Пример #1
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);
        }
Пример #2
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"));
        }
Пример #3
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);
        }
Пример #4
0
        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);
        }
Пример #5
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);
        }
Пример #6
0
        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}");
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }