2 // ReaderWriterLockTest.cs - NUnit Test Cases for System.Threading.ReaderWriterLock
\r
5 // Lluis Sanchez Gual (lluis@ximian.com)
\r
7 // (C) 2004 Novell, Inc (http://www.novell.com)
\r
10 using NUnit.Framework;
\r
12 using System.Threading;
\r
14 namespace MonoTests.System.Threading
\r
17 [Category ("NotWorking")]
18 public class ReaderWriterLockTest : Assertion
\r
20 ReaderWriterLock rwlock;
\r
24 public ThreadStart SecondaryThread;
\r
25 public Exception ResultException;
\r
26 public Thread RunningThread;
\r
34 catch (Exception ex)
\r
36 ResultException = ex;
\r
42 RunningThread.Join (5000);
\r
43 if (ResultException != null) throw ResultException;
\r
47 void RunThread (ThreadStart ts)
\r
49 ThreadRunner tr = StartThread (ts);
\r
53 ThreadRunner StartThread (ThreadStart ts)
\r
55 ThreadRunner tr = new ThreadRunner();
\r
56 tr.SecondaryThread = ts;
\r
57 Thread t = new Thread (new ThreadStart (tr.Run));
\r
58 tr.RunningThread = t;
\r
64 public void TestIsReaderLockHeld ()
\r
66 rwlock = new ReaderWriterLock ();
\r
67 Assert ("a1", !rwlock.IsReaderLockHeld);
\r
68 rwlock.AcquireReaderLock (500);
\r
69 Assert ("a2", rwlock.IsReaderLockHeld);
\r
70 RunThread (new ThreadStart (IsReaderLockHeld_2));
\r
71 rwlock.ReleaseReaderLock ();
\r
74 private void IsReaderLockHeld_2 ()
\r
76 Assert ("a3", !rwlock.IsReaderLockHeld);
\r
80 public void TestIsWriterLockHeld ()
\r
82 rwlock = new ReaderWriterLock ();
\r
83 Assert ("a1", !rwlock.IsWriterLockHeld);
\r
84 rwlock.AcquireWriterLock (500);
\r
85 Assert ("a2", rwlock.IsWriterLockHeld);
\r
86 RunThread (new ThreadStart (IsWriterLockHeld_2));
\r
87 rwlock.ReleaseWriterLock ();
\r
90 private void IsWriterLockHeld_2 ()
\r
92 Assert ("a3", !rwlock.IsWriterLockHeld);
\r
96 public void TestAcquireLocks ()
\r
98 rwlock = new ReaderWriterLock ();
\r
99 rwlock.AcquireReaderLock (500);
\r
100 rwlock.AcquireReaderLock (500);
\r
101 rwlock.ReleaseReaderLock ();
\r
102 Assert ("a1", rwlock.IsReaderLockHeld);
\r
103 RunThread (new ThreadStart (AcquireLock_readerWorks));
\r
104 Assert ("a2", rwlock.IsReaderLockHeld);
\r
106 RunThread (new ThreadStart (AcquireLock_writerFails));
\r
107 rwlock.ReleaseReaderLock ();
\r
108 Assert ("a6", !rwlock.IsReaderLockHeld);
\r
110 RunThread (new ThreadStart (AcquireLock_writerWorks));
\r
112 rwlock.AcquireWriterLock (200);
\r
113 RunThread (new ThreadStart (AcquireLock_writerFails));
\r
114 RunThread (new ThreadStart (AcquireLock_readerFails));
\r
115 rwlock.ReleaseWriterLock ();
\r
118 void AcquireLock_readerWorks ()
\r
120 rwlock.AcquireReaderLock (200);
\r
121 rwlock.AcquireReaderLock (200);
\r
122 rwlock.ReleaseReaderLock ();
\r
123 Assert ("a3", rwlock.IsReaderLockHeld);
\r
124 rwlock.ReleaseReaderLock ();
\r
125 Assert ("a4", !rwlock.IsReaderLockHeld);
\r
128 void AcquireLock_writerFails ()
\r
132 rwlock.AcquireWriterLock (200);
\r
133 rwlock.ReleaseWriterLock ();
\r
134 throw new Exception ("Should not get writer lock");
\r
141 void AcquireLock_writerWorks ()
\r
143 rwlock.AcquireWriterLock (200);
\r
144 rwlock.ReleaseWriterLock ();
\r
147 void AcquireLock_readerFails ()
\r
151 rwlock.AcquireReaderLock (200);
\r
152 rwlock.ReleaseReaderLock ();
\r
153 throw new Exception ("Should not get reader lock");
\r
161 public void TestReleaseRestoreReaderLock ()
\r
163 rwlock = new ReaderWriterLock ();
\r
164 rwlock.AcquireReaderLock (500);
\r
165 rwlock.AcquireReaderLock (500);
\r
166 Assert ("r1", rwlock.IsReaderLockHeld);
\r
168 LockCookie co = rwlock.ReleaseLock ();
\r
169 RunThread (new ThreadStart (AcquireLock_writerWorks));
\r
171 rwlock.RestoreLock (ref co);
\r
172 RunThread (new ThreadStart (AcquireLock_writerFails));
\r
174 rwlock.ReleaseReaderLock ();
\r
175 Assert ("r2", rwlock.IsReaderLockHeld);
\r
176 rwlock.ReleaseReaderLock ();
\r
177 Assert ("r3", !rwlock.IsReaderLockHeld);
\r
181 public void TestReleaseRestoreWriterLock ()
\r
183 rwlock = new ReaderWriterLock ();
\r
184 rwlock.AcquireWriterLock (500);
\r
185 rwlock.AcquireWriterLock (500);
\r
186 Assert ("w1", rwlock.IsWriterLockHeld);
\r
188 LockCookie co = rwlock.ReleaseLock ();
\r
189 RunThread (new ThreadStart (AcquireLock_readerWorks));
\r
191 rwlock.RestoreLock (ref co);
\r
192 RunThread (new ThreadStart (AcquireLock_readerFails));
\r
194 rwlock.ReleaseWriterLock ();
\r
195 Assert ("w2", rwlock.IsWriterLockHeld);
\r
196 rwlock.ReleaseWriterLock ();
\r
197 Assert ("w3", !rwlock.IsWriterLockHeld);
\r
201 public void TestUpgradeDowngradeLock ()
\r
203 rwlock = new ReaderWriterLock ();
\r
204 rwlock.AcquireReaderLock (200);
\r
205 rwlock.AcquireReaderLock (200);
\r
207 LockCookie co = rwlock.UpgradeToWriterLock (200);
\r
208 Assert ("u1", !rwlock.IsReaderLockHeld);
\r
209 Assert ("u2", rwlock.IsWriterLockHeld);
\r
210 RunThread (new ThreadStart (AcquireLock_writerFails));
\r
212 rwlock.DowngradeFromWriterLock (ref co);
\r
213 Assert ("u3", rwlock.IsReaderLockHeld);
\r
214 Assert ("u4", !rwlock.IsWriterLockHeld);
\r
215 RunThread (new ThreadStart (AcquireLock_readerWorks));
\r
217 rwlock.ReleaseReaderLock ();
\r
218 Assert ("u5", rwlock.IsReaderLockHeld);
\r
219 rwlock.ReleaseReaderLock ();
\r
220 Assert ("u6", !rwlock.IsReaderLockHeld);
\r
224 public void TestReaderInsideWriter ()
\r
226 // Reader acquires and releases work like the writer equivalent
\r
228 rwlock = new ReaderWriterLock ();
\r
229 rwlock.AcquireWriterLock (-1);
\r
230 rwlock.AcquireReaderLock (-1);
\r
231 Assert ("u1", !rwlock.IsReaderLockHeld);
\r
232 Assert ("u2", rwlock.IsWriterLockHeld);
\r
233 rwlock.AcquireReaderLock (-1);
\r
234 Assert ("u3", !rwlock.IsReaderLockHeld);
\r
235 Assert ("u4", rwlock.IsWriterLockHeld);
\r
236 rwlock.ReleaseWriterLock ();
\r
237 Assert ("u5", !rwlock.IsReaderLockHeld);
\r
238 Assert ("u6", rwlock.IsWriterLockHeld);
\r
239 rwlock.ReleaseReaderLock ();
\r
240 Assert ("u7", !rwlock.IsReaderLockHeld);
\r
241 Assert ("u8", rwlock.IsWriterLockHeld);
\r
242 rwlock.ReleaseReaderLock ();
\r
243 Assert ("u9", !rwlock.IsReaderLockHeld);
\r
244 Assert ("u10", !rwlock.IsWriterLockHeld);
\r
248 public void TestReaderMustWaitWriter ()
\r
250 // A thread cannot get the reader lock if there are other threads
\r
251 // waiting for the writer lock.
\r
253 rwlock = new ReaderWriterLock ();
\r
254 rwlock.AcquireWriterLock (200);
\r
256 ThreadRunner tr = StartThread (new ThreadStart (ReaderMustWaitWriter_2));
\r
257 Thread.Sleep (200);
\r
259 RunThread (new ThreadStart (AcquireLock_readerFails));
\r
261 rwlock.ReleaseReaderLock ();
\r
265 void ReaderMustWaitWriter_2 ()
\r
267 rwlock.AcquireWriterLock (2000);
\r
268 rwlock.ReleaseWriterLock ();
\r
272 public void TestBug_55911 ()
\r
274 rwlock = new ReaderWriterLock ();
\r
276 rwlock.AcquireReaderLock (Timeout.Infinite);
\r
278 LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite);
\r
280 finally { rwlock.ReleaseReaderLock(); }
\r
282 rwlock.AcquireReaderLock (Timeout.Infinite);
\r
284 LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite);
\r
286 finally { rwlock.ReleaseReaderLock(); }
\r
290 public void TestBug_55909 ()
\r
292 rwlock = new ReaderWriterLock ();
\r
293 ThreadRunner tr = StartThread (new ThreadStart(Bug_55909_Thread2));
\r
294 Thread.Sleep (200);
\r
295 rwlock.AcquireReaderLock (Timeout.Infinite);
\r
297 LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite);
\r
298 Thread.Sleep (500);
\r
300 finally { rwlock.ReleaseReaderLock(); }
\r
305 public void Bug_55909_Thread2 ()
\r
307 rwlock.AcquireReaderLock(Timeout.Infinite);
\r
309 Thread.Sleep (1000);
\r
310 LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite);
\r
311 Thread.Sleep (500);
\r
313 finally { rwlock.ReleaseReaderLock(); }
\r
317 public void TestBug_55909_bis ()
\r
319 rwlock = new ReaderWriterLock ();
\r
320 ThreadRunner tr1 = StartThread (new ThreadStart(Bug_55909_bis_ReaderWriter));
\r
322 ThreadRunner tr2 = StartThread (new ThreadStart(Bug_55909_bis_Reader));
\r
324 ThreadRunner tr3 = StartThread (new ThreadStart(Bug_55909_bis_Writer));
\r
326 ThreadRunner tr4 = StartThread (new ThreadStart(Bug_55909_bis_Reader));
\r
333 void Bug_55909_bis_Reader ()
\r
335 rwlock.AcquireReaderLock(-1);
\r
336 Thread.Sleep(2000);
\r
337 rwlock.ReleaseReaderLock();
\r
340 void Bug_55909_bis_ReaderWriter ()
\r
342 rwlock.AcquireReaderLock(-1);
\r
343 LockCookie lc = rwlock.UpgradeToWriterLock(-1);
\r
344 Thread.Sleep(1000);
\r
345 rwlock.DowngradeFromWriterLock(ref lc);
\r
346 rwlock.ReleaseReaderLock();
\r
349 void Bug_55909_bis_Writer ()
\r
351 rwlock.AcquireWriterLock(-1);
\r
352 rwlock.ReleaseWriterLock();
\r