Add package validation tests for PackageFactory Some basic tests to ensure validation is happening at the expected point in PackageFactory - after loading has completed. RELNOTES: None PiperOrigin-RevId: 297371908
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java index 507990d..7c743c1 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -25,10 +25,12 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.Reporter; -import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus; +import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension; +import com.google.devtools.build.lib.packages.PackageValidator.InvalidPackageException; import com.google.devtools.build.lib.packages.util.PackageFactoryTestBase; import com.google.devtools.build.lib.syntax.ParserInput; import com.google.devtools.build.lib.syntax.StarlarkFile; +import com.google.devtools.build.lib.syntax.StarlarkSemantics; import com.google.devtools.build.lib.testutil.TestUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -55,6 +57,11 @@ @RunWith(JUnit4.class) public class PackageFactoryTest extends PackageFactoryTestBase { + @Override + public List<EnvironmentExtension> getEnvironmentExtensions() { + return ImmutableList.of(); + } + @Test public void testCreatePackage() throws Exception { Path buildFile = scratch.file("/pkgname/BUILD", "# empty build file "); @@ -527,6 +534,31 @@ } @Test + public void testPackageValidationFailureRegisteredAfterLoading() throws Exception { + Path path = scratch.file("/x/BUILD", "sh_library(name='y')"); + + dummyPackageValidator.setImpl( + pkg -> { + if (pkg.getName().equals("x")) { + throw new InvalidPackageException(pkg.getPackageIdentifier(), "nope"); + } + }); + + Package pkg = packages.createPackage("x", RootedPath.toRootedPath(root, path)); + assertThat(pkg.containsErrors()).isFalse(); + + InvalidPackageException expected = + assertThrows( + InvalidPackageException.class, + () -> + packages + .factory() + .afterDoneLoadingPackage( + pkg, StarlarkSemantics.DEFAULT_SEMANTICS, /*loadTimeNanos=*/ 0)); + assertThat(expected).hasMessageThat().contains("no such package 'x': nope"); + } + + @Test public void testGlobDirectoryExclusion() throws Exception { emptyFile("/fruit/data/apple"); emptyFile("/fruit/data/pear"); @@ -1181,11 +1213,6 @@ } @Override - protected PackageFactoryApparatus createPackageFactoryApparatus() { - return new PackageFactoryApparatus(events.reporter()); - } - - @Override protected String getPathPrefix() { return ""; }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java index eda3d33..8d61e5f 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.PackageFactory; +import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension; import com.google.devtools.build.lib.packages.PackageValidator; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.packages.StarlarkSemanticsOptions; @@ -43,6 +44,7 @@ import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.common.options.OptionsParser; import java.io.IOException; +import java.util.List; /** * An apparatus that creates / maintains a {@link PackageFactory}. @@ -52,9 +54,17 @@ private final ExtendedEventHandler eventHandler; private final PackageFactory factory; + public PackageFactoryApparatus(ExtendedEventHandler eventHandler) { + this( + eventHandler, + /*environmentExtensions=*/ ImmutableList.of(), + PackageValidator.NOOP_VALIDATOR); + } + public PackageFactoryApparatus( ExtendedEventHandler eventHandler, - PackageFactory.EnvironmentExtension... environmentExtensions) { + List<EnvironmentExtension> environmentExtensions, + PackageValidator packageValidator) { this.eventHandler = eventHandler; RuleClassProvider ruleClassProvider = TestRuleClassProvider.getRuleClassProvider(); factory = @@ -63,7 +73,7 @@ ImmutableList.copyOf(environmentExtensions), "test", Package.Builder.DefaultHelper.INSTANCE, - PackageValidator.NOOP_VALIDATOR); + packageValidator); } /**
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java index c0c1ffd..449648a 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
@@ -31,6 +31,8 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension; +import com.google.devtools.build.lib.packages.PackageValidator; import com.google.devtools.build.lib.packages.RawAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.syntax.Starlark; @@ -61,7 +63,10 @@ protected Scratch scratch; protected EventCollectionApparatus events = new EventCollectionApparatus(); - protected PackageFactoryApparatus packages = createPackageFactoryApparatus(); + protected DummyPackageValidator dummyPackageValidator = new DummyPackageValidator(); + protected PackageFactoryApparatus packages = + new PackageFactoryApparatus( + events.reporter(), getEnvironmentExtensions(), dummyPackageValidator); protected Root root; protected com.google.devtools.build.lib.packages.Package expectEvalSuccess(String... content) @@ -82,7 +87,7 @@ events.assertContainsError(expectedError); } - protected abstract PackageFactoryApparatus createPackageFactoryApparatus(); + protected abstract List<EnvironmentExtension> getEnvironmentExtensions(); protected Path throwOnReaddir = null; @@ -365,4 +370,19 @@ } } } + + /** {@PackageValidator} whose functionality can be swapped out on demand via {@link #setImpl}. */ + protected static class DummyPackageValidator implements PackageValidator { + private PackageValidator underlying = PackageValidator.NOOP_VALIDATOR; + + /** Sets {@link PackageValidator} implementation to use. */ + public void setImpl(PackageValidator impl) { + this.underlying = impl; + } + + @Override + public void validate(Package pkg) throws InvalidPackageException { + underlying.validate(pkg); + } + } }