bazel packages: use skyframe not PackageFactory for loading

This change removes all but one uses of PackageFactoryApparatus and
createPackageForTesting. PackageFactoryTest is next.

PiperOrigin-RevId: 334468289
diff --git a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
index 6ed979b..e2bc2dc 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
@@ -18,10 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.RootedPath;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,31 +31,22 @@
 @RunWith(JUnit4.class)
 public class EnvironmentGroupTest extends PackageLoadingTestCase {
 
-  private Package pkg;
   private EnvironmentGroup group;
 
   @Before
   public final void createPackage() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "pkg/BUILD",
-            "environment(name='foo', fulfills = [':bar', ':baz'])",
-            "environment(name='bar', fulfills = [':baz'])",
-            "environment(name='baz')",
-            "environment(name='not_in_group')",
-            "environment_group(",
-            "    name = 'group',",
-            "    environments = [':foo', ':bar', ':baz'],",
-            "    defaults = [':foo'],",
-            ")");
-    pkg =
-        packageFactory.createPackageForTesting(
-            PackageIdentifier.createInMainRepo("pkg"),
-            RootedPath.toRootedPath(root, buildfile),
-            getPackageManager(),
-            reporter);
-
-    group = (EnvironmentGroup) pkg.getTarget("group");
+    scratch.file(
+        "pkg/BUILD",
+        "environment(name='foo', fulfills = [':bar', ':baz'])",
+        "environment(name='bar', fulfills = [':baz'])",
+        "environment(name='baz')",
+        "environment(name='not_in_group')",
+        "environment_group(",
+        "    name = 'group',",
+        "    environments = [':foo', ':bar', ':baz'],",
+        "    defaults = [':foo'],",
+        ")");
+    group = (EnvironmentGroup) getTarget("//pkg:group");
   }
 
   @Test
@@ -115,17 +103,11 @@
 
   @Test
   public void emptyGroupsNotAllowed() throws Exception {
-    Path buildfile = scratch.file(
-        "a/BUILD",
-        "environment_group(name = 'empty_group', environments = [], defaults = [])");
+    scratch.file(
+        "a/BUILD", "environment_group(name = 'empty_group', environments = [], defaults = [])");
     reporter.removeHandler(failFastHandler);
-    Package emptyGroupPkg =
-        packageFactory.createPackageForTesting(
-            PackageIdentifier.createInMainRepo("a"),
-            RootedPath.toRootedPath(root, buildfile),
-            getPackageManager(),
-            reporter);
-    assertThat(emptyGroupPkg.containsErrors()).isTrue();
+    Package pkg = getTarget("//a:BUILD").getPackage();
+    assertThat(pkg.containsErrors()).isTrue();
     assertContainsEvent(
         "environment group empty_group must contain at least one environment");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java b/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
index 83ef9f3..8729529 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
@@ -17,37 +17,21 @@
 import static org.junit.Assert.assertThrows;
 
 import com.google.common.base.Joiner;
-import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
-import com.google.devtools.build.lib.testutil.Scratch;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.vfs.RootedPath;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/** A test for the {@code exports_files} function defined in {@link PackageFactory}. */
+/** A test for the {@code exports_files} function. */
 @RunWith(JUnit4.class)
-public class ExportsFilesTest {
-
-  private Scratch scratch = new Scratch("/workspace");
-  private EventCollectionApparatus events = new EventCollectionApparatus();
-  private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter());
-  private Root root;
-
-  @Before
-  public void setUp() throws Exception {
-    root = Root.fromPath(scratch.dir(""));
-  }
+public class ExportsFilesTest extends PackageLoadingTestCase {
 
   private Package pkg() throws Exception {
-    Path buildFile = scratch.file("pkg/BUILD",
-                                  "exports_files(['foo.txt', 'bar.txt'])");
-    return packages.createPackage("pkg", RootedPath.toRootedPath(root, buildFile));
+    scratch.file("pkg/BUILD", "exports_files(['foo.txt', 'bar.txt'])");
+    return getTarget("//pkg:BUILD").getPackage();
   }
 
   @Test
@@ -90,16 +74,12 @@
 
   @Test
   public void testExportsFilesAndRuleNameConflict() throws Exception {
-    events.setFailFast(false);
-
-    Path buildFile = scratch.file("pkg2/BUILD",
+    reporter.removeHandler(failFastHandler);
+    scratch.file(
+        "pkg2/BUILD",
         "exports_files(['foo'])",
-        "genrule(name = 'foo', srcs = ['bar'], outs = [],",
-        "        cmd = '/bin/true')");
-    Package pkg = packages.createPackage("pkg2", RootedPath.toRootedPath(root, buildFile));
-    events.assertContainsError("rule 'foo' in package 'pkg2' conflicts with "
-                               + "existing source file");
-    assertThat(pkg.getTarget("foo") instanceof InputFile).isTrue();
+        "genrule(name = 'foo', srcs = ['bar'], outs = [], cmd = '/bin/true')");
+    assertThat(getTarget("//pkg2:foo")).isInstanceOf(InputFile.class);
+    assertContainsEvent("rule 'foo' in package 'pkg2' conflicts with existing source file");
   }
-
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java b/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
index 68d90c9..8f87104 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
@@ -17,47 +17,26 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
-import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.vfs.RootedPath;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * A test for {@link InputFile}.
- */
+/** A test for {@link InputFile}. */
 @RunWith(JUnit4.class)
-public class InputFileTest {
+public class InputFileTest extends PackageLoadingTestCase {
 
   private Path pathX;
   private Path pathY;
   private Package pkg;
 
-  private EventCollectionApparatus events = new EventCollectionApparatus();
-  private Scratch scratch = new Scratch("/workspace");
-  private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter());
-  private Root root;
-
-  @Before
-  public void setUp() throws Exception {
-    root = Root.fromPath(scratch.dir(""));
-  }
-
   @Before
   public final void writeFiles() throws Exception  {
-    Path buildfile =
-        scratch.file(
-            "pkg/BUILD",
-            "genrule(name = 'dummy', ",
-            "        cmd = '', ",
-            "        outs = [], ",
-            "        srcs = ['x', 'subdir/y'])");
-    pkg = packages.createPackage("pkg", RootedPath.toRootedPath(root, buildfile));
-    events.assertNoWarningsOrErrors();
+    scratch.file("pkg/BUILD", "genrule(name='dummy', cmd='', outs=[], srcs=['x', 'subdir/y'])");
+    pkg = getTarget("//pkg:BUILD").getPackage();
+    assertNoEvents();
 
     this.pathX = scratch.file("pkg/x", "blah");
     this.pathY = scratch.file("pkg/subdir/y", "blah blah");
diff --git a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
index fd4fc3b..ee8487b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
@@ -16,10 +16,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.RootedPath;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,22 +29,10 @@
 
   @Before
   public final void createRule() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "pkg/BUILD",
-            "genrule(name='foo', ",
-            "        srcs=[], ",
-            "        cmd='', ",
-            "        outs=['x', 'subdir/y'])");
-    this.pkg =
-        packageFactory.createPackageForTesting(
-            PackageIdentifier.createInMainRepo("pkg"),
-            RootedPath.toRootedPath(root, buildfile),
-            getPackageManager(),
-            reporter);
+    scratch.file("pkg/BUILD", "genrule(name='foo', srcs=[], cmd='', outs=['x', 'subdir/y'])");
+    this.rule = (Rule) getTarget("//pkg:foo");
+    this.pkg = rule.getPackage();
     assertNoEvents();
-
-    this.rule = (Rule) pkg.getTarget("foo");
   }
 
   private void checkTargetRetainsGeneratingRule(OutputFile output) throws Exception {
@@ -100,23 +85,18 @@
 
   @Test
   public void testDuplicateOutputFilesInDifferentRules() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "two_outs/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls >$(location out)',",
-            "        outs=['out'])",
-            "",
-            "genrule(name='b',",
-            "        cmd='ls >$(location out)',",
-            "        outs=['out'])");
+    scratch.file(
+        "two_outs/BUILD",
+        "genrule(name='a',",
+        "        cmd='ls >$(location out)',",
+        "        outs=['out'])",
+        "",
+        "genrule(name='b',",
+        "        cmd='ls >$(location out)',",
+        "        outs=['out'])");
 
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("two_outs"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//two_outs:BUILD");
     assertContainsEvent(
         "generated file 'out' in rule 'b' conflicts with "
             + "existing generated file from rule 'a'");
@@ -124,41 +104,27 @@
 
   @Test
   public void testOutputFileNameConflictsWithExistingRule() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "out_is_rule/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls >$(location out)',",
-            "        outs=['out'])",
-            "",
-            "genrule(name='b',",
-            "        cmd='ls >$(location out)',",
-            "        outs=['a'])");
+    scratch.file(
+        "out_is_rule/BUILD",
+        "genrule(name='a',",
+        "        cmd='ls >$(location out)',",
+        "        outs=['out'])",
+        "",
+        "genrule(name='b',",
+        "        cmd='ls >$(location out)',",
+        "        outs=['a'])");
 
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("out_is_rule"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//out_is_rule:BUILD");
     assertContainsEvent("generated file 'a' in rule 'b' conflicts with existing genrule rule");
   }
 
   @Test
   public void testDuplicateOutputFilesInSameRule() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "two_outs/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls >$(location out)',",
-            "        outs=['out', 'out'])");
-
+    scratch.file(
+        "two_outs/BUILD", "genrule(name='a', cmd='ls >$(location out)',outs=['out', 'out'])");
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("two_outs"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//two_outs:BUILD");
     assertContainsEvent(
         "generated file 'out' in rule 'a' conflicts with "
             + "existing generated file from rule 'a'");
@@ -166,55 +132,25 @@
 
   @Test
   public void testOutputFileWithIllegalName() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "bad_out_name/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls',",
-            "        outs=['!@#:'])");
-
+    scratch.file("bad_out_name/BUILD", "genrule(name='a', cmd='ls', outs=['!@#:'])");
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("bad_out_name"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//bad_out_name:BUILD");
     assertContainsEvent("illegal output file name '!@#:' in rule //bad_out_name:a");
   }
 
   @Test
   public void testOutputFileWithCrossPackageLabel() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "cross_package_out/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls',",
-            "        outs=['//foo:bar'])");
-
+    scratch.file("cross_package_out/BUILD", "genrule(name='a', cmd='ls', outs=['//foo:bar'])");
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("cross_package_out"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//cross_package_out:BUILD");
     assertContainsEvent("label '//foo:bar' is not in the current package");
   }
 
   @Test
   public void testOutputFileNamedBUILD() throws Exception {
-    Path buildfile =
-        scratch.file(
-            "output_called_build/BUILD",
-            "genrule(name='a',",
-            "        cmd='ls',",
-            "        outs=['BUILD'])");
-
+    scratch.file("output_called_build/BUILD", "genrule(name='a', cmd='ls', outs=['BUILD'])");
     reporter.removeHandler(failFastHandler);
-    packageFactory.createPackageForTesting(
-        PackageIdentifier.createInMainRepo("output_called_build"),
-        RootedPath.toRootedPath(root, buildfile),
-        getPackageManager(),
-        reporter);
+    getTarget("//output_called_build:BUILD");
     assertContainsEvent("generated file 'BUILD' in rule 'a' conflicts with existing source file");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
index 7acef7e..08b68e2 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
@@ -17,14 +17,8 @@
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
-import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
-import com.google.devtools.build.lib.testutil.Scratch;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.vfs.RootedPath;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import java.util.concurrent.SynchronousQueue;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -32,20 +26,11 @@
 /**
  * Checks against a class initialization deadlock. "query sometimes hangs".
  *
- * <p>This requires static initialization of PackageGroup and PackageSpecification
- * to occur in a multithreaded context, and therefore must be in its own class.
+ * <p>This requires static initialization of PackageGroup and PackageSpecification to occur in a
+ * multithreaded context, and therefore must be in its own class.
  */
 @RunWith(JUnit4.class)
-public class PackageGroupStaticInitializationTest {
-  private Scratch scratch = new Scratch("/workspace");
-  private EventCollectionApparatus events = new EventCollectionApparatus();
-  private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter());
-  private Root root;
-
-  @Before
-  public void setUp() throws Exception {
-    root = Root.fromPath(scratch.dir(""));
-  }
+public class PackageGroupStaticInitializationTest extends PackageLoadingTestCase {
 
   @Test
   public void testNoDeadlockOnPackageGroupCreation() throws Exception {
@@ -77,7 +62,7 @@
               @Override
               public void run() {
                 try {
-                  getPackageGroup("fruits", "mango");
+                  getTarget("//fruits:mango");
                   groupQueue.take();
                 } catch (Exception e) {
                   // Can't throw from Runnable, but this will cause the test to timeout
@@ -94,14 +79,4 @@
     assertThat(producingThread.isAlive()).isFalse();
     assertThat(consumingThread.isAlive()).isFalse();
   }
-
-  private Package getPackage(String packageName) throws Exception {
-    PathFragment buildFileFragment = PathFragment.create(packageName).getRelative("BUILD");
-    Path buildFile = scratch.resolve(buildFileFragment.getPathString());
-    return packages.createPackage(packageName, RootedPath.toRootedPath(root, buildFile));
-  }
-
-  private PackageGroup getPackageGroup(String pkg, String name) throws Exception {
-    return (PackageGroup) getPackage(pkg).getTarget(name);
-  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
index eff3f7a..64543ac 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
@@ -16,31 +16,14 @@
 import static com.google.common.collect.ImmutableList.toImmutableList;
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
-import com.google.devtools.build.lib.testutil.Scratch;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.vfs.RootedPath;
-import org.junit.Before;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Unit tests for PackageGroup.
- */
+/** Unit tests for PackageGroup. */
 @RunWith(JUnit4.class)
-public class PackageGroupTest {
-  private Scratch scratch = new Scratch("/workspace");
-  private EventCollectionApparatus events = new EventCollectionApparatus();
-  private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter());
-  private Root root;
-
-  @Before
-  public void setUp() throws Exception {
-    root = Root.fromPath(scratch.dir(""));
-  }
+public class PackageGroupTest extends PackageLoadingTestCase {
 
   @Test
   public void testDoesNotFailHorribly() throws Exception {
@@ -54,9 +37,9 @@
   public void testEmptyPackageGroupNameDoesNotThrow() throws Exception {
     scratch.file("strawberry/BUILD", "package_group(name = '', packages=[])");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackage("strawberry");
-    events.assertContainsError("package group has invalid name");
+    assertContainsEvent("package group has invalid name");
   }
 
   @Test
@@ -84,33 +67,28 @@
     scratch.file("vegetables/BUILD");
     scratch.file("fruits/vegetables/BUILD");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackageGroup("fruits", "apple");
-    events.assertContainsError("invalid package name 'vegetables'");
+    assertContainsEvent("invalid package name 'vegetables'");
   }
 
   @Test
   public void testPackagesWithRepositoryDoNotWork() throws Exception {
     scratch.file(
-        "fruits/BUILD",
-        "package_group(name = 'banana',",
-        "              packages = ['@veggies//:cucumber'])");
+        "fruits/BUILD", "package_group(name = 'banana', packages = ['@veggies//:cucumber'])");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackageGroup("fruits", "banana");
-    events.assertContainsError("invalid package name '@veggies//:cucumber'");
+    assertContainsEvent("invalid package name '@veggies//:cucumber'");
   }
 
   @Test
   public void testAllPackagesInMainRepositoryDoesNotWork() throws Exception {
-    scratch.file(
-        "fruits/BUILD",
-        "package_group(name = 'apple',",
-        "              packages = ['@//...'])");
+    scratch.file("fruits/BUILD", "package_group(name = 'apple', packages = ['@//...'])");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackageGroup("fruits", "apple");
-    events.assertContainsError("invalid package name '@//...'");
+    assertContainsEvent("invalid package name '@//...'");
   }
 
   @Test
@@ -123,30 +101,25 @@
     scratch.file("vegetables/BUILD");
     scratch.file("fruits/vegetables/BUILD");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackageGroup("fruits", "apple");
-    events.assertContainsError("invalid package name '//vegetables:carrot'");
+    assertContainsEvent("invalid package name '//vegetables:carrot'");
   }
 
   @Test
   public void testTargetNameAsPackageDoesNotWork2() throws Exception {
-    scratch.file(
-        "fruits/BUILD", "package_group(name = 'apple',", "              packages = [':carrot'])");
-
+    scratch.file("fruits/BUILD", "package_group(name = 'apple', packages = [':carrot'])");
     scratch.file("vegetables/BUILD");
     scratch.file("fruits/vegetables/BUILD");
 
-    events.setFailFast(false);
+    reporter.removeHandler(failFastHandler);
     getPackageGroup("fruits", "apple");
-    events.assertContainsError("invalid package name ':carrot'");
+    assertContainsEvent("invalid package name ':carrot'");
   }
 
   @Test
   public void testAllBeneathSpecificationWorks() throws Exception {
-    scratch.file(
-        "fruits/BUILD",
-        "package_group(name = 'maracuja',",
-        "              packages = ['//tropics/...'])");
+    scratch.file("fruits/BUILD", "package_group(name = 'maracuja', packages = ['//tropics/...'])");
 
     getPackageGroup("fruits", "maracuja");
   }
@@ -267,13 +240,10 @@
   }
 
   private Package getPackage(String packageName) throws Exception {
-    PathFragment buildFileFragment = PathFragment.create(packageName).getRelative("BUILD");
-
-    Path buildFile = scratch.resolve(buildFileFragment.getPathString());
-    return packages.createPackage(packageName, RootedPath.toRootedPath(root, buildFile));
+    return getTarget("//" + packageName + ":BUILD").getPackage();
   }
 
   private PackageGroup getPackageGroup(String pkg, String name) throws Exception {
-    return (PackageGroup) getPackage(pkg).getTarget(name);
+    return (PackageGroup) getTarget("//" + pkg + ":" + name);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
index c1f6d47..4ca8b15 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
@@ -16,91 +16,66 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
-import com.google.devtools.build.lib.testutil.Scratch;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.Root;
-import com.google.devtools.build.lib.vfs.RootedPath;
-import org.junit.Before;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.events.EventKind;
+import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Tests for {@link Rule}.
- */
+/** Tests for {@link Rule}. */
 @RunWith(JUnit4.class)
-public class RuleTest {
-  private Scratch scratch = new Scratch("/workspace");
-  private EventCollectionApparatus events = new EventCollectionApparatus();
-  private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter());
-  private Root root;
-
-  @Before
-  public void setUp() throws Exception {
-    root = Root.fromPath(scratch.dir(""));
-  }
+public class RuleTest extends PackageLoadingTestCase {
 
   @Test
   public void testOutputNameError() throws Exception {
-    events.setFailFast(false);
-    Path buildFile = scratch.file("namecollide/BUILD",
+    reporter.removeHandler(failFastHandler);
+    scratch.file(
+        "namecollide/BUILD",
         "genrule(name = 'hello_world',",
-                "srcs = ['ignore_me.txt'],",
-                "outs = ['message.txt', 'hello_world'],",
-                "cmd  = 'echo \"Hello, world.\" >$(location message.txt)')");
-
-    Package pkg = packages.createPackage("namecollide", RootedPath.toRootedPath(root, buildFile));
-    Rule genRule = pkg.getRule("hello_world");
+        "srcs = ['ignore_me.txt'],",
+        "outs = ['message.txt', 'hello_world'],",
+        "cmd  = 'echo \"Hello, world.\" >$(location message.txt)')");
+    Rule genRule = (Rule) getTarget("//namecollide:hello_world");
     assertThat(genRule.containsErrors()).isFalse(); // TODO: assertTrue
-    events.assertContainsWarning("target 'hello_world' is both a rule and a file; please choose "
-                               + "another name for the rule");
+    assertContainsEvent(
+        "target 'hello_world' is both a rule and a file; please choose another name for the rule",
+        ImmutableSet.of(EventKind.WARNING));
   }
 
   @Test
   public void testIsLocalTestRuleForLocalEquals1() throws Exception {
-    Path buildFile = scratch.file("x/BUILD",
+    scratch.file(
+        "x/BUILD",
         "cc_test(name = 'y',",
         "          srcs = ['a'],",
         "          local = 0)",
         "cc_test(name = 'z',",
         "          srcs = ['a'],",
         "          local = 1)");
-    Package pkg = packages.createPackage("x", RootedPath.toRootedPath(root, buildFile));
-    Rule y = pkg.getRule("y");
+    Rule y = (Rule) getTarget("//x:y");
     assertThat(TargetUtils.isLocalTestRule(y)).isFalse();
-    Rule z = pkg.getRule("z");
+    Rule z = (Rule) getTarget("//x:z");
     assertThat(TargetUtils.isLocalTestRule(z)).isTrue();
   }
 
   @Test
   public void testDeprecation() throws Exception {
-    Path buildFile = scratch.file("x/BUILD",
-        "cc_test(name = 'y')",
-        "cc_test(name = 'z', deprecation = 'Foo')");
-    Package pkg = packages.createPackage("x", RootedPath.toRootedPath(root, buildFile));
-    Rule y = pkg.getRule("y");
+    scratch.file("x/BUILD", "cc_test(name = 'y')", "cc_test(name = 'z', deprecation = 'Foo')");
+    Rule y = (Rule) getTarget("//x:y");
     assertThat(TargetUtils.getDeprecation(y)).isNull();
-    Rule z = pkg.getRule("z");
+    Rule z = (Rule) getTarget("//x:z");
     assertThat(TargetUtils.getDeprecation(z)).isEqualTo("Foo");
   }
 
   @Test
   public void testVisibilityValid() throws Exception {
-    Package pkg =
-        packages.createPackage(
-            "x",
-            RootedPath.toRootedPath(
-                root,
-                scratch.file(
-                    "x/BUILD",
-                    "cc_binary(name = 'pr',",
-                    "          visibility = ['//visibility:private'])",
-                    "cc_binary(name = 'pu',",
-                    "          visibility = ['//visibility:public'])",
-                    "cc_binary(name = 'cu',",
-                    "          visibility = ['//a:b'])")));
-
+    scratch.file(
+        "x/BUILD",
+        "cc_binary(name = 'pr', visibility = ['//visibility:private'])",
+        "cc_binary(name = 'pu', visibility = ['//visibility:public'])",
+        "cc_binary(name = 'cu', visibility = ['//a:b'])");
+    Package pkg = getTarget("//x:BUILD").getPackage();
     assertThat(pkg.getRule("pu").getVisibility()).isEqualTo(ConstantRuleVisibility.PUBLIC);
     assertThat(pkg.getRule("pr").getVisibility()).isEqualTo(ConstantRuleVisibility.PRIVATE);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculatorTest.java b/src/test/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculatorTest.java
index 65b31c5..520c708 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculatorTest.java
@@ -17,17 +17,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.NoSuchPackageException;
-import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.query2.proto.proto2api.Build;
 import com.google.devtools.build.lib.query2.proto.proto2api.Build.Attribute.Discriminator;
 import com.google.devtools.build.lib.vfs.DigestHashFunction;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.RootedPath;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,13 +33,12 @@
 
   @Test
   public void testComputeAttributeChangeChangesHash() throws Exception {
-    Path buildFile = scratch.file("pkg/BUILD");
-
-    scratch.overwriteFile("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
-    Rule ruleBefore = getRule(buildFile, "x");
+    scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
+    Rule ruleBefore = (Rule) getTarget("//pkg:x");
 
     scratch.overwriteFile("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['z'])");
-    Rule ruleAfter = getRule(buildFile, "x");
+    invalidatePackages();
+    Rule ruleAfter = (Rule) getTarget("//pkg:x");
 
     String hashBefore =
         SyntheticAttributeHashCalculator.compute(
@@ -64,16 +58,15 @@
 
   @Test
   public void testComputeLocationDoesntChangeHash() throws Exception {
-    Path buildFile = scratch.file("pkg/BUILD");
-
-    scratch.overwriteFile("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
-    Rule ruleBefore = getRule(buildFile, "x");
+    scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
+    Rule ruleBefore = (Rule) getTarget("//pkg:x");
 
     scratch.overwriteFile(
         "pkg/BUILD",
         "genrule(name='rule_that_moves_x', cmd='touch $@', outs=['whatever'])",
         "genrule(name='x', cmd='touch $@', outs=['y'])");
-    Rule ruleAfter = getRule(buildFile, "x");
+    invalidatePackages();
+    Rule ruleAfter = (Rule) getTarget("//pkg:x");
 
     String hashBefore =
         SyntheticAttributeHashCalculator.compute(
@@ -93,8 +86,8 @@
 
   @Test
   public void testComputeSerializedAttributesUsedOverAvailable() throws Exception {
-    Rule rule =
-        getRule(scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])"), "x");
+    scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
+    Rule rule = (Rule) getTarget("//pkg:x");
 
     String hashBefore =
         SyntheticAttributeHashCalculator.compute(
@@ -124,8 +117,8 @@
 
   @Test
   public void testComputeExtraDataChangesHash() throws Exception {
-    Rule rule =
-        getRule(scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])"), "x");
+    scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
+    Rule rule = (Rule) getTarget("//pkg:x");
 
     String hashBefore =
         SyntheticAttributeHashCalculator.compute(
@@ -146,10 +139,8 @@
 
   @Test
   public void testComputePackageErrorStatusChangesHash() throws Exception {
-    Path buildFile = scratch.file("pkg/BUILD");
-
-    scratch.overwriteFile("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
-    Rule ruleBefore = getRule(buildFile, "x");
+    scratch.file("pkg/BUILD", "genrule(name='x', cmd='touch $@', outs=['y'])");
+    Rule ruleBefore = (Rule) getTarget("//pkg:x");
 
     // Remove fail-fast handler, we're intentionally creating a package with errors.
     reporter.removeHandler(failFastHandler);
@@ -157,7 +148,8 @@
         "pkg/BUILD",
         "genrule(name='x', cmd='touch $@', outs=['z'])",
         "genrule(name='missing_attributes')");
-    Rule ruleAfter = getRule(buildFile, "x");
+    invalidatePackages();
+    Rule ruleAfter = (Rule) getTarget("//pkg:x");
     assertThat(ruleAfter.containsErrors()).isTrue();
 
     String hashBefore =
@@ -175,16 +167,4 @@
 
     assertThat(hashBefore).isNotEqualTo(hashAfter);
   }
-
-  private Rule getRule(Path buildFile, String rule)
-      throws NoSuchPackageException, InterruptedException {
-    Package pkg =
-        packageFactory.createPackageForTesting(
-            PackageIdentifier.createInMainRepo(buildFile.getParentDirectory().getBaseName()),
-            RootedPath.toRootedPath(root, buildFile),
-            getPackageManager(),
-            reporter);
-
-    return pkg.getRule(rule);
-  }
 }