aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java20
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceTest.java540
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/BUILD14
3 files changed, 573 insertions, 1 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 873d28bf1a..9f4b07112f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.analysis.mock;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.analysis.ConfigurationCollectionFactory;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
@@ -119,6 +120,10 @@ public final class BazelAnalysisMock extends AnalysisMock {
"/bazel_tools_workspace/tools/android/BUILD",
androidBuildContents.toArray(new String[androidBuildContents.size()]));
config.create(
+ "/bazel_tools_workspace/tools/android/emulator/BUILD",
+ Iterables.toArray(createToolsAndroidEmulatorContents(), String.class));
+
+ config.create(
"/bazel_tools_workspace/third_party/java/apkbuilder/BUILD",
"sh_binary(name = 'embedded_apkbuilder',",
" srcs = ['embedded_apkbuilder.sh'])");
@@ -154,6 +159,17 @@ public final class BazelAnalysisMock extends AnalysisMock {
ccSupport().setup(config);
}
+ /** Contents of {@code //tools/android/emulator/BUILD.tools}. */
+ private ImmutableList<String> createToolsAndroidEmulatorContents() {
+ return ImmutableList.of(
+ "exports_files(['emulator_arm', 'emulator_x86', 'mksd', 'empty_snapshot_fs'])",
+ "filegroup(name = 'emulator_x86_bios', srcs = ['bios.bin', 'vgabios-cirrus.bin'])",
+ "filegroup(name = 'xvfb_support', srcs = ['support_file1', 'support_file2'])",
+ "sh_binary(name = 'unified_launcher', srcs = ['empty.sh'])",
+ "filegroup(name = 'shbase', srcs = ['googletest.sh'])",
+ "filegroup(name = 'sdk_path', srcs = ['empty.sh'])");
+ }
+
private ImmutableList<String> createAndroidBuildContents() {
ImmutableList.Builder<String> androidBuildContents = ImmutableList.builder();
@@ -216,7 +232,9 @@ public final class BazelAnalysisMock extends AnalysisMock {
.add("sh_binary(name = 'zip_manifest_creator', srcs = ['empty.sh'])")
.add("sh_binary(name = 'aar_embedded_jars_extractor', srcs = ['empty.sh'])")
.add("java_import(name = 'idlclass_import',")
- .add(" jars = [ 'idlclass.jar' ])");
+ .add(" jars = [ 'idlclass.jar' ])")
+ .add("exports_files(['adb', 'adb_static'])")
+ .add("sh_binary(name = 'android_runtest', srcs = ['empty.sh'])");
return androidBuildContents.build();
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceTest.java
new file mode 100644
index 0000000000..694031ac43
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceTest.java
@@ -0,0 +1,540 @@
+// Copyright 2017 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 static com.google.common.truth.Truth.assertWithMessage;
+import static org.junit.Assert.assertNotNull;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.FilesToRunProvider;
+import com.google.devtools.build.lib.analysis.Runfiles;
+import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.rules.test.ExecutionInfoProvider;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link AndroidDevice}. */
+@RunWith(JUnit4.class)
+public class AndroidDeviceTest extends BuildViewTestCase {
+ private static final String SYSTEM_IMAGE_LABEL =
+ "//sdk/system_images:emulator_images_android_21_x86";
+ private static final String SYSTEM_IMAGE_DIRECTORY = "sdk/system_images/android_21/x86/";
+ private static final ImmutableList<String> SYSTEM_IMAGE_FILES =
+ ImmutableList.of(
+ SYSTEM_IMAGE_DIRECTORY + "kernel-qemu",
+ SYSTEM_IMAGE_DIRECTORY + "ramdisk.img",
+ SYSTEM_IMAGE_DIRECTORY + "system.img.tar.gz",
+ SYSTEM_IMAGE_DIRECTORY + "userdata.img.tar.gz");
+ private static final String SOURCE_PROPERTIES = SYSTEM_IMAGE_DIRECTORY + "source.properties";
+ private static final String REQUIRES_KVM = "requires-kvm";
+
+ @Before
+ public void setup() throws IOException {
+ scratch.file(
+ "sdk/system_images/BUILD",
+ "filegroup(",
+ " name = 'emulator_images_android_21_x86',",
+ " srcs = [",
+ " 'android_21/x86/kernel-qemu',",
+ " 'android_21/x86/ramdisk.img',",
+ " 'android_21/x86/source.properties',",
+ " 'android_21/x86/system.img.tar.gz',",
+ " 'android_21/x86/userdata.img.tar.gz'",
+ " ],",
+ ")");
+ }
+
+ private FilesToRunProvider getToolDependency(String label) throws Exception {
+ return getHostConfiguredTarget(ruleClassProvider.getToolsRepository() + label)
+ .getProvider(FilesToRunProvider.class);
+ }
+
+ private String getToolDependencyExecPathString(String label) throws Exception {
+ return getToolDependency(label).getExecutable().getExecPathString();
+ }
+
+ private String getToolDependencyRunfilesPathString(String label) throws Exception {
+ return getToolDependency(label).getExecutable().getRunfilesPathString();
+ }
+
+ @Test
+ public void testWellFormedDevice() throws Exception {
+ ConfiguredTarget target = scratchConfiguredTarget(
+ "tools/android/emulated_device",
+ "nexus_6",
+ "android_device(",
+ " name = 'nexus_6', ",
+ " ram = 2048, ",
+ " horizontal_resolution = 720, ",
+ " vertical_resolution = 1280, ",
+ " cache = 32, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 280, ",
+ " vm_heap = 256",
+ ")");
+
+ Set<String> outputBasenames = new HashSet<>();
+ for (Artifact outArtifact : getFilesToBuild(target)) {
+ outputBasenames.add(outArtifact.getPath().getBaseName());
+ }
+
+ assertWithMessage("Not generating expected outputs.").that(outputBasenames)
+ .containsExactly("nexus_6", "userdata_images.dat", "emulator-meta-data.pb");
+
+ Runfiles runfiles = getDefaultRunfiles(target);
+ assertThat(ActionsTestUtil.execPaths(runfiles.getUnconditionalArtifacts())).containsAllOf(
+ getToolDependencyExecPathString("//tools/android/emulator:support_file1"),
+ getToolDependencyExecPathString("//tools/android/emulator:support_file2"));
+
+ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith(
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)),
+ "nexus_6_images/userdata_images.dat");
+
+ String systemImageString = Joiner.on(" ").join(SYSTEM_IMAGE_FILES);
+
+ Iterable<String> biosFilesExecPathStrings =
+ Iterables.transform(
+ getToolDependency("//tools/android/emulator:emulator_x86_bios").getFilesToRun(),
+ new Function<Artifact, String>() {
+ @Override
+ public String apply(Artifact artifact) {
+ return artifact.getExecPathString();
+ }
+ });
+
+ assertWithMessage("Invalid boot commandline.")
+ .that(action.getArguments())
+ .containsExactly(
+ getToolDependencyExecPathString("//tools/android/emulator:unified_launcher"),
+ "--action=boot",
+ "--density=280",
+ "--memory=2048",
+ "--skin=720x1280",
+ "--cache=32",
+ "--vm_size=256",
+ "--system_images=" + systemImageString,
+ "--bios_files=" + Joiner.on(",").join(biosFilesExecPathStrings),
+ "--source_properties_file=" + SOURCE_PROPERTIES,
+ "--generate_output_dir="
+ + targetConfig.getBinFragment()
+ + "/tools/android/emulated_device/nexus_6_images",
+ "--adb_static=" + getToolDependencyExecPathString("//tools/android:adb_static"),
+ "--emulator_x86="
+ + getToolDependencyExecPathString("//tools/android/emulator:emulator_x86"),
+ "--emulator_arm="
+ + getToolDependencyExecPathString("//tools/android/emulator:emulator_arm"),
+ "--adb=" + getToolDependencyExecPathString("//tools/android:adb"),
+ "--mksdcard=" + getToolDependencyExecPathString("//tools/android/emulator:mksd"),
+ "--empty_snapshot_fs="
+ + getToolDependencyExecPathString("//tools/android/emulator:empty_snapshot_fs"),
+ "--flag_configured_android_tools",
+ "--nocopy_system_images",
+ "--single_image_file",
+ "--android_sdk_path="
+ + getToolDependencyExecPathString("//tools/android/emulator:sdk_path"),
+ "--platform_apks=");
+
+ assertThat(action.getExecutionInfo()).doesNotContainKey(REQUIRES_KVM);
+ assertThat(ActionsTestUtil.execPaths(action.getInputs()))
+ .containsAllOf(
+ getToolDependencyExecPathString("//tools/android/emulator:support_file1"),
+ getToolDependencyExecPathString("//tools/android/emulator:support_file2"));
+
+ assertNotNull(target.get(ExecutionInfoProvider.SKYLARK_CONSTRUCTOR.getKey()));
+ ExecutionInfoProvider executionInfoProvider =
+ (ExecutionInfoProvider) target.get(ExecutionInfoProvider.SKYLARK_CONSTRUCTOR.getKey());
+ assertThat(executionInfoProvider.getExecutionInfo()).doesNotContainKey(REQUIRES_KVM);
+ TemplateExpansionAction stubAction = (TemplateExpansionAction) getGeneratingAction(
+ getExecutable(target));
+ String stubContents = stubAction.getFileContents();
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "unified_launcher=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:unified_launcher")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "adb=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android:adb")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "adb_static=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android:adb_static")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "emulator_arm=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:emulator_arm")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "emulator_x86=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:emulator_x86")));
+ assertThat(stubContents).contains("source_properties_file=\"${WORKSPACE_DIR}/"
+ + SOURCE_PROPERTIES + "\"");
+ assertThat(stubContents).contains("emulator_system_images=\"" + systemImageString + "\"");
+ }
+
+ @Test
+ public void testWellFormedDevice_withKvm() throws Exception {
+ ConfiguredTarget target = scratchConfiguredTarget(
+ "tools/android/emulated_device",
+ "nexus_6",
+ "android_device(",
+ " name = 'nexus_6', ",
+ " ram = 2048, ",
+ " horizontal_resolution = 720, ",
+ " vertical_resolution = 1280, ",
+ " cache = 32, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 280, ",
+ " vm_heap = 256,",
+ " tags = ['requires-kvm']",
+ ")");
+
+ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith(
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)),
+ "nexus_6_images/userdata_images.dat");
+
+ assertThat(action.getExecutionInfo())
+ .containsEntry(REQUIRES_KVM, "");
+ assertNotNull(target.get(ExecutionInfoProvider.SKYLARK_CONSTRUCTOR.getKey()));
+ assertThat(
+ ((ExecutionInfoProvider) target.get(ExecutionInfoProvider.SKYLARK_CONSTRUCTOR.getKey()))
+ .getExecutionInfo())
+ .containsKey(REQUIRES_KVM);
+ }
+
+ @Test
+ public void testWellFormedDevice_defaultPropertiesPresent() throws Exception {
+ String dummyPropPackage = "tools/android/emulated_device/data";
+ String dummyPropFile = "default.properties";
+ String dummyPropLabel = String.format("//%s:%s", dummyPropPackage, dummyPropFile);
+ scratch.file(String.format("%s/%s", dummyPropPackage, dummyPropFile),
+ "ro.build.id=HiThere");
+ scratch.file(String.format("%s/BUILD", dummyPropPackage),
+ "exports_files(['default.properties'])");
+ ConfiguredTarget target = scratchConfiguredTarget(
+ "tools/android/emulated_device",
+ "nexus_6",
+ "android_device(",
+ " name = 'nexus_6', ",
+ " ram = 2048, ",
+ " horizontal_resolution = 720, ",
+ " vertical_resolution = 1280, ",
+ " cache = 32, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 280, ",
+ " vm_heap = 256,",
+ " default_properties = '" + dummyPropLabel + "'",
+ ")");
+
+
+ Set<String> outputBasenames = new HashSet<>();
+ for (Artifact outArtifact : getFilesToBuild(target)) {
+ outputBasenames.add(outArtifact.getPath().getBaseName());
+ }
+
+ assertWithMessage("Not generating expected outputs.").that(outputBasenames)
+ .containsExactly("nexus_6", "userdata_images.dat", "emulator-meta-data.pb");
+
+ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith(
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)),
+ "nexus_6_images/userdata_images.dat");
+
+
+ String systemImageString = Joiner.on(" ").join(SYSTEM_IMAGE_FILES);
+ Iterable<String> biosFilesExecPathStrings =
+ Iterables.transform(
+ getToolDependency("//tools/android/emulator:emulator_x86_bios").getFilesToRun(),
+ new Function<Artifact, String>() {
+ @Override
+ public String apply(Artifact artifact) {
+ return artifact.getExecPathString();
+ }
+ });
+
+ assertWithMessage("Invalid boot commandline.")
+ .that(action.getArguments())
+ .containsExactly(
+ getToolDependencyExecPathString("//tools/android/emulator:unified_launcher"),
+ "--action=boot",
+ "--density=280",
+ "--memory=2048",
+ "--skin=720x1280",
+ "--cache=32",
+ "--vm_size=256",
+ "--system_images=" + systemImageString,
+ "--bios_files=" + Joiner.on(",").join(biosFilesExecPathStrings),
+ "--source_properties_file=" + SOURCE_PROPERTIES,
+ "--generate_output_dir="
+ + targetConfig.getBinFragment()
+ + "/tools/android/emulated_device/nexus_6_images",
+ "--adb_static=" + getToolDependencyExecPathString("//tools/android:adb_static"),
+ "--emulator_x86="
+ + getToolDependencyExecPathString("//tools/android/emulator:emulator_x86"),
+ "--emulator_arm="
+ + getToolDependencyExecPathString("//tools/android/emulator:emulator_arm"),
+ "--adb=" + getToolDependencyExecPathString("//tools/android:adb"),
+ "--mksdcard=" + getToolDependencyExecPathString("//tools/android/emulator:mksd"),
+ "--empty_snapshot_fs="
+ + getToolDependencyExecPathString("//tools/android/emulator:empty_snapshot_fs"),
+ "--flag_configured_android_tools",
+ "--nocopy_system_images",
+ "--single_image_file",
+ "--android_sdk_path="
+ + getToolDependencyExecPathString("//tools/android/emulator:sdk_path"),
+ "--platform_apks=",
+ "--default_properties_file=" + String.format("%s/%s", dummyPropPackage, dummyPropFile));
+
+ TemplateExpansionAction stubAction = (TemplateExpansionAction) getGeneratingAction(
+ getExecutable(target));
+ String stubContents = stubAction.getFileContents();
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "unified_launcher=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:unified_launcher")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "adb=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android:adb")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "adb_static=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android:adb_static")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "emulator_arm=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:emulator_arm")));
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "emulator_x86=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:emulator_x86")));
+ assertThat(stubContents).contains(
+ "source_properties_file=\"${WORKSPACE_DIR}/" + SOURCE_PROPERTIES + "\"");
+ assertThat(stubContents).contains("emulator_system_images=\"" + systemImageString + "\"");
+ assertThat(stubContents)
+ .contains(
+ String.format(
+ "android_sdk_path=\"${WORKSPACE_DIR}/%s\"",
+ getToolDependencyRunfilesPathString("//tools/android/emulator:sdk_path")));
+
+ assertThat(target.getProvider(RunfilesProvider.class).getDefaultRunfiles().getArtifacts())
+ .contains(getToolDependency("//tools/android/emulator:unified_launcher").getExecutable());
+ }
+
+ @Test
+ public void testPlatformApksFlag_multipleApks() throws Exception {
+ String dummyPlatformApkPackage = "tools/android/emulated_device/data";
+ List<String> dummyPlatformApkFiles = Lists.newArrayList(
+ "dummy1.apk",
+ "dummy2.apk",
+ "dummy3.apk",
+ "dummy4.apk");
+ List<String> platformApkFullPaths = Lists.newArrayList();
+ List<String> dummyPlatformApkLabels = Lists.newArrayList();
+ for (String dummyPlatformApkFile : dummyPlatformApkFiles) {
+ String platformApkFullPath = String.format("%s/%s",
+ dummyPlatformApkPackage, dummyPlatformApkFile);
+ platformApkFullPaths.add(platformApkFullPath);
+ String dummyPlatformApkLabel = String.format("'//%s:%s'",
+ dummyPlatformApkPackage, dummyPlatformApkFile);
+ dummyPlatformApkLabels.add(dummyPlatformApkLabel);
+ scratch.file(String.format("%s/%s", dummyPlatformApkPackage, dummyPlatformApkFile),
+ dummyPlatformApkFile);
+ }
+ scratch.file(String.format("%s/BUILD", dummyPlatformApkPackage),
+ "exports_files(['dummy1.apk', 'dummy2.apk', 'dummy3.apk', 'dummy4.apk'])");
+ ConfiguredTarget target = scratchConfiguredTarget(
+ "tools/android/emulated_device",
+ "nexus_6",
+ "android_device(",
+ " name = 'nexus_6', ",
+ " ram = 2048, ",
+ " horizontal_resolution = 720, ",
+ " vertical_resolution = 1280, ",
+ " cache = 32, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 280, ",
+ " vm_heap = 256,",
+ " platform_apks = [" + Joiner.on(", ").join(dummyPlatformApkLabels) + "]",
+ ")");
+
+ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith(
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)),
+ "nexus_6_images/userdata_images.dat");
+
+ assertWithMessage("Missing platform_apks flag").that(action.getArguments())
+ .contains("--platform_apks=" + Joiner.on(",").join(platformApkFullPaths));
+ }
+
+ @Test
+ public void testPlatformApksFlag() throws Exception {
+ String dummyPlatformApkPackage = "tools/android/emulated_device/data";
+ String dummyPlatformApkFile = "dummy.apk";
+ String dummyPlatformApkLabel = String.format("//%s:%s",
+ dummyPlatformApkPackage, dummyPlatformApkFile);
+ scratch.file(String.format("%s/%s", dummyPlatformApkPackage, dummyPlatformApkFile),
+ "dummyApk");
+ scratch.file(String.format("%s/BUILD", dummyPlatformApkPackage),
+ "exports_files(['dummy.apk'])");
+ ConfiguredTarget target = scratchConfiguredTarget(
+ "tools/android/emulated_device",
+ "nexus_6",
+ "android_device(",
+ " name = 'nexus_6', ",
+ " ram = 2048, ",
+ " horizontal_resolution = 720, ",
+ " vertical_resolution = 1280, ",
+ " cache = 32, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 280, ",
+ " vm_heap = 256,",
+ " platform_apks = ['" + dummyPlatformApkLabel + "']",
+ ")");
+
+ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith(
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)),
+ "nexus_6_images/userdata_images.dat");
+
+ assertWithMessage("Missing platform_apks flag").that(action.getArguments())
+ .contains("--platform_apks=" + String.format("%s/%s",
+ dummyPlatformApkPackage, dummyPlatformApkFile));
+ }
+
+ @Test
+ public void testBadAttributes() throws Exception {
+ checkError("bad/ram", "bad_ram", "ram must be",
+ "android_device(name = 'bad_ram', ",
+ " ram = -1, ",
+ " vm_heap = 24, ",
+ " cache = 123, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 456, ",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 800) ");
+ checkError("bad/vm", "bad_vm", "heap must be",
+ "android_device(name = 'bad_vm', ",
+ " ram = 512, ",
+ " vm_heap = -24, ",
+ " cache = 123, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 456, ",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 800) ");
+ checkError("bad/cache", "bad_cache", "cache must be",
+ "android_device(name = 'bad_cache', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = -123, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = 456, ",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 800) ");
+ checkError("bad/density", "bad_density", "density must be",
+ "android_device(name = 'bad_density', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = -456, ",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 800) ");
+ checkError("bad/horizontal", "bad_horizontal", "horizontal must be",
+ "android_device(name = 'bad_horizontal', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " screen_density = -456, ",
+ " horizontal_resolution = 100, ",
+ " vertical_resolution = 800) ");
+ checkError("bad/vertical", "bad_vertical", "vertical must be",
+ "android_device(name = 'bad_vertical', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " screen_density = -456, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 100) ");
+ checkError("bad/bogus_default_prop", "bogus_default_prop", "no such package",
+ "android_device(name = 'bogus_default_prop', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " screen_density = 311, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " default_properties = '//something/somewhere',",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 100) ");
+ checkError("bad/multi_default_prop", "multi_default_prop", "expected a single artifact",
+ "android_device(name = 'multi_default_prop', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " screen_density = 311, ",
+ " system_image = '" + SYSTEM_IMAGE_LABEL + "',",
+ " default_properties = '" + SYSTEM_IMAGE_LABEL + "',",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 100) ");
+ checkError("bad/filegroup", "bad_filegroup", "No source.properties",
+ "filegroup(name = 'empty',",
+ " srcs = [])",
+ "android_device(name = 'bad_filegroup', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " screen_density = -456, ",
+ " system_image = ':empty',",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 100) ");
+ checkError("bad/filegroup_2", "bad_filegroup2", "Multiple source.properties",
+ "filegroup(name = 'empty',",
+ " srcs = ['source.properties', 'foo/source.properties'])",
+ "android_device(name = 'bad_filegroup2', ",
+ " ram = 512, ",
+ " vm_heap = 24, ",
+ " cache = 23, ",
+ " screen_density = -456, ",
+ " system_image = ':empty',",
+ " horizontal_resolution = 640, ",
+ " vertical_resolution = 100) ");
+
+ }
+}
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 48c6a9c4d1..b543ba853d 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
@@ -115,3 +115,17 @@ java_library(
"//third_party:truth",
],
)
+
+java_test(
+ name = "AndroidDeviceTest",
+ srcs = ["AndroidDeviceTest.java"],
+ deps = [
+ "//src/main/java/com/google/devtools/build/lib:build-base",
+ "//src/main/java/com/google/devtools/build/lib/actions",
+ "//src/test/java/com/google/devtools/build/lib:actions_testutil",
+ "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+ "//third_party:guava",
+ "//third_party:junit4",
+ "//third_party:truth",
+ ],
+)