public void MakeSurePuttingSeveralLocksOnSameThingCleanUpNicelyWhenYouReleaseTheLocks() { var manager = new FileSystemObjectLockingManager(); var folderNodes = FakeNodesFactory.CreateFakeFolderNodes(2); var fileNode = FakeNodesFactory.CreateFakeFileNode(); var nodeResolvingResult = new NodeWithSurroundingsResolvingResult <FileNode>(folderNodes, fileNode, FakeNodesFactory.CreateFakeFolderNodes(1).First()); Guid lockId = manager.AcquireLock(nodeResolvingResult, LockKind.Read); Guid lock2Id = manager.AcquireLock(nodeResolvingResult, LockKind.Read); Guid lock3Id = manager.AcquireLock(nodeResolvingResult, LockKind.Read); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[0])); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[1])); manager.ReleaseLock(lockId); manager.ReleaseLock(lock3Id); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[0])); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[1])); manager.ReleaseLock(lock2Id); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(folderNodes[0])); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(folderNodes[1])); }
/// <summary> /// /// </summary> /// <param name="fileToLock"></param> /// <param name="lockKind"></param> /// <returns></returns> /// <exception cref="CannotAcquireLockException"></exception> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"></exception> public Guid AcquireLock(NodeWithSurroundingsResolvingResult <FileNode> fileToLock, LockKind lockKind) { if (fileToLock == null) { throw new ArgumentNullException("fileToLock"); } lock (_operationExecutionCriticalSection) { var idOfFileToLock = fileToLock.ResolvedNode.Id; FileLockable fileLockable; Guid newLockId; if (_fileIdsToLocks.ContainsKey(idOfFileToLock)) { fileLockable = _fileIdsToLocks[idOfFileToLock]; } else { fileLockable = new FileLockable(fileToLock.ResolvedNode, fileToLock.FoldersPassedWhileResolving); _fileIdsToLocks[idOfFileToLock] = fileLockable; } newLockId = LockTheFile(fileLockable, lockKind); ReportToAllFolderNodesLockableThatTheyHaveANewLock(fileToLock, fileLockable, newLockId); _lockIdsToLocks[newLockId] = fileLockable; return(newLockId); } }
public void MakeSureYouCanAcquireSeveralReadLocksInARow() { var manager = new FileSystemObjectLockingManager(); var folderNodes = FakeNodesFactory.CreateFakeFolderNodes(2); var fileNode = FakeNodesFactory.CreateFakeFileNode(); var nodeResolvingResult = new NodeWithSurroundingsResolvingResult <FileNode>(folderNodes, fileNode, FakeNodesFactory.CreateFakeFolderNodes(1).First()); manager.AcquireLock(nodeResolvingResult, LockKind.Read); manager.AcquireLock(nodeResolvingResult, LockKind.Read); manager.AcquireLock(nodeResolvingResult, LockKind.Read); }
public StructureBuilderTestCollaborators(NodeWithSurroundingsResolvingResult <FileNode> fileNode, IVirtualDisk disk) { if (fileNode == null) { throw new ArgumentNullException("fileNode"); } if (disk == null) { throw new ArgumentNullException("disk"); } FileNode = fileNode; Disk = disk; }
public void MakeSureYouCannotAcquireWriteLockOnTheSameThingThatAlreadyHasAReadLock() { var manager = new FileSystemObjectLockingManager(); var folderNodes = FakeNodesFactory.CreateFakeFolderNodes(2); var fileNode = FakeNodesFactory.CreateFakeFileNode(); var nodeResolvingResult = new NodeWithSurroundingsResolvingResult <FileNode>(folderNodes, fileNode, FakeNodesFactory.CreateFakeFolderNodes(1).First()); manager.AcquireLock(nodeResolvingResult, LockKind.Read); ExceptionAssert.MakeSureExceptionIsRaisedBy <CannotAcquireLockException>( delegate { manager.AcquireLock(nodeResolvingResult, LockKind.Write); }); }
private void ReportToAllFolderNodesLockableThatTheyHaveANewLock(NodeWithSurroundingsResolvingResult <FileNode> fileToLock, FileLockable fileLockable, Guid newLockId) { foreach (FolderNode node in fileToLock.FoldersPassedWhileResolving) { FolderNodeLockable folderNodeLockableToAdjust; if (_nodeIdsToLocks.ContainsKey(node.Id)) { folderNodeLockableToAdjust = _nodeIdsToLocks[node.Id]; } else { folderNodeLockableToAdjust = new FolderNodeLockable(node); _nodeIdsToLocks[node.Id] = folderNodeLockableToAdjust; } folderNodeLockableToAdjust.AddLock(fileLockable, newLockId); } }
public void MakeSureAcquiringALockDoesLockAppropriateFolders() { var manager = new FileSystemObjectLockingManager(); var folderNodes = FakeNodesFactory.CreateFakeFolderNodes(2); var fileNode = FakeNodesFactory.CreateFakeFileNode(); var nodeResolvingResult = new NodeWithSurroundingsResolvingResult <FileNode>(folderNodes, fileNode, FakeNodesFactory.CreateFakeFolderNodes(1).First()); Guid lockId = manager.AcquireLock(nodeResolvingResult, LockKind.Read); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[0])); Assert.IsTrue(manager.IsNodeLockedForRenamesAndMoves(folderNodes[1])); manager.ReleaseLock(lockId); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(folderNodes[0])); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(folderNodes[1])); }
/// <summary> /// /// </summary> /// <param name="fullPathForFile"></param> /// <param name="nodeResolvingResult"></param> /// <returns></returns> /// <exception cref="FileNotFoundException"></exception> /// <exception cref="InvalidPathException"></exception> /// <exception cref="ArgumentNullException"></exception> private DataStreamStructureBuilder GetDataStreamStructureBuilderResolvingTheFile(string fullPathForFile, out NodeWithSurroundingsResolvingResult <FileNode> nodeResolvingResult) { nodeResolvingResult = _nodeResolver.ResolveFileNodeByPath(fullPathForFile); FileNode fileNode = nodeResolvingResult.ResolvedNode; return(new DataStreamStructureBuilder(fileNode.FileContentsStreamDefinition, _virtualDisk, _freeBlockManager, _fileSystemNodeStorage, fileNode, AddressingSystemParameters.Default)); }
public Guid AcquireLock(NodeWithSurroundingsResolvingResult <FileNode> fileToLock, LockKind lockKind) { return(Guid.NewGuid()); }