using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace AMWD.Common.Tests.Extensions { [TestClass] public class ReaderWriterLockSlimExtensionsTests { [TestMethod] public void ShouldEnterReadLock() { // arrange var rwLock = new ReaderWriterLockSlim(); // act using var disposable = rwLock.GetReadLock(); // assert Assert.IsNotNull(disposable); Assert.IsTrue(rwLock.IsReadLockHeld); Assert.IsFalse(rwLock.IsUpgradeableReadLockHeld); Assert.IsFalse(rwLock.IsWriteLockHeld); } [TestMethod] public void ShouldEnterUpgradeableReadLock() { // arrange var rwLock = new ReaderWriterLockSlim(); // act using var disposable = rwLock.GetUpgradeableReadLock(); // assert Assert.IsNotNull(disposable); Assert.IsFalse(rwLock.IsReadLockHeld); Assert.IsTrue(rwLock.IsUpgradeableReadLockHeld); Assert.IsFalse(rwLock.IsWriteLockHeld); } [TestMethod] public void ShouldEnterWriteLock() { // arrange var rwLock = new ReaderWriterLockSlim(); // act using var disposable = rwLock.GetWriteLock(); // assert Assert.IsNotNull(disposable); Assert.IsFalse(rwLock.IsReadLockHeld); Assert.IsFalse(rwLock.IsUpgradeableReadLockHeld); Assert.IsTrue(rwLock.IsWriteLockHeld); } [TestMethod] public void ShouldNotAllowWriteLockAfterReadLock() { // arrange var rwLock = new ReaderWriterLockSlim(); // act using var disposableRead = rwLock.GetReadLock(); try { using var disposaleWrite = rwLock.GetWriteLock(); Assert.Fail(); } catch (LockRecursionException) { } // assert Assert.IsNotNull(disposableRead); Assert.IsTrue(rwLock.IsReadLockHeld); Assert.IsFalse(rwLock.IsUpgradeableReadLockHeld); Assert.IsFalse(rwLock.IsWriteLockHeld); } [TestMethod] public void ShouldAllowWriteLockAfterUpgradeableReadLock() { // arrange var rwLock = new ReaderWriterLockSlim(); // act using var disposableRead = rwLock.GetUpgradeableReadLock(); using var disposaleWrite = rwLock.GetWriteLock(); // assert Assert.IsNotNull(disposableRead); Assert.IsNotNull(disposaleWrite); Assert.IsFalse(rwLock.IsReadLockHeld); Assert.IsTrue(rwLock.IsUpgradeableReadLockHeld); Assert.IsTrue(rwLock.IsWriteLockHeld); } } }