From 3ea6a557854530c36f170e7a8d868b51663939d1 Mon Sep 17 00:00:00 2001 From: ajmichael Date: Mon, 12 Feb 2018 12:29:14 -0800 Subject: Make AndroidInstrumentationInfo createable from Skylark. This enables writing tests for android_instrumentation_test that mock android_binary using a skylark rule that returns an AndroidInstrumentationInfo. RELNOTES: None PiperOrigin-RevId: 185417182 --- .../rules/android/AndroidInstrumentationInfo.java | 28 ++++++++++++++++++++- .../build/lib/rules/android/AndroidBinaryTest.java | 29 ++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java index b588861ab5..d5a3fa2ef9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java @@ -13,13 +13,17 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.FunctionSignature; +import com.google.devtools.build.lib.syntax.SkylarkType; /** * A provider for targets that create Android instrumentations. Consumed by Android testing rules. @@ -33,9 +37,31 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; public class AndroidInstrumentationInfo extends NativeInfo { private static final String SKYLARK_NAME = "AndroidInstrumentationInfo"; + private static final FunctionSignature.WithValues SIGNATURE = + FunctionSignature.WithValues.create( + FunctionSignature.of( + /*numMandatoryPositionals=*/ 0, + /*numOptionalPositionals=*/ 0, + /*numMandatoryNamedOnly*/ 2, + /*starArg=*/ false, + /*kwArg=*/ false, + "target_apk", + "instrumentation_apk"), + /*defaultValues=*/ null, + /*types=*/ ImmutableList.of( + SkylarkType.of(Artifact.class), // target_apk + SkylarkType.of(Artifact.class))); // instrumentation_apk public static final NativeProvider PROVIDER = new NativeProvider( - AndroidInstrumentationInfo.class, SKYLARK_NAME) {}; + AndroidInstrumentationInfo.class, SKYLARK_NAME, SIGNATURE) { + @Override + protected AndroidInstrumentationInfo createInstanceFromSkylark( + Object[] args, Location loc) { + return new AndroidInstrumentationInfo( + /*targetApk=*/ (Artifact) args[0], + /*instrumentationApk=*/ (Artifact) args[1]); + } + }; private final Artifact targetApk; private final Artifact instrumentationApk; diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java index ccf94bfbf8..1a7cec0813 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java @@ -4077,6 +4077,35 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "java/com/google/android/instr/b1.apk", "java/com/google/android/instr/b2.apk"); } + @Test + public void testInstrumentationInfoCreatableFromSkylark() throws Exception { + scratch.file( + "java/com/google/android/instr/BUILD", + "load(':instr.bzl', 'instr')", + "android_binary(name = 'b1',", + " srcs = ['b1.java'],", + " instruments = ':b2',", + " manifest = 'AndroidManifest.xml')", + "android_binary(name = 'b2',", + " srcs = ['b2.java'],", + " manifest = 'AndroidManifest.xml')", + "instr(name = 'instr', dep = ':b1')"); + scratch.file( + "java/com/google/android/instr/instr.bzl", + "def _impl(ctx):", + " target = ctx.attr.dep[AndroidInstrumentationInfo].target_apk", + " instr = ctx.attr.dep[AndroidInstrumentationInfo].instrumentation_apk", + " return [AndroidInstrumentationInfo(target_apk=target,instrumentation_apk=instr)]", + "instr = rule(implementation=_impl,", + " attrs={'dep': attr.label(providers=[AndroidInstrumentationInfo])})"); + ConfiguredTarget instr = getConfiguredTarget("//java/com/google/android/instr"); + assertThat(instr).isNotNull(); + assertThat(instr.get(AndroidInstrumentationInfo.PROVIDER).getTargetApk().prettyPrint()) + .isEqualTo("java/com/google/android/instr/b2.apk"); + assertThat(instr.get(AndroidInstrumentationInfo.PROVIDER).getInstrumentationApk().prettyPrint()) + .isEqualTo("java/com/google/android/instr/b1.apk"); + } + @Test public void testInstrumentationInfoProviderHasApks() throws Exception { scratch.file( -- cgit v1.2.3