aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/Constants.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosDeviceProvider.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTestSubstitutionProvider.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java22
6 files changed, 71 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/Constants.java b/src/main/java/com/google/devtools/build/lib/Constants.java
index ee32c59f31..f976be85da 100644
--- a/src/main/java/com/google/devtools/build/lib/Constants.java
+++ b/src/main/java/com/google/devtools/build/lib/Constants.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
/**
* Various constants required by Bazel.
@@ -80,4 +81,9 @@ public class Constants {
*/
public static final String PARSER_ERROR_EXTENSION_NEEDED =
"Move this construct to a macro in a .bzl file and load it";
+
+ /**
+ * Rule classes which specify iOS devices for running tests.
+ */
+ public static final ImmutableSet<String> IOS_DEVICE_RULE_CLASSES = ImmutableSet.of("ios_device");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java
index babed00135..349b3176f5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ExperimentalIosTestRule.java
@@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.Type.LABEL;
+import com.google.devtools.build.lib.Constants;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
@@ -47,7 +48,7 @@ public final class ExperimentalIosTestRule implements RuleDefinition {
ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ))
.override(attr(IosTest.TARGET_DEVICE, LABEL)
.allowedFileTypes()
- .allowedRuleClasses("ios_device")
+ .allowedRuleClasses(Constants.IOS_DEVICE_RULE_CLASSES)
.value(env.getLabel("//tools/objc/sim_devices:default")))
.add(attr("$test_template", LABEL)
.value(env.getLabel("//tools/objc:ios_test.sh.bazel_template")))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java
index 2f01633a30..fe0587d449 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java
@@ -37,6 +37,7 @@ public final class IosDevice implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(context)
.add(RunfilesProvider.class, RunfilesProvider.EMPTY)
.add(IosDeviceProvider.class, provider)
+ .add(IosTestSubstitutionProvider.class, provider.iosTestSubstitutionProvider())
.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDeviceProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDeviceProvider.java
index e729a235c4..98cf21da51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDeviceProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDeviceProvider.java
@@ -20,8 +20,6 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import java.util.List;
-
/**
* Provider that describes a simulator device.
*/
@@ -76,13 +74,13 @@ public final class IosDeviceProvider implements TransitiveInfoProvider {
}
/**
- * Returns a list of substitutions which should be performed to the test runner script, to fill
- * in device-specific data which may be required in order to run tests.
+ * Returns an {@code IosTestSubstitutionProvider} exposing substitutions indicating how to run a
+ * test in this particular iOS simulator configuration.
*/
- public List<Substitution> getSubstitutionsForTestRunnerScript() {
- return ImmutableList.of(
+ public IosTestSubstitutionProvider iosTestSubstitutionProvider() {
+ return new IosTestSubstitutionProvider(ImmutableList.of(
Substitution.of("%(device_type)s", getType()),
Substitution.of("%(simulator_sdk)s", getIosVersion())
- );
+ ));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestSubstitutionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestSubstitutionProvider.java
new file mode 100644
index 0000000000..6c4dae5c0e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestSubstitutionProvider.java
@@ -0,0 +1,41 @@
+// Copyright 2015 Google Inc. 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.objc;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+
+/**
+ * Provides substitutions which should be performed to the test runner script of
+ * {@code experimental_ios_test} targets.
+ */
+@Immutable
+public final class IosTestSubstitutionProvider implements TransitiveInfoProvider {
+
+ private final ImmutableList<Substitution> substitutions;
+
+ public IosTestSubstitutionProvider(Iterable<Substitution> substitutions) {
+ this.substitutions = ImmutableList.copyOf(substitutions);
+ }
+
+ /**
+ * Returns a list of substitutions which should be performed to the test runner script.
+ */
+ public ImmutableList<Substitution> getSubstitutionsForTestRunnerScript() {
+ return substitutions;
+ }
+}
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 abf40ef21e..b46ccf4763 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
@@ -22,8 +22,10 @@ import com.google.devtools.build.lib.analysis.FileProvider;
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;
+import com.google.devtools.build.lib.analysis.RunfilesProvider;
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.util.FileType;
@@ -60,8 +62,6 @@ class TestSupport {
// xctestIpa is the app bundle being tested
Artifact xctestIpa = xctestIpa();
- IosDeviceProvider targetDevice = targetDevice();
-
List<Substitution> substitutions = new ImmutableList.Builder<Substitution>()
.add(Substitution.of("%(test_app_ipa)s", testIpa.getRootRelativePathString()))
.add(Substitution.of("%(test_app_name)s", baseNameWithoutIpa(testIpa)))
@@ -71,7 +71,7 @@ class TestSupport {
.add(Substitution.of("%(iossim_path)s", iossim().getRootRelativePath().getPathString()))
- .addAll(targetDevice.getSubstitutionsForTestRunnerScript())
+ .addAll(deviceSubstitutions().getSubstitutionsForTestRunnerScript())
.build();
@@ -81,8 +81,9 @@ class TestSupport {
template, generatedTestScript(), substitutions, /*executable=*/true));
}
- private IosDeviceProvider targetDevice() {
- return ruleContext.getPrerequisite("target_device", Mode.TARGET, IosDeviceProvider.class);
+ private IosTestSubstitutionProvider deviceSubstitutions() {
+ return ruleContext.getPrerequisite(
+ "target_device", Mode.TARGET, IosTestSubstitutionProvider.class);
}
private Artifact testIpa() {
@@ -108,11 +109,20 @@ class TestSupport {
.addArtifact(testIpa())
.addArtifact(xctestIpa())
.addArtifact(generatedTestScript())
- .addArtifact(iossim());
+ .addArtifact(iossim())
+ .addTransitiveArtifacts(deviceRunfiles());
return this;
}
/**
+ * Runfiles required in order to use the specified target device.
+ */
+ private NestedSet<Artifact> deviceRunfiles() {
+ return ruleContext.getPrerequisite("target_device", Mode.TARGET, RunfilesProvider.class)
+ .getDefaultRunfiles().getAllArtifacts();
+ }
+
+ /**
* Adds files which must be built in order to run this test to builder.
*/
TestSupport addFilesToBuild(NestedSetBuilder<Artifact> builder) {