Skip to content

Commit c921013

Browse files
maca88fredericDelaporte
authored andcommitted
Try to fix broken tests
1 parent 26a7f6e commit c921013

File tree

2 files changed

+107
-6
lines changed

2 files changed

+107
-6
lines changed

src/NHibernate.Test/UtilityTest/AsyncReaderWriterLockFixture.cs

Lines changed: 97 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,70 +14,110 @@ public partial class AsyncReaderWriterLockFixture
1414
public void TestBlocking()
1515
{
1616
var l = new AsyncReaderWriterLock();
17-
for (var i = 0; i < 10; i++)
17+
for (var i = 0; i < 2; i++)
1818
{
1919
var readReleaser = l.ReadLock();
20+
Assert.That(l.CurrentReaders, Is.EqualTo(1));
21+
2022
var readReleaserTask = Task.Run(() => l.ReadLock());
23+
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
2124
Assert.That(readReleaserTask.Wait(_delay), Is.True);
2225

2326
var writeReleaserTask = Task.Run(() => l.WriteLock());
27+
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
28+
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
2429
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
2530

2631
readReleaser.Dispose();
32+
Assert.That(l.CurrentReaders, Is.EqualTo(1));
2733
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
2834

2935
readReleaserTask.Result.Dispose();
36+
Assert.That(l.CurrentReaders, Is.EqualTo(0));
37+
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
3038
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
3139

3240
readReleaserTask = Task.Run(() => l.ReadLock());
41+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
3342
Assert.That(readReleaserTask.Wait(_delay), Is.False);
3443

3544
var writeReleaserTask2 = Task.Run(() => l.WriteLock());
45+
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask2);
3646
Assert.That(writeReleaserTask2.Wait(_delay), Is.False);
3747

3848
writeReleaserTask.Result.Dispose();
49+
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask2);
50+
AssertEqualValue(() => l.Writing, true, writeReleaserTask2);
3951
Assert.That(readReleaserTask.Wait(_delay), Is.False);
4052
Assert.That(writeReleaserTask2.Wait(_delay), Is.True);
4153

4254
writeReleaserTask2.Result.Dispose();
55+
AssertEqualValue(() => l.Writing, false, writeReleaserTask2);
56+
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
57+
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
4358
Assert.That(readReleaserTask.Wait(_delay), Is.True);
59+
4460
readReleaserTask.Result.Dispose();
61+
Assert.That(l.ReadersWaiting, Is.EqualTo(0));
62+
Assert.That(l.WritersWaiting, Is.EqualTo(0));
63+
Assert.That(l.CurrentReaders, Is.EqualTo(0));
64+
Assert.That(l.Writing, Is.False);
4565
}
4666
}
4767

4868
[Test]
4969
public void TestBlockingAsync()
5070
{
5171
var l = new AsyncReaderWriterLock();
52-
for (var i = 0; i < 10; i++)
72+
for (var i = 0; i < 2; i++)
5373
{
5474
var readReleaserTask = l.ReadLockAsync();
55-
var readReleaserTask2 = l.ReadLockAsync();
75+
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
5676
Assert.That(readReleaserTask.Wait(_delay), Is.True);
77+
78+
var readReleaserTask2 = l.ReadLockAsync();
79+
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask2);
5780
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
5881

5982
var writeReleaserTask = l.WriteLockAsync();
83+
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
84+
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
6085
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
6186

6287
readReleaserTask.Result.Dispose();
88+
Assert.That(l.CurrentReaders, Is.EqualTo(1));
6389
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
6490

6591
readReleaserTask2.Result.Dispose();
92+
Assert.That(l.CurrentReaders, Is.EqualTo(0));
93+
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
6694
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
6795

6896
readReleaserTask = l.ReadLockAsync();
97+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
6998
Assert.That(readReleaserTask.Wait(_delay), Is.False);
7099

71100
var writeReleaserTask2 = l.WriteLockAsync();
101+
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask2);
72102
Assert.That(writeReleaserTask2.Wait(_delay), Is.False);
73103

74104
writeReleaserTask.Result.Dispose();
105+
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask2);
106+
AssertEqualValue(() => l.Writing, true, writeReleaserTask2);
75107
Assert.That(readReleaserTask.Wait(_delay), Is.False);
76108
Assert.That(writeReleaserTask2.Wait(_delay), Is.True);
77109

78110
writeReleaserTask2.Result.Dispose();
111+
AssertEqualValue(() => l.Writing, false, writeReleaserTask2);
112+
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
113+
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
79114
Assert.That(readReleaserTask.Wait(_delay), Is.True);
115+
80116
readReleaserTask.Result.Dispose();
117+
Assert.That(l.ReadersWaiting, Is.EqualTo(0));
118+
Assert.That(l.WritersWaiting, Is.EqualTo(0));
119+
Assert.That(l.CurrentReaders, Is.EqualTo(0));
120+
Assert.That(l.Writing, Is.False);
81121
}
82122
}
83123

@@ -109,27 +149,43 @@ public void TestMixingSyncAndAsync()
109149
{
110150
var l = new AsyncReaderWriterLock();
111151
var readReleaser = l.ReadLock();
152+
Assert.That(l.CurrentReaders, Is.EqualTo(1));
153+
112154
var readReleaserTask = l.ReadLockAsync();
155+
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
113156
Assert.That(readReleaserTask.Wait(_delay), Is.True);
114157

115158
readReleaser.Dispose();
159+
Assert.That(l.CurrentReaders, Is.EqualTo(1));
160+
116161
readReleaserTask.Result.Dispose();
162+
Assert.That(l.CurrentReaders, Is.EqualTo(0));
117163

118164
var writeReleaser = l.WriteLock();
165+
Assert.That(l.AcquiredWriteLock, Is.True);
166+
119167
var writeReleaserTask = l.WriteLockAsync();
168+
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask);
120169
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
121170

122171
readReleaserTask = Task.Run(() => l.ReadLock());
123-
var readReleaserTask2 = l.ReadLockAsync();
172+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
124173
Assert.That(readReleaserTask.Wait(_delay), Is.False);
174+
175+
var readReleaserTask2 = l.ReadLockAsync();
176+
AssertEqualValue(() => l.ReadersWaiting, 2, readReleaserTask2);
125177
Assert.That(readReleaserTask2.Wait(_delay), Is.False);
126178

127179
writeReleaser.Dispose();
180+
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask);
181+
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
128182
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
129183
Assert.That(readReleaserTask.Wait(_delay), Is.False);
130184
Assert.That(readReleaserTask2.Wait(_delay), Is.False);
131185

132186
writeReleaserTask.Result.Dispose();
187+
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
188+
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask2);
133189
Assert.That(readReleaserTask.Wait(_delay), Is.True);
134190
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
135191
}
@@ -138,17 +194,26 @@ public void TestMixingSyncAndAsync()
138194
public void TestWritePriorityOverReadAsync()
139195
{
140196
var l = new AsyncReaderWriterLock();
141-
for (var i = 0; i < 10; i++)
197+
for (var i = 0; i < 2; i++)
142198
{
143199
var writeReleaser = l.WriteLock();
200+
Assert.That(l.AcquiredWriteLock, Is.True);
201+
144202
var readReleaserTask = l.ReadLockAsync();
203+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
204+
145205
var writeReleaserTask = l.WriteLockAsync();
206+
AssertEqualValue(() => l.WritersWaiting, 1, writeReleaserTask);
146207

147208
writeReleaser.Dispose();
209+
AssertEqualValue(() => l.WritersWaiting, 0, writeReleaserTask);
210+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask);
148211
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
149212

150213
writeReleaserTask.Result.Dispose();
214+
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask);
151215
Assert.That(readReleaserTask.Wait(_delay), Is.True);
216+
152217
readReleaserTask.Result.Dispose();
153218
}
154219
}
@@ -158,25 +223,34 @@ public void TestPartialReleasingReadLockAsync()
158223
{
159224
var l = new AsyncReaderWriterLock();
160225
var readReleaserTask = l.ReadLockAsync();
161-
var readReleaserTask2 = l.ReadLockAsync();
226+
AssertEqualValue(() => l.CurrentReaders, 1, readReleaserTask);
162227
Assert.That(readReleaserTask.Wait(_delay), Is.True);
228+
229+
var readReleaserTask2 = l.ReadLockAsync();
230+
AssertEqualValue(() => l.CurrentReaders, 2, readReleaserTask);
163231
Assert.That(readReleaserTask2.Wait(_delay), Is.True);
164232

165233
var writeReleaserTask = l.WriteLockAsync();
234+
AssertEqualValue(() => l.AcquiredWriteLock, true, writeReleaserTask);
235+
AssertEqualValue(() => l.Writing, false, writeReleaserTask);
166236
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
167237

168238
var readReleaserTask3 = l.ReadLockAsync();
239+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask3);
169240
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
170241

171242
readReleaserTask.Result.Dispose();
172243
Assert.That(writeReleaserTask.Wait(_delay), Is.False);
173244
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
174245

175246
readReleaserTask2.Result.Dispose();
247+
AssertEqualValue(() => l.Writing, true, writeReleaserTask);
248+
AssertEqualValue(() => l.ReadersWaiting, 1, readReleaserTask3);
176249
Assert.That(writeReleaserTask.Wait(_delay), Is.True);
177250
Assert.That(readReleaserTask3.Wait(_delay), Is.False);
178251

179252
writeReleaserTask.Result.Dispose();
253+
AssertEqualValue(() => l.ReadersWaiting, 0, readReleaserTask3);
180254
Assert.That(readReleaserTask3.Wait(_delay), Is.True);
181255
}
182256

@@ -303,5 +377,22 @@ async Task AsyncLock(Random random, CancellationToken cancellationToken)
303377
}
304378
}
305379
}
380+
381+
private static void AssertEqualValue<T>(Func<T> getValueFunc, T value, Task task, int waitDelay = 500)
382+
{
383+
var currentTime = 0;
384+
const int step = 5;
385+
while (currentTime < waitDelay)
386+
{
387+
task.Wait(step);
388+
currentTime += step;
389+
if (getValueFunc().Equals(value))
390+
{
391+
return;
392+
}
393+
}
394+
395+
Assert.That(getValueFunc(), Is.EqualTo(value));
396+
}
306397
}
307398
}

src/NHibernate/Util/AsyncReaderWriterLock.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ public AsyncReaderWriterLock()
2626
_readerReleaserTask = Task.FromResult(_readerReleaser);
2727
}
2828

29+
internal int CurrentReaders => _currentReaders;
30+
31+
internal int WritersWaiting => _writersWaiting;
32+
33+
internal int ReadersWaiting => _readersWaiting;
34+
35+
internal bool Writing => _currentReaders == 0 && _writeLockSemaphore.CurrentCount == 0;
36+
37+
internal bool AcquiredWriteLock => _writeLockSemaphore.CurrentCount == 0;
38+
2939
public IDisposable WriteLock()
3040
{
3141
if (!CanEnterWriteLock(out var waitForReadLocks))

0 commit comments

Comments
 (0)