public void LockTest_ReadSamePathNotMutallyExclusive() { Setup(); var lockManager = new LockManager(); // Test reads are NOT mutually exclusive var outputFileInput = CreateOutputFileArtifact(); var process1 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() }); var process2 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() }); TestMutuallyExclusive( () => lockManager.AcquirePathAccessLock(process1), () => lockManager.AcquirePathAccessLock(process2), assertExclusive: false); }
public void LockTest_WriteReadSamePathMutallyExclusive() { Setup(); var lockManager = new LockManager(); // Test read and write to same path are mutually exclusive var root = CreateUniqueObjPath("sealed"); var outputFile = CreateOutputFileArtifact(root.ToString(Context.PathTable)); var seal = CreateSealDirectory(root, SealDirectoryKind.Partial, CreateSourceFile(), outputFile); var process = CreateProcess(new[] { CreateSourceFile() }, new[] { outputFile }); TestMutuallyExclusive( () => lockManager.AcquirePathAccessLock(process), () => lockManager.AcquirePathAccessLock(seal)); }
public void LockTest_ReadPathsWithInnerExclusiveMutallyExclusive() { Setup(); var lockManager = new LockManager(); // Test reads are NOT mutually exclusive var outputFileInput = CreateOutputFileArtifact(); var process1 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() }); var process2 = CreateProcess(new[] { outputFileInput }, new[] { CreateOutputFileArtifact() }); using (var sharedAccessLock1 = lockManager.AcquirePathAccessLock(process1)) using (var sharedAccessLock2 = lockManager.AcquirePathAccessLock(process2)) { // Test that two group locks can't acquire the inner exclusive lock for the same path // at the same time TestMutuallyExclusive( () => sharedAccessLock1.AcquirePathInnerExclusiveLock(outputFileInput.Path), () => sharedAccessLock2.AcquirePathInnerExclusiveLock(outputFileInput.Path)); } }
public void LockTest_WriteSamePathMutallyExclusive() { Setup(); var lockManager = new LockManager(); // Test writes to same path are exclusive var outputFile = CreateOutputFileArtifact(); // Create pips which write to the same location var copyFile1 = CreateCopyFile(CreateSourceFile(), outputFile); var copyFile2 = CreateCopyFile(CreateSourceFile(), outputFile); var copyFile3 = CreateCopyFile(CreateSourceFile(), outputFile); var process = CreateProcess(new[] { CreateSourceFile() }, new[] { outputFile }); TestMutuallyExclusive( () => lockManager.AcquirePathAccessLock(copyFile1), () => lockManager.AcquirePathAccessLock(copyFile2)); TestMutuallyExclusive( () => lockManager.AcquirePathAccessLock(process), () => lockManager.AcquirePathAccessLock(copyFile3)); }
public void LockTest_PathPipLockNotMutallyExclusive() { Setup(); var lockManager = new LockManager(); var process = CreateProcess(new[] { CreateSourceFile() }, new[] { CreateOutputFileArtifact() }); // Test pip locks and path locks are NOT mutually exclusive TestMutuallyExclusive( () => lockManager.AcquirePathAccessLock(process), () => lockManager.AcquireLock(new PipId(30)), assertExclusive: false); }
public void LockTest_GlobalLock_PathLockMutallyExclusive() { Setup(); var lockManager = new LockManager(); // Global lock and path lock are mutually exclusive var copyFile = CreateCopyFile(CreateSourceFile(), CreateOutputFileArtifact()); TestMutuallyExclusive(() => lockManager.AcquireGlobalExclusiveLock(), () => lockManager.AcquirePathAccessLock(copyFile)); }