aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Sergio Campama <kaipi@google.com>2016-12-12 17:43:29 +0000
committerGravatar John Cater <jcater@google.com>2016-12-12 20:36:04 +0000
commit860f28f421e3c2ba7fc6b321224cea81b1024fab (patch)
tree3eb77a5f8b1f692607f1329200809f55feef562c
parentb11dd482eef2eb922686fb9ba96e39113cc1abd1 (diff)
Migrates TestEnvironmentProvider to using the new Skylark declared providers API. This enables creating a TestEnvironmentProvider from Skylark.
-- PiperOrigin-RevId: 141775285 MOS_MIGRATED_REVID=141775285
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModule.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/test/TestEnvironmentProvider.java24
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModuleTest.java27
6 files changed, 95 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 78877d3425..61b8109160 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -216,7 +216,10 @@ public final class RuleConfiguredTargetBuilder {
.setInstrumentedFiles(providersBuilder.getProvider(InstrumentedFilesProvider.class));
TestEnvironmentProvider environmentProvider =
- providersBuilder.getProvider(TestEnvironmentProvider.class);
+ (TestEnvironmentProvider)
+ skylarkDeclaredProviders
+ .build()
+ .get(TestEnvironmentProvider.SKYLARK_CONSTRUCTOR.getKey());
if (environmentProvider != null) {
testActionBuilder.addExtraEnv(environmentProvider.getEnvironment());
}
@@ -310,6 +313,21 @@ public final class RuleConfiguredTargetBuilder {
}
/**
+ * Adds "declared providers" defined in native code to the rule. Use this method for declared
+ * providers in definitions of native rules.
+ *
+ * <p>Use {@link #addSkylarkDeclaredProvider(SkylarkClassObject, Location)} for Skylark rule
+ * implementations.
+ */
+ public RuleConfiguredTargetBuilder addNativeDeclaredProviders(
+ Iterable<SkylarkClassObject> providers) {
+ for (SkylarkClassObject provider : providers) {
+ addNativeDeclaredProvider(provider);
+ }
+ return this;
+ }
+
+ /**
* Adds a "declared provider" defined in native code to the rule.
* Use this method for declared providers in definitions of native rules.
*
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index d75b0b4a06..2902cdc65b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -227,8 +227,8 @@ public final class IosTest implements RuleConfiguredTargetFactory {
.addProvider(xcodeProvider)
.addProvider(RunfilesProvider.simple(runfiles))
.addNativeDeclaredProvider(new ExecutionInfoProvider(execInfoMapBuilder.build()))
+ .addNativeDeclaredProviders(testSupport.getExtraProviders())
.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
- .addProviders(testSupport.getExtraProviders())
.setRunfilesSupport(runfilesSupport, executable)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
index 8dcab44fd3..a1fb0acfe0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
@@ -26,11 +26,11 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles.Builder;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.DottedVersion;
import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SimulatorRule;
@@ -242,7 +242,7 @@ public class TestSupport {
* Returns any additional providers that need to be exported to the rule context to the passed
* builder.
*/
- public TransitiveInfoProviderMap getExtraProviders() {
+ public Iterable<SkylarkClassObject> getExtraProviders() {
IosDeviceProvider deviceProvider =
ruleContext.getPrerequisite(IosTest.TARGET_DEVICE, Mode.TARGET, IosDeviceProvider.class);
DottedVersion xcodeVersion = deviceProvider.getXcodeVersion();
@@ -260,7 +260,7 @@ public class TestSupport {
envBuilder.put("APPLE_COVERAGE", "1");
}
- return TransitiveInfoProviderMap.of(new TestEnvironmentProvider(envBuilder.build()));
+ return ImmutableList.<SkylarkClassObject>of(new TestEnvironmentProvider(envBuilder.build()));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModule.java b/src/main/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModule.java
index 7714d59240..e9d7cdd6ee 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModule.java
@@ -59,6 +59,37 @@ public class SkylarkTestingModule {
}
};
+ // TODO(bazel-team): Change this BuiltinFunction to be the actual
+ // TestEnvironmentProvider.SKYLARK_CONSTRUCTOR.
+ @SkylarkSignature(
+ name = "TestEnvironment",
+ objectType = SkylarkTestingModule.class,
+ returnType = TestEnvironmentProvider.class,
+ doc =
+ "Creates a new test environment provider. Use this provider to specify extra"
+ + "environment variables to be made available during test execution.",
+ parameters = {
+ @Param(name = "self", type = SkylarkTestingModule.class, doc = "The 'testing' instance."),
+ @Param(
+ name = "environment",
+ type = SkylarkDict.class,
+ named = false,
+ positional = true,
+ doc =
+ "A map of string keys and values that represent environment variables and their values."
+ + " These will be made available during the test execution."
+ )
+ }
+ )
+ public static final BuiltinFunction NEW_TEST_ENVIRONMENT_PROVIDER =
+ new BuiltinFunction("TestEnvironment") {
+ @SuppressWarnings("unused")
+ // This method is registered statically for skylark, and never called directly.
+ public TestEnvironmentProvider invoke(SkylarkTestingModule self, SkylarkDict environment) {
+ return new TestEnvironmentProvider(environment);
+ }
+ };
+
static {
SkylarkSignatureProcessor.configureSkylarkFunctions(SkylarkTestingModule.class);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestEnvironmentProvider.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestEnvironmentProvider.java
index 0b8f01924b..9c81c0c6a4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestEnvironmentProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestEnvironmentProvider.java
@@ -18,20 +18,24 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
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 java.util.Map;
-/**
- * Provider containing any additional environment variables for use in the test action.
- */
+/** Provider containing any additional environment variables for use in the test action. */
@Immutable
-public final class TestEnvironmentProvider implements TransitiveInfoProvider {
- private final ImmutableMap<String, String> environment;
+public final class TestEnvironmentProvider extends SkylarkClassObject
+ implements TransitiveInfoProvider {
- /**
- * Constructs a new provider with the given variable name to variable value mapping.
- */
- public TestEnvironmentProvider(ImmutableMap<String, String> environment) {
+ /** Skylark constructor and identifier for TestEnvironmentProvider. */
+ public static final SkylarkClassObjectConstructor SKYLARK_CONSTRUCTOR =
+ SkylarkClassObjectConstructor.createNative("TestEnvironment");
+
+ private final Map<String, String> environment;
+
+ /** Constructs a new provider with the given variable name to variable value mapping. */
+ public TestEnvironmentProvider(Map<String, String> environment) {
+ super(SKYLARK_CONSTRUCTOR, ImmutableMap.<String, Object>of("environment", environment));
this.environment = Preconditions.checkNotNull(environment);
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModuleTest.java b/src/test/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModuleTest.java
index 786c571f73..021a96340d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModuleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/test/SkylarkTestingModuleTest.java
@@ -51,4 +51,31 @@ public class SkylarkTestingModuleTest extends BuildViewTestCase {
assertThat(provider.getExecutionInfo().get("requires-darwin")).isEqualTo("1");
}
+
+ @Test
+ public void testSkylarkRulePropagatesTestEnvironmentProvider() throws Exception {
+ scratch.file("examples/rule/BUILD");
+ scratch.file(
+ "examples/rule/apple_rules.bzl",
+ "def my_rule_impl(ctx):",
+ " test_env = testing.TestEnvironment({'XCODE_VERSION_OVERRIDE': '7.3.1'})",
+ " return [test_env]",
+ "my_rule = rule(implementation = my_rule_impl,",
+ " attrs = {},",
+ ")");
+ scratch.file(
+ "examples/apple_skylark/BUILD",
+ "package(default_visibility = ['//visibility:public'])",
+ "load('/examples/rule/apple_rules', 'my_rule')",
+ "my_rule(",
+ " name = 'my_target',",
+ ")");
+
+ ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+ TestEnvironmentProvider provider =
+ (TestEnvironmentProvider)
+ skylarkTarget.get(TestEnvironmentProvider.SKYLARK_CONSTRUCTOR.getKey());
+
+ assertThat(provider.getEnvironment().get("XCODE_VERSION_OVERRIDE")).isEqualTo("7.3.1");
+ }
}