From 5b1ce4d5d7568ecacf02c63c30a9cc7ce7ef24d3 Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Wed, 30 May 2018 04:34:08 -0700 Subject: Fix `equals()` and `hashCode()` for artifacts: artifacts of different classes are not equal. Also validate that there are no tree and file artifacts with the same exec path. Fixes #4668. Closes #5284. Change-Id: Id97c0407a476a5bfc697b4ca7b858e3d0c0f8c75 PiperOrigin-RevId: 198540425 --- .../build/lib/analysis/util/AnalysisTestUtil.java | 12 +++++- .../build/lib/analysis/util/BuildViewTestCase.java | 45 ++++++++++++++++++++++ .../devtools/build/lib/packages/RuleClassTest.java | 2 +- .../build/lib/rules/android/AndroidBinaryTest.java | 2 +- .../build/lib/skylark/SkylarkIntegrationTest.java | 24 ++++++++++++ 5 files changed, 82 insertions(+), 3 deletions(-) (limited to 'src/test/java/com') diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java index a86066d1a5..51c0fcf6e3 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java @@ -193,6 +193,11 @@ public final class AnalysisTestUtil { return original.getOrphanArtifacts(); } + @Override + public ImmutableSet getTreeArtifactsConflictingWithFiles() { + return original.getTreeArtifactsConflictingWithFiles(); + } + @Override public ActionKeyContext getActionKeyContext() { return original.getActionKeyContext(); @@ -398,7 +403,12 @@ public final class AnalysisTestUtil { @Override public ImmutableSet getOrphanArtifacts() { - return ImmutableSet.of(); + return ImmutableSet.of(); + } + + @Override + public ImmutableSet getTreeArtifactsConflictingWithFiles() { + return ImmutableSet.of(); } @Override diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index e687bc260f..360717f5fa 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -1141,6 +1141,32 @@ public abstract class BuildViewTestCase extends FoundationTestCase { return view.getArtifactFactory().getDerivedArtifact(rootRelativePath, root, owner); } + /** + * Gets a tree artifact, creating it if necessary. {@code ArtifactOwner} should be a genuine + * {@link ConfiguredTargetKey} corresponding to a {@link ConfiguredTarget}. If called from a test + * that does not exercise the analysis phase, the convenience methods {@link + * #getBinArtifactWithNoOwner} or {@link #getGenfilesArtifactWithNoOwner} should be used instead. + */ + protected Artifact getTreeArtifact( + PathFragment rootRelativePath, ArtifactRoot root, ArtifactOwner owner) { + return view.getArtifactFactory().getTreeArtifact(rootRelativePath, root, owner); + } + + /** + * Gets a Tree Artifact for testing in the subdirectory of the {@link + * BuildConfiguration#getBinDirectory} corresponding to the package of {@code owner}. So to + * specify a file foo/foo.o owned by target //foo:foo, {@code packageRelativePath} should just be + * "foo.o". + */ + protected final Artifact getTreeArtifact(String packageRelativePath, ConfiguredTarget owner) { + return getPackageRelativeTreeArtifact( + packageRelativePath, + getConfiguration(owner).getBinDirectory(RepositoryName.MAIN), + ConfiguredTargetKey.of( + owner, skyframeExecutor.getConfiguration(reporter, owner.getConfigurationKey()))); + } + + /** * Gets a derived Artifact for testing with path of the form * root/owner.getPackageFragment()/packageRelativePath. @@ -1154,6 +1180,20 @@ public abstract class BuildViewTestCase extends FoundationTestCase { root, owner); } + /** + * Gets a tree Artifact for testing with path of the form + * root/owner.getPackageFragment()/packageRelativePath. + * + * @see #getDerivedArtifact(PathFragment, ArtifactRoot, ArtifactOwner) + */ + private Artifact getPackageRelativeTreeArtifact( + String packageRelativePath, ArtifactRoot root, ArtifactOwner owner) { + return getTreeArtifact( + owner.getLabel().getPackageFragment().getRelative(packageRelativePath), + root, owner); + } + + /** * Gets a derived Artifact for testing in the {@link BuildConfiguration#getBinDirectory}. This * method should only be used for tests that do no analysis, and so there is no ConfiguredTarget @@ -1921,6 +1961,11 @@ public abstract class BuildViewTestCase extends FoundationTestCase { throw new UnsupportedOperationException(); } + @Override + public ImmutableSet getTreeArtifactsConflictingWithFiles() { + throw new UnsupportedOperationException(); + } + @Override public ActionKeyContext getActionKeyContext() { return actionKeyContext; diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java index c82b2aeb25..b9b2f4c33c 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java @@ -894,7 +894,7 @@ public class RuleClassTest extends PackageLoadingTestCase { supportsConstraintChecking, /*requiredToolchains=*/ ImmutableSet.