diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/testutil')
3 files changed, 57 insertions, 42 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java index 2bd6cf6d8e..6f9cd6170f 100644 --- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java +++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java @@ -17,18 +17,16 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.packages.Target; -import com.google.devtools.build.lib.skyframe.PackageFunction; import com.google.devtools.build.lib.skyframe.packages.BazelPackageLoader; import com.google.devtools.build.lib.skyframe.packages.PackageLoader; import com.google.devtools.build.lib.syntax.SkylarkSemantics; -import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.lib.vfs.PathFragment; /** * A Package.Builder.Helper for use in tests that a sanity check with {@link BazelPackageLoader} for @@ -36,9 +34,12 @@ import com.google.devtools.build.lib.vfs.PathFragment; */ public class BazelPackageBuilderHelperForTesting implements Package.Builder.Helper { private final RuleClassProvider ruleClassProvider; + private final BlazeDirectories directories; - public BazelPackageBuilderHelperForTesting(RuleClassProvider ruleClassProvider) { + public BazelPackageBuilderHelperForTesting( + RuleClassProvider ruleClassProvider, BlazeDirectories directories) { this.ruleClassProvider = ruleClassProvider; + this.directories = directories; } @Override @@ -66,23 +67,14 @@ public class BazelPackageBuilderHelperForTesting implements Package.Builder.Help RuleClassProvider ruleClassProvider, SkylarkSemantics skylarkSemantics) { PackageIdentifier pkgId = pkg.getPackageIdentifier(); - if (pkgId.equals(Label.EXTERNAL_PACKAGE_IDENTIFIER) - || !pkg.getPackageIdentifier().getRepository().isMain() - || PackageFunction.isDefaultsPackage(pkg.getPackageIdentifier())) { - // TODO(nharmata): Support these packages. - return; - } - int numNameSegments = pkg.getNameFragment().segmentCount(); - PathFragment fullFilenameFragment = pkg.getFilename().asFragment(); - int numFullFilenameFragmentSegments = fullFilenameFragment.segmentCount(); - Path workspaceRoot = pkg.getFilename().getFileSystem().getPath( - fullFilenameFragment.subFragment( - 0, - numFullFilenameFragmentSegments - (numNameSegments + 1))); - PackageLoader packageLoader = BazelPackageLoader.builder(workspaceRoot) - .setSkylarkSemantics(skylarkSemantics) - .setRuleClassProvider(ruleClassProvider) - .build(); + PackageLoader packageLoader = + BazelPackageLoader.builder( + directories.getWorkspace(), + directories.getInstallBase(), + directories.getOutputBase()) + .setSkylarkSemantics(skylarkSemantics) + .setRuleClassProvider(ruleClassProvider) + .build(); Package newlyLoadedPkg; try { newlyLoadedPkg = packageLoader.loadPackage(pkg.getPackageIdentifier()); @@ -97,17 +89,31 @@ public class BazelPackageBuilderHelperForTesting implements Package.Builder.Help ImmutableSet.copyOf( Iterables.transform(newlyLoadedPkg.getTargets().values(), TARGET_TO_LABEL)); if (!targetsInPkg.equals(targetsInNewlyLoadedPkg)) { - throw new IllegalStateException(String.format( - "The Package for %s had a different set of targets (<targetsInPkg> - " - + "<targetsInNewlyLoadedPkg> = %s, <targetsInNewlyLoadedPkg> - <targetsInPkg> = %s) when " - + "loaded normally during execution of the current test than it did when loaded via " - + "BazelPackageLoader (done automatically by the BazelPackageBuilderHelperForTesting " - + "hook). This either means: (i) Skyframe package loading semantics have diverged from " - + "BazelPackageLoader semantics (ii) The test in question is doing something that " - + "confuses BazelPackageBuilderHelperForTesting.", - pkgId, - Sets.difference(targetsInPkg, targetsInNewlyLoadedPkg), - Sets.difference(targetsInNewlyLoadedPkg, targetsInPkg))); + Sets.SetView<Label> unsatisfied = Sets.difference(targetsInPkg, targetsInNewlyLoadedPkg); + if (pkgId.compareTo(PackageIdentifier.createInMainRepo("tools/defaults")) == 0 + && unsatisfied.isEmpty()) { + // The tools/defaults package is populated from command-line options + // (=configuration fragments) which the user specifies in tests using + // BuildViewTestCase.useConfiguration(). + // We'd like PackageLoader to work as much as possible without duplicating the entire + // configuration of Bazel, so we prefer not to pass these flags to PackageLoader. + // As a result, the contents of tools/defaults might differ. + // As long as PackageLoader returns a superset of what Bazel returns, everything should load + // fine. + return; + } + Sets.SetView<Label> unexpected = Sets.difference(targetsInNewlyLoadedPkg, targetsInPkg); + throw new IllegalStateException( + String.format( + "The Package for %s had a different set of targets (<targetsInPkg> - " + + "<targetsInNewlyLoadedPkg> = %s, <targetsInNewlyLoadedPkg> - <targetsInPkg> = " + + "%s) when loaded normally during execution of the current test than it did " + + "when loaded via BazelPackageLoader (done automatically by the " + + "BazelPackageBuilderHelperForTesting hook). This either means: (i) Skyframe " + + "package loading semantics have diverged from " + + "BazelPackageLoader semantics (ii) The test in question is doing something " + + "that confuses BazelPackageBuilderHelperForTesting.", + pkgId, unsatisfied, unexpected)); } } } diff --git a/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java b/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java index 04e8e03710..5cb3772266 100644 --- a/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java +++ b/src/test/java/com/google/devtools/build/lib/testutil/PackageFactoryBuilderFactoryForBazelUnitTests.java @@ -13,6 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.testutil; +import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.packages.BuilderFactoryForTesting; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.RuleClassProvider; @@ -20,11 +22,10 @@ import com.google.devtools.build.lib.skyframe.packages.PackageFactoryBuilderWith import com.google.devtools.build.lib.vfs.FileSystem; /** - * A {@link PackageFactory.BuilderFactoryForTesting} implementation that injects a - * {@link BazelPackageBuilderHelperForTesting}. + * A {@link BuilderFactoryForTesting} implementation that injects a {@link + * BazelPackageBuilderHelperForTesting}. */ -class PackageFactoryBuilderFactoryForBazelUnitTests - extends PackageFactory.BuilderFactoryForTesting { +class PackageFactoryBuilderFactoryForBazelUnitTests implements BuilderFactoryForTesting { static final PackageFactoryBuilderFactoryForBazelUnitTests INSTANCE = new PackageFactoryBuilderFactoryForBazelUnitTests(); @@ -32,17 +33,25 @@ class PackageFactoryBuilderFactoryForBazelUnitTests } @Override - public PackageFactoryBuilderWithSkyframeForTesting builder() { - return new PackageFactoryBuilderForBazelUnitTests(); + public PackageFactoryBuilderWithSkyframeForTesting builder(BlazeDirectories directories) { + return new PackageFactoryBuilderForBazelUnitTests(directories); } private static class PackageFactoryBuilderForBazelUnitTests extends PackageFactoryBuilderWithSkyframeForTesting { + + private final BlazeDirectories directories; + + public PackageFactoryBuilderForBazelUnitTests(BlazeDirectories directories) { + this.directories = directories; + } + @Override public PackageFactory build(RuleClassProvider ruleClassProvider, FileSystem fs) { - Package.Builder.Helper packageBuilderHelperForTesting = doChecksForTesting - ? new BazelPackageBuilderHelperForTesting(ruleClassProvider) - : Package.Builder.DefaultHelper.INSTANCE; + Package.Builder.Helper packageBuilderHelperForTesting = + doChecksForTesting + ? new BazelPackageBuilderHelperForTesting(ruleClassProvider, directories) + : Package.Builder.DefaultHelper.INSTANCE; return new PackageFactory( ruleClassProvider, platformSetRegexps, diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java index d7abdf6e9c..7a592463d0 100644 --- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java +++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java @@ -15,7 +15,7 @@ package com.google.devtools.build.lib.testutil; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.lib.packages.PackageFactory.BuilderFactoryForTesting; +import com.google.devtools.build.lib.packages.BuilderFactoryForTesting; import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; |