aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar kush <kush@google.com>2017-08-30 00:27:35 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-08-30 13:48:40 +0200
commit95bf7c89064d6871615f2b6211b9de4575d38b51 (patch)
treec5db1d9652352a39f419e73d055c6010f018dc12 /src/test/java/com/google/devtools/build/lib
parent00443495e002c9fc68adbcb708f223eb4b6a73c1 (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.java37
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");
+ }
}