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])); }
public void MakeSureNoFolderIsLockedAfterManagerCreation() { var manager = new FileSystemObjectLockingManager(); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(FakeNodesFactory.CreateFakeFolderNodes(1).First())); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(FakeNodesFactory.CreateFakeFolderNodes(1).First())); Assert.IsFalse(manager.IsNodeLockedForRenamesAndMoves(FakeNodesFactory.CreateFakeFolderNodes(1).First())); }
public void MakeSureYouCannotProvideNullAsFileResolvingResultWhenTryingToLock() { var manager = new FileSystemObjectLockingManager(); ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentNullException>( delegate { manager.AcquireLock(null, LockKind.Write); }); }
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 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); }); }
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="disk"></param> /// <param name="namesComparer"></param> /// <param name="nodeResolver"></param> /// <param name="pathBuilder"></param> /// <param name="namesValidator"></param> /// <param name="pathValidator"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InconsistentDataDetectedException"></exception> internal static VirtualFileSystem CreateFromDisk(IVirtualDisk disk, IEqualityComparer <string> namesComparer, NodeResolver nodeResolver, PathBuilder pathBuilder, IFileSystemArtifactNamesValidator namesValidator, IPathValidator pathValidator) { if (disk == null) { throw new ArgumentNullException("disk"); } if (namesComparer == null) { throw new ArgumentNullException("namesComparer"); } if (nodeResolver == null) { throw new ArgumentNullException("nodeResolver"); } if (pathBuilder == null) { throw new ArgumentNullException("pathBuilder"); } if (namesValidator == null) { throw new ArgumentNullException("namesValidator"); } if (pathValidator == null) { throw new ArgumentNullException("pathValidator"); } VirtualFileSystemInfo fileSystemInfo; var fileSystemNodeStorage = new FileSystemNodeStorage(disk); const int headerBlockIndex = VirtualDiskFormatter.FileSystemHeaderBlockIndex; const int freeBlockBitmapStartingBlockIndex = VirtualDiskFormatter.FreeSpaceStartingBlockIndex; var header = fileSystemNodeStorage.ReadFileSystemHeader(headerBlockIndex); fileSystemInfo = new VirtualFileSystemInfo(header.Version, disk.BlockSizeInBytes, header.RootBlockOffset, freeBlockBitmapStartingBlockIndex); var freeSpaceBitmapStore = new FreeSpaceBitmapStore(disk, VirtualDiskFormatter.FreeSpaceStartingBlockIndex); int bitmapSize; var freeSpaceMap = freeSpaceBitmapStore.ReadMap(out bitmapSize); var freeSpaceBitArray = new BitArray(freeSpaceMap) { Length = bitmapSize }; var freeBlockManagerBitArrayBased = new FreeBlockManagerBitArrayBased(freeSpaceBitArray, fileSystemInfo.FirstNonReservedDiskBlockIndex, bitmapSize); IFreeBlockManager freeBlockManager = new FreeBlockManagerDiskWriting(freeSpaceBitmapStore, freeBlockManagerBitArrayBased); IFolderEnumeratorRegistry folderEnumeratorRegistry = new FolderEnumeratorRegistry(); IFileSystemObjectLockingManager lockingManager = new FileSystemObjectLockingManager(); var blockReferenceEditor = new BlockReferenceListsEditor(disk, freeBlockManager, fileSystemNodeStorage); //Note: много общих коллабораторов у трех классов. Недорефакторено. var fileManager = new FileManager(disk, fileSystemNodeStorage, namesComparer, nodeResolver, freeBlockManager, folderEnumeratorRegistry, lockingManager, blockReferenceEditor, pathBuilder, namesValidator, pathValidator); var folderManager = new FolderManager(fileSystemNodeStorage, namesComparer, nodeResolver, freeBlockManager, folderEnumeratorRegistry, lockingManager, blockReferenceEditor, pathBuilder, namesValidator, pathValidator); return(new VirtualFileSystem(disk, fileSystemInfo, fileSystemNodeStorage, namesComparer, nodeResolver, freeBlockManager, folderEnumeratorRegistry, blockReferenceEditor, pathBuilder, namesValidator, pathValidator, fileManager, folderManager)); }