From 1d7d5275230fe02ee2b4c5c061a56a3d0cc87d2f Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Tue, 25 Jul 2023 16:30:41 -0700 Subject: [PATCH] Add integration tests --- .../BlazeQueryDirectoryToTargetProvider.java | 2 +- .../java/sync/FakeBlazeQueryProvider.java | 45 +++++++++++ .../idea/blaze/java/sync/JavaSyncTest.java | 79 +++++++++++++++++++ 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 java/tests/integrationtests/com/google/idea/blaze/java/sync/FakeBlazeQueryProvider.java diff --git a/base/src/com/google/idea/blaze/base/dependencies/BlazeQueryDirectoryToTargetProvider.java b/base/src/com/google/idea/blaze/base/dependencies/BlazeQueryDirectoryToTargetProvider.java index dc34030cccf..6e71cfbf45d 100644 --- a/base/src/com/google/idea/blaze/base/dependencies/BlazeQueryDirectoryToTargetProvider.java +++ b/base/src/com/google/idea/blaze/base/dependencies/BlazeQueryDirectoryToTargetProvider.java @@ -58,7 +58,7 @@ public List doExpandDirectoryTargets( return runQuery(project, getQueryString(directories, shouldManualTargetSync), context); } - private static String getQueryString(ImportRoots directories, boolean allowManualTargetsSync) { + protected static String getQueryString(ImportRoots directories, boolean allowManualTargetsSync) { StringBuilder targets = new StringBuilder(); targets.append( directories.rootDirectories().stream() diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/sync/FakeBlazeQueryProvider.java b/java/tests/integrationtests/com/google/idea/blaze/java/sync/FakeBlazeQueryProvider.java new file mode 100644 index 00000000000..785d4478cc2 --- /dev/null +++ b/java/tests/integrationtests/com/google/idea/blaze/java/sync/FakeBlazeQueryProvider.java @@ -0,0 +1,45 @@ +package com.google.idea.blaze.java.sync; + +import com.google.common.collect.ImmutableList; +import com.google.idea.blaze.base.dependencies.BlazeQueryDirectoryToTargetProvider; +import com.google.idea.blaze.base.dependencies.TargetInfo; +import com.google.idea.blaze.base.model.primitives.Label; +import com.google.idea.blaze.base.scope.BlazeContext; +import com.google.idea.blaze.base.sync.projectview.ImportRoots; +import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver; +import com.intellij.openapi.project.Project; + +import javax.annotation.Nullable; +import java.util.List; + +/** + * Need to mock out this target provider since it attempts to execute Bazel outside of the sandbox + * environment. Used primarily within JavaSyncTest to validate the behavior of the + * allow_manual_targets_sync: option. + */ +class FakeBlazeQueryProvider extends BlazeQueryDirectoryToTargetProvider { + + private static final String MANUAL_EXCLUDE_TAG = "((?!manual)"; + + // Need to override in order to be able to execute getQueryString(). + @Nullable + @Override + public List doExpandDirectoryTargets( + Project project, + Boolean shouldManualTargetSync, + ImportRoots directories, + WorkspacePathResolver pathResolver, + BlazeContext context) { + return runQuery(project, getQueryString(directories, shouldManualTargetSync), context); + } + + @Nullable + private static ImmutableList runQuery(Project project, String query, BlazeContext context) { + if (!query.contains(MANUAL_EXCLUDE_TAG)) { + TargetInfo targetInfo = TargetInfo.builder(Label.create("//java/com/google:lib"), "java_library").build(); + return ImmutableList.of(targetInfo); + } else { + return ImmutableList.of(); + } + } +} diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/sync/JavaSyncTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/sync/JavaSyncTest.java index 8889acbc6a5..ac2fb4a0334 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/sync/JavaSyncTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/sync/JavaSyncTest.java @@ -18,6 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; +import com.google.idea.blaze.base.dependencies.BlazeQueryDirectoryToTargetProvider; +import com.google.idea.blaze.base.dependencies.DirectoryToTargetProvider; import com.google.idea.blaze.base.ideinfo.JavaIdeInfo; import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; import com.google.idea.blaze.base.ideinfo.TargetMap; @@ -155,6 +157,83 @@ public void testSimpleSync() throws Exception { .isEqualTo(WorkspaceType.JAVA); } + public void runWorkspaceSync() { + workspace.createFile( + new WorkspacePath("java/com/google/Source.java"), + "package com.google;", + "public class Source {}"); + + workspace.createFile( + new WorkspacePath("java/com/google/Other.java"), + "package com.google;", + "public class Other {}"); + + TargetMap targetMap = + TargetMapBuilder.builder() + .addTarget( + TargetIdeInfo.builder() + .setBuildFile(sourceRoot("java/com/google/BUILD")) + .setLabel("//java/com/google:lib") + .setKind("java_library") + .addTag("manual") + .addSource(sourceRoot("java/com/google/Source.java")) + .addSource(sourceRoot("java/com/google/Other.java"))) + .build(); + + setTargetMap(targetMap); + + runBlazeSync( + BlazeSyncParams.builder() + .setTitle("Sync") + .setSyncMode(SyncMode.INCREMENTAL) + .setSyncOrigin("test") + .setAddProjectViewTargets(true) + .build()); + } + + void mockBazelQueryDirectorProvider() { + DirectoryToTargetProvider.EP_NAME.getPoint().unregisterExtension(BlazeQueryDirectoryToTargetProvider.class); + registerExtensionFirst(DirectoryToTargetProvider.EP_NAME, new FakeBlazeQueryProvider()); + } + + @Test + public void testManualTargetSyncTrue() throws Exception { + mockBazelQueryDirectorProvider(); + + setProjectView( + "directories:", + " java/com/google", + "derive_targets_from_directories: true", + "allow_manual_targets_sync: true"); + runWorkspaceSync(); + + errorCollector.assertNoIssues(); + List syncStatsList = getSyncStats(); + SyncStats syncStats = syncStatsList.get(0); + + assertThat(syncStats.buildPhaseStats().get(0).targets()).hasSize(1); + } + + @Test + public void testManualTargetSyncFalse() throws Exception { + mockBazelQueryDirectorProvider(); + + setProjectView( + "directories:", + " java/com/google", + "derive_targets_from_directories: true", + "allow_manual_targets_sync: false"); + + runWorkspaceSync(); + + errorCollector.assertNoIssues(); + List syncStatsList = getSyncStats(); + SyncStats syncStats = syncStatsList.get(0); + + assertThat(syncStats.buildPhaseStats().get(0).targets()).hasSize(0); + } + + @Test public void testSimpleSyncLogging() throws Exception { setProjectView("directories:", " java/com/google", "targets:", " //java/com/google:lib");