Support platform-based AndroidBuildViewTest variations.

This provides a code pattern for cloning all tests inheriting
AndroidBuildViewTest with platform-based toolchain resolution.

Clones will be added as the platform logic grows to support them.

PiperOrigin-RevId: 347868940
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index be2f819..bbcf729 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -189,6 +189,7 @@
 import javax.annotation.Nullable;
 import net.starlark.java.eval.StarlarkSemantics;
 import org.junit.Before;
+import org.junit.Ignore;
 
 /**
  * Common test code that creates a BuildView instance.
@@ -2345,6 +2346,7 @@
   }
 
   /** Creates instances of {@link ActionExecutionContext} consistent with test case. */
+  @Ignore
   public class ActionExecutionContextBuilder {
     private MetadataProvider actionInputFileCache = null;
     private TreeMap<String, String> clientEnv = new TreeMap<>();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java
index a90a80c..ea9f6fa 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java
@@ -16,6 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig;
+import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.Pair;
 import java.io.IOException;
 
@@ -84,4 +85,61 @@
             Pair.of("ld-bfd", "arm/bin/arm-linux-androideabi-ld.bfd"),
             Pair.of("ld-gold", "arm/bin/arm-linux-androideabi-ld.gold"));
   }
+
+  public static void setupPlatformResolvableSdks(MockToolsConfig config) throws Exception {
+    config.create(
+        "platform_selected_android_sdks/BUILD",
+        "package(default_visibility=['//visibility:public'])",
+        "android_sdk(",
+        "    name = 'x86_64',",
+        "    aapt = ':aapt_x86_64',",
+        "    aapt2 = ':aapt2_x86_64',",
+        "    adb = ':adb_x86_64',",
+        "    aidl = ':aidl_x86_64',",
+        "    android_jar = ':android_x86_64.jar',",
+        "    apksigner = ':apksigner_x86_64',",
+        "    dx = ':dx_x86_64',",
+        "    framework_aidl = ':framework_idl_x86_64',",
+        "    main_dex_classes = ':main_dex_classes_x86_64',",
+        "    main_dex_list_creator = ':main_dex_list_creator_x86_64',",
+        "    proguard = ':proguard_x86_64',",
+        "    shrinked_android_jar =':shrinked_android_x86_64.jar',",
+        "    zipalign = ':zipalign_x86_64',",
+        "    tags = ['__ANDROID_RULES_MIGRATION__'],",
+        ")",
+        "android_sdk(",
+        "    name = 'arm',",
+        "    aapt = ':aapt_arm',",
+        "    aapt2 = ':aapt2_arm',",
+        "    adb = ':adb_arm',",
+        "    aidl = ':aidl_arm',",
+        "    android_jar = ':android_arm.jar',",
+        "    apksigner = ':apksigner_arm',",
+        "    dx = ':dx_arm',",
+        "    framework_aidl = ':framework_idl_arm',",
+        "    main_dex_classes = ':main_dex_classes_arm',",
+        "    main_dex_list_creator = ':main_dex_list_creator_arm',",
+        "    proguard = ':proguard_arm',",
+        "    shrinked_android_jar =':shrinked_android_arm.jar',",
+        "    zipalign = ':zipalign_arm',",
+        "    tags = ['__ANDROID_RULES_MIGRATION__'],",
+        ")");
+
+    config.create(
+        "platform_selected_android_sdks/toolchains/BUILD",
+        "toolchain(",
+        "    name = 'x86_64_toolchain',",
+        String.format("    toolchain_type = '%s',", TestConstants.ANDROID_TOOLCHAIN_TYPE_LABEL),
+        "    toolchain = '//platform_selected_android_sdks:x86_64',",
+        "    target_compatible_with = [",
+        "        '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:x86_64',",
+        "    ])",
+        "toolchain(",
+        "    name = 'arm_toolchain',",
+        String.format("    toolchain_type = '%s',", TestConstants.ANDROID_TOOLCHAIN_TYPE_LABEL),
+        "    toolchain = '//platform_selected_android_sdks:arm',",
+        "    target_compatible_with = [",
+        "        '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:arm',",
+        "    ])");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 1d45a7f..3c1a441 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -69,12 +69,25 @@
 import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 /** A test for {@link com.google.devtools.build.lib.rules.android.AndroidBinary}. */
-@RunWith(JUnit4.class)
-public class AndroidBinaryTest extends AndroidBuildViewTestCase {
+@RunWith(Enclosed.class)
+public abstract class AndroidBinaryTest extends AndroidBuildViewTestCase {
+  /** Use legacy toolchain resolution. */
+  @RunWith(JUnit4.class)
+  public static class WithoutPlatforms extends AndroidBinaryTest {}
+
+  /** Use platform-based toolchain resolution. */
+  @RunWith(JUnit4.class)
+  public static class WithPlatforms extends AndroidBinaryTest {
+    @Override
+    protected boolean platformBasedToolchains() {
+      return true;
+    }
+  }
 
   @Before
   public void setupCcToolchain() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index cd8ae47..4837878 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -56,6 +56,24 @@
 /** Common methods shared between Android related {@link BuildViewTestCase}s. */
 public abstract class AndroidBuildViewTestCase extends BuildViewTestCase {
 
+  /** Override this to trigger platform-based Android toolchain resolution. */
+  protected boolean platformBasedToolchains() {
+    return false;
+  }
+
+  @Override
+  protected void useConfiguration(ImmutableMap<String, Object> starlarkOptions, String... args)
+      throws Exception {
+    if (platformBasedToolchains()) {
+      ImmutableList.Builder<String> fullArgs = ImmutableList.builder();
+      fullArgs.add(args);
+      fullArgs.add("--incompatible_enable_android_toolchain_resolution");
+      super.useConfiguration(starlarkOptions, fullArgs.build().toArray(new String[0]));
+    } else {
+      super.useConfiguration(starlarkOptions, args);
+    }
+  }
+
   protected Iterable<Artifact> getNativeLibrariesInApk(ConfiguredTarget target) {
     return Iterables.filter(
         getGeneratingAction(getCompressedUnsignedApk(target)).getInputs().toList(),
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidPlatformsTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidPlatformsTest.java
index 1c426f6..d756a63 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidPlatformsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidPlatformsTest.java
@@ -14,12 +14,10 @@
 package com.google.devtools.build.lib.rules.android;
 
 import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.joining;
 
-import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.packages.util.MockPlatformSupport;
+import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
 import com.google.devtools.build.lib.rules.cpp.CppLinkAction;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import org.junit.Before;
@@ -47,11 +45,33 @@
  */
 @RunWith(JUnit4.class)
 public class AndroidPlatformsTest extends AndroidBuildViewTestCase {
-  private static final ImmutableList<String> MOCK_CPUS = ImmutableList.of("x86_64", "arm");
+  @Override
+  protected boolean platformBasedToolchains() {
+    return true;
+  }
+
+  private static final String EXTRA_SDK_TOOLCHAINS_FLAG =
+      "--extra_toolchains=//platform_selected_android_sdks/toolchains:all";
 
   @Before
-  public void setupMockClient() throws Exception {
-    getAnalysisMock().setupMockClient(mockToolsConfig);
+  public void setupPlatformsAndToolchains() throws Exception {
+    scratch.file(
+        "android_platforms/BUILD",
+        "platform(",
+        "    name = 'x86_platform',",
+        "    constraint_values = [",
+        "        '" + TestConstants.PLATFORM_PACKAGE_ROOT + "/java/constraints:java8',",
+        "        '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:x86_64',",
+        "    ])",
+        "platform(",
+        "    name = 'arm_platform',",
+        "    constraint_values = [",
+        "        '" + TestConstants.PLATFORM_PACKAGE_ROOT + "/java/constraints:java8',",
+        "        '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:arm',",
+        "    ])");
+    BazelMockAndroidSupport.setupPlatformResolvableSdks(mockToolsConfig);
+
+    analysisMock.setupMockClient(mockToolsConfig);
     // This line is necessary so an ARM C++ toolchain is available for dependencies under an Android
     // split transition. BazelMockAndroidSupport.setupNdk(mockToolsConfig) isn't sufficient for this
     // because that sets up the NDK in a special package //android/crosstool that tests then have to
@@ -59,77 +79,7 @@
     // of this test is to test that --platforms sets the correct NDK toolchain, we don't want these
     // tests to have to explicitly set --android_crosstool_top. Until --platforms correctly does
     // that, NDKs default to the default C++ toolchain. That's what this line configures.
-    getAnalysisMock().ccSupport().setupCcToolchainConfigForCpu(mockToolsConfig, "armeabi-v7a");
-  }
-
-  private static final String PLATFORM_TEMPLATE =
-      String.join(
-          "\n",
-          "platform(",
-          "    name = '%s',",
-          "    constraint_values = [",
-          "        '" + TestConstants.PLATFORM_PACKAGE_ROOT + "/java/constraints:java8',",
-          "        '" + TestConstants.CONSTRAINTS_PACKAGE_ROOT + "cpu:%s',",
-          "    ])");
-
-  @Before
-  public void writeMockPlatforms() throws Exception {
-    MockPlatformSupport.setup(mockToolsConfig);
-    for (String cpu : MOCK_CPUS) {
-      scratch.appendFile(
-          "test_android_platforms/BUILD", String.format(PLATFORM_TEMPLATE, cpu, cpu));
-    }
-  }
-
-  @Before
-  public void writeMockSDKs() throws Exception {
-    for (String cpu : MOCK_CPUS) {
-      scratch.appendFile(
-          "test_android_sdks/BUILD",
-          "android_sdk(",
-          String.format("    name = '%s',", cpu),
-          "    aapt = 'aapt',",
-          "    aapt2 = 'aapt2',",
-          "    adb = 'adb',",
-          "    aidl = 'aidl',",
-          "    android_jar = 'android.jar',",
-          String.format("    apksigner = 'apksigner_%s',", cpu),
-          "    dx = 'dx',",
-          "    framework_aidl = 'framework_aidl',",
-          "    main_dex_classes = 'main_dex_classes',",
-          "    main_dex_list_creator = 'main_dex_list_creator',",
-          "    proguard = 'proguard',",
-          "    shrinked_android_jar = 'shrinked_android_jar',",
-          "    zipalign = 'zipalign',",
-          "    tags = ['__ANDROID_RULES_MIGRATION__'])");
-    }
-  }
-
-  @Before
-  public void writeMockSdkToolchains() throws Exception {
-    for (String cpu : MOCK_CPUS) {
-      scratch.appendFile(
-          "test_android_sdk_toolchains/BUILD",
-          "toolchain(",
-          String.format("    name = '%s',", cpu),
-          String.format("    toolchain_type = '%s',", TestConstants.ANDROID_TOOLCHAIN_TYPE_LABEL),
-          String.format("    toolchain = '//test_android_sdks:%s',", cpu),
-          "    target_compatible_with = [",
-          String.format("        '%scpu:%s',", TestConstants.CONSTRAINTS_PACKAGE_ROOT, cpu),
-          "    ]",
-          ")");
-    }
-  }
-
-  /** {@link #useConfiguration} variant that sets up Android platform resolution and toolchains. */
-  private void usePlatformConfiguration(String... args) throws Exception {
-    ImmutableList.Builder<String> fullArgs = ImmutableList.builder();
-    fullArgs.add("--incompatible_enable_android_toolchain_resolution");
-    String toolchainLabels =
-        MOCK_CPUS.stream().map(cpu -> "//test_android_sdk_toolchains:" + cpu).collect(joining(","));
-    fullArgs.add("--extra_toolchains=" + toolchainLabels);
-    fullArgs.add(args);
-    useConfiguration(fullArgs.build().toArray(new String[0]));
+    analysisMock.ccSupport().setupCcToolchainConfigForCpu(mockToolsConfig, "armeabi-v7a");
   }
 
   @Test
@@ -141,19 +91,19 @@
         "    srcs = ['A.java'],",
         "    manifest = 'AndroidManifest.xml')");
 
-    usePlatformConfiguration("--platforms=//test_android_platforms:x86_64");
+    useConfiguration(EXTRA_SDK_TOOLCHAINS_FLAG, "--platforms=//android_platforms:x86_platform");
     Artifact apkX86 =
         getImplicitOutputArtifact(
             getConfiguredTarget("//java/a:a"), AndroidRuleClasses.ANDROID_BINARY_APK);
     assertThat(getGeneratingSpawnActionArgs(apkX86).get(0))
-        .isEqualTo("test_android_sdks/apksigner_x86_64");
+        .isEqualTo("platform_selected_android_sdks/apksigner_x86_64");
 
-    usePlatformConfiguration("--platforms=//test_android_platforms:arm");
+    useConfiguration(EXTRA_SDK_TOOLCHAINS_FLAG, "--platforms=//android_platforms:arm_platform");
     Artifact apkArm =
         getImplicitOutputArtifact(
             getConfiguredTarget("//java/a:a"), AndroidRuleClasses.ANDROID_BINARY_APK);
     assertThat(getGeneratingSpawnActionArgs(apkArm).get(0))
-        .isEqualTo("test_android_sdks/apksigner_arm");
+        .isEqualTo("platform_selected_android_sdks/apksigner_arm");
   }
 
   @Test
@@ -171,7 +121,7 @@
 
     // See BazelMockAndroidSupport for the NDK toolchain this should imply. This replaces
     // "--fat_apk_cpu=x86", "--android_crosstool_top=//android/crosstool:everything".
-    useConfiguration("--platforms=//test_android_platforms:x86_64");
+    useConfiguration(EXTRA_SDK_TOOLCHAINS_FLAG, "--platforms=//android_platforms:x86_platform");
     ConfiguredTarget x86Binary = getConfiguredTarget("//java/a:a");
     CppLinkAction x86Link =
         (CppLinkAction) getGeneratingAction(getPrerequisiteArtifacts(x86Binary, "deps").get(0));
@@ -182,7 +132,7 @@
 
     // See BazelMockAndroidSupport for the NDK toolchain this should imply. This replaces
     // "--fat_apk_cpu=armeabi-v7a", "--android_crosstool_top=//android/crosstool:everything".
-    useConfiguration("--platforms=//test_android_platforms:arm");
+    useConfiguration(EXTRA_SDK_TOOLCHAINS_FLAG, "--platforms=//android_platforms:arm_platform");
     ConfiguredTarget armBinary = getConfiguredTarget("//java/a:a");
     CppLinkAction armLink =
         (CppLinkAction) getGeneratingAction(getPrerequisiteArtifacts(armBinary, "deps").get(0));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
index 9d2cba0..c856b57 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -136,14 +136,12 @@
     srcs = ["AndroidPlatformsTest.java"],
     deps = [
         ":AndroidBuildViewTestCase",
-        "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/rules/android",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
-        "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
     ],