From 7ba1731ad47eb86b8c14247b05240404d258175f Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Tue, 1 Sep 2015 16:12:41 +0000 Subject: Change ios_test to reflect experimental_ios_test functionality on mac. -- MOS_MIGRATED_REVID=102046532 --- .../build/lib/bazel/rules/objc/BazelIosTest.java | 45 +++++++------- .../lib/bazel/rules/objc/BazelIosTestRule.java | 70 ++++++++++++++++++---- .../devtools/build/lib/rules/objc/TestSupport.java | 12 ++-- 3 files changed, 87 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTest.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTest.java index 2950b151b5..150041b880 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTest.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTest.java @@ -14,58 +14,55 @@ package com.google.devtools.build.lib.bazel.rules.objc; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; -import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; 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.RunfilesSupport; -import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.rules.objc.ExecutionRequirements; import com.google.devtools.build.lib.rules.objc.IosTest; import com.google.devtools.build.lib.rules.objc.ObjcCommon; -import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses; +import com.google.devtools.build.lib.rules.objc.TestSupport; import com.google.devtools.build.lib.rules.objc.XcodeProvider; +import com.google.devtools.build.lib.rules.test.ExecutionInfoProvider; /** * Implementation for ios_test rule in Bazel. */ public final class BazelIosTest extends IosTest { - static final String IOS_TEST_ON_BAZEL_ATTR = "$ios_test_on_bazel"; - @Override public ConfiguredTarget create(RuleContext ruleContext, ObjcCommon common, XcodeProvider xcodeProvider, NestedSet filesToBuild) throws InterruptedException { - Artifact testRunner = ruleContext.getPrerequisiteArtifact(IOS_TEST_ON_BAZEL_ATTR, Mode.TARGET); - Artifact testScript = - ObjcRuleClasses.artifactByAppendingToBaseName(ruleContext, "_test_script"); + Runfiles.Builder runfilesBuilder = new Runfiles.Builder(ruleContext.getWorkspaceName()) + .addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES); + NestedSetBuilder filesToBuildBuilder = NestedSetBuilder.stableOrder() + .addTransitive(filesToBuild); + + TestSupport testSupport = new TestSupport(ruleContext) + .registerTestRunnerActions() + .addRunfiles(runfilesBuilder, common.getObjcProvider()) + .addFilesToBuild(filesToBuildBuilder); - ruleContext.registerAction( - new TemplateExpansionAction( - ruleContext.getActionOwner(), - testRunner, - testScript, - ImmutableList.of(), - /*executable=*/ true)); + Artifact executable = testSupport.generatedTestScript(); - Runfiles runfiles = new Runfiles.Builder(ruleContext.getWorkspaceName()) - .addArtifact(testScript).build(); + Runfiles runfiles = runfilesBuilder.build(); RunfilesSupport runfilesSupport = - RunfilesSupport.withExecutable(ruleContext, runfiles, testScript); + RunfilesSupport.withExecutable(ruleContext, runfiles, executable); return new RuleConfiguredTargetBuilder(ruleContext) - .setFilesToBuild(NestedSetBuilder.stableOrder() - .addTransitive(filesToBuild) - .add(testRunner) - .build()) + .setFilesToBuild(filesToBuildBuilder.build()) .add(XcodeProvider.class, xcodeProvider) .add(RunfilesProvider.class, RunfilesProvider.simple(runfiles)) - .setRunfilesSupport(runfilesSupport, testRunner) + .add(ExecutionInfoProvider.class, + new ExecutionInfoProvider(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""))) + .addProviders(testSupport.getExtraProviders(common.getObjcProvider())) + .setRunfilesSupport(runfilesSupport, executable) .build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java index 4b7c7c468d..49f711bd7e 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java @@ -14,20 +14,32 @@ package com.google.devtools.build.lib.bazel.rules.objc; +import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.Type.LABEL; +import static com.google.devtools.build.lib.packages.Type.LABEL_LIST; +import static com.google.devtools.build.lib.packages.Type.STRING_LIST; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; +import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration; +import com.google.devtools.build.lib.rules.objc.IosTest; import com.google.devtools.build.lib.rules.objc.ObjcConfiguration; import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses; import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport; import com.google.devtools.build.lib.rules.objc.XcodeSupport; +import com.google.devtools.build.lib.syntax.Label; +import com.google.devtools.build.lib.util.FileType; + +import java.util.List; /** * Rule definition for the ios_test rule. @@ -38,17 +50,55 @@ public final class BazelIosTestRule implements RuleDefinition { return builder .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class) /* -
    -
  • name.ipa: the test bundle as an - .ipa file -
  • name.xcodeproj/project.pbxproj: An Xcode project file which can be - used to develop or build on a Mac.
  • -
- */ +
    +
  • name.ipa: the test bundle as an + .ipa file +
  • name.xcodeproj/project.pbxproj: An Xcode project file which can be + used to develop or build on a Mac.
  • +
+ */ .setImplicitOutputsFunction( ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ)) - .add(attr(BazelIosTest.IOS_TEST_ON_BAZEL_ATTR, LABEL) - .value(env.getLabel("//tools/objc:ios_test_on_bazel")).exec()) + .override( + attr(IosTest.TARGET_DEVICE, LABEL) + .allowedFileTypes() + .allowedRuleClasses("ios_device") + .value(env.getLabel("//tools/objc/sim_devices:default"))) + /* + The device against how to run the test. If this attribute is defined, the test will run on + the lab device. Otherwise, the test will run on simulator. + ${SYNOPSIS} + */ + .add( + attr("ios_test_target_device", LABEL) + .allowedFileTypes() + .allowedRuleClasses("ios_lab_device")) + /* + Extra arguments to pass to the ios_test_target_device's binary. They should be + in the form KEY=VALUE or simply KEY (check your device's documentation for allowed + parameters). + ${SYNOPSIS} + */ + .add(attr("ios_device_arg", STRING_LIST)) + /* + Plugins to pass to the test runner. + ${SYNOPSIS} + */ + .add(attr("plugins", LABEL_LIST).allowedFileTypes(FileType.of("_deploy.jar"))) + .add(attr("$test_template", LABEL) + .value(env.getLabel("//tools/objc:ios_test.sh.bazel_template"))) + .add(attr("$test_runner", LABEL).value(env.getLabel("//tools/objc:testrunner"))) + .override(attr(":gcov", LABEL_LIST).cfg(HOST) + .value(new LateBoundLabelList() { + @Override + public List