aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Sergio Campama <kaipi@google.com>2016-11-04 21:03:25 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-11-07 09:52:58 +0000
commit6e8e9c081ed9d0fbbc77b3da5248d49ca034e5e8 (patch)
treeab71b31f430a0bfb86bd1a0cf889fb9fc0e1536c /src
parenta0994dc961eb5a4021d6563cc9ac4a22f5c85000 (diff)
Adds Skylark support to XcTestAppProvider
-- MOS_MIGRATED_REVID=138231767
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java44
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java41
3 files changed, 84 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 10f3903741..4560718c22 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -146,6 +146,7 @@ import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcProvider;
import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses;
import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule;
+import com.google.devtools.build.lib.rules.objc.XcTestAppProvider;
import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule;
import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule;
@@ -551,6 +552,8 @@ public class BazelRuleClassProvider {
builder.addBuildInfoFactory(new ObjcBuildInfoFactory());
builder.registerSkylarkProvider(
ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, ObjcProvider.class);
+ builder.registerSkylarkProvider(
+ XcTestAppProvider.XCTEST_APP_SKYLARK_PROVIDER_NAME, XcTestAppProvider.class);
builder.addSkylarkAccessibleTopLevels("apple_common", new AppleSkylarkCommon());
builder.addConfig(ObjcCommandLineOptions.class, new ObjcConfigurationLoader());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
index 5583c4ece6..45380b3cd8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.rules.objc;
import com.google.common.annotations.VisibleForTesting;
+import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.packages.SkylarkClassObject;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.apple.Platform;
@@ -156,6 +157,49 @@ public class AppleSkylarkCommon {
}
};
+ @SkylarkSignature(
+ name = "new_xctest_app_provider",
+ objectType = AppleSkylarkCommon.class,
+ returnType = XcTestAppProvider.class,
+ doc = "Creates a new XcTestAppProvider instance.",
+ parameters = {
+ @Param(name = "self", type = AppleSkylarkCommon.class, doc = "The apple_common instance."),
+ @Param(
+ name = "bundle_loader",
+ type = Artifact.class,
+ named = true,
+ positional = false,
+ doc = "The bundle loader for the test. Corresponds to the binary inside the test IPA."
+ ),
+ @Param(
+ name = "ipa",
+ type = Artifact.class,
+ named = true,
+ positional = false,
+ doc = "The test IPA."
+ ),
+ @Param(
+ name = "objc_provider",
+ type = ObjcProvider.class,
+ named = true,
+ positional = false,
+ doc = "An ObjcProvider that should be included by tests using this test bundle."
+ )
+ }
+ )
+ public static final BuiltinFunction NEW_XCTEST_APP_PROVIDER =
+ new BuiltinFunction("new_xctest_app_provider") {
+ @SuppressWarnings("unused")
+ // This method is registered statically for skylark, and never called directly.
+ public XcTestAppProvider invoke(
+ AppleSkylarkCommon self,
+ Artifact bundleLoader,
+ Artifact ipa,
+ ObjcProvider objcProvider) {
+ return new XcTestAppProvider(bundleLoader, ipa, objcProvider);
+ }
+ };
+
static {
SkylarkSignatureProcessor.configureSkylarkFunctions(AppleSkylarkCommon.class);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java
index 3d47454e2e..3a9656d244 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcTestAppProvider.java
@@ -14,21 +14,41 @@
package com.google.devtools.build.lib.rules.objc;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.util.Preconditions;
-/**
- * Supplies information needed when a dependency serves as an {@code xctest_app}.
- */
+/** Supplies information needed when a dependency serves as an {@code xctest_app}. */
@Immutable
-public final class XcTestAppProvider implements TransitiveInfoProvider {
+@SkylarkModule(
+ name = "XcTestAppProvider",
+ category = SkylarkModuleCategory.PROVIDER,
+ doc = "A provider for XCTest apps for testing."
+)
+public final class XcTestAppProvider extends SkylarkClassObject implements TransitiveInfoProvider {
+ /**
+ * The skylark struct key name for a rule implementation to use when exporting an ObjcProvider.
+ */
+ public static final String XCTEST_APP_SKYLARK_PROVIDER_NAME = "xctest_app";
+
+ private static final SkylarkClassObjectConstructor XCTEST_APP_PROVIDER =
+ SkylarkClassObjectConstructor.createNative("xctest_app_provider");
+
private final Artifact bundleLoader;
private final Artifact ipa;
private final ObjcProvider objcProvider;
XcTestAppProvider(Artifact bundleLoader, Artifact ipa, ObjcProvider objcProvider) {
+ super(
+ XCTEST_APP_PROVIDER,
+ getSkylarkFields(bundleLoader, ipa, objcProvider),
+ "XcTestAppProvider field %s could not be instantiated");
this.bundleLoader = Preconditions.checkNotNull(bundleLoader);
this.ipa = Preconditions.checkNotNull(ipa);
this.objcProvider = Preconditions.checkNotNull(objcProvider);
@@ -41,6 +61,7 @@ public final class XcTestAppProvider implements TransitiveInfoProvider {
return bundleLoader;
}
+ /** The test app's IPA. */
public Artifact getIpa() {
return ipa;
}
@@ -50,8 +71,20 @@ public final class XcTestAppProvider implements TransitiveInfoProvider {
* {@code xctest_app}. This is <strong>not</strong> a typical {@link ObjcProvider} - it has
* certain linker-releated keys omitted, such as {@link ObjcProvider#LIBRARY}, since XcTests have
* access to symbols in their test rig without linking them into the main test binary.
+ *
+ * <p>The current list of whitelisted values can be found in
+ * {@link ReleaseBundlingSupport#xcTestAppProvider}.
*/
public ObjcProvider getObjcProvider() {
return objcProvider;
}
+
+ private static ImmutableMap<String, Object> getSkylarkFields(
+ Artifact bundleLoader, Artifact ipa, ObjcProvider objcProvider) {
+ return new ImmutableMap.Builder<String, Object>()
+ .put("bundle_loader", bundleLoader)
+ .put("ipa", ipa)
+ .put("objc", objcProvider)
+ .build();
+ }
}