Example #1
0
        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]));
        }
Example #2
0
        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));
        }
Example #4
0
        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));
        }
Example #6
0
        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));
        }
Example #7
0
        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));
        }
Example #9
0
        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)));
        }
Example #10
0
        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));
        }