aswb/querysync/javatests/com/google/idea/blaze/qsync/java/AddProjectGenSrcsTest.kt (308 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.ImmutableMap import com.google.common.truth.Truth import com.google.idea.blaze.common.Context 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.project.ProjectProto import com.google.idea.blaze.qsync.project.ProjectProto.ArtifactDirectoryContents import com.google.idea.blaze.qsync.testdata.TestData import com.google.protobuf.TextFormat import java.nio.file.Path import java.time.Instant import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.mockito.Mock import org.mockito.Mockito import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoRule @RunWith(JUnit4::class) class AddProjectGenSrcsTest { @get:Rule val mockito: MockitoRule = MockitoJUnit.rule() @Mock var context: Context<*>? = null private val syncer = TestDataSyncRunner(NoopContext(), QuerySyncTestUtils.PATH_INFERRING_PACKAGE_READER) private val javaSourcePackageExtractor = JavaSourcePackageExtractor(null) @Test @Throws(Exception::class) fun generated_source_added() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val artifactState = ArtifactTracker.State.forTargets( TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testData.assumedOnlyLabel).toBuilder() .setGenSrcs( BuildArtifact.create( "gensrcdigest", Path.of("output/path/com/org/Class.java"), testData.assumedOnlyLabel ) .withMetadata(JavaArtifactMetadata.JavaSourcePackage("com.org")) ) .build(), DependencyBuildContext.NONE ) ) val addGensrcs = AddProjectGenSrcs(original.queryData().projectDefinition(), javaSourcePackageExtractor) val update = ProjectProtoUpdate(original.project(), original.graph(), context) addGensrcs.update(update, artifactState, context!!) val newProject = update.build() val workspace = newProject.getModules(0) // check our above assumption: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat(workspace.getContentEntriesList()) .contains( TextFormat.parse( Joiner.on("\n") .join( "root {", " path: \".bazel/gensrc/java\"", " base: PROJECT", " }", " sources {", " is_generated: true", " project_path {", " path: \".bazel/gensrc/java\"", " base: PROJECT", " }", " }" ), ProjectProto.ContentEntry::class.java ) ) Truth.assertThat(newProject.getArtifactDirectories().getDirectoriesMap()) .containsEntry( ".bazel/gensrc/java", TextFormat.parse( Joiner.on("\n") .join( "contents {", " key: \"com/org/Class.java\"", " value {", " transform: COPY", " build_artifact {", " digest: \"gensrcdigest\"", " }", " target: \"" + testData.assumedOnlyLabel + "\"", " }", " }" ), ArtifactDirectoryContents::class.java ) ) Mockito.verify(context, Mockito.never())!!.setHasWarnings() } @Test @Throws(Exception::class) fun conflict_last_build_taken() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val testLabel = testData.assumedOnlyLabel val genSrc1 = TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testLabel.siblingWithName("genSrc1")).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "gensrc1", Path.of("output/path/com/org/Class.java"), testLabel.siblingWithName("genSrc1") ) .withMetadata(JavaArtifactMetadata.JavaSourcePackage("com.org")) ) ) .build(), DependencyBuildContext.create( "abc-def", Instant.now().minusSeconds(60) ) ) val genSrc2Label = testData.assumedOnlyLabel.siblingWithName("genSrc2") val genSrc2 = TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testLabel.siblingWithName("genSrc2")).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "gensrc2", Path.of("output/otherpath/com/org/Class.java"), genSrc2Label ) .withMetadata(JavaArtifactMetadata.JavaSourcePackage("com.org")) ) ) .build(), DependencyBuildContext.create("abc-def", Instant.now()) ) val artifactState = ArtifactTracker.State.create( ImmutableMap.of( genSrc1.label(), genSrc1, genSrc2.label(), genSrc2 ), ImmutableMap.of() ) val addGenSrcs = AddProjectGenSrcs(original.queryData().projectDefinition(), javaSourcePackageExtractor) val update = ProjectProtoUpdate(original.project(), original.graph(), context) addGenSrcs.update(update, artifactState, context!!) val newProject = update.build() val workspace = newProject.getModules(0) // check our above assumption: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat(workspace.getContentEntriesList()) .contains( TextFormat.parse( Joiner.on("\n") .join( "root {", " path: \".bazel/gensrc/java\"", " base: PROJECT", " }", " sources {", " is_generated: true", " project_path {", " path: \".bazel/gensrc/java\"", " base: PROJECT", " }", " }" ), ProjectProto.ContentEntry::class.java ) ) Truth.assertThat(newProject.getArtifactDirectories().getDirectoriesMap()) .containsEntry( ".bazel/gensrc/java", TextFormat.parse( Joiner.on("\n") .join( "contents {", " key: \"com/org/Class.java\"", " value {", " transform: COPY", " build_artifact {", " digest: \"gensrc2\"", " }", " target: \"" + genSrc2Label + "\"", " }", " }" ), ArtifactDirectoryContents::class.java ) ) Mockito.verify(context)!!.setHasWarnings() } @Test @Throws(Exception::class) fun conflict_same_digest_ignored() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val testLabel = testData.assumedOnlyLabel val genSrc1 = TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testLabel.siblingWithName("genSrc1")).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "samedigest", Path.of("output/path/com/org/Class.java"), testLabel.siblingWithName("genSrc1") ) .withMetadata(JavaArtifactMetadata.JavaSourcePackage("com.org")) ) ) .build(), DependencyBuildContext.create( "abc-def", Instant.now().minusSeconds(60) ) ) val genSrc2Label = testData.assumedOnlyLabel.siblingWithName("genSrc2") val genSrc2 = TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testLabel.siblingWithName("genSrc2")).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "samedigest", Path.of("output/otherpath/com/org/Class.java"), genSrc2Label ) .withMetadata(JavaArtifactMetadata.JavaSourcePackage("com.org")) ) ) .build(), DependencyBuildContext.create("abc-def", Instant.now()) ) val artifactState = ArtifactTracker.State.create( ImmutableMap.of( genSrc1.label(), genSrc1, genSrc2.label(), genSrc2 ), ImmutableMap.of() ) val addGenSrcs = AddProjectGenSrcs(original.queryData().projectDefinition(), javaSourcePackageExtractor) val update = ProjectProtoUpdate(original.project(), original.graph(), context) addGenSrcs.update(update, artifactState, context!!) Mockito.verify(context, Mockito.never())!!.setHasWarnings() } @Test @Throws(Exception::class) fun generated_source_no_package_name() { val testData = TestData.JAVA_LIBRARY_EXTERNAL_DEP_QUERY val original = syncer.sync(testData) val artifactState = ArtifactTracker.State.forTargets( TargetBuildInfo.forJavaTarget( JavaArtifactInfo.empty(testData.assumedOnlyLabel).toBuilder() .setGenSrcs( ImmutableList.of( BuildArtifact.create( "gensrcdigest", Path.of("output/path/com/org/Class.java"), testData.assumedOnlyLabel ) ) ) .build(), DependencyBuildContext.NONE ) ) val addGensrcs = AddProjectGenSrcs(original.queryData().projectDefinition(), javaSourcePackageExtractor) val update = ProjectProtoUpdate(original.project(), original.graph(), context) addGensrcs.update(update, artifactState, context!!) val newProject = update.build() val workspace = newProject.getModules(0) // check our above assumption: Truth.assertThat(workspace.getName()).isEqualTo(".workspace") Truth.assertThat( workspace.getContentEntriesList() .flatMap { it!!.getSourcesList() } .filter { it!!.getIsGenerated() }) .isEmpty() Truth.assertThat( newProject.getArtifactDirectories().getDirectoriesMap().values .flatMap { it!!.getContentsMap().entries } .isEmpty()) Mockito.verify(context)!!.setHasWarnings() } }