示例#1
0
        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]));
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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;
        }
示例#5
0
        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);
            });
        }
示例#6
0
        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);
            }
        }
示例#7
0
        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]));
        }
示例#8
0
        /// <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());
 }