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); }
private static void AddRandomFilesToArchive(MS2Archive archive) { const int minFilesForRandom = 10; const string folderForAddingName = "FilesForAddingToArchive"; string folderToArchive = Path.Combine(@"..\TestData", folderForAddingName); string folderToArchiveFullPath = Path.GetFullPath(folderToArchive) + @"\"; string[] filesToArchive = Directory.GetFiles(folderToArchive, "*.*", SearchOption.AllDirectories).Select(p => Path.GetFullPath(p)).ToArray(); Assert.IsTrue(filesToArchive.Length > minFilesForRandom, $"you need at least {minFilesForRandom} files in the adding archive folder for this test"); uint count = (uint)Random.Next(minFilesForRandom, filesToArchive.Length); HashSet <string> distinctFiles = new HashSet <string>(); uint i = 0; while (i < count) { if (distinctFiles.Add(filesToArchive[Random.Next(0, filesToArchive.Length)])) { i++; } } string[] files = distinctFiles.ToArray(); Assert.AreEqual(files.Length, (int)count); for (i = 0; i < count; i++) { string file = files[i]; archive.Files.Add(MS2File.Create((uint)archive.Files.Count + i, file.Remove(folderToArchiveFullPath), CompressionType.Zlib, archive.CryptoMode, file)); } }
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); } }
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); } }