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); } }
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); }
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")); }
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); }
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>()); }
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); }
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); }
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); }
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; } }
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); }
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(); } } }