diff options
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) { |