ReaderWriterLockTest.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. //
  2. // ReaderWriterLockTest.cs - NUnit Test Cases for System.Threading.ReaderWriterLock
  3. //
  4. // Author:
  5. // Lluis Sanchez Gual ([email protected])
  6. //
  7. // (C) 2004 Novell, Inc (http://www.novell.com)
  8. //
  9. using NUnit.Framework;
  10. using System;
  11. using System.Threading;
  12. namespace MonoTests.System.Threading
  13. {
  14. [TestFixture]
  15. public class ReaderWriterLockTest : Assertion
  16. {
  17. ReaderWriterLock rwlock;
  18. Exception resultException;
  19. ThreadStart secondaryThread;
  20. void StartThread (ThreadStart ts)
  21. {
  22. secondaryThread = ts;
  23. resultException = null;
  24. Thread t = new Thread (new ThreadStart (ThreadRunner));
  25. t.Start ();
  26. t.Join ();
  27. if (resultException != null) throw resultException;
  28. }
  29. void ThreadRunner ()
  30. {
  31. try
  32. {
  33. secondaryThread();
  34. }
  35. catch (Exception ex)
  36. {
  37. resultException = ex;
  38. }
  39. }
  40. [Test]
  41. public void TestIsReaderLockHeld ()
  42. {
  43. rwlock = new ReaderWriterLock ();
  44. Assert ("a1", !rwlock.IsReaderLockHeld);
  45. rwlock.AcquireReaderLock (500);
  46. Assert ("a2", rwlock.IsReaderLockHeld);
  47. StartThread (new ThreadStart (IsReaderLockHeld_2));
  48. rwlock.ReleaseReaderLock ();
  49. }
  50. private void IsReaderLockHeld_2 ()
  51. {
  52. Assert ("a3", !rwlock.IsReaderLockHeld);
  53. }
  54. [Test]
  55. public void TestIsWriterLockHeld ()
  56. {
  57. rwlock = new ReaderWriterLock ();
  58. Assert ("a1", !rwlock.IsWriterLockHeld);
  59. rwlock.AcquireWriterLock (500);
  60. Assert ("a2", rwlock.IsWriterLockHeld);
  61. StartThread (new ThreadStart (IsWriterLockHeld_2));
  62. rwlock.ReleaseWriterLock ();
  63. }
  64. private void IsWriterLockHeld_2 ()
  65. {
  66. Assert ("a3", !rwlock.IsWriterLockHeld);
  67. }
  68. [Test]
  69. public void TestAcquireLocks ()
  70. {
  71. rwlock = new ReaderWriterLock ();
  72. rwlock.AcquireReaderLock (500);
  73. rwlock.AcquireReaderLock (500);
  74. rwlock.ReleaseReaderLock ();
  75. Assert ("a1", rwlock.IsReaderLockHeld);
  76. StartThread (new ThreadStart (AcquireLock_readerWorks));
  77. Assert ("a2", rwlock.IsReaderLockHeld);
  78. StartThread (new ThreadStart (AcquireLock_writerFails));
  79. rwlock.ReleaseReaderLock ();
  80. Assert ("a6", !rwlock.IsReaderLockHeld);
  81. StartThread (new ThreadStart (AcquireLock_writerWorks));
  82. rwlock.AcquireWriterLock (200);
  83. StartThread (new ThreadStart (AcquireLock_writerFails));
  84. StartThread (new ThreadStart (AcquireLock_readerFails));
  85. rwlock.ReleaseWriterLock ();
  86. }
  87. void AcquireLock_readerWorks ()
  88. {
  89. rwlock.AcquireReaderLock (200);
  90. rwlock.AcquireReaderLock (200);
  91. rwlock.ReleaseReaderLock ();
  92. Assert ("a3", rwlock.IsReaderLockHeld);
  93. rwlock.ReleaseReaderLock ();
  94. Assert ("a4", !rwlock.IsReaderLockHeld);
  95. }
  96. void AcquireLock_writerFails ()
  97. {
  98. try
  99. {
  100. rwlock.AcquireWriterLock (200);
  101. rwlock.ReleaseWriterLock ();
  102. throw new Exception ("Should not get writer lock");
  103. }
  104. catch (Exception ex)
  105. {
  106. }
  107. }
  108. void AcquireLock_writerWorks ()
  109. {
  110. rwlock.AcquireWriterLock (200);
  111. rwlock.ReleaseWriterLock ();
  112. }
  113. void AcquireLock_readerFails ()
  114. {
  115. try
  116. {
  117. rwlock.AcquireReaderLock (200);
  118. rwlock.ReleaseReaderLock ();
  119. throw new Exception ("Should not get reader lock");
  120. }
  121. catch (Exception ex)
  122. {
  123. }
  124. }
  125. [Test]
  126. public void TestReleaseRestoreReaderLock ()
  127. {
  128. rwlock = new ReaderWriterLock ();
  129. rwlock.AcquireReaderLock (500);
  130. rwlock.AcquireReaderLock (500);
  131. Assert ("r1", rwlock.IsReaderLockHeld);
  132. LockCookie co = rwlock.ReleaseLock ();
  133. StartThread (new ThreadStart (AcquireLock_writerWorks));
  134. rwlock.RestoreLock (ref co);
  135. StartThread (new ThreadStart (AcquireLock_writerFails));
  136. rwlock.ReleaseReaderLock ();
  137. Assert ("r2", rwlock.IsReaderLockHeld);
  138. rwlock.ReleaseReaderLock ();
  139. Assert ("r3", !rwlock.IsReaderLockHeld);
  140. }
  141. [Test]
  142. public void TestReleaseRestoreWriterLock ()
  143. {
  144. rwlock = new ReaderWriterLock ();
  145. rwlock.AcquireWriterLock (500);
  146. rwlock.AcquireWriterLock (500);
  147. Assert ("w1", rwlock.IsWriterLockHeld);
  148. LockCookie co = rwlock.ReleaseLock ();
  149. StartThread (new ThreadStart (AcquireLock_readerWorks));
  150. rwlock.RestoreLock (ref co);
  151. StartThread (new ThreadStart (AcquireLock_readerFails));
  152. rwlock.ReleaseWriterLock ();
  153. Assert ("w2", rwlock.IsWriterLockHeld);
  154. rwlock.ReleaseWriterLock ();
  155. Assert ("w3", !rwlock.IsWriterLockHeld);
  156. }
  157. [Test]
  158. public void TestUpgradeDowngradeLock ()
  159. {
  160. rwlock = new ReaderWriterLock ();
  161. rwlock.AcquireReaderLock (200);
  162. rwlock.AcquireReaderLock (200);
  163. LockCookie co = rwlock.UpgradeToWriterLock (200);
  164. Assert ("u1", !rwlock.IsReaderLockHeld);
  165. Assert ("u2", rwlock.IsWriterLockHeld);
  166. StartThread (new ThreadStart (AcquireLock_writerFails));
  167. rwlock.DowngradeFromWriterLock (ref co);
  168. Assert ("u3", rwlock.IsReaderLockHeld);
  169. Assert ("u4", !rwlock.IsWriterLockHeld);
  170. StartThread (new ThreadStart (AcquireLock_readerWorks));
  171. rwlock.ReleaseReaderLock ();
  172. Assert ("u5", rwlock.IsReaderLockHeld);
  173. rwlock.ReleaseReaderLock ();
  174. Assert ("u6", !rwlock.IsReaderLockHeld);
  175. }
  176. [Test]
  177. public void TestReaderInsideWriter ()
  178. {
  179. // Reader acquires and releases work like the writer equivalent
  180. rwlock = new ReaderWriterLock ();
  181. rwlock.AcquireWriterLock (-1);
  182. rwlock.AcquireReaderLock (-1);
  183. Assert ("u1", !rwlock.IsReaderLockHeld);
  184. Assert ("u2", rwlock.IsWriterLockHeld);
  185. rwlock.AcquireReaderLock (-1);
  186. Assert ("u3", !rwlock.IsReaderLockHeld);
  187. Assert ("u4", rwlock.IsWriterLockHeld);
  188. rwlock.ReleaseWriterLock ();
  189. Assert ("u5", !rwlock.IsReaderLockHeld);
  190. Assert ("u6", rwlock.IsWriterLockHeld);
  191. rwlock.ReleaseReaderLock ();
  192. Assert ("u7", !rwlock.IsReaderLockHeld);
  193. Assert ("u8", rwlock.IsWriterLockHeld);
  194. rwlock.ReleaseReaderLock ();
  195. Assert ("u9", !rwlock.IsReaderLockHeld);
  196. Assert ("u10", !rwlock.IsWriterLockHeld);
  197. }
  198. }
  199. }