aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2018-01-26 13:02:28 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-26 13:04:30 -0800
commit12f82746fd0fc77a35524e002689ab90b7d026dd (patch)
tree51a4d33381cdd1adb740be884ba5de11f4846851
parent6fff4da5f5e436551aa9294b58960da1d64af39a (diff)
Support Android testing with Skylark-defined device rules.
Do this by exposing DeviceBrokerInfo and a constructor for it in android_common. See AndroidInstrumentationTestTest for an example. RELNOTES: None PiperOrigin-RevId: 183432674
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerInfo.java (renamed from src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerTypeProvider.java)23
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java39
6 files changed, 68 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
index 057739510b..8f44097450 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java
@@ -132,8 +132,7 @@ public class AndroidDevice implements RuleConfiguredTargetFactory {
.setRunfilesSupport(runfilesSupport, executable)
.addFilesToRun(extraFilesToRun)
.addNativeDeclaredProvider(new ExecutionInfo(executionInfo))
- .addProvider(
- DeviceBrokerTypeProvider.class, new DeviceBrokerTypeProvider(DEVICE_BROKER_TYPE))
+ .addNativeDeclaredProvider(new DeviceBrokerInfo(DEVICE_BROKER_TYPE))
.addProvider(
Dex2OatProvider.class, new Dex2OatProvider(cloudDex2oatEnabled))
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java
index 7c68827089..64a7cf04b2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java
@@ -300,7 +300,7 @@ public class AndroidInstrumentationTest implements RuleConfiguredTargetFactory {
private static String getDeviceBrokerType(RuleContext ruleContext) {
return ruleContext
- .getPrerequisite("target_device", Mode.HOST, DeviceBrokerTypeProvider.class)
+ .getPrerequisite("target_device", Mode.HOST, DeviceBrokerInfo.PROVIDER)
.getDeviceBrokerType();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java
index 07908ad1b1..9dfae4b389 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java
@@ -45,7 +45,7 @@ public class AndroidInstrumentationTestRule implements RuleDefinition {
.exec()
.cfg(HostTransition.INSTANCE)
.allowedFileTypes(FileTypeSet.NO_FILE)
- .allowedRuleClasses("android_device"))
+ .mandatoryProviders(DeviceBrokerInfo.PROVIDER.id()))
.add(
attr("support_apks", LABEL_LIST)
.allowedFileTypes(AndroidRuleClasses.APK)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
index be66ad689c..6cd0a855d9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java
@@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.android;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
+import com.google.devtools.build.lib.skylarkinterface.Param;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -27,6 +28,20 @@ import com.google.devtools.build.lib.vfs.PathFragment;
public class AndroidSkylarkCommon {
@SkylarkCallable(
+ name = "create_device_broker_info",
+ doc = "Create a device broker info",
+ parameters = {
+ @Param(
+ name = "type",
+ type = String.class
+ )
+ }
+ )
+ public DeviceBrokerInfo createDeviceBrokerInfo(String deviceBrokerType) {
+ return new DeviceBrokerInfo(deviceBrokerType);
+ }
+
+ @SkylarkCallable(
name = "resource_source_directory",
allowReturnNones = true,
doc =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerTypeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerInfo.java
index 7a0b926741..9d05cd274b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerTypeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DeviceBrokerInfo.java
@@ -1,4 +1,4 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
+// Copyright 2018 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.
@@ -13,16 +13,29 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.packages.NativeProvider;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
-/** Supplies the device broker type string, passed to the android_test runtime. */
+/** Supplies the device broker type string, passed to the Android test runtime. */
+@SkylarkModule(
+ name = "DeviceBrokerInfo",
+ doc = "Information about the device broker",
+ category = SkylarkModuleCategory.PROVIDER
+)
@Immutable
-public final class DeviceBrokerTypeProvider implements TransitiveInfoProvider {
+public final class DeviceBrokerInfo extends NativeInfo {
+
+ private static final String SKYLARK_NAME = "DeviceBrokerInfo";
+ public static final NativeProvider<DeviceBrokerInfo> PROVIDER =
+ new NativeProvider<DeviceBrokerInfo>(DeviceBrokerInfo.class, SKYLARK_NAME) {};
private final String deviceBrokerType;
- public DeviceBrokerTypeProvider(String deviceBrokerType) {
+ public DeviceBrokerInfo(String deviceBrokerType) {
+ super(PROVIDER);
this.deviceBrokerType = deviceBrokerType;
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
index 60931e2d61..fb958ab520 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestTest.java
@@ -17,6 +17,7 @@ import static com.google.common.truth.Truth.assertThat;
import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith;
import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FileProvider;
@@ -161,13 +162,7 @@ public class AndroidInstrumentationTestTest extends AndroidBuildViewTestCase {
ConfiguredTarget androidInstrumentationTest = getConfiguredTarget("//javatests/com/app/ait");
assertThat(androidInstrumentationTest).isNotNull();
- String testExecutableScript =
- ((TemplateExpansionAction)
- getGeneratingAction(
- androidInstrumentationTest
- .getProvider(FilesToRunProvider.class)
- .getExecutable()))
- .getFileContents();
+ String testExecutableScript = getTestStubContents(androidInstrumentationTest);
assertThat(testExecutableScript)
.contains("instrumentation_apk=\"javatests/com/app/instrumentation_app.apk\"");
@@ -225,6 +220,29 @@ public class AndroidInstrumentationTestTest extends AndroidBuildViewTestCase {
")");
}
+ @Test
+ public void testAndroidInstrumentationTestWithSkylarkDevice()
+ throws Exception {
+ scratch.file(
+ "javatests/com/app/skylarkdevice/local_adb_device.bzl",
+ "def _impl(ctx):",
+ " ctx.actions.write(output=ctx.outputs.executable, content='', is_executable=True)",
+ " return [android_common.create_device_broker_info('LOCAL_ADB_SERVER')]",
+ "local_adb_device = rule(implementation=_impl, executable=True)");
+ scratch.file(
+ "javatests/com/app/skylarkdevice/BUILD",
+ "load(':local_adb_device.bzl', 'local_adb_device')",
+ "local_adb_device(name = 'local_adb_device')",
+ "android_instrumentation_test(",
+ " name = 'ait',",
+ " instrumentation = '//javatests/com/app:instrumentation_app',",
+ " target_device = ':local_adb_device',",
+ ")");
+ String testExecutableScript =
+ getTestStubContents(getConfiguredTarget("//javatests/com/app/skylarkdevice:ait"));
+ assertThat(testExecutableScript).contains("device_broker_type=\"LOCAL_ADB_SERVER\"");
+ }
+
private static Artifact getDeviceFixtureScript(ConfiguredTarget deviceScriptFixture) {
return getFirstArtifactEndingWith(
deviceScriptFixture.getProvider(FileProvider.class).getFilesToBuild(), ".sh");
@@ -237,4 +255,11 @@ public class AndroidInstrumentationTestTest extends AndroidBuildViewTestCase {
private static Artifact getTargetApk(ConfiguredTarget instrumentation) {
return instrumentation.get(AndroidInstrumentationInfo.PROVIDER).getTargetApk();
}
+
+ private String getTestStubContents(ConfiguredTarget androidInstrumentationTest) throws Exception {
+ Action templateAction =
+ getGeneratingAction(
+ androidInstrumentationTest.getProvider(FilesToRunProvider.class).getExecutable());
+ return ((TemplateExpansionAction) templateAction).getFileContents();
+ }
}