diff options
author | ajmichael <ajmichael@google.com> | 2018-01-26 13:02:28 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-26 13:04:30 -0800 |
commit | 12f82746fd0fc77a35524e002689ab90b7d026dd (patch) | |
tree | 51a4d33381cdd1adb740be884ba5de11f4846851 | |
parent | 6fff4da5f5e436551aa9294b58960da1d64af39a (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.java | 3 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java | 2 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestRule.java | 2 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkCommon.java | 15 | ||||
-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.java | 39 |
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(); + } } |