Skip to content

Commit 5eb5fa4

Browse files
committed
test all docker clients
modify TestFixture to support dind and different clients add dind for tls client tests to ci add parallel test add speed test check for com.docker.service in Docker_IsRunning too add 1s sleep in MonitorEventsFiltered_Succeeds test
1 parent 5181dcb commit 5eb5fa4

12 files changed

+835
-321
lines changed

.github/workflows/ci.yml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,29 @@ on:
88
jobs:
99
build:
1010
runs-on: ubuntu-22.04
11+
services:
12+
# Docker without TLS (plain TCP) !DEPRECATED! with next docker release
13+
docker-no-tls:
14+
image: docker:28.1-dind
15+
env:
16+
DOCKER_TLS_CERTDIR: ""
17+
ports:
18+
- 2375:2375
19+
options: >-
20+
--privileged
21+
22+
# Docker with TLS (secure TCP)
23+
docker-tls:
24+
image: docker:28.1-dind
25+
env:
26+
DOCKER_TLS_CERTDIR: /certs
27+
ports:
28+
- 2376:2376
29+
options: >-
30+
--privileged
31+
volumes:
32+
- ${{ github.workspace }}/certs:/certs
33+
1134
strategy:
1235
matrix:
1336
framework:
@@ -16,12 +39,53 @@ jobs:
1639
steps:
1740
- uses: actions/checkout@v4
1841
with:
42+
path: test
1943
fetch-depth: 0
2044
- name: Setup .NET Core
2145
uses: actions/setup-dotnet@v4
2246
with:
2347
dotnet-version: 9.x
2448
- name: Build
2549
run: dotnet build -c Release --framework ${{ matrix.framework }}
50+
working-directory: test
51+
52+
- name: Pack client cert, key, ca for C# docker client
53+
run: |
54+
mkdir -p ${{ github.workspace }}/certs
55+
sudo chmod 777 ${{ github.workspace }}/certs
56+
57+
# create pfx
58+
openssl pkcs12 -export -out ${{ github.workspace }}/certs/client.pfx -inkey ${{ github.workspace }}/certs/client/key.pem -in ${{ github.workspace }}/certs/client/cert.pem -certfile ${{ github.workspace }}/certs/client/ca.pem -passout pass:
59+
60+
- name: Wait for Docker (no TLS) to be healthy
61+
run: |
62+
for i in {1..10}; do
63+
if docker --host=tcp://localhost:2375 version; then
64+
echo "Docker (no TLS) is ready!"
65+
exit 0
66+
fi
67+
echo "Waiting for Docker (no TLS) to be ready..."
68+
sleep 3
69+
done
70+
echo "Docker (no TLS) did not become ready in time."
71+
exit 1
72+
73+
- name: Wait for Docker (with TLS) to be healthy
74+
run: |
75+
for i in {1..10}; do
76+
if docker --host=tcp://localhost:2376 --tlsverify \
77+
--tlscacert=${{ github.workspace }}/certs/client/ca.pem \
78+
--tlscert=${{ github.workspace }}/certs/client/cert.pem \
79+
--tlskey=${{ github.workspace }}/certs/client/key.pem version; then
80+
echo "Docker (TLS) is ready!"
81+
exit 0
82+
fi
83+
echo "Waiting for Docker (TLS) to be ready..."
84+
sleep 3
85+
done
86+
echo "Docker (TLS) did not become ready in time."
87+
exit 1
88+
2689
- name: Test
2790
run: dotnet test -c Release --framework ${{ matrix.framework }} --no-build --logger console
91+
working-directory: test

test/Docker.DotNet.Tests/CommonCommands.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ public static class CommonCommands
44
{
55
public static readonly string[] SleepInfinity = ["/bin/sh", "-c", "trap \"exit 0\" TERM INT; sleep infinity"];
66

7-
public static readonly string[] EchoToStdoutAndStderr = ["/bin/sh", "-c", "trap \"exit 0\" TERM INT; while true; do echo \"stdout message\"; echo \"stderr message\" >&2; sleep 1; done"];
7+
public static readonly string[] EchoToStdoutAndStderr = ["/bin/sh", "-c", "trap \"exit 0\" TERM INT; RND=$RANDOM; while true; do echo \"stdout message $RND\"; echo \"stderr message $RND\" >&2; sleep 1; done"];
8+
9+
public static readonly string[] EchoToStdoutAndStderrFast = ["/bin/sh", "-c", "trap \"exit 0\" TERM INT; RND=$RANDOM; while true; do echo \"stdout message $RND\"; echo \"stderr message $RND\" >&2; done"];
810
}

test/Docker.DotNet.Tests/Docker.DotNet.Tests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
<ItemGroup>
1313
<ProjectReference Include="..\..\src\Docker.DotNet.BasicAuth\Docker.DotNet.BasicAuth.csproj" />
1414
<ProjectReference Include="..\..\src\Docker.DotNet.X509\Docker.DotNet.X509.csproj" />
15+
<ProjectReference Include="..\..\src\Docker.DotNet.NPipe\Docker.DotNet.NPipe.csproj" />
16+
<ProjectReference Include="..\..\src\Docker.DotNet.Unix\Docker.DotNet.Unix.csproj" />
17+
<ProjectReference Include="..\..\src\Docker.DotNet.NativeHttp\Docker.DotNet.NativeHttp.csproj" />
18+
<ProjectReference Include="..\..\src\Docker.DotNet.LegacyHttp\Docker.DotNet.LegacyHttp.csproj" />
1519
<ProjectReference Include="..\..\src\Docker.DotNet\Docker.DotNet.csproj" />
20+
1621
</ItemGroup>
1722
<ItemGroup>
1823
<Content Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />

test/Docker.DotNet.Tests/IConfigOperationsTests.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ public IConfigOperationsTests(TestFixture testFixture, ITestOutputHelper testOut
1212
_testOutputHelper = testOutputHelper;
1313
}
1414

15-
[Fact]
16-
public async Task SwarmConfig_CanCreateAndRead()
15+
public static IEnumerable<object[]> GetDockerClientTypes() =>
16+
TestFixture.GetDockerClientTypes();
17+
18+
[Theory]
19+
[MemberData(nameof(GetDockerClientTypes))]
20+
public async Task SwarmConfig_CanCreateAndRead(TestClientsEnum clientType)
1721
{
18-
var currentConfigs = await _testFixture.DockerClient.Configs.ListConfigsAsync();
22+
var currentConfigs = await _testFixture.DockerClients[clientType].Configs.ListConfigsAsync();
1923

2024
_testOutputHelper.WriteLine($"Current Configs: {currentConfigs.Count}");
2125

@@ -31,15 +35,15 @@ public async Task SwarmConfig_CanCreateAndRead()
3135
Config = testConfigSpec
3236
};
3337

34-
var createdConfig = await _testFixture.DockerClient.Configs.CreateConfigAsync(configParameters);
38+
var createdConfig = await _testFixture.DockerClients[clientType].Configs.CreateConfigAsync(configParameters);
3539
Assert.NotNull(createdConfig.ID);
3640
_testOutputHelper.WriteLine($"Config created: {createdConfig.ID}");
3741

38-
var configs = await _testFixture.DockerClient.Configs.ListConfigsAsync();
42+
var configs = await _testFixture.DockerClients[clientType].Configs.ListConfigsAsync();
3943
Assert.Contains(configs, c => c.ID == createdConfig.ID);
4044
_testOutputHelper.WriteLine($"Current Configs: {configs.Count}");
4145

42-
var configResponse = await _testFixture.DockerClient.Configs.InspectConfigAsync(createdConfig.ID);
46+
var configResponse = await _testFixture.DockerClients[clientType].Configs.InspectConfigAsync(createdConfig.ID);
4347

4448
Assert.NotNull(configResponse);
4549

@@ -51,8 +55,8 @@ public async Task SwarmConfig_CanCreateAndRead()
5155

5256
_testOutputHelper.WriteLine("Config created is the same.");
5357

54-
await _testFixture.DockerClient.Configs.RemoveConfigAsync(createdConfig.ID);
58+
await _testFixture.DockerClients[clientType].Configs.RemoveConfigAsync(createdConfig.ID);
5559

56-
await Assert.ThrowsAsync<DockerApiException>(() => _testFixture.DockerClient.Configs.InspectConfigAsync(createdConfig.ID));
60+
await Assert.ThrowsAsync<DockerApiException>(() => _testFixture.DockerClients[clientType].Configs.InspectConfigAsync(createdConfig.ID));
5761
}
5862
}

0 commit comments

Comments
 (0)