public void TryChangingPositionCombinedWithWritingAndReading()
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            byte[] bytes = ByteBufferFactory.CreateByteBufferWithAllBytesSet(123, 123);

            dataStream.Write(bytes, 0, bytes.Length);

            dataStream.SetPosition(0);

            byte[] bytes2 = ByteBufferFactory.CreateByteBufferWithAllBytesSet(14, 77);

            dataStream.Write(bytes2, 0, bytes2.Length);

            var bytesRead = new byte[dataStream.Length];

            dataStream.SetPosition(0);

            dataStream.Read(bytesRead, 0, dataStream.Length);

            for (int i = 0; i < dataStream.Length; i++)
            {
                if (i <= 13)
                {
                    Assert.AreEqual(77, bytesRead[i]);
                }
                else
                {
                    Assert.AreEqual(123, bytesRead[i]);
                }
            }
        }
示例#2
0
        public void MakeSureMovingAFolderInvalidatesAllEnumeratorsUnderIt()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var folderA          = fileSystem.CreateFolder(@"\A");
            var folderB          = fileSystem.CreateFolder(@"\A\B");
            var folderC          = fileSystem.CreateFolder(@"\A\B\C");
            var folderBUnderRoot = fileSystem.CreateFolder(@"\B");

            var enumeratorA = fileSystem.EnumerateFilesUnderFolder(folderA.FullPath, "*");
            var enumeratorB = fileSystem.EnumerateFilesUnderFolder(folderB.FullPath, "*");
            var enumeratorC = fileSystem.EnumerateFilesUnderFolder(folderC.FullPath, "*");

            fileSystem.MoveFolder(folderA.FullPath, folderBUnderRoot.FullPath);

            ExceptionAssert.MakeSureExceptionIsRaisedBy <InvalidOperationException>(
                delegate
            {
                enumeratorA.MoveNext();
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <InvalidOperationException>(
                delegate
            {
                enumeratorB.MoveNext();
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <InvalidOperationException>(
                delegate
            {
                enumeratorC.MoveNext();
            });
        }
示例#3
0
        public void MakeSureYouCannotMoveAFolderWhileItOrItsSubfoldersIsLocked()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            fileSystem.CreateFolder(@"\Books");
            var literacyFolder = fileSystem.CreateFolder(@"\Books\Literacy");
            var tolstoysFolder = fileSystem.CreateFolder(@"\books\literacy\tolstoj");
            var warAndPeace    = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(tolstoysFolder.FullPath, "WarAndPeace.txt"));

            using (var dataStream = fileSystem.OpenFileForReading(warAndPeace.FullPath))
            {
                ExceptionAssert.MakeSureExceptionIsRaisedBy <FolderLockedException>(
                    delegate
                {
                    fileSystem.MoveFolder(literacyFolder.FullPath, VirtualFileSystem.Root);
                    fileSystem.MoveFolder(tolstoysFolder.FullPath, VirtualFileSystem.Root);
                });
            }

            using (var dataStream = fileSystem.OpenFileForWriting(warAndPeace.FullPath))
            {
                ExceptionAssert.MakeSureExceptionIsRaisedBy <FolderLockedException>(
                    delegate
                {
                    fileSystem.MoveFolder(literacyFolder.FullPath, VirtualFileSystem.Root);
                    fileSystem.MoveFolder(tolstoysFolder.FullPath, VirtualFileSystem.Root);
                });
            }

            fileSystem.MoveFolder(literacyFolder.FullPath, VirtualFileSystem.Root);
        }
示例#4
0
        public void MakeSureFileSystemDoesNotDieWhenAbsolutelyFull() // был такой баг
        {
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateAllCollaborators(15000, false).VirtualFileSystem;

            using (var stream = fileSystem.CreateAndOpenFileForWriting(@"\huge"))
            {
                stream.SetLength((fileSystem.FreeSpaceInBytes / 8) * 7);
            }

            try
            {
                while (fileSystem.FreeSpaceInBytes != 0)
                {
                    string fileName = Guid.NewGuid().ToString("N");
                    fileSystem.CreateFile(@"\" + fileName);
                }
            }
            catch (Exception exception)
            {
                if (!(exception is InsufficientSpaceException)) // единственный приемлемый тип исключения в данном случае.
                {
                    throw;
                }
            }
        }
示例#5
0
        public void MakeSureDeletingAFileFreesSpaceForSure() // был такой баг.
        {
            var collaborators            = TestCollaboratorsFactory.CreateAllCollaborators(50000, false);
            VirtualFileSystem fileSystem = collaborators.VirtualFileSystem;

            int freeSpaceBeforeAnything = fileSystem.FreeSpaceInBytes;

            byte[] interestingData = ByteBufferFactory.BuildSomeGuidsIntoByteArray(10000);

            using (var dataStream = fileSystem.CreateAndOpenFileForWriting(@"\hey"))
            {
                for (int i = 0; i < 50; i++)
                {
                    dataStream.Write(interestingData, 0, interestingData.Length);
                }
            }

            fileSystem.DeleteFile(@"\hey");

            Assert.AreEqual(freeSpaceBeforeAnything, fileSystem.FreeSpaceInBytes);

            fileSystem = TestCollaboratorsFactory.CreateFileSystemFromExistingStream(collaborators.Stream);

            Assert.AreEqual(freeSpaceBeforeAnything, fileSystem.FreeSpaceInBytes);
        }
示例#6
0
        public void TryClearingOutABunchOfFilesAndFolderAfterReloadingFileSystem()
        {
            Stream stream;

            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            fileSystem.CreateFolder(@"\emails");
            fileSystem.CreateFolder(@"\system128");
            fileSystem.CreateFolder(@"\folder10dsjknfskdjfnkjsnfkjsnfkjskjfskjfsnkjkdjsfnsjkd");
            fileSystem.CreateFile(@"\hello1");
            fileSystem.CreateFile(@"\GoodWillHunting.dvd");
            fileSystem.CreateFile(@"\Casablanca.flv");

            fileSystem = TestCollaboratorsFactory.CreateFileSystemFromExistingStream(stream);

            CollectionAssert.AreEquivalent(new[] { "emails", "system128", "folder10dsjknfskdjfnkjsnfkjsnfkjskjfskjfsnkjkdjsfnsjkd" }, fileSystem.GetNamesOfAllFoldersFrom(VirtualFileSystem.Root));
            CollectionAssert.AreEquivalent(new[] { "hello1", "GoodWillHunting.dvd", "Casablanca.flv" }, fileSystem.GetNamesOfAllFilesFrom(VirtualFileSystem.Root));

            fileSystem.DeleteFolder(@"\emails");
            fileSystem.DeleteFile(@"\hello1");
            fileSystem.DeleteFolder(@"\system128");
            fileSystem.DeleteFolder(@"\folder10dsjknfskdjfnkjsnfkjsnfkjskjfskjfsnkjkdjsfnsjkd");
            fileSystem.DeleteFile(@"\GoodWillHunting.dvd");
            fileSystem.DeleteFile(@"\Casablanca.flv");

            Assert.AreEqual(0, fileSystem.GetAllFoldersFrom(VirtualFileSystem.Root).Count);
            Assert.AreEqual(0, fileSystem.GetAllFilesFrom(VirtualFileSystem.Root).Count);
        }
        public void MakeSureYouCannotMoveAFileWhileItIsLocked()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFile   = fileSystem.CreateFile(@"\WarAndPeace.txt");
            var newFolder = fileSystem.CreateFolder(@"\Books");

            using (var dataStream = fileSystem.OpenFileForReading(newFile.FullPath))
            {
                ExceptionAssert.MakeSureExceptionIsRaisedBy <FileLockedException>(
                    delegate
                {
                    fileSystem.MoveFile(newFile.FullPath, newFolder.FullPath);
                });
            }

            using (var dataStream = fileSystem.OpenFileForWriting(newFile.FullPath))
            {
                ExceptionAssert.MakeSureExceptionIsRaisedBy <FileLockedException>(
                    delegate
                {
                    fileSystem.MoveFile(newFile.FullPath, newFolder.FullPath);
                });
            }

            fileSystem.MoveFile(newFile.FullPath, newFolder.FullPath);
        }
        public void TryExpandingTheStreamViaSetLengthAndThenWritingReadingFromIt()
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            const int testArrayLength = 500000;

            dataStream.SetLength(testArrayLength);

            Assert.AreEqual(testArrayLength, dataStream.Length);
            Assert.AreEqual(0, dataStream.Position);

            const int halfTestArray = testArrayLength / 2; //на половине пути запишем что-нибудь интересное.

            dataStream.SetPosition(halfTestArray);

            var bytesToWrite = new byte[halfTestArray];

            for (int i = 0; i < bytesToWrite.Length; i++)
            {
                bytesToWrite[i] = 231;
            }

            dataStream.Write(bytesToWrite, 0, bytesToWrite.Length);

            dataStream.SetPosition(halfTestArray);

            var bytesRead = new byte[bytesToWrite.Length];

            dataStream.Read(bytesRead, 0, bytesRead.Length);

            MakeSureEachByteInArrayIsRight(bytesRead, 231); // и проверим, что записалось что нужно, - новый объем как будто проработан.
        }
        public void MakeSureYouCanMoveFileToTheSameFolderItIsIn()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFolder = fileSystem.CreateFolder(@"\Books");
            var newFile   = fileSystem.CreateFile(@"\Books\WarAndPeace.txt");

            fileSystem.MoveFile(newFile.FullPath, newFolder.FullPath);

            CollectionAssert.AreEqual(new[] { newFile.Name }, fileSystem.GetNamesOfAllFilesFrom(newFolder.FullPath));
        }
示例#10
0
        public void MakeSureYouCanMoveFolderToTheSameFolderItIsIn()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFolder   = fileSystem.CreateFolder(@"\Books");
            var movedFolder = fileSystem.MoveFolder(newFolder.FullPath, VirtualFileSystem.Root);

            var namesOfFolders = fileSystem.GetNamesOfAllFoldersFrom(VirtualFileSystem.Root);

            CollectionAssert.AreEqual(new[] { newFolder.Name }, namesOfFolders);
        }
示例#11
0
        public void MakeSureYouCannotMoveANonExistingFolder()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFolder = fileSystem.CreateFolder(@"\Folder");

            ExceptionAssert.MakeSureExceptionIsRaisedBy <FolderNotFoundException>(
                delegate
            {
                fileSystem.MoveFolder(@"\Guid.NewGuid()", newFolder.FullPath);
            });
        }
示例#12
0
        public void MakeSureYouCannotMoveFolderToANonExistingFolder()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFolder = fileSystem.CreateFolder(@"\WarAndPeace.Editions");

            ExceptionAssert.MakeSureExceptionIsRaisedBy <FolderNotFoundException>(
                delegate
            {
                fileSystem.MoveFile(newFolder.FullPath, @"\BogusFolder");
            });
        }
        public void MakeSureReadDoesNotThrowIfReadingBeyondTheStream()
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            byte[] bytes = ByteBufferFactory.CreateByteBufferWithAllBytesSet(55000, 123);

            dataStream.Write(bytes, 0, bytes.Length);

            dataStream.SetPosition(55000 - 35);

            var largeArray = new byte[2000];

            Assert.AreEqual(35, dataStream.Read(largeArray, 0, 2000));
        }
示例#14
0
        public void MakeSureFileSystemChangesPersistAfterItHasBeenReloaded()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            Assert.AreEqual(0, fileSystem.GetAllFoldersFrom(VirtualFileSystem.Root).Count);

            CreateFilesAndFolders(fileSystem);

            fileSystem = TestCollaboratorsFactory.CreateFileSystemFromExistingStream(stream);

            fileSystem.CreateFile(@"\newFile");
            fileSystem.CreateFolder(@"\newFolder");
        }
示例#15
0
        public void MakeSureYouCannotMoveAFolderWhenDestinationFolderAlreadyContainsDirectoryWithGivenName()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFolder    = fileSystem.CreateFolder(@"\Fitzgerald");
            var newSubfolder = fileSystem.CreateFolder(@"\Books");

            fileSystem.CreateFolder(@"\Books\Fitzgerald");

            ExceptionAssert.MakeSureExceptionIsRaisedBy <FolderAlreadyExistsException>(
                delegate
            {
                fileSystem.MoveFolder(newFolder.FullPath, newSubfolder.FullPath);
            });
        }
示例#16
0
        public void MakeSureMovingAFolderIsProhibitedIfYouAreMovingItDownItsOwnPathToRoot()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var folderA = fileSystem.CreateFolder(@"\A");

            fileSystem.CreateFolder(@"\A\B");
            var folderC = fileSystem.CreateFolder(@"\A\B\C");

            ExceptionAssert.MakeSureExceptionIsRaisedBy <InvalidOperationException>(
                delegate
            {
                fileSystem.MoveFolder(folderA.FullPath, folderC.FullPath);
            });
        }
        public void MakeSureYouCannotMoveAFileWhenDestinationFolderAlreadyContainsFileWithGivenName()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var newFile   = fileSystem.CreateFile(@"\WarAndPeace.txt");
            var newFolder = fileSystem.CreateFolder(@"\Books");

            fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(newFolder.FullPath, newFile.Name));

            ExceptionAssert.MakeSureExceptionIsRaisedBy <FileAlreadyExistsException>(
                delegate
            {
                fileSystem.MoveFile(newFile.FullPath, newFolder.FullPath);
            });
        }
        public void TryPushingAFileToItsLimitSize()
        {
            var testCollaborators = TestCollaboratorsFactory.CreateCollaboratorsForTestingDataStreamsOneGigabyteDrive();

            DataStreamReadableWritable stream =
                testCollaborators.VirtualFileSystem.OpenFileForWriting(testCollaborators.FileInfo.FullPath);

            var zeroes = new byte[testCollaborators.Disk.BlockSizeInBytes * 1000];

            ExceptionAssert.MakeSureExceptionIsRaisedBy <MaximumFileSizeReachedException>(
                delegate
            {
                while (stream.Length != Int32.MaxValue)
                {
                    stream.Write(zeroes, 0, zeroes.Length);
                }
            });
        }
示例#19
0
        public void TryCreatingAndThenRemovingABunchOfFilesCheckingFreeSpace()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            int freeSpaceBeforeAnything = fileSystem.FreeSpaceInBytes;

            int numberOfItemsToCreate = 50;

            var files   = new List <string>();
            var folders = new List <string>();

            for (int i = 0; i < numberOfItemsToCreate; i++)
            {
                var fileName = Guid.NewGuid().ToString("N");

                files.Add(fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(VirtualFileSystem.Root, fileName)).FullPath);
            }

            for (int i = 0; i < numberOfItemsToCreate; i++)
            {
                var folderName = Guid.NewGuid().ToString("N");

                folders.Add(fileSystem.CreateFolder(fileSystem.PathBuilder.CombinePaths(VirtualFileSystem.Root, folderName)).FullPath);
            }

            int freeSpaceAsLastReported = fileSystem.FreeSpaceInBytes;

            fileSystem = TestCollaboratorsFactory.CreateFileSystemFromExistingStream(stream);

            Assert.AreEqual(freeSpaceAsLastReported, fileSystem.FreeSpaceInBytes);

            foreach (string filePath in files)
            {
                fileSystem.DeleteFile(filePath);
            }

            foreach (string folderPath in folders)
            {
                fileSystem.DeleteFolder(folderPath);
            }

            Assert.AreEqual(freeSpaceBeforeAnything, fileSystem.FreeSpaceInBytes);
        }
        public void MakeSureShrinkingFreesDiskSpace()
        {
            var testCollaborators = TestCollaboratorsFactory.CreateCollaboratorsForTestingDataStreams();

            DataStreamReadableWritable dataStream =
                testCollaborators.VirtualFileSystem.OpenFileForWriting(testCollaborators.FileInfo.FullPath);

            int valueCloseToDiskSize = (int)testCollaborators.Disk.DiskSizeInBytes - 25 * testCollaborators.Disk.BlockSizeInBytes;

            dataStream.SetLength(valueCloseToDiskSize);

            var fileSystem = testCollaborators.VirtualFileSystem;

            FileInfo newFileNode = fileSystem.CreateFile(@"\testFile2");

            DataStreamReadableWritable newFileNodeStream = fileSystem.OpenFileForWriting(newFileNode.FullPath);

            ExceptionAssert.MakeSureExceptionIsRaisedBy <InsufficientSpaceException>(
                delegate
            {
                newFileNodeStream.SetLength(valueCloseToDiskSize);
            });

            dataStream.SetLength(0);

            newFileNodeStream.SetLength(valueCloseToDiskSize);
            dataStream.SetPosition(0);

            const int answeringToAllQuestionsByte = 42;

            byte[] bytesToWrite = ByteBufferFactory.CreateByteBufferWithAllBytesSet(valueCloseToDiskSize, answeringToAllQuestionsByte);

            newFileNodeStream.Write(bytesToWrite, 0, bytesToWrite.Length);

            newFileNodeStream.SetPosition(0);

            var buffer = new byte[valueCloseToDiskSize];

            newFileNodeStream.Read(buffer, 0, buffer.Length);

            MakeSureEachByteInArrayIsRight(buffer, answeringToAllQuestionsByte);
        }
        public void MakeSureMovingUnlistsFileFromOldParentAndEnlistsItInNewOne()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var folderA = fileSystem.CreateFolder(@"\A");

            fileSystem.CreateFolder(@"\A\B");
            var folderC = fileSystem.CreateFolder(@"\A\B\C");

            var fileA = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderA.FullPath, "AUnderA.txt"));
            var fileB = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderA.FullPath, "BUnderA.txt"));

            CollectionAssert.AreEquivalent(new[] { fileA.Name, fileB.Name }, fileSystem.GetNamesOfAllFilesFrom(folderA.FullPath));

            fileSystem.MoveFile(fileA.FullPath, folderC.FullPath);

            CollectionAssert.AreEquivalent(new[] { fileB.Name }, fileSystem.GetNamesOfAllFilesFrom(folderA.FullPath));
            CollectionAssert.AreEquivalent(new[] { fileA.Name }, fileSystem.GetNamesOfAllFilesFrom(folderC.FullPath));
        }
        private void TryWritingAndReadingBackSpecifiedByteArrays(byte[] testArray)
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            Assert.AreEqual(0, dataStream.Position);
            Assert.AreEqual(0, dataStream.Length);

            dataStream.Write(testArray, 0, testArray.Length);

            Assert.AreEqual(testArray.Length, dataStream.Position);
            Assert.AreEqual(testArray.Length, dataStream.Length);

            var bytesRead = new byte[testArray.Length];

            Assert.AreEqual(0, dataStream.Read(bytesRead, 0, testArray.Length)); // позиция в DataStream = testArray.Length; Прочитать ничего не получится.

            dataStream.SetPosition(0);

            dataStream.Read(bytesRead, 0, testArray.Length);

            CollectionAssert.AreEqual(testArray, bytesRead);
        }
示例#23
0
        public void MakeSureWeirdBugWithFoldersAndFilesWithDuplicatedNamesIsGone()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            Assert.AreEqual(0, fileSystem.GetAllFoldersFrom(VirtualFileSystem.Root).Count);

            fileSystem.CreateFile(@"\hip");
            fileSystem.CreateFolder(@"\hop");
            fileSystem.CreateFile(@"\chop");
            fileSystem.CreateFolder(@"\chop");

            fileSystem = TestCollaboratorsFactory.CreateFileSystemFromExistingStream(stream);

            fileSystem.CreateFile(@"\chopper");
            fileSystem.CreateFolder(@"\chopper");

            CollectionAssert.AreEquivalent(new[] { "hip", "chop", "chopper" }, fileSystem.GetNamesOfAllFilesFrom(VirtualFileSystem.Root));

            ReadOnlyCollection <FolderInfo> foldersUnderRoot = fileSystem.GetAllFoldersFrom(VirtualFileSystem.Root);

            CollectionAssert.AreEquivalent(new[] { "hop", "chop", "chopper" }, foldersUnderRoot.Select(folder => folder.Name).ToList());
        }
        public void TryReadingAndWritingPortionsOfDataByteByByte()
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            var stream       = new MemoryStream();
            var binaryWriter = new BinaryWriter(stream);

            const int numberOfIntegersToTest = 2561;

            for (int i = 0; i < numberOfIntegersToTest; i++)
            {
                binaryWriter.Write(i);
            }

            byte[] bytes = stream.ToArray();

            for (int i = 0; i < bytes.Length; i++)
            {
                dataStream.Write(new byte[] { bytes[i] }, 0, 1);
            }

            dataStream.SetPosition(0);

            var bytesRead = new byte[dataStream.Length];

            dataStream.Read(bytesRead, 0, dataStream.Length);

            var readingStream = new MemoryStream(bytesRead, false);
            var reader        = new BinaryReader(readingStream);

            for (int i = 0; i < numberOfIntegersToTest; i++)
            {
                int number = reader.ReadInt32();

                Assert.AreEqual(i, number);
            }
        }
示例#25
0
        public void MakeSureMovingUnlistsFolderFromOldParentAndEnlistsItInNewOnePreservingChildren()
        {
            Stream            stream;
            VirtualFileSystem fileSystem = TestCollaboratorsFactory.CreateFileSystem(out stream);

            var folderA = fileSystem.CreateFolder(@"\A");
            var folderB = fileSystem.CreateFolder(@"\A\B");
            var folderC = fileSystem.CreateFolder(@"\A\B\C");
            var fileA   = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderB.FullPath, "AUnderB.txt"));
            var fileB   = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderB.FullPath, "BUnderB.txt"));
            var fileC   = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderC.FullPath, "C1.txt"));
            var fileD   = fileSystem.CreateFile(fileSystem.PathBuilder.CombinePaths(folderC.FullPath, "C2.txt"));

            var folderBMoved = fileSystem.MoveFolder(folderB.FullPath, VirtualFileSystem.Root);

            Assert.AreEqual(@"\B", folderBMoved.FullPath);

            CollectionAssert.AreEquivalent(new List <string>(), fileSystem.GetNamesOfAllFilesFrom(folderA.FullPath));
            CollectionAssert.AreEquivalent(new List <string>(), fileSystem.GetNamesOfAllFoldersFrom(folderA.FullPath));
            CollectionAssert.AreEquivalent(new[] { folderA.Name, folderB.Name }, fileSystem.GetNamesOfAllFoldersFrom(VirtualFileSystem.Root));
            CollectionAssert.AreEquivalent(new[] { fileA.Name, fileB.Name }, fileSystem.GetNamesOfAllFilesFrom(folderBMoved.FullPath));
            CollectionAssert.AreEquivalent(new[] { folderC.Name }, fileSystem.GetNamesOfAllFoldersFrom(folderBMoved.FullPath));
            CollectionAssert.AreEquivalent(new[] { fileC.Name, fileD.Name }, fileSystem.GetNamesOfAllFilesFrom(@"\B\c"));
        }
        public void TryShrinkingTheStreamAndThenWritingReadingFromIt()
        {
            DataStreamReadableWritable dataStream = TestCollaboratorsFactory.CreateEmptyDataStream();

            const int testArrayLength = 50000;

            dataStream.SetLength(testArrayLength);

            byte[] bytesToWrite = new byte[testArrayLength];

            for (int i = 0; i < bytesToWrite.Length; i++)
            {
                bytesToWrite[i] = (byte)(i / 10000);
            }

            dataStream.Write(bytesToWrite, 0, bytesToWrite.Length);

            ShrinkAndMakeSureDataIsIntact(dataStream, 40000);
            ShrinkAndMakeSureDataIsIntact(dataStream, 34567);
            ShrinkAndMakeSureDataIsIntact(dataStream, 25000);
            ShrinkAndMakeSureDataIsIntact(dataStream, 9999);
            ShrinkAndMakeSureDataIsIntact(dataStream, 24);
            ShrinkAndMakeSureDataIsIntact(dataStream, 1);
        }
        public void TryWritingABigFileReadingItAfterSystemReload()
        {
            var testCollaborators = TestCollaboratorsFactory.CreateAllCollaborators(50000, false);

            byte[] interestingBytes = ByteBufferFactory.BuildSomeGuidsIntoByteArray(5000);

            int streamLength;

            const int numberOfGuidPortionsToReadAndWrite = 500;

            using (DataStreamReadableWritable stream = testCollaborators.VirtualFileSystem.CreateAndOpenFileForWriting(@"\hey"))
            {
                for (int i = 0; i < numberOfGuidPortionsToReadAndWrite; i++)
                {
                    stream.Write(interestingBytes, 0, interestingBytes.Length);
                }

                streamLength = stream.Length;
            }

            VirtualFileSystem fileSystemReloaded =
                TestCollaboratorsFactory.CreateFileSystemFromExistingStream(testCollaborators.Stream);

            using (DataStreamReadable stream = fileSystemReloaded.OpenFileForReading(@"\hey"))
            {
                Assert.AreEqual(streamLength, stream.Length);

                var bytesRead = new byte[interestingBytes.Length];

                for (int i = 0; i < numberOfGuidPortionsToReadAndWrite; i++)
                {
                    int numberOfBytesRead = stream.Read(bytesRead, 0, interestingBytes.Length);
                    CollectionAssert.AreEqual(interestingBytes, bytesRead);
                }
            }
        }
示例#28
0
        public void MakeSureStructureBuilderAllocatesExactlyTheNumberOfBlocksNeededToStoreTheData()
        {
            var testCollaborators = TestCollaboratorsFactory.CreateCollaboratorsForTestingDataStreamStructureBuilder();

            MockRepository mocks = new MockRepository();

            IFreeBlockManager freeBlockManager = mocks.DynamicMock <IFreeBlockManager>();

            IFileSystemNodeStorage nodeStorageStub = mocks.Stub <IFileSystemNodeStorage>();

            int freeBlockCounter            = 25;
            int numberOfFreeBlocksAllocated = 0;

            using (mocks.Unordered())
            {
                Expect.Call(freeBlockManager.AcquireFreeBlocks(1)).IgnoreArguments().Do(
                    new Func <int, ReadOnlyCollection <int> >(delegate(int i)
                {
                    var blocks = new List <int>();

                    for (int j = 0; j < i; j++)
                    {
                        blocks.Add(freeBlockCounter);
                        freeBlockCounter++;
                    }

                    numberOfFreeBlocksAllocated += i;

                    return(blocks.AsReadOnly());
                }));

                Expect.Call(freeBlockManager.AcquireFreeBlock()).IgnoreArguments().Do(
                    new Func <int>(delegate
                {
                    freeBlockCounter++;
                    numberOfFreeBlocksAllocated++;
                    return(freeBlockCounter);
                }));
            }

            mocks.ReplayAll();

            var dataStreamStructureBuilder =
                new TestDataStreamStructureBuilder(
                    testCollaborators.FileNode.ResolvedNode.FileContentsStreamDefinition,
                    testCollaborators.Disk,
                    freeBlockManager,
                    nodeStorageStub,
                    testCollaborators.FileNode.ResolvedNode,
                    AddressingSystemParameters.Default);

            Assert.AreEqual(0, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(1000);

            Assert.AreEqual(1000, dataStreamStructureBuilder.CurrentSize);

            var diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);   // один для данных, другой - под single indirect block

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 1
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(1500);
            Assert.AreEqual(1500, dataStreamStructureBuilder.CurrentSize);

            dataStreamStructureBuilder.SetSize(2000);

            Assert.AreEqual(2000, dataStreamStructureBuilder.CurrentSize);

            diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 1
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(2048);
            Assert.AreEqual(2048, dataStreamStructureBuilder.CurrentSize);

            diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);   // оверхед системы адресации - еще один блок.

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 2
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(testCollaborators.Disk.BlockSizeInBytes * (testCollaborators.Disk.BlockSizeInBytes / 4) * 3);

            Assert.AreEqual((testCollaborators.Disk.BlockSizeInBytes / 4) * 3 + 3, numberOfFreeBlocksAllocated);

            dataStreamStructureBuilder.SetSize(testCollaborators.Disk.BlockSizeInBytes * (testCollaborators.Disk.BlockSizeInBytes / 4) * 5);
        }