Ejemplo n.º 1
0
        public async Task DisposeAsync_Expiry_UnlockAndHandleLostTokenSet()
        {
            // arrange
            var memoryLock = new Mock <IInMemoryKeyLock>();

            var acquired = new InMemoryAcquiredLock(TestLockKey, memoryLock.Object, TimeSpan.FromMilliseconds(10));

            await Assert.ThrowsAsync <TaskCanceledException>(async() =>
                                                             await Task.Delay(TimeSpan.FromMinutes(2), acquired.HandleLostToken));

            // assert
            await AssertHelper.WaitForAssert(() => { memoryLock.Verify(x => x.Unlock(TestLockKey), Times.Once); });
        }
Ejemplo n.º 2
0
        public async Task DisposeAsync_Acquired_Unlock()
        {
            // arrange
            var memoryLock = new Mock <IInMemoryKeyLock>();

            var acquired = new InMemoryAcquiredLock(TestLockKey, memoryLock.Object, DefaultExpiry);

            // act
            await acquired.DisposeAsync();

            // assert
            memoryLock.Verify(x => x.Unlock(TestLockKey), Times.Once);
        }
Ejemplo n.º 3
0
        public async Task DisposeAsync_ThreadSafety()
        {
            // arrange
            var readerWriterLock = new AsyncReaderWriterLock();
            var writerLockHandle = readerWriterLock.WriterLock();

            var finished = false;

            var memoryLock = new Mock <IInMemoryKeyLock>();
            var acquired   = new InMemoryAcquiredLock(TestLockKey, memoryLock.Object, DefaultExpiry);

            async Task TestLock()
            {
                while (!finished)
                {
                    using (await readerWriterLock.ReaderLockAsync())
                    {
                        await acquired.DisposeAsync();
                    }
                }
            }

            var tasks = Enumerable.Range(0, 3).Select(_ => Task.Run(TestLock)).ToList();

            for (var i = 0; i < 50; i++)
            {
                writerLockHandle.Dispose();
                await Task.Delay(1);

                writerLockHandle = readerWriterLock.WriterLock();

                memoryLock.Verify(x => x.Unlock(TestLockKey), Times.AtMostOnce);

                memoryLock = new Mock <IInMemoryKeyLock>();
                acquired   = new InMemoryAcquiredLock(TestLockKey, memoryLock.Object, DefaultExpiry);
            }

            // assert
            finished = true;
            writerLockHandle.Dispose();
        }