aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2018-02-12 12:29:14 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-12 12:30:43 -0800
commit3ea6a557854530c36f170e7a8d868b51663939d1 (patch)
tree768d9299107b2da4db22a6eb83b44cacb904fbfd /src
parent642c436ddc66a487b6f644c066ba14b63714aa6c (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationInfo.java28
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java29
2 files changed, 56 insertions, 1 deletions
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<Object, SkylarkType> 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<AndroidInstrumentationInfo> PROVIDER =
new NativeProvider<AndroidInstrumentationInfo>(
- 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
@@ -4078,6 +4078,35 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
}
@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(
"java/com/google/android/instr/BUILD",