Skip to content

Commit 66080ce

Browse files
maca88fredericDelaporte
authored andcommitted
Fix remaining tests
1 parent c921013 commit 66080ce

File tree

1 file changed

+54
-61
lines changed

1 file changed

+54
-61
lines changed

src/NHibernate.Test/UtilityTest/AsyncReaderWriterLockFixture.cs

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ namespace NHibernate.Test.UtilityTest
88
{
99
public partial class AsyncReaderWriterLockFixture
1010
{
11-
private readonly int _delay = 50;
12-
1311
[Test]
1412
public void TestBlocking()
1513
{
@@ -21,41 +19,41 @@ public void TestBlocking()
2119

2220
var readReleaserTask = Task.Run(() => l.ReadLock());
2321
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
24-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
22+
AssertTaskCompleted(readReleaserTask);
2523

2624
var writeReleaserTask = Task.Run(() => l.WriteLock());
2725
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
2826
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
29-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
27+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
3028

3129
readReleaser.Dispose();
3230
Assert.That(l.CurrentReaders, Is.EqualTo(1));
33-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
31+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
3432

3533
readReleaserTask.Result.Dispose();
3634
Assert.That(l.CurrentReaders, Is.EqualTo(0));
3735
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
38-
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
36+
AssertTaskCompleted(writeReleaserTask);
3937

4038
readReleaserTask = Task.Run(() => l.ReadLock());
4139
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
42-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
40+
Assert.That(readReleaserTask.IsCompleted, Is.False);
4341

4442
var writeReleaserTask2 = Task.Run(() => l.WriteLock());
4543
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask2);
46-
Assert.That(writeReleaserTask2.Wait(_delay), Is.False);
44+
Assert.That(writeReleaserTask2.IsCompleted, Is.False);
4745

4846
writeReleaserTask.Result.Dispose();
4947
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask2);
5048
AssertEqualValue(() => l.Writing, true, writeReleaserTask2);
51-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
52-
Assert.That(writeReleaserTask2.Wait(_delay), Is.True);
49+
Assert.That(readReleaserTask.IsCompleted, Is.False);
50+
AssertTaskCompleted(writeReleaserTask2);
5351

5452
writeReleaserTask2.Result.Dispose();
5553
AssertEqualValue(() => l.Writing, false, writeReleaserTask2);
5654
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
5755
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
58-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
56+
AssertTaskCompleted(readReleaserTask);
5957

6058
readReleaserTask.Result.Dispose();
6159
Assert.That(l.ReadersWaiting, Is.EqualTo(0));
@@ -73,45 +71,45 @@ public void TestBlockingAsync()
7371
{
7472
var readReleaserTask = l.ReadLockAsync();
7573
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
76-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
74+
AssertTaskCompleted(readReleaserTask);
7775

7876
var readReleaserTask2 = l.ReadLockAsync();
7977
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask2);
80-
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
78+
AssertTaskCompleted(readReleaserTask2);
8179

8280
var writeReleaserTask = l.WriteLockAsync();
8381
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
8482
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
85-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
83+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
8684

8785
readReleaserTask.Result.Dispose();
8886
Assert.That(l.CurrentReaders, Is.EqualTo(1));
89-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
87+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
9088

9189
readReleaserTask2.Result.Dispose();
9290
Assert.That(l.CurrentReaders, Is.EqualTo(0));
9391
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
94-
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
92+
AssertTaskCompleted(writeReleaserTask);
9593

9694
readReleaserTask = l.ReadLockAsync();
9795
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
98-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
96+
Assert.That(readReleaserTask.IsCompleted, Is.False);
9997

10098
var writeReleaserTask2 = l.WriteLockAsync();
10199
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask2);
102-
Assert.That(writeReleaserTask2.Wait(_delay), Is.False);
100+
Assert.That(writeReleaserTask2.IsCompleted, Is.False);
103101

104102
writeReleaserTask.Result.Dispose();
105103
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask2);
106104
AssertEqualValue(() => l.Writing, true, writeReleaserTask2);
107-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
108-
Assert.That(writeReleaserTask2.Wait(_delay), Is.True);
105+
Assert.That(readReleaserTask.IsCompleted, Is.False);
106+
AssertTaskCompleted(writeReleaserTask2);
109107

110108
writeReleaserTask2.Result.Dispose();
111109
AssertEqualValue(() => l.Writing, false, writeReleaserTask2);
112110
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
113111
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
114-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
112+
AssertTaskCompleted(readReleaserTask);
115113

116114
readReleaserTask.Result.Dispose();
117115
Assert.That(l.ReadersWaiting, Is.EqualTo(0));
@@ -153,7 +151,7 @@ public void TestMixingSyncAndAsync()
153151

154152
var readReleaserTask = l.ReadLockAsync();
155153
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
156-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
154+
AssertTaskCompleted(readReleaserTask);
157155

158156
readReleaser.Dispose();
159157
Assert.That(l.CurrentReaders, Is.EqualTo(1));
@@ -166,28 +164,28 @@ public void TestMixingSyncAndAsync()
166164

167165
var writeReleaserTask = l.WriteLockAsync();
168166
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask);
169-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
167+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
170168

171169
readReleaserTask = Task.Run(() => l.ReadLock());
172170
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
173-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
171+
Assert.That(readReleaserTask.IsCompleted, Is.False);
174172

175173
var readReleaserTask2 = l.ReadLockAsync();
176174
AssertEqualValue(() => l.ReadersWaiting, 2, readReleaserTask2);
177-
Assert.That(readReleaserTask2.Wait(_delay), Is.False);
175+
Assert.That(readReleaserTask2.IsCompleted, Is.False);
178176

179177
writeReleaser.Dispose();
180178
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask);
181179
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
182-
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
183-
Assert.That(readReleaserTask.Wait(_delay), Is.False);
184-
Assert.That(readReleaserTask2.Wait(_delay), Is.False);
180+
AssertTaskCompleted(writeReleaserTask);
181+
Assert.That(readReleaserTask.IsCompleted, Is.False);
182+
Assert.That(readReleaserTask2.IsCompleted, Is.False);
185183

186184
writeReleaserTask.Result.Dispose();
187185
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
188186
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask2);
189-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
190-
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
187+
AssertTaskCompleted(readReleaserTask);
188+
AssertTaskCompleted(readReleaserTask2);
191189
}
192190

193191
[Test]
@@ -208,11 +206,11 @@ public void TestWritePriorityOverReadAsync()
208206
writeReleaser.Dispose();
209207
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask);
210208
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
211-
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
209+
AssertTaskCompleted(writeReleaserTask);
212210

213211
writeReleaserTask.Result.Dispose();
214212
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
215-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
213+
AssertTaskCompleted(readReleaserTask);
216214

217215
readReleaserTask.Result.Dispose();
218216
}
@@ -224,34 +222,34 @@ public void TestPartialReleasingReadLockAsync()
224222
var l = new AsyncReaderWriterLock();
225223
var readReleaserTask = l.ReadLockAsync();
226224
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
227-
Assert.That(readReleaserTask.Wait(_delay), Is.True);
225+
AssertTaskCompleted(readReleaserTask);
228226

229227
var readReleaserTask2 = l.ReadLockAsync();
230228
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
231-
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
229+
AssertTaskCompleted(readReleaserTask2);
232230

233231
var writeReleaserTask = l.WriteLockAsync();
234232
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
235233
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
236-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
234+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
237235

238236
var readReleaserTask3 = l.ReadLockAsync();
239237
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask3);
240-
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
238+
Assert.That(readReleaserTask3.IsCompleted, Is.False);
241239

242240
readReleaserTask.Result.Dispose();
243-
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
244-
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
241+
Assert.That(writeReleaserTask.IsCompleted, Is.False);
242+
Assert.That(readReleaserTask3.IsCompleted, Is.False);
245243

246244
readReleaserTask2.Result.Dispose();
247245
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
248246
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask3);
249-
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
250-
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
247+
AssertTaskCompleted(writeReleaserTask);
248+
Assert.That(readReleaserTask3.IsCompleted, Is.False);
251249

252250
writeReleaserTask.Result.Dispose();
253251
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask3);
254-
Assert.That(readReleaserTask3.Wait(_delay), Is.True);
252+
AssertTaskCompleted(readReleaserTask3);
255253
}
256254

257255
[Test, Explicit]
@@ -260,32 +258,20 @@ public async Task TestLoadSyncAndAsync()
260258
var l = new AsyncReaderWriterLock();
261259
int readLockCount = 0, writeLockCount = 0;
262260
var incorrectLockCount = false;
263-
var threads = new Thread[10];
264-
var tasks = new Task[10];
261+
var tasks = new Task[20];
265262
var masterRandom = new Random();
266263
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10));
267264

268-
for (var i = 0; i < threads.Length; i++)
269-
{
270-
// Ensure that each random has its own unique seed
271-
var random = new Random(masterRandom.Next());
272-
threads[i] = new Thread(() => SyncLock(random, cancellationTokenSource.Token));
273-
threads[i].Start();
274-
}
275-
276265
for (var i = 0; i < tasks.Length; i++)
277266
{
278267
// Ensure that each random has its own unique seed
279268
var random = new Random(masterRandom.Next());
280-
tasks[i] = Task.Run(() => AsyncLock(random, cancellationTokenSource.Token));
269+
tasks[i] = i % 2 == 0
270+
? Task.Run(() => SyncLock(random, cancellationTokenSource.Token))
271+
: AsyncLock(random, cancellationTokenSource.Token);
281272
}
282273

283-
foreach (var thread in threads)
284-
{
285-
thread.Join();
286-
}
287-
288-
await Task.WhenAll(tasks).ConfigureAwait(false);
274+
await Task.WhenAll(tasks);
289275
Assert.That(incorrectLockCount, Is.False);
290276

291277

@@ -341,7 +327,7 @@ async Task AsyncLock(Random random, CancellationToken cancellationToken)
341327
while (!cancellationToken.IsCancellationRequested)
342328
{
343329
var isRead = random.Next(100) < 80;
344-
var releaser = isRead
330+
var releaser = isRead
345331
? await l.ReadLockAsync().ConfigureAwait(false)
346332
: await l.WriteLockAsync().ConfigureAwait(false);
347333
lock (l)
@@ -378,10 +364,10 @@ async Task AsyncLock(Random random, CancellationToken cancellationToken)
378364
}
379365
}
380366

381-
private static void AssertEqualValue<T>(Func<T> getValueFunc, T value, Task task, int waitDelay = 500)
367+
private static void AssertEqualValue<T>(Func<T> getValueFunc, T value, Task task, int waitDelay = 5000)
382368
{
383369
var currentTime = 0;
384-
const int step = 5;
370+
var step = 5;
385371
while (currentTime < waitDelay)
386372
{
387373
task.Wait(step);
@@ -390,9 +376,16 @@ private static void AssertEqualValue<T>(Func<T> getValueFunc, T value, Task task
390376
{
391377
return;
392378
}
379+
380+
step *= 2;
393381
}
394382

395383
Assert.That(getValueFunc(), Is.EqualTo(value));
396384
}
385+
386+
private static void AssertTaskCompleted(Task task)
387+
{
388+
AssertEqualValue(() => task.IsCompleted, true, task);
389+
}
397390
}
398391
}

0 commit comments

Comments
 (0)