Eliminate all arbitrary delays, replace with synchronization. (#124)
This commit is contained in:
@@ -91,19 +91,10 @@ namespace k8s.Tests
|
|||||||
httpContext.Response.ContentLength = null;
|
httpContext.Response.ContentLength = null;
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockBadStreamLine);
|
await WriteStreamLine(httpContext, MockBadStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockBadStreamLine);
|
await WriteStreamLine(httpContext, MockBadStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockModifiedStreamLine);
|
await WriteStreamLine(httpContext, MockModifiedStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
// make server alive, cannot set to int.max as of it would block response
|
// make server alive, cannot set to int.max as of it would block response
|
||||||
await Task.Delay(TimeSpan.FromDays(1));
|
await Task.Delay(TimeSpan.FromDays(1));
|
||||||
@@ -117,7 +108,6 @@ namespace k8s.Tests
|
|||||||
|
|
||||||
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
|
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
|
||||||
|
|
||||||
|
|
||||||
var events = new HashSet<WatchEventType>();
|
var events = new HashSet<WatchEventType>();
|
||||||
var errors = 0;
|
var errors = 0;
|
||||||
|
|
||||||
@@ -159,16 +149,14 @@ namespace k8s.Tests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void DisposeWatch()
|
public void DisposeWatch()
|
||||||
{
|
{
|
||||||
|
using (var eventsReceived = new CountdownEvent(1))
|
||||||
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
||||||
{
|
{
|
||||||
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
@@ -183,11 +171,17 @@ namespace k8s.Tests
|
|||||||
var events = new HashSet<WatchEventType>();
|
var events = new HashSet<WatchEventType>();
|
||||||
|
|
||||||
var watcher = listTask.Watch<V1Pod>(
|
var watcher = listTask.Watch<V1Pod>(
|
||||||
(type, item) => { events.Add(type); }
|
(type, item) => {
|
||||||
|
events.Add(type);
|
||||||
|
eventsReceived.Signal();
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// wait at least an event
|
// wait at least an event
|
||||||
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
|
Assert.True(
|
||||||
|
eventsReceived.Wait(TimeSpan.FromSeconds(10)),
|
||||||
|
"Timed out waiting for events."
|
||||||
|
);
|
||||||
|
|
||||||
Assert.NotEmpty(events);
|
Assert.NotEmpty(events);
|
||||||
Assert.True(watcher.Watching);
|
Assert.True(watcher.Watching);
|
||||||
@@ -211,19 +205,10 @@ namespace k8s.Tests
|
|||||||
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
||||||
{
|
{
|
||||||
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockDeletedStreamLine);
|
await WriteStreamLine(httpContext, MockDeletedStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockModifiedStreamLine);
|
await WriteStreamLine(httpContext, MockModifiedStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockErrorStreamLine);
|
await WriteStreamLine(httpContext, MockErrorStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
// make server alive, cannot set to int.max as of it would block response
|
// make server alive, cannot set to int.max as of it would block response
|
||||||
await Task.Delay(TimeSpan.FromDays(1));
|
await Task.Delay(TimeSpan.FromDays(1));
|
||||||
@@ -279,16 +264,13 @@ namespace k8s.Tests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void WatchServerDisconnect()
|
public void WatchServerDisconnect()
|
||||||
{
|
{
|
||||||
Watcher<V1Pod> watcher;
|
|
||||||
Exception exceptionCatched = null;
|
Exception exceptionCatched = null;
|
||||||
|
using (var exceptionReceived = new AutoResetEvent(false))
|
||||||
|
using (var waitForException = new AutoResetEvent(false))
|
||||||
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
||||||
{
|
{
|
||||||
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
||||||
|
waitForException.WaitOne();
|
||||||
// make sure watch success
|
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(200));
|
|
||||||
|
|
||||||
throw new IOException("server down");
|
throw new IOException("server down");
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
@@ -299,17 +281,25 @@ namespace k8s.Tests
|
|||||||
|
|
||||||
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
|
var listTask = client.ListNamespacedPodWithHttpMessagesAsync("default", watch: true).Result;
|
||||||
|
|
||||||
|
waitForException.Set();
|
||||||
|
Watcher<V1Pod> watcher;
|
||||||
watcher = listTask.Watch<V1Pod>(
|
watcher = listTask.Watch<V1Pod>(
|
||||||
(type, item) => { },
|
(type, item) => { },
|
||||||
e => { exceptionCatched = e; });
|
e => {
|
||||||
}
|
exceptionCatched = e;
|
||||||
|
exceptionReceived.Set();
|
||||||
|
});
|
||||||
|
|
||||||
// wait server down
|
// wait server down
|
||||||
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
|
Assert.True(
|
||||||
|
exceptionReceived.WaitOne(TimeSpan.FromSeconds(10)),
|
||||||
|
"Timed out waiting for exception"
|
||||||
|
);
|
||||||
|
|
||||||
Assert.False(watcher.Watching);
|
Assert.False(watcher.Watching);
|
||||||
Assert.IsType<IOException>(exceptionCatched);
|
Assert.IsType<IOException>(exceptionCatched);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class DummyHandler : DelegatingHandler
|
private class DummyHandler : DelegatingHandler
|
||||||
{
|
{
|
||||||
@@ -326,13 +316,11 @@ namespace k8s.Tests
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void TestWatchWithHandlers()
|
public void TestWatchWithHandlers()
|
||||||
{
|
{
|
||||||
|
using (CountdownEvent eventsReceived = new CountdownEvent(1))
|
||||||
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
using (var server = new MockKubeApiServer(TestOutput, async httpContext =>
|
||||||
{
|
{
|
||||||
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
await WriteStreamLine(httpContext, MockKubeApiServer.MockPodResponse);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
await WriteStreamLine(httpContext, MockAddedEventStreamLine);
|
||||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
|
||||||
|
|
||||||
// make server alive, cannot set to int.max as of it would block response
|
// make server alive, cannot set to int.max as of it would block response
|
||||||
await Task.Delay(TimeSpan.FromDays(1));
|
await Task.Delay(TimeSpan.FromDays(1));
|
||||||
@@ -355,11 +343,17 @@ namespace k8s.Tests
|
|||||||
var events = new HashSet<WatchEventType>();
|
var events = new HashSet<WatchEventType>();
|
||||||
|
|
||||||
var watcher = listTask.Watch<V1Pod>(
|
var watcher = listTask.Watch<V1Pod>(
|
||||||
(type, item) => { events.Add(type); }
|
(type, item) => {
|
||||||
|
events.Add(type);
|
||||||
|
eventsReceived.Signal();
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// wait server yields all events
|
// wait server yields all events
|
||||||
Thread.Sleep(TimeSpan.FromMilliseconds(500));
|
Assert.True(
|
||||||
|
eventsReceived.Wait(TimeSpan.FromMilliseconds(10000)),
|
||||||
|
"Timed out waiting for all events / errors to be received."
|
||||||
|
);
|
||||||
|
|
||||||
Assert.Contains(WatchEventType.Added, events);
|
Assert.Contains(WatchEventType.Added, events);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user