Пример #1
0
        public async Task Add_ReadIsLocked_ShorterThenTimeout()
        {
            // Arrange
            var id   = 1;
            var item = new MockEntity(id);

            // Act
            using (var testRunThreadEvent = new AutoResetEvent(false))
            {
                using (var lockerRunThreadEvent = new AutoResetEvent(false))
                {
                    ThreadPool.QueueUserWorkItem(s =>
                    {
                        _accessLock.EnterReadLock();

                        testRunThreadEvent.Set();
                        lockerRunThreadEvent.WaitOne();

                        _accessLock.ExitReadLock();

                        testRunThreadEvent.Set();

                        // Lock thread to avoid run Add task in this thread
                        lockerRunThreadEvent.WaitOne();
                    });

                    testRunThreadEvent.WaitOne();

                    var addTask = _testObject.Add(item, TimeSpan.FromSeconds(1));

                    lockerRunThreadEvent.Set();
                    testRunThreadEvent.WaitOne();

                    await addTask;

                    // Assert
                    Assert.Single(_internalStorageItems.Keys);
                    Assert.Equal(id, _internalStorageItems.Keys.First());
                    Assert.Single(_internalStorageItems.Values);
                    Assert.Equal(item, _internalStorageItems.Values.First());

                    lockerRunThreadEvent.Set();
                }
            }
        }