Пример #1
0
        public void CancelWithLockAsyncAction_Cancel()
        {
            // setup
            var semaphore = new SemaphoreSlim(1);
            var value     = new List();
            var subject   = new AsyncSynchronized <List>(semaphore, value);

            // act and assert
            Should.Throw <TaskCanceledException>(() => subject.WithLockAsync((v) => Task.FromResult(0), new CancellationTokenSource(0).Token));

            semaphore.CurrentCount.ShouldBe(1);
        }
Пример #2
0
        public void WithLockAsyncFunc_Exception_Release()
        {
            // setup
            var semaphore = new SemaphoreSlim(1);
            var value     = new List();
            var subject   = new AsyncSynchronized <List>(semaphore, value);

            // act and assert
            Should.Throw <CustomException>(() => subject.WithLockAsync(new Func <List, int>((v) =>
            {
                throw new CustomException();
            })));

            semaphore.CurrentCount.ShouldBe(1);
        }
Пример #3
0
        public async Task WithLockAsyncAction_Acquire()
        {
            // setup
            var semaphore = new SemaphoreSlim(1);
            var value     = new List();
            var subject   = new AsyncSynchronized <List>(semaphore, value);

            // act and assert
            await subject.WithLockAsync((v) =>
            {
                semaphore.CurrentCount.ShouldBe(0);
                v.ShouldBe(value);
            });

            semaphore.CurrentCount.ShouldBe(1);
        }
Пример #4
0
        public void WithLockAsyncAction_ExceptionInRelease_ThrowUnlockException()
        {
            // setup
            var semaphore = new SemaphoreSlim(1);
            var value     = new List();
            var subject   = new AsyncSynchronized <List>(semaphore, value);

            // act and assert
            var exception = Should.Throw <UnlockException>(() => subject.WithLockAsync((v) =>
            {
                semaphore.Dispose();
            }));

            exception.PriorException.ShouldBeNull();
            exception.InnerExceptions
            .ToDictionary(kv => kv.Key, kv => kv.Value.GetType())
            .ShouldBe(new Dictionary <int, Type>
            {
                [0] = typeof(ObjectDisposedException)
            });
        }