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 public class ReaderWriterLockTest : Assertion
\r
19 ReaderWriterLock rwlock;
\r
21 Exception resultException;
\r
22 ThreadStart secondaryThread;
\r
24 void StartThread (ThreadStart ts)
\r
26 secondaryThread = ts;
\r
27 resultException = null;
\r
28 Thread t = new Thread (new ThreadStart (ThreadRunner));
\r
31 if (resultException != null) throw resultException;
\r
34 void ThreadRunner ()
\r
40 catch (Exception ex)
\r
42 resultException = ex;
\r
47 public void TestIsReaderLockHeld ()
\r
49 rwlock = new ReaderWriterLock ();
\r
50 Assert ("a1", !rwlock.IsReaderLockHeld);
\r
51 rwlock.AcquireReaderLock (500);
\r
52 Assert ("a2", rwlock.IsReaderLockHeld);
\r
53 StartThread (new ThreadStart (IsReaderLockHeld_2));
\r
54 rwlock.ReleaseReaderLock ();
\r
57 private void IsReaderLockHeld_2 ()
\r
59 Assert ("a3", !rwlock.IsReaderLockHeld);
\r
63 public void TestIsWriterLockHeld ()
\r
65 rwlock = new ReaderWriterLock ();
\r
66 Assert ("a1", !rwlock.IsWriterLockHeld);
\r
67 rwlock.AcquireWriterLock (500);
\r
68 Assert ("a2", rwlock.IsWriterLockHeld);
\r
69 StartThread (new ThreadStart (IsWriterLockHeld_2));
\r
70 rwlock.ReleaseWriterLock ();
\r
73 private void IsWriterLockHeld_2 ()
\r
75 Assert ("a3", !rwlock.IsWriterLockHeld);
\r
79 public void TestAcquireLocks ()
\r
81 rwlock = new ReaderWriterLock ();
\r
82 rwlock.AcquireReaderLock (500);
\r
83 rwlock.AcquireReaderLock (500);
\r
84 rwlock.ReleaseReaderLock ();
\r
85 Assert ("a1", rwlock.IsReaderLockHeld);
\r
86 StartThread (new ThreadStart (AcquireLock_readerWorks));
\r
87 Assert ("a2", rwlock.IsReaderLockHeld);
\r
89 StartThread (new ThreadStart (AcquireLock_writerFails));
\r
90 rwlock.ReleaseReaderLock ();
\r
91 Assert ("a6", !rwlock.IsReaderLockHeld);
\r
93 StartThread (new ThreadStart (AcquireLock_writerWorks));
\r
95 rwlock.AcquireWriterLock (200);
\r
96 StartThread (new ThreadStart (AcquireLock_writerFails));
\r
97 StartThread (new ThreadStart (AcquireLock_readerFails));
\r
98 rwlock.ReleaseWriterLock ();
\r
101 void AcquireLock_readerWorks ()
\r
103 rwlock.AcquireReaderLock (200);
\r
104 rwlock.AcquireReaderLock (200);
\r
105 rwlock.ReleaseReaderLock ();
\r
106 Assert ("a3", rwlock.IsReaderLockHeld);
\r
107 rwlock.ReleaseReaderLock ();
\r
108 Assert ("a4", !rwlock.IsReaderLockHeld);
\r
111 void AcquireLock_writerFails ()
\r
115 rwlock.AcquireWriterLock (200);
\r
116 rwlock.ReleaseWriterLock ();
\r
117 throw new Exception ("Should not get writer lock");
\r
119 catch (Exception ex)
\r
124 void AcquireLock_writerWorks ()
\r
126 rwlock.AcquireWriterLock (200);
\r
127 rwlock.ReleaseWriterLock ();
\r
130 void AcquireLock_readerFails ()
\r
134 rwlock.AcquireReaderLock (200);
\r
135 rwlock.ReleaseReaderLock ();
\r
136 throw new Exception ("Should not get reader lock");
\r
138 catch (Exception ex)
\r
144 public void TestReleaseRestoreReaderLock ()
\r
146 rwlock = new ReaderWriterLock ();
\r
147 rwlock.AcquireReaderLock (500);
\r
148 rwlock.AcquireReaderLock (500);
\r
149 Assert ("r1", rwlock.IsReaderLockHeld);
\r
151 LockCookie co = rwlock.ReleaseLock ();
\r
152 StartThread (new ThreadStart (AcquireLock_writerWorks));
\r
154 rwlock.RestoreLock (ref co);
\r
155 StartThread (new ThreadStart (AcquireLock_writerFails));
\r
157 rwlock.ReleaseReaderLock ();
\r
158 Assert ("r2", rwlock.IsReaderLockHeld);
\r
159 rwlock.ReleaseReaderLock ();
\r
160 Assert ("r3", !rwlock.IsReaderLockHeld);
\r
164 public void TestReleaseRestoreWriterLock ()
\r
166 rwlock = new ReaderWriterLock ();
\r
167 rwlock.AcquireWriterLock (500);
\r
168 rwlock.AcquireWriterLock (500);
\r
169 Assert ("w1", rwlock.IsWriterLockHeld);
\r
171 LockCookie co = rwlock.ReleaseLock ();
\r
172 StartThread (new ThreadStart (AcquireLock_readerWorks));
\r
174 rwlock.RestoreLock (ref co);
\r
175 StartThread (new ThreadStart (AcquireLock_readerFails));
\r
177 rwlock.ReleaseWriterLock ();
\r
178 Assert ("w2", rwlock.IsWriterLockHeld);
\r
179 rwlock.ReleaseWriterLock ();
\r
180 Assert ("w3", !rwlock.IsWriterLockHeld);
\r
184 public void TestUpgradeDowngradeLock ()
\r
186 rwlock = new ReaderWriterLock ();
\r
187 rwlock.AcquireReaderLock (200);
\r
188 rwlock.AcquireReaderLock (200);
\r
190 LockCookie co = rwlock.UpgradeToWriterLock (200);
\r
191 Assert ("u1", !rwlock.IsReaderLockHeld);
\r
192 Assert ("u2", rwlock.IsWriterLockHeld);
\r
193 StartThread (new ThreadStart (AcquireLock_writerFails));
\r
195 rwlock.DowngradeFromWriterLock (ref co);
\r
196 Assert ("u3", rwlock.IsReaderLockHeld);
\r
197 Assert ("u4", !rwlock.IsWriterLockHeld);
\r
198 StartThread (new ThreadStart (AcquireLock_readerWorks));
\r
200 rwlock.ReleaseReaderLock ();
\r
201 Assert ("u5", rwlock.IsReaderLockHeld);
\r
202 rwlock.ReleaseReaderLock ();
\r
203 Assert ("u6", !rwlock.IsReaderLockHeld);
\r
207 public void TestReaderInsideWriter ()
\r
209 // Reader acquires and releases work like the writer equivalent
\r
211 rwlock = new ReaderWriterLock ();
\r
212 rwlock.AcquireWriterLock (-1);
\r
213 rwlock.AcquireReaderLock (-1);
\r
214 Assert ("u1", !rwlock.IsReaderLockHeld);
\r
215 Assert ("u2", rwlock.IsWriterLockHeld);
\r
216 rwlock.AcquireReaderLock (-1);
\r
217 Assert ("u3", !rwlock.IsReaderLockHeld);
\r
218 Assert ("u4", rwlock.IsWriterLockHeld);
\r
219 rwlock.ReleaseWriterLock ();
\r
220 Assert ("u5", !rwlock.IsReaderLockHeld);
\r
221 Assert ("u6", rwlock.IsWriterLockHeld);
\r
222 rwlock.ReleaseReaderLock ();
\r
223 Assert ("u7", !rwlock.IsReaderLockHeld);
\r
224 Assert ("u8", rwlock.IsWriterLockHeld);
\r
225 rwlock.ReleaseReaderLock ();
\r
226 Assert ("u9", !rwlock.IsReaderLockHeld);
\r
227 Assert ("u10", !rwlock.IsWriterLockHeld);
\r