Skip to content

Commit 3b4f418

Browse files
authored
feat: Add startup callback overload with configuration type (#1547)
1 parent bfbfc07 commit 3b4f418

File tree

12 files changed

+44
-16
lines changed

12 files changed

+44
-16
lines changed

src/Testcontainers.Weaviate/WeaviateContainer.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@ namespace Testcontainers.Weaviate;
22

33
/// <inheritdoc cref="DockerContainer" />
44
[PublicAPI]
5-
public sealed class WeaviateContainer(WeaviateConfiguration configuration) : DockerContainer(configuration)
5+
public sealed class WeaviateContainer : DockerContainer
66
{
7+
/// <summary>
8+
/// Initializes a new instance of the <see cref="WeaviateContainer" /> class.
9+
/// </summary>
10+
/// <param name="configuration">The container configuration.</param>
11+
public WeaviateContainer(WeaviateConfiguration configuration)
12+
: base(configuration)
13+
{
14+
}
15+
716
/// <summary>
817
/// Gets the Weaviate base address.
918
/// </summary>

src/Testcontainers.Xunit/ContainerFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ namespace Testcontainers.Xunit;
1111
[PublicAPI]
1212
public class ContainerFixture<TBuilderEntity, TContainerEntity>(IMessageSink messageSink)
1313
: ContainerLifetime<TBuilderEntity, TContainerEntity>(new MessageSinkLogger(messageSink))
14-
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
14+
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1515
where TContainerEntity : IContainer;

src/Testcontainers.Xunit/ContainerLifetime.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Testcontainers.Xunit;
66
/// <typeparam name="TBuilderEntity">The builder entity.</typeparam>
77
/// <typeparam name="TContainerEntity">The container entity.</typeparam>
88
public abstract class ContainerLifetime<TBuilderEntity, TContainerEntity> : IAsyncLifetime
9-
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
9+
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1010
where TContainerEntity : IContainer
1111
{
1212
private readonly Lazy<TContainerEntity> _container;
@@ -91,8 +91,8 @@ await Container.StartAsync()
9191

9292
#if XUNIT_V3
9393
/// <inheritdoc cref="IAsyncDisposable.DisposeAsync" />
94-
#else
95-
/// <inheritdoc cref="IAsyncLifetime.DisposeAsync" />
94+
#else
95+
/// <inheritdoc cref="IAsyncLifetime.DisposeAsync" />
9696
#endif
9797
protected virtual async LifetimeTask DisposeAsyncCore()
9898
{

src/Testcontainers.Xunit/ContainerTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Testcontainers.Xunit;
1111
[PublicAPI]
1212
public abstract class ContainerTest<TBuilderEntity, TContainerEntity>(ITestOutputHelper testOutputHelper, Func<TBuilderEntity, TBuilderEntity> configure = null)
1313
: ContainerLifetime<TBuilderEntity, TContainerEntity>(new TestOutputLogger(testOutputHelper))
14-
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
14+
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1515
where TContainerEntity : IContainer
1616
{
1717
protected override TBuilderEntity Configure(TBuilderEntity builder) => configure != null ? configure(builder) : builder;

src/Testcontainers.Xunit/DbContainerFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Testcontainers.Xunit;
1010
[PublicAPI]
1111
public abstract class DbContainerFixture<TBuilderEntity, TContainerEntity>(IMessageSink messageSink)
1212
: ContainerFixture<TBuilderEntity, TContainerEntity>(messageSink), IDbContainerTestMethods
13-
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
13+
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1414
where TContainerEntity : IContainer, IDatabaseContainer
1515
{
1616
private DbContainerTestMethods _testMethods;

src/Testcontainers.Xunit/DbContainerTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Testcontainers.Xunit;
99
[PublicAPI]
1010
public abstract class DbContainerTest<TBuilderEntity, TContainerEntity>(ITestOutputHelper testOutputHelper, Func<TBuilderEntity, TBuilderEntity> configure = null)
1111
: ContainerTest<TBuilderEntity, TContainerEntity>(testOutputHelper, configure), IDbContainerTestMethods
12-
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity>, new()
12+
where TBuilderEntity : IContainerBuilder<TBuilderEntity, TContainerEntity, IContainerConfiguration>, new()
1313
where TContainerEntity : IContainer, IDatabaseContainer
1414
{
1515
private DbContainerTestMethods _testMethods;

src/Testcontainers.Xunit/Usings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
global using System.Threading;
66
global using System.Threading.Tasks;
77
global using DotNet.Testcontainers.Builders;
8+
global using DotNet.Testcontainers.Configurations;
89
global using DotNet.Testcontainers.Containers;
910
global using JetBrains.Annotations;
1011
global using Microsoft.Extensions.Logging;

src/Testcontainers/Builders/ContainerBuilder`3.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace DotNet.Testcontainers.Builders
2222
/// <typeparam name="TContainerEntity">The resource entity.</typeparam>
2323
/// <typeparam name="TConfigurationEntity">The configuration entity.</typeparam>
2424
[PublicAPI]
25-
public abstract class ContainerBuilder<TBuilderEntity, TContainerEntity, TConfigurationEntity> : AbstractBuilder<TBuilderEntity, TContainerEntity, CreateContainerParameters, TConfigurationEntity>, IContainerBuilder<TBuilderEntity, TContainerEntity>
25+
public abstract class ContainerBuilder<TBuilderEntity, TContainerEntity, TConfigurationEntity> : AbstractBuilder<TBuilderEntity, TContainerEntity, CreateContainerParameters, TConfigurationEntity>, IContainerBuilder<TBuilderEntity, TContainerEntity, TConfigurationEntity>
2626
where TBuilderEntity : ContainerBuilder<TBuilderEntity, TContainerEntity, TConfigurationEntity>
2727
where TContainerEntity : IContainer
2828
where TConfigurationEntity : IContainerConfiguration
@@ -387,13 +387,19 @@ public TBuilderEntity WithWaitStrategy(IWaitForContainerOS waitStrategy)
387387
/// <inheritdoc />
388388
public TBuilderEntity WithStartupCallback(Func<TContainerEntity, CancellationToken, Task> startupCallback)
389389
{
390-
return Clone(new ContainerConfiguration(startupCallback: (container, ct) => startupCallback((TContainerEntity)container, ct)));
390+
return Clone(new ContainerConfiguration(startupCallback: (container, _, ct) => startupCallback((TContainerEntity)container, ct)));
391+
}
392+
393+
/// <inheritdoc />
394+
public TBuilderEntity WithStartupCallback(Func<TContainerEntity, TConfigurationEntity, CancellationToken, Task> startupCallback)
395+
{
396+
return Clone(new ContainerConfiguration(startupCallback: (container, configuration, ct) => startupCallback((TContainerEntity)container, (TConfigurationEntity)configuration, ct)));
391397
}
392398

393399
/// <inheritdoc />
394400
protected override TBuilderEntity Init()
395401
{
396-
return base.Init().WithImagePullPolicy(PullPolicy.Missing).WithPortForwarding().WithOutputConsumer(Consume.DoNotConsumeStdoutAndStderr()).WithWaitStrategy(Wait.ForUnixContainer()).WithStartupCallback((_, _) => Task.CompletedTask);
402+
return base.Init().WithImagePullPolicy(PullPolicy.Missing).WithPortForwarding().WithOutputConsumer(Consume.DoNotConsumeStdoutAndStderr()).WithWaitStrategy(Wait.ForUnixContainer()).WithStartupCallback((_, _, _) => Task.CompletedTask);
397403
}
398404

399405
/// <inheritdoc />

src/Testcontainers/Builders/IContainerBuilder`2.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ namespace DotNet.Testcontainers.Builders
1818
/// </summary>
1919
/// <typeparam name="TBuilderEntity">The builder entity.</typeparam>
2020
/// <typeparam name="TContainerEntity">The resource entity.</typeparam>
21+
/// <typeparam name="TConfigurationEntity">The configuration entity.</typeparam>
2122
[PublicAPI]
22-
public interface IContainerBuilder<out TBuilderEntity, out TContainerEntity> : IAbstractBuilder<TBuilderEntity, TContainerEntity, CreateContainerParameters>
23+
public interface IContainerBuilder<out TBuilderEntity, out TContainerEntity, out TConfigurationEntity> : IAbstractBuilder<TBuilderEntity, TContainerEntity, CreateContainerParameters>
2324
{
2425
/// <summary>
2526
/// Accepts the license agreement.
@@ -488,5 +489,16 @@ public interface IContainerBuilder<out TBuilderEntity, out TContainerEntity> : I
488489
/// <returns>A configured instance of <typeparamref name="TBuilderEntity" />.</returns>
489490
[PublicAPI]
490491
TBuilderEntity WithStartupCallback(Func<TContainerEntity, CancellationToken, Task> startupCallback);
492+
493+
/// <summary>
494+
/// Sets a startup callback to invoke after the container start.
495+
/// </summary>
496+
/// <remarks>
497+
/// The callback method is invoked after the container start, but before the wait strategies.
498+
/// </remarks>
499+
/// <param name="startupCallback">The callback method to invoke.</param>
500+
/// <returns>A configured instance of <typeparamref name="TBuilderEntity" />.</returns>
501+
[PublicAPI]
502+
TBuilderEntity WithStartupCallback(Func<TContainerEntity, TConfigurationEntity, CancellationToken, Task> startupCallback);
491503
}
492504
}

src/Testcontainers/Configurations/Containers/ContainerConfiguration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public ContainerConfiguration(
6161
IEnumerable<string> extraHosts = null,
6262
IOutputConsumer outputConsumer = null,
6363
IEnumerable<WaitStrategy> waitStrategies = null,
64-
Func<IContainer, CancellationToken, Task> startupCallback = null,
64+
Func<IContainer, IContainerConfiguration, CancellationToken, Task> startupCallback = null,
6565
bool? autoRemove = null,
6666
bool? privileged = null)
6767
{
@@ -216,6 +216,6 @@ public ContainerConfiguration(IContainerConfiguration oldValue, IContainerConfig
216216

217217
/// <inheritdoc />
218218
[JsonIgnore]
219-
public Func<IContainer, CancellationToken, Task> StartupCallback { get; }
219+
public Func<IContainer, IContainerConfiguration, CancellationToken, Task> StartupCallback { get; }
220220
}
221221
}

0 commit comments

Comments
 (0)