Enable mock rules to set their types.

This enables, e.g., TEST rules to be created.

RELNOTES: None.
PiperOrigin-RevId: 200138491
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java b/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java
index 1534202..934f4bb 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.analysis.util;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
@@ -22,6 +23,7 @@
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.RuleClass;
 
+import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import java.util.Arrays;
 
 /**
@@ -106,35 +108,44 @@
     private final String name;
     private final MockRuleCustomBehavior customBehavior;
     private final Class<? extends RuleConfiguredTargetFactory> factory;
-    private final Class<? extends RuleDefinition> ancestor;
+    private final ImmutableList<Class<? extends RuleDefinition>> ancestors;
+    private final RuleClassType type;
 
     /** The default {@link RuleConfiguredTargetFactory} for this rule class. */
     private static final Class<? extends RuleConfiguredTargetFactory> DEFAULT_FACTORY =
         MockRuleDefaults.DefaultConfiguredTargetFactory.class;
     /** The default {@link RuleDefinition} for this rule class. */
-    private static final Class<? extends RuleDefinition> DEFAULT_ANCESTOR =
-        BaseRuleClasses.RootRule.class;
+    private static final ImmutableList<Class<? extends RuleDefinition>> DEFAULT_ANCESTORS =
+        ImmutableList.of(BaseRuleClasses.RootRule.class);
 
     State(String ruleClassName, MockRuleCustomBehavior customBehavior,
         Class<? extends RuleConfiguredTargetFactory> factory,
-        Class<? extends RuleDefinition> ancestor) {
+        ImmutableList<Class<? extends RuleDefinition>> ancestors,
+        RuleClassType type) {
       this.name = Preconditions.checkNotNull(ruleClassName);
       this.customBehavior = Preconditions.checkNotNull(customBehavior);
       this.factory = factory;
-      this.ancestor = ancestor;
+      this.ancestors = ancestors;
+      this.type = type;
     }
 
     public static class Builder {
       private Class<? extends RuleConfiguredTargetFactory> factory = DEFAULT_FACTORY;
-      private Class<? extends RuleDefinition> ancestor = DEFAULT_ANCESTOR;
+      private ImmutableList<Class<? extends RuleDefinition>> ancestors = DEFAULT_ANCESTORS;
+      private RuleClassType type = RuleClassType.NORMAL;
 
       public Builder factory(Class<? extends RuleConfiguredTargetFactory> factory) {
         this.factory = factory;
         return this;
       }
 
-      public Builder ancestor(Class<? extends RuleDefinition> ancestor) {
-        this.ancestor = ancestor;
+      public Builder ancestor(Class<? extends RuleDefinition>... ancestor) {
+        this.ancestors = ImmutableList.copyOf(ancestor);
+        return this;
+      }
+
+      public Builder type(RuleClassType type) {
+        this.type = type;
         return this;
       }
 
@@ -148,7 +159,7 @@
       }
 
       private State build(String ruleClassName, MockRuleCustomBehavior customBehavior) {
-        return new State(ruleClassName, customBehavior, factory, ancestor);
+        return new State(ruleClassName, customBehavior, factory, ancestors, type);
       }
     }
   }
@@ -165,13 +176,22 @@
   /**
    * Sets a custom ancestor {@link RuleDefinition} for this mock rule.
    *
-   * <p>If not set, {@link State#DEFAULT_ANCESTOR} is used.
+   * <p>If not set, {@link State#DEFAULT_ANCESTORS} is used.
    */
-  static State.Builder ancestor(Class<? extends RuleDefinition> ancestor) {
+  static State.Builder ancestor(Class<? extends RuleDefinition>... ancestor) {
     return new State.Builder().ancestor(ancestor);
   }
 
   /**
+   * Sets a custom {@link RuleClassType} for this mock rule.
+   *
+   * <p>If not set, {@link RuleClassType#NORMAL} is used.
+   */
+  static State.Builder type(RuleClassType type) {
+    return new State.Builder().type(type);
+  }
+
+  /**
    * Returns a new {@link State} for this rule class with custom attributes. This is a convenience
    * method for lambda definitions:
    *
@@ -214,7 +234,7 @@
   @Override
   default RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
     State state = define();
-    if (state.ancestor == State.DEFAULT_ANCESTOR) {
+    if (State.DEFAULT_ANCESTORS.equals(state.ancestors)) {
       MockRuleDefaults.DEFAULT_ATTRIBUTES.stream().forEach(builder::add);
     }
     state.customBehavior.customize(builder, environment);
@@ -231,9 +251,9 @@
     State state = define();
     return RuleDefinition.Metadata.builder()
         .name(state.name)
-        .type(RuleClass.Builder.RuleClassType.NORMAL)
+        .type(state.type)
         .factoryClass(state.factory)
-        .ancestors(state.ancestor)
+        .ancestors(state.ancestors)
         .build();
   }
 }