aswb/querysync/javatests/com/google/idea/blaze/qsync/java/AddProjectGenSrcJarsTest.kt (230 lines of code) (raw):

/* * Copyright 2024 The Bazel Authors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.idea.blaze.qsync.java import com.google.common.base.Joiner import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableSet import com.google.common.truth.Truth import com.google.idea.blaze.common.Label.Companion.of import com.google.idea.blaze.common.NoopContext import com.google.idea.blaze.qsync.QuerySyncTestUtils import com.google.idea.blaze.qsync.TestDataSyncRunner import com.google.idea.blaze.qsync.artifacts.BuildArtifact import com.google.idea.blaze.qsync.deps.ArtifactTracker import com.google.idea.blaze.qsync.deps.DependencyBuildContext import com.google.idea.blaze.qsync.deps.JavaArtifactInfo import com.google.idea.blaze.qsync.deps.ProjectProtoUpdate import com.google.idea.blaze.qsync.deps.TargetBuildInfo import com.google.idea.blaze.qsync.java.JavaArtifactMetadata.SrcJarPrefixedJavaPackageRoots import com.google.idea.blaze.qsync.java.SrcJarInnerPathFinder.JarPath import com.google.idea.blaze.qsync.project.ProjectProto import com.google.idea.blaze.qsync.testdata.TestData import com.google.protobuf.TextFormat import java.nio.file.Path import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoRule @RunWith(JUnit4::class) class AddProjectGenSrcJarsTest { @get:Rule val mockito: MockitoRule = MockitoJUnit.rule() private val syncer = TestDataSyncRunner(NoopContext(), QuerySyncTestUtils.PATH_INFERRING_PACKAGE_READER) private val innerPathsMetadata = SrcJarPrefixedPackageRootsExtractor(null) @Test @Throws(Exception::class) fun external_srcjar_ignored() { val original = syncer.sync(TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY) val artifactState = ArtifactTracker.State.forJavaArtifacts( JavaArtifactInfo.empty(of("//java/com/google/common/collect:collect")).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "srcjardigest", Path.of("output/path/to/external.srcjar"), of("//java/com/google/common/collect:collect") ) ) ) .build() ) val javaDeps = AddProjectGenSrcJars(original.queryData().projectDefinition(), innerPathsMetadata) val update = ProjectProtoUpdate(original.project(), original.graph(), NoopContext()) javaDeps.update(update, artifactState, NoopContext()) val newProject = update.build() Truth.assertThat(newProject.getLibraryList()).isEqualTo(original.project().getLibraryList()) Truth.assertThat(newProject.getModulesList()).isEqualTo(original.project().getModulesList()) Truth.assertThat(newProject.getArtifactDirectories().getDirectoriesMap().keys).isEmpty() } @Test @Throws(Exception::class) fun project_srcjar_added() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val artifactState = ArtifactTracker.State.forTargets( TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testData.getAssumedOnlyLabel()).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "srcjardigest", Path.of("output/path/to/project.srcjar"), testData.getAssumedOnlyLabel() ) .withMetadata( SrcJarPrefixedJavaPackageRoots( ImmutableSet.of(JarPath.create("root", "")) ) ) ) ) .build(), DependencyBuildContext.NONE ) ) val javaDeps = AddProjectGenSrcJars(original.queryData().projectDefinition(), innerPathsMetadata) val update = ProjectProtoUpdate(original.project(), original.graph(), NoopContext()) javaDeps.update(update, artifactState, NoopContext()) val newProject = update.build() Truth.assertThat(newProject.getLibraryList()).isEqualTo(original.project().getLibraryList()) val workspace = newProject.getModules(0) // check our assumptions: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat(workspace.getContentEntriesList()) .contains( TextFormat.parse( Joiner.on("\n") .join( "root {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src\"", " base: PROJECT", " }", " sources {", " is_generated: true", " project_path {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src/root\"", " base: PROJECT", " }", " }" ), ProjectProto.ContentEntry::class.java ) ) } @Test @Throws(Exception::class) fun project_srcjar_added_java_package_mismatch() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val artifactState = ArtifactTracker.State.forTargets( TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testData.getAssumedOnlyLabel()).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "srcjardigest", Path.of("output/path/to/project.srcjar"), testData.getAssumedOnlyLabel() ) .withMetadata( SrcJarPrefixedJavaPackageRoots( ImmutableSet.of(JarPath.create("root", "com.example")) ) ) ) ) .build(), DependencyBuildContext.NONE ) ) val javaDeps = AddProjectGenSrcJars(original.queryData().projectDefinition(), innerPathsMetadata) val update = ProjectProtoUpdate(original.project(), original.graph(), NoopContext()) javaDeps.update(update, artifactState, NoopContext()) val newProject = update.build() Truth.assertThat(newProject.getLibraryList()).isEqualTo(original.project().getLibraryList()) val workspace = newProject.getModules(0) // check our assumptions: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat(workspace.getContentEntriesList()) .contains( TextFormat.parse( Joiner.on("\n") .join( "root {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src\"", " base: PROJECT", " }", " sources {", " is_generated: true", " package_prefix: \"com.example\"", " project_path {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src/root\"", " base: PROJECT", " }", " }" ), ProjectProto.ContentEntry::class.java ) ) } @Test @Throws(Exception::class) fun missing_metadata_project_srcjar_added() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val artifactState = ArtifactTracker.State.forTargets( TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testData.getAssumedOnlyLabel()).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "srcjardigest", Path.of("output/path/to/project.srcjar"), testData.getAssumedOnlyLabel() ) ) ) .build(), DependencyBuildContext.NONE ) ) val javaDeps = AddProjectGenSrcJars(original.queryData().projectDefinition(), innerPathsMetadata) val update = ProjectProtoUpdate(original.project(), original.graph(), NoopContext()) javaDeps.update(update, artifactState, NoopContext()) val newProject = update.build() Truth.assertThat(newProject.getLibraryList()).isEqualTo(original.project().getLibraryList()) val workspace = newProject.getModules(0) // check our assumptions: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat(workspace.getContentEntriesList()) .contains( TextFormat.parse( Joiner.on("\n") .join( "root {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src\"", " base: PROJECT", " }", " sources {", " is_generated: true", " project_path {", " path: \".bazel/gensrc/java/output/path/to/project.srcjar/src\"", " base: PROJECT", " }", " }" ), ProjectProto.ContentEntry::class.java ) ) } }