99 lines
2.3 KiB
C#
99 lines
2.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|