Skip to content

Commit e98d679

Browse files
authored
feat: Require explicit container image in Testcontainers.Xunit (#1612)
1 parent 2603e2b commit e98d679

16 files changed

Lines changed: 99 additions & 90 deletions

File tree

src/Testcontainers.Xunit/ContainerLifetime.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class ContainerLifetime<TBuilderEntity, TContainerEntity> : IAsy
1616

1717
protected ContainerLifetime(ILogger logger)
1818
{
19-
_container = new Lazy<TContainerEntity>(() => Configure(new TBuilderEntity().WithLogger(logger)).Build());
19+
_container = new Lazy<TContainerEntity>(() => Configure(Configure()).WithLogger(logger).Build());
2020
}
2121

2222
/// <summary>
@@ -48,6 +48,25 @@ await DisposeAsyncCore()
4848
}
4949
#endif
5050

51+
/// <summary>
52+
/// Configures the container instance.
53+
/// </summary>
54+
/// <example>
55+
/// <code>
56+
/// public class MariaDbRootUserFixture(IMessageSink messageSink) : DbContainerFixture&lt;MariaDbBuilder, MariaDbContainer&gt;(messageSink)
57+
/// {
58+
/// public override DbProviderFactory DbProviderFactory =&gt; MySqlConnectorFactory.Instance;
59+
/// <br />
60+
/// protected override MariaDbBuilder Configure()
61+
/// {
62+
/// return new MariaDbBuilder("mariadb:12").WithUsername("root");
63+
/// }
64+
/// }
65+
/// </code>
66+
/// </example>
67+
/// <returns>A configured instance of <typeparamref name="TBuilderEntity" />.</returns>
68+
protected virtual TBuilderEntity Configure() => new();
69+
5170
/// <summary>
5271
/// Extension method to further configure the container instance.
5372
/// </summary>
@@ -66,6 +85,7 @@ await DisposeAsyncCore()
6685
/// </example>
6786
/// <param name="builder">The container builder to configure.</param>
6887
/// <returns>A configured instance of <typeparamref name="TBuilderEntity" />.</returns>
88+
[Obsolete("This method is obsolete and will be removed. Use the parameterless Configure() method and create the builder explicitly instead.")]
6989
protected virtual TBuilderEntity Configure(TBuilderEntity builder)
7090
{
7191
return builder;

src/Testcontainers.Xunit/ContainerTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ public abstract class ContainerTest<TBuilderEntity, TContainerEntity>(ITestOutpu
1414
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1515
where TContainerEntity : IContainer
1616
{
17+
[Obsolete("This method is obsolete and will be removed. Use the parameterless Configure() method and create the builder explicitly instead.")]
1718
protected override TBuilderEntity Configure(TBuilderEntity builder) => configure != null ? configure(builder) : builder;
1819
}

tests/Testcontainers.Cassandra.Tests/CassandraContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public async Task ExecScriptAsyncReturnsSuccess()
6060
public class CassandraDefaultFixture(IMessageSink messageSink)
6161
: DbContainerFixture<CassandraBuilder, CassandraContainer>(messageSink)
6262
{
63-
protected override CassandraBuilder Configure(CassandraBuilder builder)
64-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
63+
protected override CassandraBuilder Configure()
64+
=> new CassandraBuilder(TestSession.GetImageFromDockerfile());
6565

6666
public override DbProviderFactory DbProviderFactory
6767
=> CqlProviderFactory.Instance;
@@ -71,8 +71,8 @@ public override DbProviderFactory DbProviderFactory
7171
public class CassandraWaitForDatabaseFixture(IMessageSink messageSink)
7272
: CassandraDefaultFixture(messageSink)
7373
{
74-
protected override CassandraBuilder Configure(CassandraBuilder builder)
75-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
74+
protected override CassandraBuilder Configure()
75+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
7676
}
7777

7878
[UsedImplicitly]

tests/Testcontainers.ClickHouse.Tests/ClickHouseContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public async Task ExecScriptReturnsSuccessful()
3535
public class ClickHouseDefaultFixture(IMessageSink messageSink)
3636
: DbContainerFixture<ClickHouseBuilder, ClickHouseContainer>(messageSink)
3737
{
38-
protected override ClickHouseBuilder Configure(ClickHouseBuilder builder)
39-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
38+
protected override ClickHouseBuilder Configure()
39+
=> new ClickHouseBuilder(TestSession.GetImageFromDockerfile());
4040

4141
public override DbProviderFactory DbProviderFactory
4242
=> ClickHouseConnectionFactory.Instance;
@@ -46,8 +46,8 @@ public override DbProviderFactory DbProviderFactory
4646
public class ClickHouseWaitForDatabaseFixture(IMessageSink messageSink)
4747
: ClickHouseDefaultFixture(messageSink)
4848
{
49-
protected override ClickHouseBuilder Configure(ClickHouseBuilder builder)
50-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
49+
protected override ClickHouseBuilder Configure()
50+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5151
}
5252

5353
[UsedImplicitly]

tests/Testcontainers.CockroachDb.Tests/CockroachDbContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public async Task ExecScriptReturnsSuccessful()
3535
public class CockroachDbDefaultFixture(IMessageSink messageSink)
3636
: DbContainerFixture<CockroachDbBuilder, CockroachDbContainer>(messageSink)
3737
{
38-
protected override CockroachDbBuilder Configure(CockroachDbBuilder builder)
39-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
38+
protected override CockroachDbBuilder Configure()
39+
=> new CockroachDbBuilder(TestSession.GetImageFromDockerfile());
4040

4141
public override DbProviderFactory DbProviderFactory
4242
=> NpgsqlFactory.Instance;
@@ -46,8 +46,8 @@ public override DbProviderFactory DbProviderFactory
4646
public class CockroachDbWaitForDatabaseFixture(IMessageSink messageSink)
4747
: CockroachDbDefaultFixture(messageSink)
4848
{
49-
protected override CockroachDbBuilder Configure(CockroachDbBuilder builder)
50-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
49+
protected override CockroachDbBuilder Configure()
50+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5151
}
5252

5353
[UsedImplicitly]

tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,16 @@ public class Db2DefaultFixture(IMessageSink messageSink)
4040
public override DbProviderFactory DbProviderFactory
4141
=> DB2Factory.Instance;
4242

43-
protected override Db2Builder Configure(Db2Builder builder)
44-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithAcceptLicenseAgreement(true);
43+
protected override Db2Builder Configure()
44+
=> new Db2Builder(TestSession.GetImageFromDockerfile()).WithAcceptLicenseAgreement(true);
4545
}
4646

4747
[UsedImplicitly]
4848
public class Db2WaitForDatabaseFixture(IMessageSink messageSink)
4949
: Db2DefaultFixture(messageSink)
5050
{
51-
protected override Db2Builder Configure(Db2Builder builder)
52-
=> base.Configure(builder).WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
51+
protected override Db2Builder Configure()
52+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5353
}
5454

5555
[UsedImplicitly]

tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public async Task ExecScriptReturnsSuccessful()
3535
public class FirebirdSqlDefaultFixture(IMessageSink messageSink)
3636
: DbContainerFixture<FirebirdSqlBuilder, FirebirdSqlContainer>(messageSink)
3737
{
38-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
39-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
38+
protected override FirebirdSqlBuilder Configure()
39+
=> new FirebirdSqlBuilder(TestSession.GetImageFromDockerfile());
4040

4141
public override DbProviderFactory DbProviderFactory
4242
=> FirebirdClientFactory.Instance;
@@ -46,40 +46,40 @@ public override DbProviderFactory DbProviderFactory
4646
public class FirebirdSqlWaitForDatabaseFixture(IMessageSink messageSink)
4747
: FirebirdSqlDefaultFixture(messageSink)
4848
{
49-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
50-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
49+
protected override FirebirdSqlBuilder Configure()
50+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5151
}
5252

5353
[UsedImplicitly]
5454
public class FirebirdSql25ScFixture(IMessageSink messageSink)
5555
: FirebirdSqlDefaultFixture(messageSink)
5656
{
57-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
58-
=> builder.WithImage(TestSession.GetImageFromDockerfile(stage: "fb2.5-sc"));
57+
protected override FirebirdSqlBuilder Configure()
58+
=> new FirebirdSqlBuilder(TestSession.GetImageFromDockerfile(stage: "fb2.5-sc"));
5959
}
6060

6161
[UsedImplicitly]
6262
public class FirebirdSql25SsFixture(IMessageSink messageSink)
6363
: FirebirdSqlDefaultFixture(messageSink)
6464
{
65-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
66-
=> builder.WithImage(TestSession.GetImageFromDockerfile(stage: "fb2.5-ss"));
65+
protected override FirebirdSqlBuilder Configure()
66+
=> new FirebirdSqlBuilder(TestSession.GetImageFromDockerfile(stage: "fb2.5-ss"));
6767
}
6868

6969
[UsedImplicitly]
7070
public class FirebirdSql30Fixture(IMessageSink messageSink)
7171
: FirebirdSqlDefaultFixture(messageSink)
7272
{
73-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
74-
=> builder.WithImage(TestSession.GetImageFromDockerfile(stage: "fb3.0"));
73+
protected override FirebirdSqlBuilder Configure()
74+
=> new FirebirdSqlBuilder(TestSession.GetImageFromDockerfile(stage: "fb3.0"));
7575
}
7676

7777
[UsedImplicitly]
7878
public class FirebirdSqlSysdbaFixture(IMessageSink messageSink)
7979
: FirebirdSqlDefaultFixture(messageSink)
8080
{
81-
protected override FirebirdSqlBuilder Configure(FirebirdSqlBuilder builder)
82-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithUsername("sysdba").WithPassword("some-password");
81+
protected override FirebirdSqlBuilder Configure()
82+
=> base.Configure().WithUsername("sysdba").WithPassword("some-password");
8383
}
8484

8585
[UsedImplicitly]

tests/Testcontainers.MariaDb.Tests/MariaDbContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public async Task ExecScriptReturnsSuccessful()
3535
public class MariaDbDefaultFixture(IMessageSink messageSink)
3636
: DbContainerFixture<MariaDbBuilder, MariaDbContainer>(messageSink)
3737
{
38-
protected override MariaDbBuilder Configure(MariaDbBuilder builder)
39-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
38+
protected override MariaDbBuilder Configure()
39+
=> new MariaDbBuilder(TestSession.GetImageFromDockerfile());
4040

4141
public override DbProviderFactory DbProviderFactory
4242
=> MySqlConnectorFactory.Instance;
@@ -46,8 +46,8 @@ public override DbProviderFactory DbProviderFactory
4646
public class MariaDbWaitForDatabaseFixture(IMessageSink messageSink)
4747
: MariaDbDefaultFixture(messageSink)
4848
{
49-
protected override MariaDbBuilder Configure(MariaDbBuilder builder)
50-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
49+
protected override MariaDbBuilder Configure()
50+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5151
}
5252

5353
[UsedImplicitly]

tests/Testcontainers.Mosquitto.Tests/MosquittoContainerTest.cs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ private MosquittoContainerTest(ITestOutputHelper testOutputHelper)
1313
{
1414
}
1515

16+
protected override MosquittoBuilder Configure()
17+
=> new MosquittoBuilder(TestSession.GetImageFromDockerfile());
18+
1619
protected abstract MqttClientOptions GetClientOptions();
1720

1821
[Fact]
@@ -87,10 +90,8 @@ protected override MqttClientOptions GetClientOptions()
8790
public sealed class TcpEncryptedUnauthenticatedConfiguration(ITestOutputHelper testOutputHelper)
8891
: MosquittoContainerTest(testOutputHelper)
8992
{
90-
protected override MosquittoBuilder Configure(MosquittoBuilder builder)
91-
{
92-
return builder.WithImage(TestSession.GetImageFromDockerfile()).WithCertificate(Certificate, CertificateKey);
93-
}
93+
protected override MosquittoBuilder Configure()
94+
=> base.Configure().WithCertificate(Certificate, CertificateKey);
9495

9596
protected override MqttClientOptions GetClientOptions()
9697
{
@@ -106,11 +107,6 @@ protected override MqttClientOptions GetClientOptions()
106107
public sealed class WebSocketUnencryptedUnauthenticatedConfiguration(ITestOutputHelper testOutputHelper)
107108
: MosquittoContainerTest(testOutputHelper)
108109
{
109-
protected override MosquittoBuilder Configure(MosquittoBuilder builder)
110-
{
111-
return builder.WithImage(TestSession.GetImageFromDockerfile());
112-
}
113-
114110
protected override MqttClientOptions GetClientOptions()
115111
{
116112
return new MqttClientOptionsBuilder()
@@ -123,10 +119,8 @@ protected override MqttClientOptions GetClientOptions()
123119
public sealed class WebSocketEncryptedUnauthenticatedConfiguration(ITestOutputHelper testOutputHelper)
124120
: MosquittoContainerTest(testOutputHelper)
125121
{
126-
protected override MosquittoBuilder Configure(MosquittoBuilder builder)
127-
{
128-
return builder.WithImage(TestSession.GetImageFromDockerfile()).WithCertificate(Certificate, CertificateKey);
129-
}
122+
protected override MosquittoBuilder Configure()
123+
=> base.Configure().WithCertificate(Certificate, CertificateKey);
130124

131125
protected override MqttClientOptions GetClientOptions()
132126
{

tests/Testcontainers.MsSql.Tests/MsSqlContainerTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public async Task ExecScriptReturnsSuccessful()
3737
public class MsSqlDefaultFixture(IMessageSink messageSink)
3838
: DbContainerFixture<MsSqlBuilder, MsSqlContainer>(messageSink)
3939
{
40-
protected override MsSqlBuilder Configure(MsSqlBuilder builder)
41-
=> builder.WithImage(TestSession.GetImageFromDockerfile());
40+
protected override MsSqlBuilder Configure()
41+
=> new MsSqlBuilder(TestSession.GetImageFromDockerfile());
4242

4343
public override DbProviderFactory DbProviderFactory
4444
=> SqlClientFactory.Instance;
@@ -48,8 +48,8 @@ public override DbProviderFactory DbProviderFactory
4848
public class MsSqlWaitForDatabaseFixture(IMessageSink messageSink)
4949
: MsSqlDefaultFixture(messageSink)
5050
{
51-
protected override MsSqlBuilder Configure(MsSqlBuilder builder)
52-
=> builder.WithImage(TestSession.GetImageFromDockerfile()).WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
51+
protected override MsSqlBuilder Configure()
52+
=> base.Configure().WithWaitStrategy(Wait.ForUnixContainer().UntilDatabaseIsAvailable(DbProviderFactory));
5353
}
5454

5555
[UsedImplicitly]

0 commit comments

Comments
 (0)