public void Patching_System_SaveAndReload_SnPatch_SuccessfulBefore()
        {
            var snPatch = new SnPatch
            {
                ComponentId = "C7",
                Version     = new Version(2, 0),
                Description = "C7 description",
                ReleaseDate = new DateTime(2020, 07, 31),
                Boundary    = ParseBoundary("1.0 <= v <  2.0"),
            };

            var packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None)
                           .ConfigureAwait(false).GetAwaiter().GetResult();

            Assert.IsFalse(packages.Any());

            // SAVE
            PackageManager.SavePackage(Manifest.Create(snPatch), ExecutionResult.SuccessfulBefore, null);

            // RELOAD
            packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None)
                       .ConfigureAwait(false).GetAwaiter().GetResult();

            // ASSERT
            var patches = packages.Select(PatchManager.CreatePatch).ToArray();
            var patch   = (SnPatch)patches[0];

            Assert.AreEqual(1, patches.Length);
            Assert.IsTrue(patch.Id > 0);
            Assert.AreEqual("C7: 1.0 <= v < 2.0 --> 2.0", patch.ToString());
            Assert.AreEqual(ExecutionResult.SuccessfulBefore, patch.ExecutionResult);
        }
        public void Patching_System_CreatePackageFromPatch_NoDep()
        {
            var patch = new SnPatch
            {
                ComponentId = "C7",
                Version     = new Version(2, 0),
                Description = "C7 description",
                ReleaseDate = new DateTime(2345, 07, 31),
                Boundary    = ParseBoundary("1.0 <= v < 2.0"),
            };
            var expectedManifest = @"<?xml version='1.0' encoding='utf-8'?>
<Package type='Patch'>
  <Id>C7</Id>
  <ReleaseDate>2345-07-31</ReleaseDate>
  <Version>2.0</Version>
  <Description>C7 description</Description>
  <Dependencies>
    <Dependency id='C7' minVersion='1.0' maxVersionExclusive='2.0' />
  </Dependencies>
</Package>".Replace('\'', '"');

            // ACTION
            var pkg = PatchManager.CreatePackage(patch);

            // ASSERT
            Assert.AreEqual("C7", pkg.ComponentId);
            Assert.AreEqual(new Version(2, 0), pkg.ComponentVersion);
            Assert.AreEqual("C7 description", pkg.Description);
            Assert.AreEqual(new DateTime(2345, 07, 31), pkg.ReleaseDate);
            Assert.AreEqual(expectedManifest, pkg.Manifest);
        }
        public void PatchingSystem_SaveAndReloadSnPatch()
        {
            var snPatch = new SnPatch
            {
                ComponentId  = "C7",
                Version      = new Version(2, 0),
                Description  = "C7 description",
                ReleaseDate  = new DateTime(2020, 07, 31),
                Boundary     = ParseBoundary("1.0 <= v <  2.0"),
                Dependencies = new[]
                {
                    Dep("C1", "1.0 <= v <= 1.0"),
                    Dep("C2", "1.0 <= v       "),
                    Dep("C3", "1.0 <  v       "),
                    Dep("C4", "       v <= 2.0"),
                    Dep("C5", "       v <  2.0"),
                    Dep("C6", "1.0 <= v <  2.0"),
                }
            };

            var packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None)
                           .ConfigureAwait(false).GetAwaiter().GetResult();

            Assert.IsFalse(packages.Any());

            // SAVE
            PackageManager.SavePackage(Manifest.Create(snPatch), null, true, null);

            // RELOAD
            packages = PackageManager.Storage.LoadInstalledPackagesAsync(CancellationToken.None)
                       .ConfigureAwait(false).GetAwaiter().GetResult();

            // ASSERT
            var patches = packages.Select(PatchManager.CreatePatch).ToArray();
            var patch   = (SnPatch)patches[0];

            Assert.AreEqual(1, patches.Length);
            Assert.IsTrue(patch.Id > 0);
            Assert.AreEqual(PackageType.Patch, patch.Type);
            Assert.AreEqual("C7", patch.ComponentId);
            Assert.AreEqual(new Version(2, 0), patch.Version);
            Assert.AreEqual("1.0 <= v < 2.0", patch.Boundary.ToString());
            Assert.AreEqual("C7 description", patch.Description);
            Assert.AreEqual(new DateTime(2020, 07, 31), patch.ReleaseDate);
            var dep = string.Join(",", patch.Dependencies).Replace(" ", "");

            Assert.AreEqual("C1:1.0<=v<=1.0,C2:1.0<=v,C3:1.0<v,C4:v<=2.0,C5:v<2.0,C6:1.0<=v<2.0", dep);
            Assert.IsTrue(patch.ExecutionDate > DateTime.UtcNow.AddMinutes(-1));
            Assert.IsTrue(patch.ExecutionDate <= DateTime.UtcNow);
            Assert.AreEqual(ExecutionResult.Successful, patch.ExecutionResult);
            Assert.IsNull(patch.ExecutionError);
        }
Example #4
0
        protected void ValidatePatches(SnPatch patch1, SnPatch patch2)
        {
            if (patch1.Version == patch2.Version)
            {
                throw new InvalidPackageException(
                          $"Target versions are the same. ComponentId: {patch1.ComponentId}, version: {patch1.Version}",
                          PackagingExceptionType.TargetVersionsAreTheSame);
            }

            if (patch1.Boundary.MinVersion == patch1.Boundary.MaxVersion &&
                patch2.Boundary.MinVersion == patch2.Boundary.MaxVersion &&
                patch1.Boundary.MinVersion == patch2.Boundary.MinVersion)
            {
                throw new InvalidPackageException(
                          $"Target versions are the same. ComponentId: {patch1.ComponentId}, version: {patch1.Boundary.MinVersion}",
                          PackagingExceptionType.SourceVersionsAreTheSame);
            }

            // Ordering: the patch2 need to be higher
            if (patch1.Version > patch2.Version)
            {
                var temp = patch1;
                patch1 = patch2;
                patch2 = temp;
            }

            // (C1: 1.0 <= v <  2.0, v2.0) (C1: 1.9 <= v <  3.0, v3.0) Overlapped
            if (patch1.Boundary.MaxVersion > patch2.Boundary.MinVersion)
            {
                throw new InvalidPackageException(
                          $"Overlapped intervals. Id: {patch1.ComponentId}, versions: {patch1.Version}, {patch2.Version}",
                          PackagingExceptionType.OverlappedIntervals);
            }
            // (C1: v <= 2.0, v2.0) (C1: 2.0 <= v, v3.0) Overlapped
            if (patch1.Boundary.MaxVersion == patch2.Boundary.MinVersion &&
                !patch1.Boundary.MaxVersionIsExclusive && !patch2.Boundary.MinVersionIsExclusive)
            {
                throw new InvalidPackageException(
                          $"Overlapped intervals. Id: {patch1.ComponentId}, versions: {patch1.Version}, {patch2.Version}",
                          PackagingExceptionType.OverlappedIntervals);
            }
        }
        public void PatchingSystem_InstalledComponents_Descriptions()
        {
            var installer = new ComponentInstaller
            {
                ComponentId  = "C1",
                Version      = new Version(1, 0),
                Description  = "C1 component",
                ReleaseDate  = new DateTime(2020, 07, 30),
                Dependencies = null
            };
            var patch = new SnPatch
            {
                ComponentId = "C1",
                Version     = new Version(2, 0),
                Description = "C1 patch",
                ReleaseDate = new DateTime(2020, 07, 31),
                Boundary    = new VersionBoundary
                {
                    MinVersion = new Version(1, 0)
                },
                Dependencies = new[]
                {
                    Dep("C2", "1.0 <= v <= 1.0"),
                }
            };

            PackageManager.SavePackage(Manifest.Create(installer), null, true, null);
            PackageManager.SavePackage(Manifest.Create(patch), null, true, null);

            var verInfo = RepositoryVersionInfo.Create(CancellationToken.None);

            var components = verInfo.Components.ToArray();

            Assert.AreEqual(1, components.Length);
            Assert.AreEqual("C1", components[0].ComponentId);
            Assert.AreEqual("2.0", components[0].Version.ToString());
            Assert.AreEqual("C1 component", components[0].Description);
            Assert.AreEqual(1, components[0].Dependencies.Length);
            Assert.AreEqual("C2: 1.0 <= v <= 1.0", components[0].Dependencies[0].ToString());
        }
Example #6
0
        /* ================================================================= Steps of Packaging logic algorithms */

        protected void ValidatePatch(SnPatch patch)
        {
            if (patch.ComponentId == null)
            {
                throw new InvalidPackageException("The Id cannot be null.",
                                                  PackagingExceptionType.MissingComponentId);
            }
            if (patch.ComponentId.Length == 0)
            {
                throw new InvalidPackageException("The Id cannot be empty.",
                                                  PackagingExceptionType.MissingComponentId);
            }
            if (patch.Version == null)
            {
                throw new InvalidPackageException("Missing Version.",
                                                  PackagingExceptionType.MissingVersion);
            }

            // If MaxVersion is not defined, it need to be less than the target version
            var boundary = patch.Boundary;
            var maxVer   = boundary.MaxVersion;

            if (maxVer.Major == int.MaxValue && maxVer.Minor == int.MaxValue)
            {
                boundary.MaxVersion            = patch.Version;
                boundary.MaxVersionIsExclusive = true;
            }

            if (boundary.MaxVersionIsExclusive && patch.Version < boundary.MaxVersion)
            {
                throw new InvalidPackageException("Version too small.",
                                                  PackagingExceptionType.TargetVersionTooSmall);
            }
            if (!boundary.MaxVersionIsExclusive && patch.Version <= boundary.MaxVersion)
            {
                throw new InvalidPackageException("Version too small.",
                                                  PackagingExceptionType.TargetVersionTooSmall);
            }

            if (boundary.MaxVersion < boundary.MinVersion)
            {
                throw new InvalidPackageException("Maximum version is less than minimum version.",
                                                  PackagingExceptionType.MaxLessThanMin);
            }

            if (boundary.MinVersion == boundary.MaxVersion &&
                boundary.MinVersionIsExclusive && boundary.MaxVersionIsExclusive)
            {
                throw new InvalidPackageException("Maximum and minimum versions are equal but both versions are exclusive.",
                                                  PackagingExceptionType.InvalidInterval);
            }
            if (boundary.MinVersion == boundary.MaxVersion && boundary.MinVersionIsExclusive)
            {
                throw new InvalidPackageException("Maximum and minimum versions are equal but the minimum version is exclusive.",
                                                  PackagingExceptionType.InvalidInterval);
            }
            if (boundary.MinVersion == boundary.MaxVersion && boundary.MaxVersionIsExclusive)
            {
                throw new InvalidPackageException("Maximum and minimum versions are equal but the maximum version is exclusive.",
                                                  PackagingExceptionType.InvalidInterval);
            }

            if (patch.Dependencies != null)
            {
                if (patch.Dependencies.Any(x => x.Id == patch.ComponentId))
                {
                    throw new InvalidPackageException("Patch and dependency id are the same.",
                                                      PackagingExceptionType.PatchIdAndDependencyIdAreTheSame);
                }
            }
        }