public async Task InstallsRevisionCorrectly() { var configFile = new ConfigFile(Dir); var fs = new MockFileSystem(); var revisionManager = new RevisionManager(configFile, fs); Util.CreateSFMDirectory(fs); var revision = Util.CreateFakeTempRevision(fs); await revisionManager.InstallRevision(revision, "C:\\tmp", null); Assert.IsTrue(revisionManager.VerifyInstalled(revision, null)); }
public async Task ExecutesCorrectly() { var configFile = new ConfigFile("C:\\SFM"); var fs = new MockFileSystem(); var revisionManager = new RevisionManager(configFile, fs); fs.CreateDirectory("C:\\SFM"); fs.CreateDirectory("C:\\SFM\\ponysfm"); fs.CreateDirectory("C:\\tmp"); fs.CreateDirectory("C:\\tmp\\models"); fs.CreateFile("C:\\tmp\\models\\pony.vtf"); fs.CreateDirectory("C:\\tmp\\materials"); fs.CreateFile("C:\\tmp\\materials\\pony.vmt"); var files = new List <RevisionFileEntry> { RevisionFileEntry.FromFile("C:\\tmp\\models\\pony.vtf", fs), RevisionFileEntry.FromFile("C:\\tmp\\materials\\pony.vmt", fs) }; var revision = new Revision(1, files); await revisionManager.InstallRevision(revision, "C:\\tmp", null); Assert.IsTrue(revisionManager.VerifyInstalled(revision, null)); var list = new List <int> { 1 }; var deinstallationPresenter = new DeinstallationPresenter(revisionManager, list); await deinstallationPresenter.Execute(); Assert.IsFalse(revisionManager.VerifyInstalled(revision, null)); foreach (var file in revision.Files) { Assert.IsFalse(fs.FileExists(file.Path)); } }
public async Task UninstallsRevisionCorrectly() { var configFile = new ConfigFile(Dir); var fs = new MockFileSystem(); var revisionManager = new RevisionManager(configFile, fs); Util.CreateSFMDirectory(fs); var revision = Util.CreateFakeTempRevision(fs); await revisionManager.InstallRevision(revision, "C:\\tmp", null); Assert.IsTrue(revisionManager.VerifyInstalled(revision, null)); await revisionManager.UninstallRevision(revision.ID, null); Assert.IsFalse(revisionManager.VerifyInstalled(revision, null)); foreach (var file in revision.Files) { Assert.IsFalse(fs.FileExists(file.Path)); } }
public async Task ExecuteInstallation(int id) { var zipTmp = _fs.GetTempPath(); var tempDir = _fs.GetTempPath(); IZipFile zip = null; var progress = new Progress <int>(i => SetProgress(_currentProgressState, i)); _revisionMgr.OnFileExists += (s, e) => OnFileExists?.Invoke(s, e); if (!_fs.DirectoryExists(tempDir)) { _fs.CreateDirectory(tempDir); } LogInstallation("Installing revision " + id + "\n"); _currentProgressState = ProgressState.Download; LogInstallation("Downloading file...\n"); Action cleanup = delegate { if (zip != null) { if (zip is MockZipFile) { _fs.DeleteDirectory(zipTmp); } else { _fs.DeleteFile(zipTmp); } } _fs.DeleteDirectory(tempDir); }; try { await _api.DownloadRevisionZip(id, zipTmp, progress); } catch (WebException e) { MessageBox.Show("Failed to download: " + e.Message); cleanup(); return; } _currentProgressState = ProgressState.Extraction; LogInstallation("Extracting zip file...\n"); zip = _fs.OpenZip(zipTmp); await zip.Extract(tempDir, progress); var parser = new TempRevisionParser(tempDir, _fs); var modDir = parser.FindModFolder(); if (string.IsNullOrWhiteSpace(modDir)) { const string s = "This mod cannot be installed because it does not have the appropriate file-structure."; LogInstallation(s); MessageBox.Show(s); cleanup(); return; } _currentProgressState = ProgressState.Installation; LogInstallation("Installing files to SFM...\n"); var tmpRev = Revision.CreateTemporaryRevisionFromFolder(id, modDir, _fs); await _api.FetchMetadata(tmpRev); var result = await _revisionMgr.InstallRevision(tmpRev, modDir, progress, CancellationSource.Token); /* If we don't do this the directory deletion crashes because the handle created in zip.Extract is not released properly? */ GC.Collect(); GC.WaitForPendingFinalizers(); LogInstallation("Cleaning up...\n"); cleanup(); switch (result) { case InstallationResult.Success: LogInstallation("Installation cancelled by user\n"); break; case InstallationResult.Cancelled: LogInstallation("Installation successful\n"); break; default: throw new ArgumentOutOfRangeException(); } LogInstallation("Done!\n"); }