public void PatchingExec_InstallOne_Faulty() { var packages = new List <Package[]>(); var log = new List <PatchExecutionLogRecord>(); void LogMessage(PatchExecutionLogRecord record) { packages.Add(LoadPackages()); log.Add(record); } var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Inst("C1", "v1.0", null, Error), }; // ACTION var context = new PatchExecutionContext(null, LogMessage); var pm = new PatchManager(context); pm.ExecuteRelevantPatches(patches, installed, context); // ASSERT Assert.AreEqual("ErrorInExecution C1: 1.0", ErrorsToString(context)); Assert.AreEqual(3, log.Count); Assert.AreEqual("[C1: 1.0] ExecutionStart.", log[0].ToString()); Assert.AreEqual("[C1: 1.0] ExecutionError. Err", log[1].ToString()); Assert.AreEqual("[C1: 1.0] ExecutionFinished. Faulty", log[2].ToString()); Assert.AreEqual("1, C1: Install Unfinished, 1.0", PackagesToString(packages[0])); Assert.AreEqual("1, C1: Install Unfinished, 1.0", PackagesToString(packages[1])); Assert.AreEqual("1, C1: Install Faulty, 1.0", PackagesToString(packages[2])); }
public void PatchingExecSim_Install_1New() { var patches = new ISnPatch[] { Inst("C1", "v1.0", null, null), }; var installed = new SnComponentDescriptor[0]; var context = new PatchExecutionContext(null, null); var pm = new PatchManager(context); var executables = pm.GetExecutablePatches(patches, installed, context, out var after).ToArray(); Assert.AreEqual(1, after.Length); Assert.AreEqual(1, executables.Length); }
public void Patching_System_Load_Issue1174() { SavePackage(Inst("REF", "1.0"), ExecutionResult.Successful, true); SavePackage(Inst("C01", "1.0"), ExecutionResult.FaultyBefore, true); SavePackage(Inst("C01", "1.0"), ExecutionResult.Successful, true); // ACTION var installed = PackageManager.Storage? .LoadInstalledComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var faulty = PackageManager.Storage? .LoadIncompleteComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var currentComponents = SnComponentDescriptor.CreateComponents(installed, faulty); // ASSERT Assert.AreEqual("C01v1.0(,,Successful) REFv1.0(,,Successful)", ComponentsToStringWithResult(currentComponents)); }
public void PatchingExec_PatchOne_Faulty() { var packages = new List <Package[]>(); var log = new List <PatchExecutionLogRecord>(); void LogMessage(PatchExecutionLogRecord record) { packages.Add(LoadPackages()); log.Add(record); } var executed = new List <ISnPatch>(); void Execute(PatchExecutionContext peContext) => executed.Add(peContext.CurrentPatch); var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Patch("C1", "1.0 <= v < 2.0", "v2.0", null, Error), Inst("C1", "v1.0", null, Execute), }; // ACTION var context = new PatchExecutionContext(null, LogMessage); var pm = new PatchManager(context); pm.ExecuteRelevantPatches(patches, installed, context); // ASSERT Assert.AreEqual("ErrorInExecution C1: 1.0 <= v < 2.0 --> 2.0", ErrorsToString(context)); Assert.AreEqual(5, log.Count); Assert.AreEqual("C1i1.0", PatchesToString(executed.ToArray())); Assert.AreEqual("[C1: 1.0] ExecutionStart.", log[0].ToString()); Assert.AreEqual("[C1: 1.0] ExecutionFinished. Successful", log[1].ToString()); Assert.AreEqual("[C1: 1.0 <= v < 2.0 --> 2.0] ExecutionStart.", log[2].ToString()); Assert.AreEqual("[C1: 1.0 <= v < 2.0 --> 2.0] ExecutionError. Err", log[3].ToString()); Assert.AreEqual("[C1: 1.0 <= v < 2.0 --> 2.0] ExecutionFinished. Faulty", log[4].ToString()); Assert.AreEqual(5, packages.Count); Assert.AreEqual("1, C1: Install Unfinished, 1.0", PackagesToString(packages[0])); Assert.AreEqual("1, C1: Install Successful, 1.0", PackagesToString(packages[1])); Assert.AreEqual("1, C1: Install Successful, 1.0|2, C1: Patch Unfinished, 2.0", PackagesToString(packages[2])); Assert.AreEqual("1, C1: Install Successful, 1.0|2, C1: Patch Unfinished, 2.0", PackagesToString(packages[3])); Assert.AreEqual("1, C1: Install Successful, 1.0|2, C1: Patch Faulty, 2.0", PackagesToString(packages[4])); }
public void Patching_System_LoadInstalledComponents() { // Installers only SavePackage(Inst("C01", "1.0"), ExecutionResult.Unfinished); SavePackage(Inst("C02", "1.0"), ExecutionResult.FaultyBefore); SavePackage(Inst("C03", "1.0"), ExecutionResult.SuccessfulBefore); SavePackage(Inst("C04", "1.0"), ExecutionResult.Faulty); SavePackage(Inst("C05", "1.0"), ExecutionResult.Successful); // Installers and patches SavePackage(Inst("C06", "1.0"), ExecutionResult.Successful); SavePackage(Patch("C06", "1.0 <= v < 2.0", "2.0"), ExecutionResult.Unfinished); SavePackage(Inst("C07", "1.0"), ExecutionResult.Successful); SavePackage(Patch("C07", "1.0 <= v < 2.0", "2.0"), ExecutionResult.FaultyBefore); SavePackage(Inst("C08", "1.0"), ExecutionResult.Successful); SavePackage(Patch("C08", "1.0 <= v < 2.0", "2.0"), ExecutionResult.SuccessfulBefore); SavePackage(Inst("C09", "1.0"), ExecutionResult.Successful); SavePackage(Patch("C09", "1.0 <= v < 2.0", "2.0"), ExecutionResult.Faulty); SavePackage(Inst("C10", "1.0"), ExecutionResult.Successful); SavePackage(Patch("C10", "1.0 <= v < 2.0", "2.0"), ExecutionResult.Successful); // ACTION var installed = PackageManager.Storage? .LoadInstalledComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var faulty = PackageManager.Storage? .LoadIncompleteComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var currentComponents = SnComponentDescriptor.CreateComponents(installed, faulty); // ASSERT Assert.AreEqual("C01v(1.0,,Unfinished) " + "C02v(1.0,,FaultyBefore) " + "C03v(1.0,,SuccessfulBefore) " + "C04v(,1.0,Faulty) " + "C05v1.0(,,Successful) " + "C06v1.0(2.0,,Unfinished) " + "C07v1.0(2.0,,FaultyBefore) " + "C08v1.0(2.0,,SuccessfulBefore) " + "C09v1.0(,2.0,Faulty) " + "C10v2.0(,,Successful)", ComponentsToStringWithResult(currentComponents)); }
public void PatchingExecSim_Patch_MissingItemInTheChain_a() { var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Patch("C1", "3.0 <= v < 4.0", "v4.0", null, null), Patch("C1", "1.0 <= v < 2.0", "v2.0", null, null), Inst("C1", "v1.0", null, null), }; // ACTION var context = new PatchExecutionContext(null, null); var pm = new PatchManager(context); var executables = pm.GetExecutablePatches(patches, installed, context, out var after).ToArray(); // ASSERT Assert.AreEqual("MissingVersion C1: 3.0 <= v < 4.0 --> 4.0", ErrorsToString(context)); Assert.AreEqual("C1v2.0", ComponentsToString(after)); Assert.AreEqual("C1i1.0 C1p2.0", PatchesToString(executables)); }
public void PatchingExecSim_Patch_C2toC1v2_b() { var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Patch("C1", "1.0 <= v < 2.0", "v2.0", null, null), Inst("C2", "v1.0", new[] { Dep("C1", "2.0 <= v <= 2.0") }, null), Inst("C1", "v1.0", null, null), }; // ACTION var context = new PatchExecutionContext(null, null); var pm = new PatchManager(context); var executables = pm.GetExecutablePatches(patches, installed, context, out var after).ToArray(); // ASSERT Assert.AreEqual(0, context.Errors.Count); Assert.AreEqual("C1v2.0 C2v1.0", ComponentsToString(after)); Assert.AreEqual("C1i1.0 C1p2.0 C2i1.0", PatchesToString(executables)); }
public void Patching_System_SaveAndReload_Installer_SuccessfulBefore() { var installer = new ComponentInstaller { ComponentId = "C7", Version = new Version(1, 0), Description = "C7 description", ReleaseDate = new DateTime(2020, 07, 31), }; var packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); Assert.IsFalse(packages.Any()); // SAVE PackageManager.SavePackage(Manifest.Create(installer), ExecutionResult.SuccessfulBefore, null); // RELOAD packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); // ASSERT var patches = packages.Select(PatchManager.CreatePatch).ToArray(); Assert.AreEqual(1, patches.Length); Assert.IsTrue(patches[0].Id > 0); Assert.AreEqual("C7: 1.0", patches[0].ToString()); Assert.AreEqual(ExecutionResult.SuccessfulBefore, patches[0].ExecutionResult); // ACTION-2 Load components var installed = PackageManager.Storage .LoadInstalledComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var incomplete = PackageManager.Storage .LoadIncompleteComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var components = SnComponentDescriptor.CreateComponents(installed, incomplete); Assert.AreEqual("C7v(1.0,,SuccessfulBefore)", ComponentsToStringWithResult(components)); }
public void PatchingExecSim_Install_Dependency() { // Test the right installer execution order if there is a dependency among the installers. var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Inst("C2", "v1.0", new[] { Dep("C1", "1.0 <= v") }, null), Inst("C1", "v1.0", null, null), }; // ACTION var context = new PatchExecutionContext(null, null); var pm = new PatchManager(context); var executables = pm.GetExecutablePatches(patches, installed, context, out var after).ToArray(); // ASSERT Assert.AreEqual(2, after.Length); Assert.AreEqual("C1,C2", string.Join(",", after.Select(x => x.ComponentId))); Assert.AreEqual(2, executables.Length); Assert.AreEqual("C1,C2", string.Join(",", executables.Select(x => x.ComponentId))); }
public void PatchingExec_InstallOne_Success() { var packages = new List <Package[]>(); var log = new List <PatchExecutionLogRecord>(); void LogMessage(PatchExecutionLogRecord record) { packages.Add(LoadPackages()); log.Add(record); } var executed = new List <ISnPatch>(); void Execute(PatchExecutionContext peContext) => executed.Add(peContext.CurrentPatch); var installed = new SnComponentDescriptor[0]; var patches = new ISnPatch[] { Inst("C1", "v1.0", null, Execute), }; // ACTION var context = new PatchExecutionContext(null, LogMessage); var pm = new PatchManager(context); pm.ExecuteRelevantPatches(patches, installed, context); // ASSERT Assert.AreEqual(0, context.Errors.Count); Assert.AreEqual(2, log.Count); Assert.AreEqual("C1i1.0", PatchesToString(executed.ToArray())); Assert.AreEqual("[C1: 1.0] ExecutionStart.", log[0].ToString()); Assert.AreEqual("[C1: 1.0] ExecutionFinished. Successful", log[1].ToString()); Assert.AreEqual("1, C1: Install Unfinished, 1.0", PackagesToString(packages[0])); Assert.AreEqual("1, C1: Install Successful, 1.0", PackagesToString(packages[1])); }
public void Patching_System_Load_Issue1174_All_Patches() { // S F Sb Fb U -> -> result // 0 0 0 0 0 - // 0 0 0 0 1 U U // 0 0 0 1 0 Fb Fb // 0 0 0 1 1 U, Fb Fb // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ // 1 1 1 0 0 Sb, F, S S // 1 1 1 0 1 U, Sb, F, S S // 1 1 1 1 0 F, Sb, F, S S // 1 1 1 1 1 U, Fb, Sb, F, S S var results = new[] { ExecutionResult.Unfinished, ExecutionResult.FaultyBefore, ExecutionResult.SuccessfulBefore, ExecutionResult.Faulty, ExecutionResult.Successful }; for (var id = 1; id < 32; id++) { SavePackage(Inst($"C{id:0#}", "1.0"), ExecutionResult.Successful, true); } for (var id = 1; id < 32; id++) { for (var r = 0; r < results.Length; r++) { if (0 != (id & 1 << r)) { SavePackage(Patch($"C{id:0#}", "1.0 <= v < 2.0", "2.0"), results[r], true); } } } // ACTION var installed = PackageManager.Storage? .LoadInstalledComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var faulty = PackageManager.Storage? .LoadIncompleteComponentsAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); var currentComponents = SnComponentDescriptor.CreateComponents(installed, faulty) .OrderBy(x => x.ComponentId).ToArray(); // ASSERT for (var id = 1; id < 32; id++) { var expectedResult = results[Convert.ToInt32(Math.Floor(Math.Log(id, 2)))]; var comp = currentComponents[id - 1]; var expectedOldVersion = new Version(1, 0); var expectedVersion = new Version(2, 0); Assert.AreEqual(expectedResult, comp.State); switch (comp.State) { case ExecutionResult.Unfinished: case ExecutionResult.FaultyBefore: case ExecutionResult.SuccessfulBefore: Assert.AreEqual(expectedVersion, comp.TempVersionBefore); Assert.IsNull(comp.TempVersionAfter); Assert.AreEqual(expectedOldVersion, comp.Version); break; case ExecutionResult.Faulty: Assert.IsNull(comp.TempVersionBefore); Assert.AreEqual(expectedVersion, comp.TempVersionAfter); Assert.AreEqual(expectedOldVersion, comp.Version); break; case ExecutionResult.Successful: Assert.IsNull(comp.TempVersionBefore); Assert.IsNull(comp.TempVersionAfter); Assert.AreEqual(expectedVersion, comp.Version); break; default: throw new ArgumentOutOfRangeException(); } } /* equivalent assertion */ // ASSERT Assert.AreEqual("C01v1.0(2.0,,Unfinished)" + " C02v1.0(2.0,,FaultyBefore)" + " C03v1.0(2.0,,FaultyBefore)" + " C04v1.0(2.0,,SuccessfulBefore)" + " C05v1.0(2.0,,SuccessfulBefore)" + " C06v1.0(2.0,,SuccessfulBefore)" + " C07v1.0(2.0,,SuccessfulBefore)" + " C08v1.0(,2.0,Faulty)" + " C09v1.0(,2.0,Faulty)" + " C10v1.0(,2.0,Faulty)" + " C11v1.0(,2.0,Faulty)" + " C12v1.0(,2.0,Faulty)" + " C13v1.0(,2.0,Faulty)" + " C14v1.0(,2.0,Faulty)" + " C15v1.0(,2.0,Faulty)" + " C16v2.0(,,Successful)" + " C17v2.0(,,Successful)" + " C18v2.0(,,Successful)" + " C19v2.0(,,Successful)" + " C20v2.0(,,Successful)" + " C21v2.0(,,Successful)" + " C22v2.0(,,Successful)" + " C23v2.0(,,Successful)" + " C24v2.0(,,Successful)" + " C25v2.0(,,Successful)" + " C26v2.0(,,Successful)" + " C27v2.0(,,Successful)" + " C28v2.0(,,Successful)" + " C29v2.0(,,Successful)" + " C30v2.0(,,Successful)" + " C31v2.0(,,Successful)", ComponentsToStringWithResult(currentComponents)); }