Пример #1
0
        public void ChainOrderTest()
        {
            for (int i = 0; i < 10; i++) //To shuffle list a few times
            {
                var chain = new MigrationChain(new List <IUpgradeLink>
                {
                    new UpgradeStub("0.0", "0.1"),
                    new UpgradeStub("0.1", "0.2"),
                    new UpgradeStub("0.2", "0.3"),
                    new UpgradeStub("0.2", "0.4"),
                    new UpgradeStub("0.0", "0.6"),
                    new UpgradeStub("0.3", "1.6.8"),
                }.Shuffle());

                var res = chain.GetUpgradePath(new Version(0, 0)).ToList();
                Assert.AreEqual(new Version(0, 0), res[0].MinFrom);
                Assert.AreEqual(new Version(0, 1), res[0].UpgradeTo);
                Assert.AreEqual(new Version(0, 1), res[1].MinFrom);
                Assert.AreEqual(new Version(0, 2), res[1].UpgradeTo);
                Assert.AreEqual(new Version(0, 2), res[2].MinFrom);
                Assert.AreEqual(new Version(0, 3), res[2].UpgradeTo);
                Assert.AreEqual(new Version(0, 2), res[3].MinFrom);
                Assert.AreEqual(new Version(0, 4), res[3].UpgradeTo);
                Assert.AreEqual(new Version(0, 0), res[4].MinFrom);
                Assert.AreEqual(new Version(0, 6), res[4].UpgradeTo);
                Assert.AreEqual(new Version(0, 3), res[5].MinFrom);
                Assert.AreEqual(new Version(1, 6, 8), res[5].UpgradeTo);
            }
        }
Пример #2
0
        public async Task UpgradeToLatestAvailableVersionTest()
        {
            var settings      = new UpgradeSettings();
            var verCollection = _database.GetCollection <DbVersion>(settings.VersionCollectionName);
            await _database.DropCollectionAsync(settings.VersionCollectionName);

            var dbLock  = new MongoDbLock(_settings, _database);
            var tracker = new MongoMigrationTracker(_settings, _database);

            //Step2: Apply upgrade chain
            var upgrades = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });

            var upgrader = new MongoMigrator(
                _database,
                upgrades,
                new UpgradeStub(null, "0.0"),
                settings,
                dbLock,
                tracker,
                new NullLoggerFactory());
            await upgrader.UpgradeOrInit();

            var ver = (await verCollection.FindAsync(e => true)).First();

            Assert.AreEqual(Version.Parse("0.3"), ver.Version, "After init, DB should marked with the latest version");
            Assert.IsTrue(ver.AutoUpgradeEnabled);
        }
Пример #3
0
        public async Task InitFailTest()
        {
            var settings      = new UpgradeSettings();
            var verCollection = _database.GetCollection <DbVersion>(settings.VersionCollectionName);
            await _database.DropCollectionAsync(settings.VersionCollectionName);

            var dbLock   = new MongoDbLock(_settings, _database);
            var tracker  = new MongoMigrationTracker(_settings, _database);
            var upgrades = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });
            var upgrader = new MongoMigrator(
                _database,
                upgrades,
                new UpgradeStub(null, "0.0", (s, db, log) => throw new Exception("test init failed")),
                settings,
                dbLock,
                tracker,
                new NullLoggerFactory());

            var ex = Assert.ThrowsAsync <MigrationException>(upgrader.UpgradeOrInit);

            Assert.IsNotNull(ex.InnerException);
            Assert.AreEqual("test init failed", ex.InnerException?.Message);

            var ver = (await verCollection.FindAsync(e => true)).First();

            Assert.IsNull(ver.Version);
            Assert.IsFalse(ver.AutoUpgradeEnabled);
            Assert.IsNotNull(ver.LastUpgradeError);
            Assert.IsTrue(ver.LastUpgradeError.Contains("test init failed"));
        }
Пример #4
0
        public async Task InitToTheLastVersionTest()
        {
            var settings      = new UpgradeSettings();
            var verCollection = _database.GetCollection <DbVersion>(settings.VersionCollectionName);
            await _database.DropCollectionAsync(settings.VersionCollectionName);

            var dbLock   = new MongoDbLock(_settings, _database);
            var tracker  = new MongoMigrationTracker(_settings, _database);
            var upgrades = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });
            var upgrader = new MongoMigrator(
                _database,
                upgrades,
                null,
                settings,
                dbLock,
                tracker,
                new NullLoggerFactory());

            await upgrader.UpgradeOrInit();

            var ver = (await verCollection.FindAsync(e => true)).First();

            Assert.AreEqual(Version.Parse("0.3"), ver.Version);
            Assert.IsTrue(ver.AutoUpgradeEnabled);
            Assert.IsNull(ver.LastUpgradeError);
        }
Пример #5
0
        public void UpgradeToVersionIsUniqueTest()
        {
            var chain = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.0", "0.3"),
                new UpgradeStub("0.0", "0.3"),
            });

            Assert.That(chain.Validate, Throws.InstanceOf <MigrationException>());
        }
Пример #6
0
        public void GapInChainTest()
        {
            var chain = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.2", "0.3"),
                new UpgradeStub("0.3", "0.4"),
            });

            Assert.That(chain.Validate, Throws.InstanceOf <MigrationException>());
            Assert.AreEqual(Version.Parse("0.4"), chain.Target);
        }
Пример #7
0
        public void EmptyUpgradeListTest()
        {
            // All these means nothing to upgrade
            var chain = new MigrationChain(Enumerable.Empty <IUpgradeLink>());

            chain.Validate();
            var path = chain.GetUpgradePath(null);

            Assert.IsNotNull(path);
            Assert.AreEqual(0, path.Count());
            Assert.IsNull(chain.Target);
        }
Пример #8
0
        public async Task UpgradeWithDifferentVerCollectionNameTest()
        {
            var settings = new UpgradeSettings {
                VersionCollectionName = "testtestete"
            };
            var verCollection = _database.GetCollection <DbVersion>(settings.VersionCollectionName);
            await _database.DropCollectionAsync(settings.VersionCollectionName);

            var dbLock  = new MongoDbLock(settings, _database);
            var tracker = new MongoMigrationTracker(settings, _database);

            //Step1: init db
            var upgrader = new MongoMigrator(
                _database,
                new MigrationChain(null),
                new UpgradeStub(null, "0.0"),
                settings,
                dbLock,
                tracker,
                new NullLoggerFactory());
            await upgrader.UpgradeOrInit();

            var ver = (await verCollection.FindAsync(e => true)).First();

            Assert.AreEqual(Version.Parse("0.0"), ver.Version);

            //Step2: Apply upgrade chain
            var upgrades = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });

            upgrader = new MongoMigrator(
                _database,
                upgrades,
                new UpgradeStub(null, "0.0", (s, db, log) => throw new Exception("test init failed")),
                settings,
                dbLock,
                tracker,
                new NullLoggerFactory());
            await upgrader.UpgradeOrInit();

            ver = (await verCollection.FindAsync(e => true)).First();
            Assert.AreEqual(Version.Parse("0.3"), ver.Version);
            Assert.IsTrue(ver.AutoUpgradeEnabled);
        }
Пример #9
0
        public void ConsistentUpgradeWithNullListTest([Values(null, "0.0", "0.1", "0.2", "0.3", "0.4", "1.0")] string current)
        {
            var currentVer = current == null ? null : Version.Parse(current);
            var chain      = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub(null, "0.0"),
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });

            chain.Validate();
            // All these means nothing to upgrade
            var path = chain.GetUpgradePath(currentVer);

            switch (current)
            {
            case null:
                Assert.AreEqual(4, path.Count());
                break;

            case "0.0":
                Assert.AreEqual(3, path.Count());
                break;

            case "0.1":
                Assert.AreEqual(2, path.Count());
                break;

            case "0.2":
                Assert.AreEqual(1, path.Count());
                break;

            case "0.3":
                Assert.AreEqual(0, path.Count());
                break;

            case "0.4":
                Assert.AreEqual(0, path.Count());
                break;

            case "1.0":
                Assert.AreEqual(0, path.Count());
                break;
            }
        }
Пример #10
0
        public void ThrowsIfTransactionSupportRequiredTest()
        {
            var dbLockMoq = new Mock <IDbLock>();

            dbLockMoq.Setup(e => e.ObtainLock(It.IsAny <TimeSpan>())).Returns(Task.FromResult(
                                                                                  (IDbLockState) new DbVersion
            {
                IsLocked = true,
                Id       = ObjectId.GenerateNewId().ToString()
            }));

            var trackerMoq = new Mock <IMigrationTracker>();

            trackerMoq.Setup(e => e.GetState()).Returns(Task.FromResult(
                                                            (IMigrationState) new DbVersion
            {
                AutoUpgradeEnabled = true
            }));
            var upgrades = new MigrationChain(new List <IUpgradeLink>
            {
                new UpgradeStub("0.0", "0.1"),
                new UpgradeStub("0.1", "0.2"),
                new UpgradeStub("0.2", "0.3"),
            });
            var upgrader = new MongoMigrator(
                _database,
                upgrades,
                null,
                new UpgradeSettings {
                IsTransactionRequired = true
            },
                dbLockMoq.Object,
                trackerMoq.Object,
                new NullLoggerFactory());

            var ex = Assert.ThrowsAsync <MigrationException>(upgrader.UpgradeOrInit);

            Assert.IsTrue(ex.Message.Contains("transactions are not available", StringComparison.OrdinalIgnoreCase),
                          ex.Message);
        }
Пример #11
0
        private static async Task <int> MainAsync(string[] args)
        {
            if (args.Any() &&
                args[0].Equals(CommandLineConstants.MigrateCliVerb, StringComparison.OrdinalIgnoreCase) &&
                !args.Any(a => a.TrimEnd().EndsWith("help", StringComparison.OrdinalIgnoreCase)))
            {
                return(Migrate() ? 0 : 1);
            }

            Agents.Net.CommunityAnalysis.Analyse(Array.Empty <Assembly>());
#if DEBUG
            Stopwatch stopwatch = Stopwatch.StartNew();
#endif
            try
            {
                bool             noSdkExploration = args.Any(a => a.Contains("--no-sdk-exploration", StringComparison.Ordinal));
                ILog             log     = CreateLog();
                ContainerBuilder builder = new ContainerBuilder();
                builder.RegisterInstance(log);
                builder.RegisterModule(new DiModule(noSdkExploration));

                using (IContainer container = builder.Build())
                {
                    try
                    {
                        ICommandLineParser commandLineParser = container.Resolve <ICommandLineParser>();
#if DEBUG
                        Console.WriteLine($@"Startup timer {stopwatch.Elapsed}");
                        Console.WriteLine($@"Arguments: {args.Aggregate(string.Empty, (s, s1) => s + "_" + s1)}");
#endif
                        int result = await commandLineParser.Parse(args).ConfigureAwait(false);

                        return(result);
                    }
                    catch (Exception e)
                    {
                        IExceptionHandler exceptionHandler = container.Resolve <IExceptionHandler>();
                        if (!exceptionHandler.HandleException(e))
                        {
                            throw;
                        }

                        return(-1);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($@"Unexpected exception during execution{Environment.NewLine}{e}");
                Trace.TraceError(e.ToString());
                return(-1);
            }

            ILog CreateLog()
            {
                string path   = LogHelper.GetLogCatalogLocation();
                ILog   result = LogCatalog.CreateNewLog(path, string.Join(" ", args));

                result.AddInitialLog(args);
                return(result);
            }

            bool Migrate()
            {
                ILog log = LogHelper.GetMigrationLog();

                try
                {
                    log.AddInitialLog(args);
                    //Not implemented feature: Old version has caches and settings in same location as current version.
                    //How to identify the version? Probably create a .version file.
                    return(MigrationChain.Start(m =>
                    {
                        Console.WriteLine(m);
                        log.LogInformation(m);
                    })
                           .AddPotentialLocation(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                                                              "plcncli.Common"), new Version(19, 0))
                           .AddMigrationFile("settings.xml")
                           .AddMigrationFile("sdk-properties.xml")
                           .SetMigrationDestination(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                                                                 (Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly()).GetName().Name))
                           .AddConversionStep <ConversionFrom190>()
                           .Execute());
                }
                finally
                {
                    (log as IDisposable)?.Dispose();
                }
            }
        }