diff options
author | 2016-12-21 23:47:28 +0000 | |
---|---|---|
committer | 2016-12-22 09:57:20 +0000 | |
commit | 762a27c1c4e8eec7527caddd94168d57181726a6 (patch) | |
tree | 226ca92027d1542fb3fbdaf9358e3af87e1463bf /src/test | |
parent | aa4ca94d7b44e6a776e46ed50d9b245058e8b9de (diff) |
Exposes the Android split transition configuration to Skylark.
--
PiperOrigin-RevId: 142709934
MOS_MIGRATED_REVID=142709934
Diffstat (limited to 'src/test')
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", |