diff options
author | 2017-08-30 00:27:35 +0200 | |
---|---|---|
committer | 2017-08-30 13:48:40 +0200 | |
commit | 95bf7c89064d6871615f2b6211b9de4575d38b51 (patch) | |
tree | c5db1d9652352a39f419e73d055c6010f018dc12 /src/test/java/com/google/devtools/build/lib | |
parent | 00443495e002c9fc68adbcb708f223eb4b6a73c1 (diff) |
Stop blaze crash due to a symlink cycle or unbounded expansion encountered
while traversing filesets.
RELNOTES: None
PiperOrigin-RevId: 166913262
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java index e42ac6efb5..b11543eefd 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction; import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PackageLookupValue.BuildFileName; +import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.FileOperationException; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest; import com.google.devtools.build.lib.testutil.FoundationTestCase; @@ -125,6 +126,11 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe directories)); skyFunctions.put(SkyFunctions.EXTERNAL_PACKAGE, new ExternalPackageFunction()); skyFunctions.put(SkyFunctions.LOCAL_REPOSITORY_LOOKUP, new LocalRepositoryLookupFunction()); + skyFunctions.put( + SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS, + new FileSymlinkInfiniteExpansionUniquenessFunction()); + skyFunctions.put( + SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, new FileSymlinkCycleUniquenessFunction()); progressReceiver = new RecordingEvaluationProgressReceiver(); differencer = new RecordingDifferencer(); @@ -816,4 +822,35 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe .hasMessageThat() .contains("Generated directory a/b/c conflicts with package under the same path."); } + + @Test + public void unboundedSymlinkExpansionError() throws Exception { + Artifact bazLink = sourceArtifact("foo/baz.sym"); + Path parentDir = scratch.dir("foo"); + bazLink.getPath().createSymbolicLink(parentDir); + SkyKey key = rftvSkyKey(pkgRoot(parentOf(rootedPath(bazLink)), DONT_CROSS)); + EvaluationResult<SkyValue> result = eval(key); + assertThat(result.hasError()).isTrue(); + ErrorInfo error = result.getError(key); + assertThat(error.getException()).isInstanceOf(FileOperationException.class); + assertThat(error.getException()).hasMessageThat().contains("Infinite symlink expansion"); + } + + @Test + public void symlinkChainError() throws Exception { + scratch.dir("a"); + Artifact fooLink = sourceArtifact("a/foo.sym"); + Artifact barLink = sourceArtifact("a/bar.sym"); + Artifact bazLink = sourceArtifact("a/baz.sym"); + fooLink.getPath().createSymbolicLink(barLink.getPath()); + barLink.getPath().createSymbolicLink(bazLink.getPath()); + bazLink.getPath().createSymbolicLink(fooLink.getPath()); + + SkyKey key = rftvSkyKey(pkgRoot(parentOf(rootedPath(bazLink)), DONT_CROSS)); + EvaluationResult<SkyValue> result = eval(key); + assertThat(result.hasError()).isTrue(); + ErrorInfo error = result.getError(key); + assertThat(error.getException()).isInstanceOf(FileOperationException.class); + assertThat(error.getException()).hasMessageThat().contains("Symlink cycle"); + } } |