Skip to content

Commit 194211b

Browse files
qmfrederikbrendandburns
authored andcommitted
Fix flakey tests by making them async (#144)
* Fix flakey tests by converting them to async and synchronizing code blocks * Use the same timeout for all tests * Use signals to gracefully shut down the mock server
1 parent 5247597 commit 194211b

File tree

7 files changed

+157
-244
lines changed

7 files changed

+157
-244
lines changed

tests/KubernetesClient.Tests/AuthTests.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
namespace k8s.Tests
2222
{
23-
public class AuthTests
24-
: TestBase
23+
public class AuthTests
2524
{
26-
public AuthTests(ITestOutputHelper testOutput) : base(testOutput)
25+
private readonly ITestOutputHelper testOutput;
26+
27+
public AuthTests(ITestOutputHelper testOutput)
2728
{
28-
}
29+
this.testOutput = testOutput;
30+
}
2931

3032
private static HttpOperationResponse<V1PodList> ExecuteListPods(IKubernetes client)
3133
{
@@ -35,7 +37,7 @@ private static HttpOperationResponse<V1PodList> ExecuteListPods(IKubernetes clie
3537
[Fact]
3638
public void Anonymous()
3739
{
38-
using (var server = new MockKubeApiServer(TestOutput))
40+
using (var server = new MockKubeApiServer(testOutput))
3941
{
4042
var client = new Kubernetes(new KubernetesClientConfiguration
4143
{
@@ -48,7 +50,7 @@ public void Anonymous()
4850
Assert.Equal(1, listTask.Body.Items.Count);
4951
}
5052

51-
using (var server = new MockKubeApiServer(TestOutput, cxt =>
53+
using (var server = new MockKubeApiServer(testOutput, cxt =>
5254
{
5355
cxt.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
5456
return Task.FromResult(false);
@@ -71,7 +73,7 @@ public void BasicAuth()
7173
const string testName = "test_name";
7274
const string testPassword = "test_password";
7375

74-
using (var server = new MockKubeApiServer(TestOutput, cxt =>
76+
using (var server = new MockKubeApiServer(testOutput, cxt =>
7577
{
7678
var header = cxt.Request.Headers["Authorization"].FirstOrDefault();
7779

@@ -182,7 +184,7 @@ public void Cert()
182184

183185
var clientCertificateValidationCalled = false;
184186

185-
using (var server = new MockKubeApiServer(TestOutput, listenConfigure: options =>
187+
using (var server = new MockKubeApiServer(testOutput, listenConfigure: options =>
186188
{
187189
options.UseHttps(new HttpsConnectionAdapterOptions
188190
{
@@ -264,7 +266,7 @@ public void Token()
264266
{
265267
const string token = "testingtoken";
266268

267-
using (var server = new MockKubeApiServer(TestOutput, cxt =>
269+
using (var server = new MockKubeApiServer(testOutput, cxt =>
268270
{
269271
var header = cxt.Request.Headers["Authorization"].FirstOrDefault();
270272

tests/KubernetesClient.Tests/Kubernetes.Exec.Tests.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ namespace k8s.Tests
2222
public class PodExecTests
2323
: WebSocketTestBase
2424
{
25+
private readonly ITestOutputHelper testOutput;
26+
2527
/// <summary>
2628
/// Create a new <see cref="KubeApiClient"/> exec-in-pod test suite.
2729
/// </summary>
@@ -31,6 +33,7 @@ public class PodExecTests
3133
public PodExecTests(ITestOutputHelper testOutput)
3234
: base(testOutput)
3335
{
36+
this.testOutput = testOutput;
3437
}
3538

3639
/// <summary>
@@ -49,7 +52,7 @@ public async Task Exec_DefaultContainer_StdOut()
4952

5053
using (Kubernetes client = CreateTestClient())
5154
{
52-
Log.LogInformation("Invoking exec operation...");
55+
testOutput.WriteLine("Invoking exec operation...");
5356

5457
WebSocket clientSocket = await client.WebSocketNamespacedPodExecAsync(
5558
name: "mypod",
@@ -63,19 +66,19 @@ public async Task Exec_DefaultContainer_StdOut()
6366
);
6467
Assert.Equal(K8sProtocol.ChannelV1, clientSocket.SubProtocol); // For WebSockets, the Kubernetes API defaults to the binary channel (v1) protocol.
6568

66-
Log.LogInformation("Client socket connected (socket state is {ClientSocketState}). Waiting for server-side socket to become available...", clientSocket.State);
69+
testOutput.WriteLine($"Client socket connected (socket state is {clientSocket.State}). Waiting for server-side socket to become available...");
6770

6871
WebSocket serverSocket = await WebSocketTestAdapter.AcceptedPodExecV1Connection;
69-
Log.LogInformation("Server-side socket is now available (socket state is {ServerSocketState}). Sending data to server socket...", serverSocket.State);
72+
testOutput.WriteLine($"Server-side socket is now available (socket state is {serverSocket.State}). Sending data to server socket...");
7073

7174
const int STDOUT = 1;
7275
const string expectedOutput = "This is text send to STDOUT.";
7376

7477
int bytesSent = await SendMultiplexed(serverSocket, STDOUT, expectedOutput);
75-
Log.LogInformation("Sent {ByteCount} bytes to server socket; receiving from client socket...", bytesSent);
78+
testOutput.WriteLine($"Sent {bytesSent} bytes to server socket; receiving from client socket...");
7679

7780
(string receivedText, byte streamIndex, int bytesReceived) = await ReceiveTextMultiplexed(clientSocket);
78-
Log.LogInformation("Received {ByteCount} bytes from client socket ('{ReceivedText}', stream {StreamIndex}).", bytesReceived, receivedText, streamIndex);
81+
testOutput.WriteLine($"Received {bytesReceived} bytes from client socket ('{receivedText}', stream {streamIndex}).");
7982

8083
Assert.Equal(STDOUT, streamIndex);
8184
Assert.Equal(expectedOutput, receivedText);

tests/KubernetesClient.Tests/KubernetesClient.Tests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
1010
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
1111
<PackageReference Include="System.Reactive" Version="3.1.1" />
12+
<PackageReference Include="Nito.AsyncEx" Version="4.0.1" />
1213
</ItemGroup>
1314

1415
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
@@ -19,7 +20,7 @@
1920
</ItemGroup>
2021

2122
<ItemGroup>
22-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0-preview-20180221-13" />
23+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" />
2324
<PackageReference Include="xunit" Version="2.3.1" />
2425
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" NoWarn="NU1701" />
2526

tests/KubernetesClient.Tests/TestBase.cs

Lines changed: 0 additions & 131 deletions
This file was deleted.

tests/KubernetesClient.Tests/V1StatusObjectViewTests.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66

77
namespace k8s.Tests
88
{
9-
public class V1StatusObjectViewTests
10-
: TestBase
9+
public class V1StatusObjectViewTests
1110
{
12-
public V1StatusObjectViewTests(ITestOutputHelper testOutput) : base(testOutput)
11+
private readonly ITestOutputHelper testOutput;
12+
13+
public V1StatusObjectViewTests(ITestOutputHelper testOutput)
1314
{
15+
this.testOutput = testOutput;
1416
}
1517

1618
[Fact]
@@ -22,7 +24,7 @@ public void ReturnStatus()
2224
Status = "test status"
2325
};
2426

25-
using (var server = new MockKubeApiServer(TestOutput, resp: JsonConvert.SerializeObject(v1Status)))
27+
using (var server = new MockKubeApiServer(testOutput, resp: JsonConvert.SerializeObject(v1Status)))
2628
{
2729
var client = new Kubernetes(new KubernetesClientConfiguration
2830
{
@@ -52,7 +54,7 @@ public void ReturnObject()
5254
}
5355
};
5456

55-
using (var server = new MockKubeApiServer(TestOutput, resp: JsonConvert.SerializeObject(corev1Namespace)))
57+
using (var server = new MockKubeApiServer(testOutput, resp: JsonConvert.SerializeObject(corev1Namespace)))
5658
{
5759
var client = new Kubernetes(new KubernetesClientConfiguration
5860
{

0 commit comments

Comments
 (0)