Beispiel #1
0
        public void WriteRead_Test()
        {
            var dataGenerator = new DataManager(_seed);
            var sourceStream  = dataGenerator.GenerateData(SourceStreamSize);
            var targetStream  = new MemoryStream();

            using (var repo = new ManagedRepository(BlockSize, ChecksumSize, _workDir))
            {
                using (var map = repo.Write(sourceStream))
                    using (new MapMonitor(map))
                    {
                        map.Start();
                        map.Wait();
                    }

                Console.WriteLine();

                using (var map = repo.Read(0, targetStream))
                    using (new MapMonitor(map))
                    {
                        map.Start();
                        map.Wait();
                    }
            }

            Assert.AreEqual(sourceStream, targetStream);
        }
Beispiel #2
0
        public void Deduplication_Test()
        {
            // Generate test data
            var dataGenerator = new DataManager(_seed);
            var sourceStream  = dataGenerator.GenerateData(SourceStreamSize);

            using (var repo = new ManagedRepository(BlockSize, ChecksumSize, _workDir))
            {
                sourceStream.Seek(0, SeekOrigin.Begin);
                using (var map = repo.Write(sourceStream))
                    using (new MapMonitor(map))
                    {
                        map.Start();
                        map.Wait();
                    }

                Console.WriteLine();

                // Calculate expecdet values
                var expectedDataSize     = repo.DataStream.Length;
                var expectedMetadataSize = repo.MetadataStream.Length;

                sourceStream.Seek(0, SeekOrigin.Begin);
                using (var map = repo.Write(sourceStream))
                    using (new MapMonitor(map))
                    {
                        map.Start();
                        map.Wait();
                    }

                // Second addition of the same data should not change expected values
                var actualdDataSize    = repo.DataStream.Length;
                var actualMetadataSize = repo.MetadataStream.Length;

                Assert.AreEqual(expectedMetadataSize, actualMetadataSize, "Metadata");
                Assert.AreEqual(expectedDataSize, actualdDataSize, "Data");
            }
        }
Beispiel #3
0
        public void Delete_Test()
        {
            var dataGenerator = new DataManager(_seed);
            var sourceStream  = dataGenerator.GenerateData(10);

            using (var repo = new ManagedRepository(BlockSize, ChecksumSize, _workDir))
            {
                for (var i = 0; i < 3; i++)
                {
                    sourceStream.Seek(0, SeekOrigin.Begin);
                    using (var map = repo.Write(sourceStream))
                        using (new MapMonitor(map))
                        {
                            map.Start();
                            map.Wait();
                        }

                    Console.WriteLine();
                }

                Assert.Contains(0, repo.Maps.ToList());
                Assert.Contains(1, repo.Maps.ToList());
                Assert.Contains(2, repo.Maps.ToList());

                using (var map = repo.Delete(1))
                    using (new MapMonitor(map))
                    {
                        map.Start();
                        map.Wait();
                    }

                Assert.Contains(0, repo.Maps.ToList());
                Assert.Contains(2, repo.Maps.ToList());

                Assert.IsFalse(repo.Maps.Any(x => x == 1), "Map with id 1 should be deleted!");
            }
        }
Beispiel #4
0
        public void Performance_Test()
        {
            const int FilesCount = 1;
            const int FileSize   = 512 * 1024 * 1024;

            Func <string> getFilePath = () => Path.Combine(_workDir, Path.GetRandomFileName());

            var sourceFiles = new List <FileInfo>(FilesCount);
            var targetFiles = new List <FileInfo>(FilesCount);
            var dataManager = new DataManager(_seed);

            Action <FileInfo, IRepository> write = (fileInfo, repo) =>
            {
                using (var file = File.Open(fileInfo.Path, FileMode.Open))
                    using (var map = repo.Write(file))
                        using (new MapMonitor(map))
                        {
                            map.Start();
                            map.Wait();

                            fileInfo.MapId = map.Id;
                        }
            };

            Action <FileInfo, IList <FileInfo>, IRepository> read = (fileInfo, files, repo) =>
            {
                var path = getFilePath();

                using (var file = File.Create(path))
                    using (var map = repo.Read(fileInfo.MapId, file))
                        using (new MapMonitor(map))
                        {
                            map.Start();
                            map.Wait();
                        }

                var targetFile = new FileInfo
                {
                    Hash  = dataManager.CalculateHash(path),
                    Path  = path,
                    MapId = fileInfo.MapId,
                    Size  = 0                                                                  // calculate
                };

                targetFiles.Add(targetFile);
            };

            using (var repo = new ManagedRepository(BlockSize, ChecksumSize, _workDir))
            {
                Console.WriteLine("=== Generating files (count: {0}) ===", FilesCount);
                Parallel.For(0, FilesCount, i => sourceFiles.Add(dataManager.GenerateFile(FileSize)));
                Console.WriteLine();

                Console.WriteLine("=== Writing files to the repo ===");
                Parallel.ForEach(sourceFiles, file => write(file, repo));
                Console.WriteLine();

                Console.WriteLine("=== Reading files from the repo ===");
                Parallel.ForEach(sourceFiles, mapId => read(mapId, targetFiles, repo));
                Console.WriteLine();

                foreach (var source in sourceFiles)
                {
                    var target = targetFiles.Single(x => x.MapId == source.MapId);

                    Assert.AreEqual(source.Hash, target.Hash);
                }
            }
        }