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 async Task EmptyUpgradeListTest() { 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 upgrader = new MongoMigrator( _database, new MigrationChain(null), null, settings, dbLock, tracker, new NullLoggerFactory()); await upgrader.UpgradeOrInit(); var ver = (await verCollection.FindAsync(e => true)).First(); Assert.IsNull(ver.Version); Assert.IsTrue(ver.AutoUpgradeEnabled); }
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 async Task LockOnEmptyDbTwiceTest([Values(3, 5, 8, 12)] int secondsToWait) { await _database.DropCollectionAsync(_settings.VersionCollectionName); var dbLock1 = new MongoDbLock(_settings, _database); var ver1 = await dbLock1.ObtainLock(TimeSpan.FromSeconds(0)); Assert.IsNotNull(ver1); Assert.IsNotNull(ver1.LockerId); Assert.IsTrue(ver1.IsLocked); var dbLock2 = new MongoDbLock(_settings, _database); var stopWatch = new Stopwatch(); stopWatch.Start(); Assert.ThrowsAsync <MigrationException>(() => dbLock2.ObtainLock(TimeSpan.FromSeconds(secondsToWait))); stopWatch.Stop(); Assert.IsTrue(TimeSpan.FromSeconds(secondsToWait - 1) < stopWatch.Elapsed, $"Elapsed: {stopWatch.Elapsed}"); Assert.IsTrue(TimeSpan.FromSeconds(secondsToWait + 1) > stopWatch.Elapsed, $"Elapsed: {stopWatch.Elapsed}"); }
public async Task LockReleaseLockTest() { await _database.DropCollectionAsync(_settings.VersionCollectionName); var dbLock1 = new MongoDbLock(_settings, _database); var ver1 = await dbLock1.ObtainLock(TimeSpan.FromSeconds(0)); Assert.IsNotNull(ver1); Assert.IsNotNull(ver1.LockerId); Assert.IsTrue(ver1.IsLocked); var dbLock2 = new MongoDbLock(_settings, _database); var secondLockTask = dbLock2.ObtainLock(TimeSpan.FromSeconds(5)); await dbLock1.ReleaseLock(); var ver2 = await secondLockTask; Assert.IsNotNull(ver2); Assert.IsNotNull(ver2.LockerId); Assert.AreNotEqual(ver1.LockerId, ver2.LockerId); Assert.IsTrue(ver1.IsLocked); }
public async Task LockReleaseOnEmptyDbTest() { await _database.DropCollectionAsync(_settings.VersionCollectionName); var verCollection = _database.GetCollection <DbVersion>(_settings.VersionCollectionName); var dbLock = new MongoDbLock(_settings, _database); var ver = await dbLock.ObtainLock(TimeSpan.FromSeconds(5)); Assert.IsNotNull(ver); Assert.IsNotNull(ver.LockerId); Assert.IsTrue(ver.IsLocked); await dbLock.ReleaseLock(); var ver2 = (await verCollection.FindAsync(e => e.Id == _settings.VersionDocumentId)).First(); Assert.IsNotNull(ver2); Assert.AreEqual(ver.LockerId, ver2.LockerId); Assert.IsFalse(ver2.IsLocked); Assert.IsTrue(ver2.AutoUpgradeEnabled); Assert.IsNull(ver2.Version); }