* ReaderWriterLockTest.cs: Added one more test.
[mono.git] / mcs / class / corlib / Test / System.Threading / ReaderWriterLockTest.cs
1 //\r
2 // ReaderWriterLockTest.cs - NUnit Test Cases for System.Threading.ReaderWriterLock\r
3 //\r
4 // Author:\r
5 //   Lluis Sanchez Gual (lluis@ximian.com)\r
6 //\r
7 // (C) 2004 Novell, Inc (http://www.novell.com)\r
8 // \r
9 \r
10 using NUnit.Framework;\r
11 using System;\r
12 using System.Threading;\r
13 \r
14 namespace MonoTests.System.Threading\r
15 {\r
16         [TestFixture]\r
17         public class ReaderWriterLockTest : Assertion\r
18         {\r
19                 ReaderWriterLock rwlock;\r
20                 \r
21                 Exception resultException;\r
22                 ThreadStart secondaryThread;\r
23                 \r
24                 void StartThread (ThreadStart ts)\r
25                 {\r
26                         secondaryThread = ts;\r
27                         resultException = null;\r
28                         Thread t = new Thread (new ThreadStart (ThreadRunner));\r
29                         t.Start ();\r
30                         t.Join ();\r
31                         if (resultException != null) throw resultException;\r
32                 }\r
33                 \r
34                 void ThreadRunner ()\r
35                 {\r
36                         try\r
37                         {\r
38                                 secondaryThread();\r
39                         }\r
40                         catch (Exception ex)\r
41                         {\r
42                                 resultException = ex;\r
43                         }\r
44                 }\r
45                 \r
46                 [Test]
47                 public void TestIsReaderLockHeld ()\r
48                 {\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
55                 }\r
56                 \r
57                 private void IsReaderLockHeld_2 ()\r
58                 {\r
59                         Assert ("a3", !rwlock.IsReaderLockHeld);\r
60                 }\r
61                 \r
62                 [Test]\r
63                 public void TestIsWriterLockHeld ()\r
64                 {\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
71                 }\r
72                 \r
73                 private void IsWriterLockHeld_2 ()\r
74                 {\r
75                         Assert ("a3", !rwlock.IsWriterLockHeld);\r
76                 }\r
77                                 \r
78                 [Test]\r
79                 public void TestAcquireLocks ()\r
80                 {\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
88                         \r
89                         StartThread (new ThreadStart (AcquireLock_writerFails));\r
90                         rwlock.ReleaseReaderLock ();\r
91                         Assert ("a6", !rwlock.IsReaderLockHeld);\r
92                         \r
93                         StartThread (new ThreadStart (AcquireLock_writerWorks));\r
94                         \r
95                         rwlock.AcquireWriterLock (200);\r
96                         StartThread (new ThreadStart (AcquireLock_writerFails));\r
97                         StartThread (new ThreadStart (AcquireLock_readerFails));\r
98                         rwlock.ReleaseWriterLock ();\r
99                 }\r
100                 \r
101                 void AcquireLock_readerWorks ()\r
102                 {\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
109                 }\r
110                 \r
111                 void AcquireLock_writerFails ()\r
112                 {\r
113                         try\r
114                         {\r
115                                 rwlock.AcquireWriterLock (200);\r
116                                 rwlock.ReleaseWriterLock ();\r
117                                 throw new Exception ("Should not get writer lock");\r
118                         }\r
119                         catch (Exception ex)\r
120                         {\r
121                         }\r
122                 }\r
123                 \r
124                 void AcquireLock_writerWorks ()\r
125                 {\r
126                         rwlock.AcquireWriterLock (200);\r
127                         rwlock.ReleaseWriterLock ();\r
128                 }\r
129                 \r
130                 void AcquireLock_readerFails ()\r
131                 {\r
132                         try\r
133                         {\r
134                                 rwlock.AcquireReaderLock (200);\r
135                                 rwlock.ReleaseReaderLock ();\r
136                                 throw new Exception ("Should not get reader lock");\r
137                         }\r
138                         catch (Exception ex)\r
139                         {\r
140                         }\r
141                 }\r
142                 \r
143                 [Test]\r
144                 public void TestReleaseRestoreReaderLock ()\r
145                 {\r
146                         rwlock = new ReaderWriterLock ();\r
147                         rwlock.AcquireReaderLock (500);\r
148                         rwlock.AcquireReaderLock (500);\r
149                         Assert ("r1", rwlock.IsReaderLockHeld);\r
150                         \r
151                         LockCookie co = rwlock.ReleaseLock ();\r
152                         StartThread (new ThreadStart (AcquireLock_writerWorks));\r
153                         \r
154                         rwlock.RestoreLock (ref co);\r
155                         StartThread (new ThreadStart (AcquireLock_writerFails));\r
156                         \r
157                         rwlock.ReleaseReaderLock ();\r
158                         Assert ("r2", rwlock.IsReaderLockHeld);\r
159                         rwlock.ReleaseReaderLock ();\r
160                         Assert ("r3", !rwlock.IsReaderLockHeld);\r
161                 }\r
162                 \r
163                 [Test]\r
164                 public void TestReleaseRestoreWriterLock ()\r
165                 {\r
166                         rwlock = new ReaderWriterLock ();\r
167                         rwlock.AcquireWriterLock (500);\r
168                         rwlock.AcquireWriterLock (500);\r
169                         Assert ("w1", rwlock.IsWriterLockHeld);\r
170                         \r
171                         LockCookie co = rwlock.ReleaseLock ();\r
172                         StartThread (new ThreadStart (AcquireLock_readerWorks));\r
173                         \r
174                         rwlock.RestoreLock (ref co);\r
175                         StartThread (new ThreadStart (AcquireLock_readerFails));\r
176                         \r
177                         rwlock.ReleaseWriterLock ();\r
178                         Assert ("w2", rwlock.IsWriterLockHeld);\r
179                         rwlock.ReleaseWriterLock ();\r
180                         Assert ("w3", !rwlock.IsWriterLockHeld);\r
181                 }\r
182                 \r
183                 [Test]\r
184                 public void TestUpgradeDowngradeLock ()\r
185                 {\r
186                         rwlock = new ReaderWriterLock ();\r
187                         rwlock.AcquireReaderLock (200);\r
188                         rwlock.AcquireReaderLock (200);\r
189                         \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
194                         \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
199                         \r
200                         rwlock.ReleaseReaderLock ();\r
201                         Assert ("u5", rwlock.IsReaderLockHeld);\r
202                         rwlock.ReleaseReaderLock ();\r
203                         Assert ("u6", !rwlock.IsReaderLockHeld);\r
204                 }\r
205                 \r
206                 [Test]\r
207                 public void TestReaderInsideWriter ()\r
208                 {\r
209                         // Reader acquires and releases work like the writer equivalent\r
210                         \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
228                 }\r
229         }\r
230 }