Skip to content

Commit 64c7e73

Browse files
committed
Make the TryGetDbProviderFactory method available to all container builders
1 parent 3d22bf5 commit 64c7e73

2 files changed

Lines changed: 35 additions & 22 deletions

File tree

src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -81,38 +81,22 @@ public override FirebirdSqlContainer Build()
8181
return new FirebirdSqlContainer(DockerResourceConfiguration);
8282
}
8383

84+
/// <inheritdoc />
85+
protected override string DbFactoryTypeName => "FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, PublicKeyToken=3750abcc3150b00c";
86+
8487
/// <inheritdoc />
8588
protected override FirebirdSqlBuilder Init()
8689
{
90+
var hasDbProviderFactory = TryGetDbProviderFactory(out var dbProviderFactory);
91+
var wait = Wait.ForUnixContainer();
8792
return base.Init()
8893
.WithImage(FirebirdSqlImage)
8994
.WithPortBinding(FirebirdSqlPort, true)
9095
.WithDatabase(DefaultDatabase)
9196
.WithUsername(DefaultUsername)
9297
.WithPassword(DefaultPassword)
9398
.WithResourceMapping(Encoding.Default.GetBytes(TestQueryString), "/home/firebird_check.sql")
94-
.WithWaitStrategy(GetDefaultWaitStrategy(Wait.ForUnixContainer()));
95-
}
96-
97-
private static IWaitForContainerOS GetDefaultWaitStrategy(IWaitForContainerOS waitStrategy)
98-
{
99-
return TryGetDbProviderFactory("FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, PublicKeyToken=3750abcc3150b00c", out var dbProviderFactory)
100-
? waitStrategy.UntilDatabaseIsAvailable(dbProviderFactory)
101-
: waitStrategy.UntilContainerIsHealthy();
102-
}
103-
104-
private static bool TryGetDbProviderFactory(string factoryTypeName, out DbProviderFactory dbProviderFactory)
105-
{
106-
try
107-
{
108-
dbProviderFactory = (DbProviderFactory)Type.GetType(factoryTypeName)?.GetField("Instance")?.GetValue(null);
109-
return dbProviderFactory != null;
110-
}
111-
catch
112-
{
113-
dbProviderFactory = null;
114-
return false;
115-
}
99+
.WithWaitStrategy(hasDbProviderFactory ? wait.UntilDatabaseIsAvailable(dbProviderFactory) : wait.UntilContainerIsHealthy());
116100
}
117101

118102
/// <inheritdoc />

src/Testcontainers/Builders/ContainerBuilder`3.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ namespace DotNet.Testcontainers.Builders
22
{
33
using System;
44
using System.Collections.Generic;
5+
using System.Data.Common;
56
using System.Globalization;
67
using System.IO;
78
using System.Linq;
@@ -51,6 +52,13 @@ protected ContainerBuilder(TConfigurationEntity dockerResourceConfiguration)
5152
/// </summary>
5253
protected virtual string DeclineLicenseAgreement { get; }
5354

55+
/// <summary>
56+
/// The assembly-qualified name of the type which contains an <c>Instance</c> field which is a <see cref="DbProviderFactory"/>.
57+
/// </summary>
58+
/// <example><c>FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, PublicKeyToken=3750abcc3150b00c</c></example>
59+
/// <remarks>Used for database containers only.</remarks>
60+
protected virtual string DbFactoryTypeName => "";
61+
5462
/// <inheritdoc />
5563
public virtual TBuilderEntity WithAcceptLicenseAgreement(bool acceptLicenseAgreement)
5664
{
@@ -383,6 +391,27 @@ public TBuilderEntity WithStartupCallback(Func<TContainerEntity, CancellationTok
383391
return Clone(new ContainerConfiguration(startupCallback: (container, ct) => startupCallback((TContainerEntity)container, ct)));
384392
}
385393

394+
/// <summary>
395+
/// Gets a <see cref="DbProviderFactory"/> through reflection, using the <c>Instance</c> field of the <see cref="DbFactoryTypeName"/> type.
396+
/// </summary>
397+
/// <param name="dbProviderFactory">
398+
/// When this method returns, contains the <see cref="DbProviderFactory"/> if the type is loaded; otherwise, <see langword="null"/>. This parameter is passed uninitialized.
399+
/// </param>
400+
/// <returns><see langword="true"/> if a <see cref="DbProviderFactory"/> was found; otherwise, <see langword="false"/>.</returns>
401+
protected virtual bool TryGetDbProviderFactory(out DbProviderFactory dbProviderFactory)
402+
{
403+
try
404+
{
405+
dbProviderFactory = (DbProviderFactory)Type.GetType(DbFactoryTypeName)?.GetField("Instance")?.GetValue(null);
406+
return dbProviderFactory != null;
407+
}
408+
catch
409+
{
410+
dbProviderFactory = null;
411+
return false;
412+
}
413+
}
414+
386415
/// <inheritdoc />
387416
protected override TBuilderEntity Init()
388417
{

0 commit comments

Comments
 (0)