Allow custom RuleDefinitions in PackageLoadingTestCase.

This enables certain tests for rules that are not implemented in the
core tool, e.g. for Skylark tests.

--
MOS_MIGRATED_REVID=116600082
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index 869343a..50c7951 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
+import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
@@ -55,6 +56,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 
@@ -65,18 +67,33 @@
 public abstract class PackageLoadingTestCase extends FoundationTestCase {
 
   private static final int GLOBBING_THREADS = 7;
-  
+
   protected ConfiguredRuleClassProvider ruleClassProvider;
   protected SkyframeExecutor skyframeExecutor;
 
   @Before
   public final void initializeSkyframeExecutor() throws Exception {
-    ruleClassProvider = TestRuleClassProvider.getRuleClassProvider();
+    List<RuleDefinition> extraRules = getExtraRules();
+    if (!extraRules.isEmpty()) {
+      ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
+      TestRuleClassProvider.addStandardRules(builder);
+      for (RuleDefinition def : extraRules) {
+        builder.addRuleDefinition(def);
+      }
+      ruleClassProvider = builder.build();
+    } else {
+      ruleClassProvider = TestRuleClassProvider.getRuleClassProvider();
+    }
     skyframeExecutor = createSkyframeExecutor(getEnvironmentExtensions(),
         Preprocessor.Factory.Supplier.NullSupplier.INSTANCE, ConstantRuleVisibility.PUBLIC, "");
     setUpSkyframe(parsePackageCacheOptions());
   }
 
+  /** Allows subclasses to augment the {@link RuleDefinition}s available in this test. */
+  protected List<RuleDefinition> getExtraRules() {
+    return ImmutableList.of();
+  }
+
   protected SkyframeExecutor createSkyframeExecutor(
       Iterable<EnvironmentExtension> environmentExtensions,
       Preprocessor.Factory.Supplier preprocessorFactorySupplier,