Ejemplo n.º 1
0
        private static async Task CreateArchiveAsync(string sourcePath, string headerFilePath, string dataFilePath)
        {
            if (!Directory.Exists(sourcePath))
            {
                throw new Exception($"Directory doesn't exist \"{sourcePath}\".");
            }

            var filePaths = GetFilesRelative(sourcePath);

            MS2File[] files = new MS2File[filePaths.Length];
            var       tasks = new Task[filePaths.Length];

            for (uint i = 0; i < filePaths.Length; i++)
            {
                uint ic = i;
                tasks[i] = Task.Run(() =>
                {
                    var(filePath, relativePath) = filePaths[ic];

                    files[ic] = MS2File.Create(ic + 1u, relativePath, CompressionType.Zlib, CryptoMode, filePath);
                });
            }

            await Task.WhenAll(tasks).ConfigureAwait(false);

            await MS2Archive.Save(CryptoMode, files, headerFilePath, dataFilePath, RunMode.Async2).ConfigureAwait(false);
        }
        public async Task TestCreateConsistencyMS2F()
        {
            const string archiveName             = "PrecomputedTerrain";
            const string folderToArchive         = @"C:\Users\Miyu\Desktop\ReleaseOutput\Resource\" + archiveName;
            string       folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\";

            string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray();

            const string  headerFilePath    = @"..\TestData\PrecomputedTerrain.m2h";
            const string  dataFilePath      = @"..\TestData\PrecomputedTerrain.m2d";
            MS2CryptoMode archiveCryptoMode = MS2CryptoMode.MS2F;

            MS2File[] files = new MS2File[filesToArchive.Length];
            for (int i = 0; i < filesToArchive.Length; i++)
            {
                string file = filesToArchive[i];

                files[i] = MS2File.Create((uint)i + 1u, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, archiveCryptoMode, file);
            }

            const string testArchiveName    = "FromExtractedMS2F";
            const string headerTestFileName = testArchiveName + ".m2h";
            const string dataTestFileName   = testArchiveName + ".m2d";

            try
            {
                await MS2Archive.Save(archiveCryptoMode, files, headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false);

                Assert.IsTrue(File.Exists(headerTestFileName));
                Assert.IsTrue(File.Exists(dataTestFileName));

                using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false))
                {
                    Dictionary <uint, MS2File> mappedFiles = archive.Files.Zip(files, (o, s) => (o, s))
                                                             .ToDictionary(f => f.o.Id, f => files.Where(sf => sf.Name == f.o.Name).First());
                    Assert.AreEqual(archive.CryptoMode, archiveCryptoMode);
                    Assert.AreEqual(archive.Files.Count, filesToArchive.Length);
                    //Assert.AreEqual(archive.Name, ArchiveName);

                    Task[] tasks = new Task[filesToArchive.Length];

                    for (int i = 0; i < filesToArchive.Length; i++)
                    {
                        int ic = i;
                        tasks[ic] = Task.Run(async() =>
                        {
                            MS2File file      = archive.Files[ic];
                            MS2File savedFile = mappedFiles[file.Id];
                            var(savedStream, savedShouldDispose) = await savedFile.GetDecryptedStreamAsync().ConfigureAwait(false);
                            try
                            {
                                Assert.AreEqual(file.Id, (uint)ic + 1);
                                Assert.AreEqual(file.CompressionType, CompressionType.Zlib);
                                Assert.IsTrue(file.IsZlibCompressed);
                                Assert.AreEqual(file.Name, savedFile.Name);
                                Assert.AreEqual(file.Header.CompressionType, file.CompressionType);
                                Assert.AreEqual(file.Header.Size, (uint)savedStream.Length);

                                (Stream stream, bool shouldDispose) = await file.GetDecryptedStreamAsync().ConfigureAwait(false);
                                try
                                {
                                    byte[] savedBytes     = new byte[savedStream.Length];
                                    byte[] originalBytes  = new byte[stream.Length];
                                    int savedReadBytes    = await savedStream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false);
                                    int originalReadBytes = await stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false);
                                    Assert.AreEqual(originalReadBytes, savedReadBytes);

                                    CollectionAssert.AreEqual(originalBytes, savedBytes);
                                }
                                finally
                                {
                                    if (shouldDispose)
                                    {
                                        stream.Dispose();
                                    }
                                }
                            }
                            finally
                            {
                                if (savedShouldDispose)
                                {
                                    savedStream.Dispose();
                                }
                            }
                        });
                    }

                    await Task.WhenAll(tasks).ConfigureAwait(false);
                }
            }
            finally
            {
                File.Delete(headerTestFileName);
                File.Delete(dataTestFileName);
            }
        }
Ejemplo n.º 3
0
        public async Task TestCreateCompletelyNewNS2F()
        {
            const string folderForArchiving      = "TestFolderForArchiving";
            string       folderToArchive         = Path.Combine(@"..\TestData", folderForArchiving);
            string       folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\";

            string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray();

            MS2CryptoMode cryptoMode = MS2CryptoMode.NS2F;

            MS2File[] files = new MS2File[filesToArchive.Length];
            for (int i = 0; i < filesToArchive.Length; i++)
            {
                string file = filesToArchive[i];

                files[i] = MS2File.Create((uint)i + 1u, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, cryptoMode, file);
            }

            const string testArchiveName    = "TestArchiveNS2F";
            const string headerTestFileName = testArchiveName + ".m2h";
            const string dataTestFileName   = testArchiveName + ".m2d";

            try
            {
                await MS2Archive.Save(cryptoMode, files, headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false);

                Assert.IsTrue(File.Exists(headerTestFileName));
                Assert.IsTrue(File.Exists(dataTestFileName));

                using (MS2Archive archive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false))
                {
                    Assert.AreEqual(archive.CryptoMode, cryptoMode);
                    Assert.AreEqual(archive.Files.Count, filesToArchive.Length);
                    //Assert.AreEqual(archive.Name, ArchiveFolder);

                    for (int i = 0; i < filesToArchive.Length; i++)
                    {
                        FileStream fsFile = File.OpenRead(filesToArchive[i]);
                        MS2File    file   = archive.Files[i];
                        Assert.AreEqual(file.Id, (uint)i + 1);
                        Assert.AreEqual(file.CompressionType, CompressionType.Zlib);
                        Assert.IsTrue(file.IsZlibCompressed);
                        Assert.AreEqual(file.Name, filesToArchive[i].Remove(folderToArchiveFullPath));
                        Assert.AreEqual(file.Header.CompressionType, file.CompressionType);
                        Assert.AreEqual(file.Header.Size, (uint)fsFile.Length);

                        (Stream stream, bool shouldDispose) = await file.GetDecryptedStreamAsync().ConfigureAwait(false);

                        try
                        {
                            byte[] originalBytes     = new byte[fsFile.Length];
                            byte[] savedBytes        = new byte[stream.Length];
                            int    originalReadBytes = await fsFile.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false);

                            int savedReadBytes = await stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false);

                            Assert.AreEqual(originalReadBytes, savedReadBytes);

                            CollectionAssert.AreEqual(originalBytes, savedBytes);
                        }
                        finally
                        {
                            if (shouldDispose)
                            {
                                stream.Dispose();
                            }
                        }
                    }
                }
            }
            finally
            {
                File.Delete(headerTestFileName);
                File.Delete(dataTestFileName);
            }
        }
Ejemplo n.º 4
0
        public async Task AddingMS2F()
        {
            const string headerFilePath = @"..\TestData\PrecomputedTerrain.m2h";
            const string dataFilePath   = @"..\TestData\PrecomputedTerrain.m2d";

            using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false))
            {
                AddRandomFilesToArchive(archive);

                const string testArchiveName    = "AddingTestMS2F";
                const string headerTestFileName = testArchiveName + ".m2h";
                const string dataTestFileName   = testArchiveName + ".m2d";

                try
                {
                    await archive.Save(headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false);

                    using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false))
                    {
                        Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode);
                        Assert.AreEqual(archive.Files.Count, testArchive.Files.Count);
                        Assert.AreNotEqual(archive.Header.Size, testArchive.Header.Size);
                        Assert.AreNotEqual(archive.Data.Size, testArchive.Data.Size);

                        for (int i = 0; i < testArchive.Files.Count; i++)
                        {
                            Assert.AreEqual(archive.Files[i].IsZlibCompressed, testArchive.Files[i].IsZlibCompressed);
                            Assert.AreEqual(archive.Files[i].CompressionType, testArchive.Files[i].CompressionType);
                            Assert.AreEqual(archive.Files[i].InfoHeader.Id, testArchive.Files[i].InfoHeader.Id);
                            Assert.AreEqual(archive.Files[i].InfoHeader.Name, testArchive.Files[i].InfoHeader.Name);
                            Assert.AreEqual(archive.Files[i].InfoHeader.RootFolderId, testArchive.Files[i].InfoHeader.RootFolderId);

                            (Stream Stream, bool ShouldDispose)original = await archive.Files[i].GetDecryptedStreamAsync().ConfigureAwait(false);
                            (Stream Stream, bool ShouldDispose)saved    = await testArchive.Files[i].GetDecryptedStreamAsync().ConfigureAwait(false);

                            try
                            {
                                if (archive.Files[i].Header != null && testArchive.Files[i].Header != null)
                                {
                                    Assert.AreEqual(archive.Files[i].Header.Size, testArchive.Files[i].Header.Size);
                                }
                                else if (archive.Files[i].Header != null)
                                {
                                    Assert.AreEqual(archive.Files[i].Header.Size, saved.Stream.Length);
                                }
                                else if (testArchive.Files[i].Header != null)
                                {
                                    Assert.AreEqual(original.Stream.Length, testArchive.Files[i].Header.Size);
                                }
                                Assert.AreEqual(original.Stream.Length, saved.Stream.Length);
                                byte[] originalBytes     = new byte[original.Stream.Length];
                                byte[] savedBytes        = new byte[saved.Stream.Length];
                                int    originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false);

                                int savedReadBytes = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false);

                                Assert.AreEqual(originalReadBytes, savedReadBytes);

                                CollectionAssert.AreEqual(originalBytes, savedBytes);
                            }
                            finally
                            {
                                if (original.ShouldDispose)
                                {
                                    original.Stream.Dispose();
                                }

                                if (saved.ShouldDispose)
                                {
                                    saved.Stream.Dispose();
                                }
                            }
                        }
                    }
                }
                finally
                {
                    File.Delete(headerTestFileName);
                    File.Delete(dataTestFileName);
                }
            }
        }
Ejemplo n.º 5
0
        public async Task LoadThenSaveTestSyncNS2F()
        {
            const string  headerFilePath    = @"..\TestData\Xml.m2h";
            const string  dataFilePath      = @"..\TestData\Xml.m2d";
            MS2CryptoMode archiveCryptoMode = MS2CryptoMode.NS2F;

            using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false))
            {
                Assert.AreEqual(archive.CryptoMode, archiveCryptoMode);
                Assert.AreEqual(archive.Files.Count, 66107);
                Assert.AreEqual(archive.Header, new MS2SizeHeader(502536u, 376900u, 3314723u));
                Assert.AreEqual(archive.Data, new MS2SizeHeader(776208u, 582154u, 2379852u));

                const string testArchiveName    = "SyncSaveTestNS2F";
                const string headerTestFileName = testArchiveName + ".m2h";
                const string dataTestFileName   = testArchiveName + ".m2d";

                try
                {
                    await archive.Save(headerTestFileName, dataTestFileName, RunMode.Sync).ConfigureAwait(false);

                    using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false))
                    {
                        Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode);
                        Assert.AreEqual(archive.Files.Count, testArchive.Files.Count);
                        Assert.AreEqual(archive.Header.Size, testArchive.Header.Size);
                        Assert.AreEqual(archive.Data.Size, testArchive.Data.Size);

                        for (int i = 0; i < testArchive.Files.Count; i++)
                        {
                            Assert.AreEqual(archive.Files[i].IsZlibCompressed, testArchive.Files[i].IsZlibCompressed);
                            Assert.AreEqual(archive.Files[i].CompressionType, testArchive.Files[i].CompressionType);
                            Assert.AreEqual(archive.Files[i].Header?.Size, testArchive.Files[i].Header?.Size);
                            Assert.AreEqual(archive.Files[i].InfoHeader.Id, testArchive.Files[i].InfoHeader.Id);
                            Assert.AreEqual(archive.Files[i].InfoHeader.Name, testArchive.Files[i].InfoHeader.Name);
                            Assert.AreEqual(archive.Files[i].InfoHeader.RootFolderId, testArchive.Files[i].InfoHeader.RootFolderId);

                            (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)original = await archive.Files[i].GetEncryptedStreamAsync().ConfigureAwait(false);
                            (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)saved    = await testArchive.Files[i].GetEncryptedStreamAsync().ConfigureAwait(false);

                            try
                            {
                                Assert.AreEqual(original.Header.Size, saved.Header.Size);
                                Assert.AreEqual(original.Stream.Length, saved.Stream.Length);
                                byte[] originalBytes     = new byte[original.Stream.Length];
                                byte[] savedBytes        = new byte[saved.Stream.Length];
                                int    originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false);

                                int savedReadBytes = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false);

                                Assert.AreEqual(originalReadBytes, savedReadBytes);

                                CollectionAssert.AreEqual(originalBytes, savedBytes);
                            }
                            finally
                            {
                                if (original.ShouldDispose)
                                {
                                    original.Stream.Dispose();
                                }

                                if (saved.ShouldDispose)
                                {
                                    saved.Stream.Dispose();
                                }
                            }
                        }
                    }
                }
                finally
                {
                    File.Delete(headerTestFileName);
                    File.Delete(dataTestFileName);
                }
            }
        }
Ejemplo n.º 6
0
        public async Task LoadThenSaveTestAsync2MS2F()
        {
            const string  headerFilePath    = @"..\TestData\PrecomputedTerrain.m2h";
            const string  dataFilePath      = @"..\TestData\PrecomputedTerrain.m2d";
            MS2CryptoMode archiveCryptoMode = MS2CryptoMode.MS2F;

            using (MS2Archive archive = await MS2Archive.Load(headerFilePath, dataFilePath).ConfigureAwait(false))
            {
                Assert.AreEqual(archive.CryptoMode, archiveCryptoMode);
                Assert.AreEqual(archive.Files.Count, 1694);
                Assert.AreEqual(archive.Header, new MS2SizeHeader(11056u, 8291u, 36097u));
                Assert.AreEqual(archive.Data, new MS2SizeHeader(31752u, 23813u, 81312u));

                const string testArchiveName    = "Async2SaveTestMS2F";
                const string headerTestFileName = testArchiveName + ".m2h";
                const string dataTestFileName   = testArchiveName + ".m2d";

                try
                {
                    await archive.Save(headerTestFileName, dataTestFileName, RunMode.Async2).ConfigureAwait(false);

                    using (MS2Archive testArchive = await MS2Archive.Load(headerTestFileName, dataTestFileName).ConfigureAwait(false))
                    {
                        Assert.AreEqual(archive.CryptoMode, testArchive.CryptoMode);
                        Assert.AreEqual(archive.Files.Count, testArchive.Files.Count);
                        Assert.AreEqual(archive.Header.Size, testArchive.Header.Size);
                        Assert.AreEqual(archive.Data.Size, testArchive.Data.Size);

                        Task[] tasks = new Task[testArchive.Files.Count];

                        for (int i = 0; i < testArchive.Files.Count; i++)
                        {
                            int ic = i;
                            Assert.AreEqual(archive.Files[ic].IsZlibCompressed, testArchive.Files[ic].IsZlibCompressed);
                            Assert.AreEqual(archive.Files[ic].CompressionType, testArchive.Files[ic].CompressionType);
                            Assert.AreEqual(archive.Files[ic].Header?.Size, testArchive.Files[ic].Header?.Size);
                            Assert.AreEqual(archive.Files[ic].InfoHeader.Id, testArchive.Files[ic].InfoHeader.Id);
                            Assert.AreEqual(archive.Files[ic].InfoHeader.Name, testArchive.Files[ic].InfoHeader.Name);
                            Assert.AreEqual(archive.Files[ic].InfoHeader.RootFolderId, testArchive.Files[ic].InfoHeader.RootFolderId);

                            tasks[ic] = Task.Run(async() =>
                            {
                                (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)original = await archive.Files[ic].GetEncryptedStreamAsync().ConfigureAwait(false);
                                (Stream Stream, bool ShouldDispose, MS2SizeHeader Header)saved    = await testArchive.Files[ic].GetEncryptedStreamAsync().ConfigureAwait(false);

                                try
                                {
                                    Assert.AreEqual(original.Header.Size, saved.Header.Size);
                                    Assert.AreEqual(original.Stream.Length, saved.Stream.Length);
                                    byte[] originalBytes  = new byte[original.Stream.Length];
                                    byte[] savedBytes     = new byte[saved.Stream.Length];
                                    int originalReadBytes = await original.Stream.ReadAsync(originalBytes, 0, originalBytes.Length).ConfigureAwait(false);
                                    int savedReadBytes    = await saved.Stream.ReadAsync(savedBytes, 0, savedBytes.Length).ConfigureAwait(false);
                                    Assert.AreEqual(originalReadBytes, savedReadBytes);

                                    CollectionAssert.AreEqual(originalBytes, savedBytes);
                                }
                                finally
                                {
                                    if (original.ShouldDispose)
                                    {
                                        original.Stream.Dispose();
                                    }

                                    if (saved.ShouldDispose)
                                    {
                                        saved.Stream.Dispose();
                                    }
                                }
                            });
                        }

                        await Task.WhenAll(tasks).ConfigureAwait(false);
                    }
                }
                finally
                {
                    File.Delete(headerTestFileName);
                    File.Delete(dataTestFileName);
                }
            }
        }