Change ios_test to reflect experimental_ios_test functionality on mac.

--
MOS_MIGRATED_REVID=102046532
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 2950b15..150041b 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<Artifact> 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<Artifact> filesToBuildBuilder = NestedSetBuilder.<Artifact>stableOrder()
+        .addTransitive(filesToBuild);
 
-    ruleContext.registerAction(
-        new TemplateExpansionAction(
-            ruleContext.getActionOwner(),
-            testRunner,
-            testScript,
-            ImmutableList.<TemplateExpansionAction.Substitution>of(),
-            /*executable=*/ true));
+    TestSupport testSupport = new TestSupport(ruleContext)
+        .registerTestRunnerActions()
+        .addRunfiles(runfilesBuilder, common.getObjcProvider())
+        .addFilesToBuild(filesToBuildBuilder);
 
-    Runfiles runfiles = new Runfiles.Builder(ruleContext.getWorkspaceName())
-        .addArtifact(testScript).build();
+    Artifact executable = testSupport.generatedTestScript();
+
+    Runfiles runfiles = runfilesBuilder.build();
     RunfilesSupport runfilesSupport =
-        RunfilesSupport.withExecutable(ruleContext, runfiles, testScript);
+        RunfilesSupport.withExecutable(ruleContext, runfiles, executable);
 
     return new RuleConfiguredTargetBuilder(ruleContext)
-        .setFilesToBuild(NestedSetBuilder.<Artifact>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 4b7c7c4..49f711b 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 @@
     return builder
         .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class)
         /*<!-- #BLAZE_RULE(ios_test).IMPLICIT_OUTPUTS -->
-        <ul>
-          <li><code><var>name</var>.ipa</code>: the test bundle as an
-              <code>.ipa</code> file
-          <li><code><var>name</var>.xcodeproj/project.pbxproj: An Xcode project file which can be
-              used to develop or build on a Mac.</li>
-        </ul>
-        <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/
+         <ul>
+         <li><code><var>name</var>.ipa</code>: the test bundle as an
+         <code>.ipa</code> file
+         <li><code><var>name</var>.xcodeproj/project.pbxproj: An Xcode project file which can be
+         used to develop or build on a Mac.</li>
+         </ul>
+         <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/
         .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")))
+        /* <!-- #BLAZE_RULE(ios_test).ATTRIBUTE(ios_test_target_device) -->
+         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}
+         <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
+        .add(
+            attr("ios_test_target_device", LABEL)
+                .allowedFileTypes()
+                .allowedRuleClasses("ios_lab_device"))
+        /* <!-- #BLAZE_RULE(ios_test).ATTRIBUTE(ios_device_arg) -->
+         Extra arguments to pass to the <code>ios_test_target_device</code>'s binary. They should be
+         in the form KEY=VALUE or simply KEY (check your device's documentation for allowed
+         parameters).
+         ${SYNOPSIS}
+         <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
+        .add(attr("ios_device_arg", STRING_LIST))
+        /* <!-- #BLAZE_RULE(ios_test).ATTRIBUTE(plugins) -->
+         Plugins to pass to the test runner.
+         ${SYNOPSIS}
+         <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
+        .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<BuildConfiguration>() {
+              @Override
+              public List<Label> getDefault(Rule rule, BuildConfiguration configuration) {
+                if (!configuration.isCodeCoverageEnabled()) {
+                  return ImmutableList.of();
+                }
+                return ImmutableList.of(
+                    configuration.getFragment(ObjcConfiguration.class).getGcovLabel());
+              }
+            }))
         .build();
   }
 
@@ -58,7 +108,7 @@
         .name("ios_test")
         .type(RuleClassType.TEST)
         .ancestors(BaseRuleClasses.BaseRule.class, BaseRuleClasses.TestBaseRule.class,
-            ObjcRuleClasses.IosTestBaseRule.class)
+            ObjcRuleClasses.IosTestBaseRule.class, ObjcRuleClasses.SimulatorRule.class)
         .factoryClass(BazelIosTest.class)
         .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 5506115..cf00943 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
@@ -46,17 +46,17 @@
 /**
  * Support for running XcTests.
  */
-class TestSupport {
+public class TestSupport {
   private final RuleContext ruleContext;
 
-  TestSupport(RuleContext ruleContext) {
+  public TestSupport(RuleContext ruleContext) {
     this.ruleContext = ruleContext;
   }
 
   /**
    * Registers actions to create all files needed in order to actually run the test.
    */
-  TestSupport registerTestRunnerActions() {
+  public TestSupport registerTestRunnerActions() {
     registerTestScriptSubstitutionAction();
     return this;
   }
@@ -64,7 +64,7 @@
   /**
    * Returns the script which should be run in order to actually run the tests.
    */
-  Artifact generatedTestScript() {
+  public Artifact generatedTestScript() {
     return ObjcRuleClasses.artifactByAppendingToBaseName(ruleContext, "_test_script");
   }
 
@@ -193,7 +193,7 @@
    *
    * @param objcProvider common information about this rule's attributes and its dependencies
    */
-  TestSupport addRunfiles(Builder runfilesBuilder, ObjcProvider objcProvider) {
+  public TestSupport addRunfiles(Builder runfilesBuilder, ObjcProvider objcProvider) {
     runfilesBuilder
         .addArtifact(testIpa())
         .addArtifacts(xctestIpa().asSet())
@@ -298,7 +298,7 @@
   /**
    * Adds files which must be built in order to run this test to builder.
    */
-  TestSupport addFilesToBuild(NestedSetBuilder<Artifact> builder) {
+  public TestSupport addFilesToBuild(NestedSetBuilder<Artifact> builder) {
     builder.add(testIpa()).addAll(xctestIpa().asSet());
     return this;
   }