Skip to content

Commit d1a6578

Browse files
committed
PostgreSql: Automatically use the UntilDatabaseIsAvailable wait strategy
1 parent 64c7e73 commit d1a6578

File tree

10 files changed

+88
-12
lines changed

10 files changed

+88
-12
lines changed

.github/workflows/cicd.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ jobs:
8080
{ name: "Testcontainers.Oracle23", runs-on: "ubuntu-22.04" },
8181
{ name: "Testcontainers.Papercut", runs-on: "ubuntu-22.04" },
8282
{ name: "Testcontainers.PostgreSql", runs-on: "ubuntu-22.04" },
83+
{ name: "Testcontainers.PostgreSql.AdoNetClient", runs-on: "ubuntu-22.04" },
8384
{ name: "Testcontainers.PubSub", runs-on: "ubuntu-22.04" },
8485
{ name: "Testcontainers.Pulsar", runs-on: "ubuntu-22.04" },
8586
{ name: "Testcontainers.Qdrant", runs-on: "ubuntu-22.04" },

Testcontainers.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Platform.Win
213213
EndProject
214214
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.PostgreSql.Tests", "tests\Testcontainers.PostgreSql.Tests\Testcontainers.PostgreSql.Tests.csproj", "{56D0DCA5-567F-4B3B-8B79-CB108F8EB8A6}"
215215
EndProject
216+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.PostgreSql.AdoNetClient.Tests", "tests\Testcontainers.PostgreSql.AdoNetClient.Tests\Testcontainers.PostgreSql.AdoNetClient.Tests.csproj", "{5D34FC64-0EE3-453C-8A5E-1DC520FB968D}"
217+
EndProject
216218
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.PubSub.Tests", "tests\Testcontainers.PubSub.Tests\Testcontainers.PubSub.Tests.csproj", "{0F86BCE8-62E1-4BFC-AA84-63C7514C90AC}"
217219
EndProject
218220
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Pulsar.Tests", "tests\Testcontainers.Pulsar.Tests\Testcontainers.Pulsar.Tests.csproj", "{D05FCB31-793E-43E0-BD6C-077013AE9113}"
@@ -650,6 +652,10 @@ Global
650652
{56D0DCA5-567F-4B3B-8B79-CB108F8EB8A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
651653
{56D0DCA5-567F-4B3B-8B79-CB108F8EB8A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
652654
{56D0DCA5-567F-4B3B-8B79-CB108F8EB8A6}.Release|Any CPU.Build.0 = Release|Any CPU
655+
{5D34FC64-0EE3-453C-8A5E-1DC520FB968D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
656+
{5D34FC64-0EE3-453C-8A5E-1DC520FB968D}.Debug|Any CPU.Build.0 = Debug|Any CPU
657+
{5D34FC64-0EE3-453C-8A5E-1DC520FB968D}.Release|Any CPU.ActiveCfg = Release|Any CPU
658+
{5D34FC64-0EE3-453C-8A5E-1DC520FB968D}.Release|Any CPU.Build.0 = Release|Any CPU
653659
{0F86BCE8-62E1-4BFC-AA84-63C7514C90AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
654660
{0F86BCE8-62E1-4BFC-AA84-63C7514C90AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
655661
{0F86BCE8-62E1-4BFC-AA84-63C7514C90AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -822,5 +828,6 @@ Global
822828
{EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
823829
{E901DF14-6F05-4FC2-825A-3055FAD33561} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
824830
{C23EE831-F23B-4829-819B-A3F92D89CEDA} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
831+
{5D34FC64-0EE3-453C-8A5E-1DC520FB968D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
825832
EndGlobalSection
826833
EndGlobal

src/Testcontainers.PostgreSql/PostgreSqlBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,14 @@ public override PostgreSqlContainer Build()
8080
return new PostgreSqlContainer(postgreSqlBuilder.DockerResourceConfiguration);
8181
}
8282

83+
/// <inheritdoc />
84+
protected override string DbFactoryTypeName => "Npgsql.NpgsqlFactory, Npgsql, PublicKeyToken=5d8b90d52f46fda7";
85+
8386
/// <inheritdoc />
8487
protected override PostgreSqlBuilder Init()
8588
{
86-
return base.Init()
89+
var hasDbProviderFactory = TryGetDbProviderFactory(out var dbProviderFactory);
90+
var builder = base.Init()
8791
.WithImage(PostgreSqlImage)
8892
.WithPortBinding(PostgreSqlPort, true)
8993
.WithDatabase(DefaultDatabase)
@@ -93,6 +97,7 @@ protected override PostgreSqlBuilder Init()
9397
.WithCommand("-c", "fsync=off")
9498
.WithCommand("-c", "full_page_writes=off")
9599
.WithCommand("-c", "synchronous_commit=off");
100+
return hasDbProviderFactory ? builder.WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(dbProviderFactory)) : builder;
96101
}
97102

98103
/// <inheritdoc />
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
root = true
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFrameworks>net9.0</TargetFrameworks>
4+
<IsPackable>false</IsPackable>
5+
<IsPublishable>false</IsPublishable>
6+
<DefineConstants>$(DefineConstants);ADONET_CLIENT</DefineConstants>
7+
</PropertyGroup>
8+
<ItemGroup>
9+
<!-- -8<- [start:PackageReferences] -->
10+
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
11+
<PackageReference Include="coverlet.collector"/>
12+
<PackageReference Include="ReflectionMagic"/>
13+
<PackageReference Include="xunit.runner.visualstudio"/>
14+
<PackageReference Include="xunit"/>
15+
<PackageReference Include="Npgsql"/>
16+
<!-- -8<- [end:PackageReferences] -->
17+
</ItemGroup>
18+
<ItemGroup>
19+
<ProjectReference Include="../../src/Testcontainers.PostgreSql/Testcontainers.PostgreSql.csproj"/>
20+
<ProjectReference Include="../../src/Testcontainers.Xunit/Testcontainers.Xunit.csproj"/>
21+
<ProjectReference Include="../Testcontainers.Commons/Testcontainers.Commons.csproj"/>
22+
</ItemGroup>
23+
<ItemGroup>
24+
<Compile Include="../Testcontainers.PostgreSql.Tests/PostgreSqlContainerTest.cs"/>
25+
</ItemGroup>
26+
</Project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
global using System;
2+
global using System.Data;
3+
global using System.Data.Common;
4+
global using System.Threading;
5+
global using System.Threading.Tasks;
6+
global using DotNet.Testcontainers.Commons;
7+
global using JetBrains.Annotations;
8+
global using Npgsql;
9+
global using ReflectionMagic;
10+
global using Testcontainers.Xunit;
11+
global using Xunit;
12+
global using Xunit.Abstractions;

tests/Testcontainers.PostgreSql.Tests/PostgreSqlContainerTest.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
using System.Linq;
2+
using DotNet.Testcontainers.Configurations;
3+
14
namespace Testcontainers.PostgreSql;
25

36
public abstract class PostgreSqlContainerTest(PostgreSqlContainerTest.PostgreSqlDefaultFixture fixture)
47
{
58
// # --8<-- [start:UsePostgreSqlContainer]
9+
#if ADONET_CLIENT
610
[Fact]
711
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
812
public void ConnectionStateReturnsOpen()
@@ -16,6 +20,7 @@ public void ConnectionStateReturnsOpen()
1620
// Then
1721
Assert.Equal(ConnectionState.Open, connection.State);
1822
}
23+
#endif
1924

2025
[Fact]
2126
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
@@ -34,6 +39,19 @@ public async Task ExecScriptReturnsSuccessful()
3439
}
3540
// # --8<-- [end:UsePostgreSqlContainer]
3641

42+
[Fact]
43+
public void WaitStrategyUsed()
44+
{
45+
PostgreSqlConfiguration configuration = fixture.Container.AsDynamic()._configuration;
46+
var waitStrategy = configuration.WaitStrategies.Last();
47+
IWaitUntil waitUntil = DynamicHelper.Unwrap(waitStrategy.AsDynamic()._waitUntil);
48+
#if ADONET_CLIENT
49+
Assert.Equal("UntilDatabaseIsAvailable", waitUntil.GetType().Name);
50+
#else
51+
Assert.Equal("Testcontainers.PostgreSql.PostgreSqlBuilder+WaitUntil", waitUntil.GetType().FullName);
52+
#endif
53+
}
54+
3755
public sealed class ReuseContainerTest : IClassFixture<PostgreSqlDefaultFixture>, IDisposable
3856
{
3957
private readonly CancellationTokenSource _cts = new CancellationTokenSource(TimeSpan.FromMinutes(1));
@@ -66,26 +84,32 @@ await _fixture.Container.StartAsync(_cts.Token)
6684
}
6785
}
6886

87+
#if ADONET_CLIENT
6988
public class PostgreSqlDefaultFixture(IMessageSink messageSink)
7089
: DbContainerFixture<PostgreSqlBuilder, PostgreSqlContainer>(messageSink)
7190
{
7291
public override DbProviderFactory DbProviderFactory
7392
=> NpgsqlFactory.Instance;
7493
}
94+
#else
95+
public class PostgreSqlDefaultFixture(IMessageSink messageSink)
96+
: ContainerFixture<PostgreSqlBuilder, PostgreSqlContainer>(messageSink);
97+
#endif
7598

7699
[UsedImplicitly]
77-
public class PostgreSqlWaitForDatabaseFixture(IMessageSink messageSink)
78-
: PostgreSqlDefaultFixture(messageSink)
100+
public class PostgreSql92Fixture(IMessageSink messageSink) : PostgreSqlDefaultFixture(messageSink)
79101
{
80102
protected override PostgreSqlBuilder Configure(PostgreSqlBuilder builder)
81-
=> builder.WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
103+
=> builder.WithImage("postgres:9.2");
82104
}
83105

84106
[UsedImplicitly]
85107
public sealed class PostgreSqlDefaultConfiguration(PostgreSqlDefaultFixture fixture)
86108
: PostgreSqlContainerTest(fixture), IClassFixture<PostgreSqlDefaultFixture>;
87109

110+
#if ADONET_CLIENT
88111
[UsedImplicitly]
89-
public sealed class PostgreSqlWaitForDatabaseConfiguration(PostgreSqlWaitForDatabaseFixture fixture)
90-
: PostgreSqlContainerTest(fixture), IClassFixture<PostgreSqlWaitForDatabaseFixture>;
112+
public sealed class PostgreSql92Configuration(PostgreSql92Fixture fixture)
113+
: PostgreSqlContainerTest(fixture), IClassFixture<PostgreSql92Fixture>;
114+
#endif
91115
}

tests/Testcontainers.PostgreSql.Tests/Testcontainers.PostgreSql.Tests.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
<IsPublishable>false</IsPublishable>
66
</PropertyGroup>
77
<ItemGroup>
8-
<!-- -8<- [start:PackageReferences] -->
98
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
109
<PackageReference Include="coverlet.collector"/>
10+
<PackageReference Include="ReflectionMagic"/>
1111
<PackageReference Include="xunit.runner.visualstudio"/>
1212
<PackageReference Include="xunit"/>
13-
<PackageReference Include="Npgsql"/>
14-
<!-- -8<- [end:PackageReferences] -->
1513
</ItemGroup>
1614
<ItemGroup>
1715
<ProjectReference Include="../../src/Testcontainers.PostgreSql/Testcontainers.PostgreSql.csproj"/>

tests/Testcontainers.PostgreSql.Tests/Usings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
global using DotNet.Testcontainers.Builders;
77
global using DotNet.Testcontainers.Commons;
88
global using JetBrains.Annotations;
9-
global using Npgsql;
9+
global using ReflectionMagic;
1010
global using Testcontainers.Xunit;
1111
global using Xunit;
1212
global using Xunit.Abstractions;

tests/Testcontainers.Xunit.Tests/Testcontainers.Xunit.Tests.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
99
<PackageReference Include="coverlet.collector"/>
1010
<PackageReference Include="Dapper"/>
11+
<PackageReference Include="Npgsql"/>
12+
<PackageReference Include="StackExchange.Redis"/>
1113
<PackageReference Include="xunit.runner.visualstudio"/>
1214
<PackageReference Include="xunit"/>
1315
</ItemGroup>
1416
<ItemGroup>
17+
<ProjectReference Include="../../src/Testcontainers.PostgreSql/Testcontainers.PostgreSql.csproj"/>
18+
<ProjectReference Include="../../src/Testcontainers.Redis/Testcontainers.Redis.csproj"/>
1519
<ProjectReference Include="../../src/Testcontainers.Xunit/Testcontainers.Xunit.csproj"/>
1620
<ProjectReference Include="../Testcontainers.Commons/Testcontainers.Commons.csproj"/>
17-
<ProjectReference Include="../Testcontainers.Redis.Tests/Testcontainers.Redis.Tests.csproj"/>
18-
<ProjectReference Include="../Testcontainers.PostgreSql.Tests/Testcontainers.PostgreSql.Tests.csproj"/>
1921
</ItemGroup>
2022
<ItemGroup>
2123
<None Update="Chinook_PostgreSql_AutoIncrementPKs.sql">

0 commit comments

Comments
 (0)