aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test
diff options
context:
space:
mode:
authorGravatar Alex Humesky <ahumesky@google.com>2016-12-21 23:47:28 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-12-22 09:57:20 +0000
commit762a27c1c4e8eec7527caddd94168d57181726a6 (patch)
tree226ca92027d1542fb3fbdaf9358e3af87e1463bf /src/test
parentaa4ca94d7b44e6a776e46ed50d9b245058e8b9de (diff)
Exposes the Android split transition configuration to Skylark.
-- PiperOrigin-RevId: 142709934 MOS_MIGRATED_REVID=142709934
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/com/google/devtools/build/lib/BUILD2
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java36
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/MOCK_ANDROID_CROSSTOOL126
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkSplitTransitionTest.java171
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/BUILD18
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/BUILD1
6 files changed, 354 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 40c40b9bf6..75e43c16ad 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -25,6 +25,7 @@ filegroup(
srcs = glob(["**"]) + [
"//src/test/java/com/google/devtools/build/lib/skylark:srcs",
"//src/test/java/com/google/devtools/build/lib/skyframe:srcs",
+ "//src/test/java/com/google/devtools/build/lib/rules/android:srcs",
"//src/test/java/com/google/devtools/build/lib/rules/repository:srcs",
"//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs",
"//src/test/java/com/google/devtools/build/lib/buildeventstream/transports:srcs",
@@ -555,6 +556,7 @@ java_library(
srcs = glob([
"packages/util/*.java",
]),
+ resources = ["packages/util/MOCK_ANDROID_CROSSTOOL"],
deps = [
":foundations_testutil",
":testutil",
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
new file mode 100644
index 0000000000..99cba90ec3
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockAndroidSupport.java
@@ -0,0 +1,36 @@
+// Copyright 2016 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.devtools.build.lib.packages.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.util.ResourceFileLoader;
+import java.io.IOException;
+
+/**
+ * Mocks out Android dependencies for testing.
+ */
+public class BazelMockAndroidSupport {
+
+ public static void setupNdk(MockToolsConfig config) throws IOException {
+ new Crosstool(config, "android/crosstool")
+ .setCrosstoolFile(
+ /*version=*/ "mock_version",
+ ResourceFileLoader.loadResource(
+ BazelMockAndroidSupport.class, "MOCK_ANDROID_CROSSTOOL"))
+ .setSupportedArchs(ImmutableList.of("x86", "armeabi-v7a"))
+ .setSupportsHeaderParsing(false)
+ .write();
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MOCK_ANDROID_CROSSTOOL b/src/test/java/com/google/devtools/build/lib/packages/util/MOCK_ANDROID_CROSSTOOL
new file mode 100644
index 0000000000..f63bcb24e4
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MOCK_ANDROID_CROSSTOOL
@@ -0,0 +1,126 @@
+major_version: "18"
+minor_version: "0"
+default_target_cpu: "armeabi-v7a"
+
+default_toolchain {
+ cpu: "armeabi-v7a"
+ toolchain_identifier: "armeabi-v7a"
+}
+
+default_toolchain {
+ cpu: "x86"
+ toolchain_identifier: "x86"
+}
+
+toolchain {
+ toolchain_identifier: "armeabi-v7a"
+ host_system_name: "x86"
+ target_system_name: "arm-linux-androideabi"
+
+ target_cpu: "armeabi-v7a"
+
+ target_libc: "local"
+ compiler: "gcc"
+ abi_version: "armeabi-v7a"
+ abi_libc_version: "r7"
+ tool_path {
+ name: "gcc"
+ path: "arm/bin/arm-linux-androideabi-gcc"
+ }
+ tool_path {
+ name: "ar"
+ path: "arm/bin/arm-linux-androideabi-ar"
+ }
+ tool_path {
+ name: "cpp"
+ path: "arm/bin/arm-linux-androideabi-cpp"
+ }
+ tool_path {
+ name: "gcov"
+ path: "arm/bin/arm-linux-androideabi-gcov"
+ }
+ tool_path {
+ name: "ld"
+ path: "arm/bin/arm-linux-androideabi-ld"
+ }
+ tool_path {
+ name: "nm"
+ path: "arm/bin/arm-linux-androideabi-nm"
+ }
+ tool_path {
+ name: "objcopy"
+ path: "arm/bin/arm-linux-androideabi-objcopy"
+ }
+ tool_path {
+ name: "objdump"
+ path: "arm/bin/arm-linux-androideabi-objdump"
+ }
+ tool_path {
+ name: "strip"
+ path: "arm/bin/arm-linux-androideabi-strip"
+ }
+ tool_path {
+ name: "ld-bfd"
+ path: "arm/bin/arm-linux-androideabi-ld.bfd"
+ }
+ tool_path {
+ name: "ld-gold"
+ path: "arm/bin/arm-linux-androideabi-ld.gold"
+ }
+}
+
+toolchain {
+ toolchain_identifier: "x86"
+ host_system_name: "x86"
+ target_system_name: "x86-linux-android"
+
+ target_cpu: "x86"
+ target_libc: "local"
+ compiler: "gcc"
+ abi_version: "x86"
+ abi_libc_version: "r7"
+ tool_path {
+ name: "gcc"
+ path: "x86/bin/i686-linux-android-gcc"
+ }
+ tool_path {
+ name: "ar"
+ path: "x86/bin/i686-linux-android-ar"
+ }
+ tool_path {
+ name: "cpp"
+ path: "x86/bin/i686-linux-android-cpp"
+ }
+ tool_path {
+ name: "gcov"
+ path: "x86/bin/i686-linux-android-gcov"
+ }
+ tool_path {
+ name: "ld"
+ path: "x86/bin/i686-linux-android-ld"
+ }
+ tool_path {
+ name: "nm"
+ path: "x86/bin/i686-linux-android-nm"
+ }
+ tool_path {
+ name: "objcopy"
+ path: "x86/bin/i686-linux-android-objcopy"
+ }
+ tool_path {
+ name: "objdump"
+ path: "x86/bin/i686-linux-android-objdump"
+ }
+ tool_path {
+ name: "strip"
+ path: "x86/bin/i686-linux-android-strip"
+ }
+ tool_path {
+ name: "ld-bfd"
+ path: "x86/bin/i686-linux-android-ld.bfd"
+ }
+ tool_path {
+ name: "ld-gold"
+ path: "x86/bin/i686-linux-android-ld.gold"
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkSplitTransitionTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkSplitTransitionTest.java
new file mode 100644
index 0000000000..f5f4395fdb
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkSplitTransitionTest.java
@@ -0,0 +1,171 @@
+// Copyright 2016 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.devtools.build.lib.rules.android;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
+import com.google.devtools.build.lib.syntax.Runtime;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class AndroidSkylarkSplitTransitionTest extends BuildViewTestCase {
+
+ protected boolean keepGoing() {
+ return false;
+ }
+
+ private void writeAndroidSplitTransitionTestFiles() throws Exception {
+ scratch.file(
+ "test/skylark/my_rule.bzl",
+ "def impl(ctx): ",
+ " return struct(",
+ " split_attr_deps = ctx.split_attr.deps,",
+ " split_attr_dep = ctx.split_attr.dep,",
+ " k8_deps = ctx.split_attr.deps.get('k8', None),",
+ " attr_deps = ctx.attr.deps,",
+ " attr_dep = ctx.attr.dep)",
+ "my_rule = rule(",
+ " implementation = impl,",
+ " attrs = {",
+ " 'deps': attr.label_list(cfg = android_common.multi_cpu_configuration),",
+ " 'dep': attr.label(cfg = android_common.multi_cpu_configuration),",
+ " })");
+
+ scratch.file(
+ "test/skylark/BUILD",
+ "load('/test/skylark/my_rule', 'my_rule')",
+ "my_rule(name = 'test', deps = [':main1', ':main2'], dep = ':main1')",
+ "cc_binary(name = 'main1', srcs = ['main1.c'])",
+ "cc_binary(name = 'main2', srcs = ['main2.c'])");
+ }
+
+ @Test
+ public void testAndroidSplitTransition() throws Exception {
+ writeAndroidSplitTransitionTestFiles();
+
+ useConfiguration("--fat_apk_cpu=k8,armeabi-v7a");
+ ConfiguredTarget target = getConfiguredTarget("//test/skylark:test");
+
+ // Check that ctx.split_attr.deps has this structure:
+ // {
+ // "k8": [ConfiguredTarget],
+ // "armeabi-v7a": [ConfiguredTarget],
+ // }
+ @SuppressWarnings("unchecked")
+ Map<String, List<ConfiguredTarget>> splitDeps =
+ (Map<String, List<ConfiguredTarget>>) target.get("split_attr_deps");
+ assertThat(splitDeps).containsKey("k8");
+ assertThat(splitDeps).containsKey("armeabi-v7a");
+ assertThat(splitDeps.get("k8")).hasSize(2);
+ assertThat(splitDeps.get("armeabi-v7a")).hasSize(2);
+ assertThat(splitDeps.get("k8").get(0).getConfiguration().getCpu()).isEqualTo("k8");
+ assertThat(splitDeps.get("k8").get(1).getConfiguration().getCpu()).isEqualTo("k8");
+ assertThat(splitDeps.get("armeabi-v7a").get(0).getConfiguration().getCpu())
+ .isEqualTo("armeabi-v7a");
+ assertThat(splitDeps.get("armeabi-v7a").get(1).getConfiguration().getCpu())
+ .isEqualTo("armeabi-v7a");
+
+ // Check that ctx.split_attr.dep has this structure (that is, that the values are not lists):
+ // {
+ // "k8": ConfiguredTarget,
+ // "armeabi-v7a": ConfiguredTarget,
+ // }
+ @SuppressWarnings("unchecked")
+ Map<String, ConfiguredTarget> splitDep =
+ (Map<String, ConfiguredTarget>) target.get("split_attr_dep");
+ assertThat(splitDep).containsKey("k8");
+ assertThat(splitDep).containsKey("armeabi-v7a");
+ assertThat(splitDep.get("k8").getConfiguration().getCpu()).isEqualTo("k8");
+ assertThat(splitDep.get("armeabi-v7a").getConfiguration().getCpu()).isEqualTo("armeabi-v7a");
+
+ // The regular ctx.attr.deps should be a single list with all the branches of the split merged
+ // together (i.e. for aspects).
+ @SuppressWarnings("unchecked")
+ List<ConfiguredTarget> attrDeps = (List<ConfiguredTarget>) target.get("attr_deps");
+ assertThat(attrDeps).hasSize(4);
+ ListMultimap<String, Object> attrDepsMap = ArrayListMultimap.create();
+ for (ConfiguredTarget ct : attrDeps) {
+ attrDepsMap.put(ct.getConfiguration().getCpu(), target);
+ }
+ assertThat(attrDepsMap.get("k8")).hasSize(2);
+ assertThat(attrDepsMap.get("armeabi-v7a")).hasSize(2);
+
+ // Check that even though my_rule.dep is defined as a single label, ctx.attr.dep is still a list
+ // with multiple ConfiguredTarget objects because of the two different CPUs.
+ @SuppressWarnings("unchecked")
+ List<ConfiguredTarget> attrDep = (List<ConfiguredTarget>) target.get("attr_dep");
+ assertThat(attrDep).hasSize(2);
+ ListMultimap<String, Object> attrDepMap = ArrayListMultimap.create();
+ for (ConfiguredTarget ct : attrDep) {
+ attrDepMap.put(ct.getConfiguration().getCpu(), target);
+ }
+ assertThat(attrDepMap.get("k8")).hasSize(1);
+ assertThat(attrDepMap.get("armeabi-v7a")).hasSize(1);
+
+ // Check that the deps were correctly accessed from within Skylark.
+ @SuppressWarnings("unchecked")
+ List<ConfiguredTarget> k8Deps = (List<ConfiguredTarget>) target.get("k8_deps");
+ assertThat(k8Deps).hasSize(2);
+ assertThat(k8Deps.get(0).getConfiguration().getCpu()).isEqualTo("k8");
+ assertThat(k8Deps.get(1).getConfiguration().getCpu()).isEqualTo("k8");
+ }
+
+ @Test
+ public void testAndroidSplitTransitionWithAndroidCpu() throws Exception {
+ writeAndroidSplitTransitionTestFiles();
+ BazelMockAndroidSupport.setupNdk(mockToolsConfig);
+
+ // --android_cpu with --android_crosstool_top also triggers the split transition.
+ useConfiguration(
+ "--android_cpu=armeabi-v7a", "--android_crosstool_top=//android/crosstool:everything");
+ ConfiguredTarget target = getConfiguredTarget("//test/skylark:test");
+
+ @SuppressWarnings("unchecked")
+ Map<Object, List<ConfiguredTarget>> splitDeps =
+ (Map<Object, List<ConfiguredTarget>>) target.get("split_attr_deps");
+
+ String cpu = "armeabi-v7a";
+ assertThat(splitDeps.get(cpu)).hasSize(2);
+ assertThat(splitDeps.get(cpu).get(0).getConfiguration().getCpu()).isEqualTo(cpu);
+ assertThat(splitDeps.get(cpu).get(1).getConfiguration().getCpu()).isEqualTo(cpu);
+ }
+
+ @Test
+ public void testAndroidSplitTransitionNoTransition() throws Exception {
+ writeAndroidSplitTransitionTestFiles();
+
+ useConfiguration("--fat_apk_cpu=", "--android_crosstool_top=");
+ ConfiguredTarget target = getConfiguredTarget("//test/skylark:test");
+
+ @SuppressWarnings("unchecked")
+ Map<Object, List<ConfiguredTarget>> splitDeps =
+ (Map<Object, List<ConfiguredTarget>>) target.get("split_attr_deps");
+
+ // Split transition isn't in effect, so the deps are compiled normally (i.e. using --cpu).
+ assertThat(splitDeps.get(Runtime.NONE)).hasSize(2);
+ assertThat(splitDeps.get(Runtime.NONE).get(0).getConfiguration().getCpu()).isEqualTo("k8");
+ assertThat(splitDeps.get(Runtime.NONE).get(1).getConfiguration().getCpu()).isEqualTo("k8");
+ }
+
+}
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
new file mode 100644
index 0000000000..460be997be
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -0,0 +1,18 @@
+filegroup(
+ name = "srcs",
+ srcs = glob(["**"]),
+ visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
+)
+
+java_test(
+ name = "AndroidSkylarkSplitTransitionTest",
+ srcs = ["AndroidSkylarkSplitTransitionTest.java"],
+ deps = [
+ "//src/main/java/com/google/devtools/build/lib:build-base",
+ "//src/main/java/com/google/devtools/build/lib:syntax",
+ "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+ "//src/test/java/com/google/devtools/build/lib:packages_testutil",
+ "//third_party:guava",
+ "//third_party:truth",
+ ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/BUILD b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
index a5fa37d9d6..85c00a305c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skylark/BUILD
@@ -59,6 +59,7 @@ java_test(
"//src/test/java/com/google/devtools/build/lib:actions_testutil",
"//src/test/java/com/google/devtools/build/lib:analysis_testutil",
"//src/test/java/com/google/devtools/build/lib:foundations_testutil",
+ "//src/test/java/com/google/devtools/build/lib:packages_testutil",
"//src/test/java/com/google/devtools/build/lib:test_runner",
"//src/test/java/com/google/devtools/build/lib:testutil",
"//third_party:guava",