Skip to content

Commit 12769b6

Browse files
Eliminate all arbitrary delays, replace with synchronization. (#124)
1 parent c8ad8f8 commit 12769b6

File tree

1 file changed

+36
-42
lines changed

1 file changed

+36
-42
lines changed

tests/WatchTests.cs

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,10 @@ public void SuriveBadLine()
9191
httpContext.Response.ContentLength = null;
9292

9393
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
94-
await Task.Delay(TimeSpan.FromMilliseconds(100));
95-
9694
await WriteStreamLine(httpContext, MockBadStreamLine);
97-
await Task.Delay(TimeSpan.FromMilliseconds(100));
98-
9995
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
100-
await Task.Delay(TimeSpan.FromMilliseconds(100));
101-
10296
await WriteStreamLine(httpContext, MockBadStreamLine);
103-
await Task.Delay(TimeSpan.FromMilliseconds(100));
104-
10597
await WriteStreamLine(httpContext, MockModifiedStreamLine);
106-
await Task.Delay(TimeSpan.FromMilliseconds(100));
10798

10899
// make server alive, cannot set to int.max as of it would block response
109100
await Task.Delay(TimeSpan.FromDays(1));
@@ -117,7 +108,6 @@ public void SuriveBadLine()
117108

118109
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
119110

120-
121111
var events = new HashSet<WatchEventType>();
122112
var errors = 0;
123113

@@ -159,16 +149,14 @@ public void SuriveBadLine()
159149
[Fact]
160150
public void DisposeWatch()
161151
{
152+
using (var eventsReceived = new CountdownEvent(1))
162153
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
163154
{
164155
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
165-
await Task.Delay(TimeSpan.FromMilliseconds(100));
166156

167157
for (;;)
168158
{
169-
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
170-
await Task.Delay(TimeSpan.FromMilliseconds(100));
171-
159+
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
172160
}
173161
}))
174162
{
@@ -183,11 +171,17 @@ public void DisposeWatch()
183171
var events = new HashSet<WatchEventType>();
184172

185173
var watcher = listTask.Watch<V1Pod>(
186-
(type, item) => { events.Add(type); }
174+
(type, item) => {
175+
events.Add(type);
176+
eventsReceived.Signal();
177+
}
187178
);
188179

189180
// wait at least an event
190-
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
181+
Assert.True(
182+
eventsReceived.Wait(TimeSpan.FromSeconds(10)),
183+
"Timed out waiting for events."
184+
);
191185

192186
Assert.NotEmpty(events);
193187
Assert.True(watcher.Watching);
@@ -211,19 +205,10 @@ public void WatchAllEvents()
211205
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
212206
{
213207
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
214-
await Task.Delay(TimeSpan.FromMilliseconds(100));
215-
216208
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
217-
await Task.Delay(TimeSpan.FromMilliseconds(100));
218-
219209
await WriteStreamLine(httpContext, MockDeletedStreamLine);
220-
await Task.Delay(TimeSpan.FromMilliseconds(100));
221-
222210
await WriteStreamLine(httpContext, MockModifiedStreamLine);
223-
await Task.Delay(TimeSpan.FromMilliseconds(100));
224-
225211
await WriteStreamLine(httpContext, MockErrorStreamLine);
226-
await Task.Delay(TimeSpan.FromMilliseconds(100));
227212

228213
// make server alive, cannot set to int.max as of it would block response
229214
await Task.Delay(TimeSpan.FromDays(1));
@@ -279,16 +264,13 @@ public void WatchAllEvents()
279264
[Fact]
280265
public void WatchServerDisconnect()
281266
{
282-
Watcher<V1Pod> watcher;
283267
Exception exceptionCatched = null;
284-
268+
using (var exceptionReceived = new AutoResetEvent(false))
269+
using (var waitForException = new AutoResetEvent(false))
285270
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
286271
{
287272
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
288-
289-
// make sure watch success
290-
await Task.Delay(TimeSpan.FromMilliseconds(200));
291-
273+
waitForException.WaitOne();
292274
throw new IOException("server down");
293275
}))
294276
{
@@ -299,16 +281,24 @@ public void WatchServerDisconnect()
299281

300282
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
301283

284+
waitForException.Set();
285+
Watcher<V1Pod> watcher;
302286
watcher = listTask.Watch<V1Pod>(
303287
(type, item) => { },
304-
e => { exceptionCatched = e; });
305-
}
288+
e => {
289+
exceptionCatched = e;
290+
exceptionReceived.Set();
291+
});
306292

307-
// wait server down
308-
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
293+
// wait server down
294+
Assert.True(
295+
exceptionReceived.WaitOne(TimeSpan.FromSeconds(10)),
296+
"Timed out waiting for exception"
297+
);
309298

310-
Assert.False(watcher.Watching);
311-
Assert.IsType<IOException>(exceptionCatched);
299+
Assert.False(watcher.Watching);
300+
Assert.IsType<IOException>(exceptionCatched);
301+
}
312302
}
313303

314304
private class DummyHandler : DelegatingHandler
@@ -326,13 +316,11 @@ protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reques
326316
[Fact]
327317
public void TestWatchWithHandlers()
328318
{
319+
using (CountdownEvent eventsReceived = new CountdownEvent(1))
329320
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
330321
{
331322
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
332-
await Task.Delay(TimeSpan.FromMilliseconds(100));
333-
334323
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
335-
await Task.Delay(TimeSpan.FromMilliseconds(100));
336324

337325
// make server alive, cannot set to int.max as of it would block response
338326
await Task.Delay(TimeSpan.FromDays(1));
@@ -355,11 +343,17 @@ public void TestWatchWithHandlers()
355343
var events = new HashSet<WatchEventType>();
356344

357345
var watcher = listTask.Watch<V1Pod>(
358-
(type, item) => { events.Add(type); }
346+
(type, item) => {
347+
events.Add(type);
348+
eventsReceived.Signal();
349+
}
359350
);
360351

361352
// wait server yields all events
362-
Thread.Sleep(TimeSpan.FromMilliseconds(500));
353+
Assert.True(
354+
eventsReceived.Wait(TimeSpan.FromMilliseconds(10000)),
355+
"Timed out waiting for all events / errors to be received."
356+
);
363357

364358
Assert.Contains(WatchEventType.Added, events);
365359

0 commit comments

Comments
 (0)