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",
],