public async Task Should_aquire_on_renew_when_expired()
        {
            var nowUtc = DateTime.UtcNow;
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 2, 1);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            owner1Res.ShouldBeTrue();

            await Task.Delay(2500);

            var semaInfo = await sema.GetSemaphoreInfo();

            var owners = sema.Deserialize(semaInfo.OwnersJson);
            var owner1 = owners.Owners.Single(x => x.OwnerId == _ownerId1);

            owner1.ExpiresAtUtc.ShouldBeLessThan(DateTime.UtcNow);

            var renewNow       = DateTime.UtcNow;
            var owner1RenewRes = await sema.TryRenew(_ownerId1);

            owner1RenewRes.ShouldBeTrue();

            semaInfo = await sema.GetSemaphoreInfo();

            owners = sema.Deserialize(semaInfo.OwnersJson);
            owner1 = owners.Owners.Single(x => x.OwnerId == _ownerId1);
            owner1.ExpiresAtUtc.ShouldBeGreaterThan(renewNow);
        }
        public async Task Should_throw_exception_when_create_already_exists()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 120, 1);
            var semaInfo            = await sema.CreateSemaphore();

            Should.Throw <Microsoft.Data.SqlClient.SqlException>(sema.CreateSemaphore());
        }
        public async Task Should_create_semaphore_on_aquire_if_not_exists()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 120, 1);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            owner1Res.ShouldBeTrue();
            var semaInfo = await sema.GetSemaphoreInfo();

            semaInfo.Name.ShouldBe(_semaphoreName);
        }
        public async Task Should_create_semaphore()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 120, 1);
            var semaInfo            = await sema.CreateSemaphore();

            semaInfo.Name.ShouldBe(_semaphoreName);

            //should have a non empty RowVersion
            semaInfo.RowVerion.Any(x => x != default(byte)).ShouldBeTrue();
            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Name.ShouldBe(_semaphoreName);
            owners.Owners.ShouldNotBeNull();
            owners.Owners.Count().ShouldBe(0);
        }
        public async Task Should_aquire_on_renew_when_not_owner()
        {
            var nowUtc = DateTime.UtcNow;
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 20, 1);
            var owner1Res           = await sema.TryRenew(_ownerId1);

            owner1Res.ShouldBeTrue();

            var semaInfo = await sema.GetSemaphoreInfo();

            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Owners.Count.ShouldBe(1);
            var owner1 = owners.Owners.Single(x => x.OwnerId == _ownerId1);

            owner1.ExpiresAtUtc.ShouldBeGreaterThan(DateTime.UtcNow);
        }
        public async Task Should_add_first_owner()
        {
            var nowUtc = DateTime.UtcNow;
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 120, 1);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            owner1Res.ShouldBeTrue();
            var semaInfo = await sema.GetSemaphoreInfo();

            semaInfo.Name.ShouldBe(_semaphoreName);
            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Name.ShouldBe(_semaphoreName);
            owners.Owners.ShouldNotBeNull();
            owners.Owners.Count().ShouldBe(1);
            owners.Owners.First().OwnerId.ShouldBe(_ownerId1);
            owners.Owners.First().ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(120), nowUtc.AddSeconds(125));
        }
        public async Task Should_remove_expired_on_acquire()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 1, 5);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            owner1Res.ShouldBeTrue();
            await Task.Delay(1500);

            var owner2Res = await sema.TryAcquire(_ownerId2);

            var semaInfo = await sema.GetSemaphoreInfo();

            owner2Res.ShouldBeTrue();
            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Owners.Count().ShouldBe(1);
            owners.Owners.Single().OwnerId.ShouldBe(_ownerId2);
        }
        public async Task Should_add_owners_up_to_max()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 120, 5);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            var owner2Res = await sema.TryAcquire(_ownerId2);

            var owner3Res = await sema.TryAcquire(_ownerId3);

            var owner4Res = await sema.TryAcquire(_ownerId4);

            var owner5Res = await sema.TryAcquire(_ownerId5);

            var owner6Res = await sema.TryAcquire(_ownerId6);

            owner1Res.ShouldBeTrue();
            owner2Res.ShouldBeTrue();
            owner3Res.ShouldBeTrue();
            owner4Res.ShouldBeTrue();
            owner5Res.ShouldBeTrue();
            owner6Res.ShouldBeFalse();
        }
        public async Task Should_release()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 10, 5);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            var owner2Res = await sema.TryAcquire(_ownerId2);

            var owner3Res = await sema.TryAcquire(_ownerId3);

            var owner4Res = await sema.TryAcquire(_ownerId4);

            var owner5Res = await sema.TryAcquire(_ownerId5);

            var owner6Res = await sema.TryAcquire(_ownerId6);

            owner1Res.ShouldBeTrue();
            owner2Res.ShouldBeTrue();
            owner3Res.ShouldBeTrue();
            owner4Res.ShouldBeTrue();
            owner5Res.ShouldBeTrue();
            owner6Res.ShouldBeFalse();

            var nowUtc           = DateTime.UtcNow;
            var owner1ReleaseRes = await sema.TryRelease(_ownerId1);

            var owner2ReleaseRes = await sema.TryRelease(_ownerId2);

            var owner3ReleaseRes = await sema.TryRelease(_ownerId3);

            var owner4ReleaseRes = await sema.TryRelease(_ownerId4);

            var owner5ReleaseRes = await sema.TryRelease(_ownerId5);

            owner1ReleaseRes.ShouldBeTrue();
            owner2ReleaseRes.ShouldBeTrue();
            owner3ReleaseRes.ShouldBeTrue();
            owner4ReleaseRes.ShouldBeTrue();
            owner5ReleaseRes.ShouldBeTrue();

            var semaInfo = await sema.GetSemaphoreInfo();

            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Owners.Count().ShouldBe(0);

            owner6Res = await sema.TryAcquire(_ownerId6);

            var owner7Res = await sema.TryAcquire(_ownerId7);

            var owner8Res = await sema.TryAcquire(_ownerId8);

            var owner9Res = await sema.TryAcquire(_ownerId9);

            var owner10Res = await sema.TryAcquire(_ownerId10);

            owner6Res.ShouldBeTrue();
            owner7Res.ShouldBeTrue();
            owner8Res.ShouldBeTrue();
            owner9Res.ShouldBeTrue();
            owner10Res.ShouldBeTrue();
        }
Beispiel #10
0
        public async Task Should_renew()
        {
            SqlServerSemaphore sema = new SqlServerSemaphore(ConnectionString, _semaphoreName, 10, 5);
            var owner1Res           = await sema.TryAcquire(_ownerId1);

            var owner2Res = await sema.TryAcquire(_ownerId2);

            var owner3Res = await sema.TryAcquire(_ownerId3);

            var owner4Res = await sema.TryAcquire(_ownerId4);

            var owner5Res = await sema.TryAcquire(_ownerId5);

            var owner6Res = await sema.TryAcquire(_ownerId6);

            owner1Res.ShouldBeTrue();
            owner2Res.ShouldBeTrue();
            owner3Res.ShouldBeTrue();
            owner4Res.ShouldBeTrue();
            owner5Res.ShouldBeTrue();
            owner6Res.ShouldBeFalse();

            await Task.Delay(5000);

            var nowUtc         = DateTime.UtcNow;
            var owner1RenewRes = await sema.TryRenew(_ownerId1);

            var owner2RenewRes = await sema.TryRenew(_ownerId2);

            var owner3RenewRes = await sema.TryRenew(_ownerId3);

            var owner4RenewRes = await sema.TryRenew(_ownerId4);

            var owner5RenewRes = await sema.TryRenew(_ownerId5);

            var owner6RenewRes = await sema.TryRenew(_ownerId6);

            owner1RenewRes.ShouldBeTrue();
            owner2RenewRes.ShouldBeTrue();
            owner3RenewRes.ShouldBeTrue();
            owner4RenewRes.ShouldBeTrue();
            owner5RenewRes.ShouldBeTrue();
            owner6RenewRes.ShouldBeFalse();

            var semaInfo = await sema.GetSemaphoreInfo();

            var owners = sema.Deserialize(semaInfo.OwnersJson);

            owners.Owners.Count().ShouldBe(5);

            var owner1 = owners.Owners.Single(x => x.OwnerId == _ownerId1);

            owner1.ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(9), nowUtc.AddSeconds(13));

            var owner2 = owners.Owners.Single(x => x.OwnerId == _ownerId2);

            owner2.ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(9), nowUtc.AddSeconds(13));

            var owner3 = owners.Owners.Single(x => x.OwnerId == _ownerId3);

            owner3.ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(9), nowUtc.AddSeconds(13));

            var owner4 = owners.Owners.Single(x => x.OwnerId == _ownerId4);

            owner4.ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(9), nowUtc.AddSeconds(13));

            var owner5 = owners.Owners.Single(x => x.OwnerId == _ownerId5);

            owner5.ExpiresAtUtc.ShouldBeInRange(nowUtc.AddSeconds(9), nowUtc.AddSeconds(13));
        }