From 27cf1d97f3133d43220480c32c1ed358084f0a08 Mon Sep 17 00:00:00 2001 From: Jasper Park Date: Tue, 12 Dec 2023 11:28:53 +0100 Subject: [PATCH 1/9] feat: add firebird sql support for testcontainers.net --- Testcontainers.sln | 14 ++ .../FirebirdSqlBuilder.cs | 170 ++++++++++++++++++ .../FirebirdSqlConfiguration.cs | 89 +++++++++ .../FirebirdSqlContainer.cs | 85 +++++++++ .../Testcontainers.FirebirdSql.csproj | 13 ++ src/Testcontainers.FirebirdSql/Usings.cs | 14 ++ .../FirebirdSqlContainerTests.cs | 75 ++++++++ .../Testcontainers.FirebirdSql.Tests.csproj | 19 ++ .../Usings.cs | 6 + 9 files changed, 485 insertions(+) create mode 100644 src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs create mode 100644 src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs create mode 100644 src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs create mode 100644 src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj create mode 100644 src/Testcontainers.FirebirdSql/Usings.cs create mode 100644 tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs create mode 100644 tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj create mode 100644 tests/Testcontainers.FirebirdSql.Tests/Usings.cs diff --git a/Testcontainers.sln b/Testcontainers.sln index 7507b0faa..afc8600f0 100644 --- a/Testcontainers.sln +++ b/Testcontainers.sln @@ -183,6 +183,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Tests", "tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.WebDriver.Tests", "tests\Testcontainers.WebDriver.Tests\Testcontainers.WebDriver.Tests.csproj", "{EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql", "src\Testcontainers.FirebirdSql\Testcontainers.FirebirdSql.csproj", "{31BAF2C4-0608-4C0F-845A-14FE7C0A1670}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql.Tests", "tests\Testcontainers.FirebirdSql.Tests\Testcontainers.FirebirdSql.Tests.csproj", "{E39095AC-9B34-4178-A486-04C902B6FD33}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -532,6 +536,14 @@ Global {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Release|Any CPU.Build.0 = Release|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.Build.0 = Release|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {5365F780-0E6C-41F0-B1B9-7DC34368F80C} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -619,5 +631,7 @@ Global {1A1983E6-5297-435F-B467-E8E1F11277D6} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {27CDB869-A150-4593-958F-6F26E5391E7C} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} + {E39095AC-9B34-4178-A486-04C902B6FD33} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} EndGlobalSection EndGlobal diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs new file mode 100644 index 000000000..9b7691ca2 --- /dev/null +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -0,0 +1,170 @@ +namespace Testcontainers.FirebirdSql; + +/// +[PublicAPI] +public class FirebirdSqlBuilder : ContainerBuilder +{ + public const string FirebirdSqlImage = "jacobalberty/firebird"; + + public const ushort FirebirdSqlPort = 3050; + + public const string DefaultDatabase = "test"; + public const string DefaultUsername = "test"; + public const string DefaultPassword = "test"; + public const string FirebirdSysdba = "sysdba"; + public const string DefaultSysdbaPassword = "masterkey"; + + /// + /// Initializes a new instance of the class. + /// + public FirebirdSqlBuilder() + : this(new FirebirdSqlConfiguration()) + { + DockerResourceConfiguration = Init().DockerResourceConfiguration; + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public FirebirdSqlBuilder(FirebirdSqlConfiguration dockerResourceConfiguration) + : base(dockerResourceConfiguration) + { + DockerResourceConfiguration = dockerResourceConfiguration; + } + + /// + protected override FirebirdSqlConfiguration DockerResourceConfiguration { get; } + + + /// + /// Sets the FirebirdSql username. + /// + /// + /// Can be set to 'sysdba'. In that case please use to set the password to connect with. + /// + /// The FirebirdSql username. + /// A configured instance of . + public FirebirdSqlBuilder WithUsername(string username) + { + var builder = Merge(DockerResourceConfiguration, new(username: username)); + if (username.ToLower() != FirebirdSysdba) + { + builder = builder + .WithEnvironment("FIREBIRD_USER", username); + } + + return builder; + } + + /// + /// Sets the FirebirdSql password. + /// + /// + /// To authenticate with the configured user. If the user is 'sysdba' please use + /// + /// The FirebirdSql password. + /// A configured instance of . + public FirebirdSqlBuilder WithPassword(string password) + { + return Merge(DockerResourceConfiguration, new(password: password)) + .WithEnvironment("FIREBIRD_PASSWORD", password); + } + + /// + /// Sets the FirebirdSql sysdba password. + /// + /// + /// To authenticate with the sysdba user. If the user is not 'sysdba' please use + /// + /// The FirebirdSql password. + /// A configured instance of . + public FirebirdSqlBuilder WithSysdbaPassword(string sysdbaPassword) + { + return Merge(DockerResourceConfiguration, new(sysdbaPassword: sysdbaPassword)) + .WithEnvironment("ISC_PASSWORD", sysdbaPassword); + } + + /// + /// Sets the FirebirdSql database. + /// + /// The FirebirdSql database. + /// A configured instance of . + public FirebirdSqlBuilder WithDatabase(string database) + { + return Merge(DockerResourceConfiguration, new(database: database)) + .WithEnvironment("FIREBIRD_DATABASE", database); + } + + /// + public override FirebirdSqlContainer Build() + { + Validate(); + var compoundWaitStrategy = Wait.ForUnixContainer() + .UntilContainerIsHealthy() + .AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration)); + return new FirebirdSqlContainer( + WithWaitStrategy(compoundWaitStrategy).DockerResourceConfiguration, + TestcontainersSettings.Logger); + } + + /// + protected override FirebirdSqlBuilder Init() + => base.Init() + .WithImage(FirebirdSqlImage) + .WithPortBinding(FirebirdSqlPort, true) + .WithDatabase(DefaultDatabase) + .WithUsername(DefaultUsername) + .WithPassword(DefaultPassword) + .WithSysdbaPassword(DefaultSysdbaPassword) + .WithResourceMapping(Encoding.UTF8.GetBytes(FirebirdSqlContainer.TestQueryString), "/home/firebird_check.sql"); + + /// + protected override void Validate() + { + base.Validate(); + + _ = Guard.Argument(DockerResourceConfiguration.Password, nameof(DockerResourceConfiguration.Password)) + .NotNull() + .NotEmpty(); + } + + /// + protected override FirebirdSqlBuilder Clone(IResourceConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new(resourceConfiguration)); + + /// + protected override FirebirdSqlBuilder Clone(IContainerConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new(resourceConfiguration)); + + /// + protected override FirebirdSqlBuilder Merge(FirebirdSqlConfiguration oldValue, FirebirdSqlConfiguration newValue) + => new(new(oldValue, newValue)); + + /// + /// + /// Uses the isql Firebird Interactive SQL Utility to detect the readiness of the FirebirdSql container: + /// https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/isql/firebird-isql.html. + /// + private sealed class WaitUntil(FirebirdSqlConfiguration conf) : IWaitUntil + { + private readonly string[] checkDatabaseCommand = + { + "/usr/local/firebird/bin/isql", + "-i", + "/home/firebird_check.sql", + $"localhost:{conf.Database}", + "-user", + conf.Username, + "-pass", + conf.Password, + }; + + public async Task UntilAsync(IContainer container) + { + var executionResult = await container.ExecAsync(checkDatabaseCommand) + .ConfigureAwait(false); + return 0L.Equals(executionResult.ExitCode); + } + } +} diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs new file mode 100644 index 000000000..033d1aa81 --- /dev/null +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs @@ -0,0 +1,89 @@ +namespace Testcontainers.FirebirdSql; + +/// +[PublicAPI] +public class FirebirdSqlConfiguration : ContainerConfiguration +{ + /// + /// Initializes a new instance of the class. + /// + /// The FirebirdSql database. + /// The FirebirdSql username. + /// The FirebirdSql password. + /// The FirebirdSql sysdba password. + public FirebirdSqlConfiguration( + string? database = null, + string? username = null, + string? password = null, + string? sysdbaPassword = null) + { + Database = database; + Username = username; + Password = password; + SysdbaPassword = sysdbaPassword; + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public FirebirdSqlConfiguration(IResourceConfiguration resourceConfiguration) + : base(resourceConfiguration) + { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public FirebirdSqlConfiguration(IContainerConfiguration resourceConfiguration) + : base(resourceConfiguration) + { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public FirebirdSqlConfiguration(FirebirdSqlConfiguration resourceConfiguration) + : this(new FirebirdSqlConfiguration(), resourceConfiguration) + { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. + } + + /// + /// Initializes a new instance of the class. + /// + /// The old Docker resource configuration. + /// The new Docker resource configuration. + public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlConfiguration newValue) + : base(oldValue, newValue) + { + Database = BuildConfiguration.Combine(oldValue.Database, newValue.Database); + Username = BuildConfiguration.Combine(oldValue.Username, newValue.Username); + Password = BuildConfiguration.Combine(oldValue.Password, newValue.Password); + SysdbaPassword = BuildConfiguration.Combine(oldValue.SysdbaPassword, newValue.SysdbaPassword); + } + + /// + /// Gets the FirebirdSql database. + /// + public string? Database { get; } + + /// + /// Gets the FirebirdSql username. + /// + public string? Username { get; } + + /// + /// Gets the FirebirdSql password. + /// + public string? Password { get; } + + /// + /// Gets the FirebirdSql sysdba password. + /// + public string? SysdbaPassword { get; } +} diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs new file mode 100644 index 000000000..fe2f7807c --- /dev/null +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs @@ -0,0 +1,85 @@ +namespace Testcontainers.FirebirdSql; + +/// +[PublicAPI] +public class FirebirdSqlContainer : DockerContainer, IDatabaseContainer +{ + public const string TestQueryString = "select 1 from RDB$DATABASE;"; + + private readonly FirebirdSqlConfiguration _configuration; + + /// + /// Initializes a new instance of the class. + /// + /// The container configuration. + /// The logger. + public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logger) : base(configuration, logger) + { + this._configuration = configuration; + } + + private string GetDatabaseName() + { + if (State == TestcontainersStates.Running && IsFirebird2_5Image) + { + var dbPath = _configuration.Environments.TryGetValue("DBPATH", out var path) + ? path + : "/firebird/data"; + return $"{dbPath}/{_configuration.Database}"; + } + else + { + return _configuration.Database; + } + } + + /// + /// Indicates whether the used image is an EOL v2.5 version of firebird + /// + /// True if the image is a v2.5 version, false otherwise + public bool IsFirebird2_5Image => Image.Tag.StartsWith("2.5") || Image.Tag.StartsWith("v2.5"); + + /// + /// Gets the FirebirdSql connection string. + /// + /// The FirebirdSql connection string. + public string GetConnectionString() + { + var properties = new Dictionary(); + properties.Add("User", _configuration.Username); + properties.Add("Password", _configuration.Username == FirebirdSqlBuilder.FirebirdSysdba + ? _configuration.SysdbaPassword + : _configuration.Password); + properties.Add("Database", GetDatabaseName()); + properties.Add("DataSource", $"{Hostname}"); + properties.Add("Port", $"{GetMappedPublicPort(FirebirdSqlBuilder.FirebirdSqlPort)}"); + properties.Add("Dialect", "3"); + properties.Add("Charset", "utf8"); + properties.Add("Role", ""); + properties.Add("Connection lifetime", "15"); + properties.Add("Pooling", "true"); + properties.Add("MinPoolSize", "0"); + properties.Add("MaxPoolSize", "50"); + properties.Add("Packet Size", "8192"); + properties.Add("ServerType", "0"); + return string.Join(";", properties.Select(p => $"{p.Key}={p.Value}")); + } + + /// + /// Executes the SQL script in the FirebirdSql container. + /// + /// The content of the SQL script to execute. + /// Cancellation token. + /// Task that completes when the SQL script has been executed. + public async Task ExecScriptAsync(string scriptContent, CancellationToken ct = default) + { + var scriptFilePath = + string.Join("/", string.Empty, "tmp", Guid.NewGuid().ToString("D"), Path.GetRandomFileName()); + + await CopyAsync(Encoding.Default.GetBytes(scriptContent), scriptFilePath, Unix.FileMode644, ct) + .ConfigureAwait(false); + + return await ExecAsync(new[] { "/usr/local/firebird/bin/isql", "-user", _configuration.Username, "-pass", _configuration.Password, "-i", scriptFilePath, $"localhost:{_configuration.Database}" }, ct) + .ConfigureAwait(false); + } +} diff --git a/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj new file mode 100644 index 000000000..4b662f072 --- /dev/null +++ b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj @@ -0,0 +1,13 @@ + + + netstandard2.0;netstandard2.1 + latest + enable + + + + + + + + diff --git a/src/Testcontainers.FirebirdSql/Usings.cs b/src/Testcontainers.FirebirdSql/Usings.cs new file mode 100644 index 000000000..709e0557c --- /dev/null +++ b/src/Testcontainers.FirebirdSql/Usings.cs @@ -0,0 +1,14 @@ +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Text; +global using System.Threading; +global using System.Threading.Tasks; +global using Docker.DotNet.Models; +global using DotNet.Testcontainers; +global using DotNet.Testcontainers.Builders; +global using DotNet.Testcontainers.Configurations; +global using DotNet.Testcontainers.Containers; +global using JetBrains.Annotations; +global using Microsoft.Extensions.Logging; diff --git a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs new file mode 100644 index 000000000..f020cbdd2 --- /dev/null +++ b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs @@ -0,0 +1,75 @@ +namespace Testcontainers.FirebirdSql.Tests; + +public abstract class FirebirdSqlContainerTests : IAsyncLifetime +{ + protected abstract FirebirdSqlContainer FirebirdSqlContainer { get; } + + public Task InitializeAsync() + { + return FirebirdSqlContainer.StartAsync(); + } + + public Task DisposeAsync() + { + return FirebirdSqlContainer.DisposeAsync().AsTask(); + } + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public void ConnectionStateReturnsOpen() + { + // Given + using DbConnection connection = new FbConnection(FirebirdSqlContainer.GetConnectionString()); + + // When + connection.Open(); + + // Then + Assert.Equal(ConnectionState.Open, connection.State); + } + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public async Task ExecScriptReturnsSuccessful() + { + // Given + const string scriptContent = FirebirdSqlContainer.TestQueryString; + + // When + var execResult = await FirebirdSqlContainer.ExecScriptAsync(scriptContent) + .ConfigureAwait(false); + + // When + Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr); + } +} + +public class Firebird25SC : FirebirdSqlContainerTests +{ + protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = + new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-sc").Build(); +} + +public class Firebird25SS : FirebirdSqlContainerTests +{ + protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = + new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-ss").Build(); +} + +public class Firebird30 : FirebirdSqlContainerTests +{ + protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = + new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:3.0").Build(); +} + +public class Firebird40 : FirebirdSqlContainerTests +{ + protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = + new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:v4.0").Build(); +} + +public class FirebirdDefault : FirebirdSqlContainerTests +{ + protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = + new FirebirdSqlBuilder().Build(); +} diff --git a/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj b/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj new file mode 100644 index 000000000..115f9e8a6 --- /dev/null +++ b/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + false + false + + + + + + + + + + + + + diff --git a/tests/Testcontainers.FirebirdSql.Tests/Usings.cs b/tests/Testcontainers.FirebirdSql.Tests/Usings.cs new file mode 100644 index 000000000..b58783ce4 --- /dev/null +++ b/tests/Testcontainers.FirebirdSql.Tests/Usings.cs @@ -0,0 +1,6 @@ +global using System.Data; +global using System.Data.Common; +global using System.Threading.Tasks; +global using DotNet.Testcontainers.Commons; +global using FirebirdSql.Data.FirebirdClient; +global using Xunit; From 0bbe071d57ca8f3f19c33b85c0bce6b1a8d37dbe Mon Sep 17 00:00:00 2001 From: Jasper Park Date: Tue, 12 Dec 2023 11:38:10 +0100 Subject: [PATCH 2/9] feat: rename parameter in wait strategy --- src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index 9b7691ca2..d1b3ccc0e 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -146,18 +146,18 @@ protected override FirebirdSqlBuilder Merge(FirebirdSqlConfiguration oldValue, F /// Uses the isql Firebird Interactive SQL Utility to detect the readiness of the FirebirdSql container: /// https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/isql/firebird-isql.html. /// - private sealed class WaitUntil(FirebirdSqlConfiguration conf) : IWaitUntil + private sealed class WaitUntil(FirebirdSqlConfiguration configuration) : IWaitUntil { private readonly string[] checkDatabaseCommand = { "/usr/local/firebird/bin/isql", "-i", "/home/firebird_check.sql", - $"localhost:{conf.Database}", + $"localhost:{configuration.Database}", "-user", - conf.Username, + configuration.Username, "-pass", - conf.Password, + configuration.Password, }; public async Task UntilAsync(IContainer container) From 905259a174176c28a155d45f429b39e8c00a4dba Mon Sep 17 00:00:00 2001 From: Jasper Park Date: Tue, 19 Dec 2023 09:24:59 +0100 Subject: [PATCH 3/9] feat: simplify username and password specification for firebird pinned version to v4.0 --- .../FirebirdSqlBuilder.cs | 37 +++---------------- .../FirebirdSqlConfiguration.cs | 11 +----- .../FirebirdSqlContainer.cs | 15 +------- .../FirebirdSqlContainerTests.cs | 4 +- 4 files changed, 10 insertions(+), 57 deletions(-) diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index d1b3ccc0e..0350bde3d 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -4,7 +4,7 @@ namespace Testcontainers.FirebirdSql; [PublicAPI] public class FirebirdSqlBuilder : ContainerBuilder { - public const string FirebirdSqlImage = "jacobalberty/firebird"; + public const string FirebirdSqlImage = "jacobalberty/firebird:v4.0"; public const ushort FirebirdSqlPort = 3050; @@ -36,53 +36,27 @@ public FirebirdSqlBuilder(FirebirdSqlConfiguration dockerResourceConfiguration) /// protected override FirebirdSqlConfiguration DockerResourceConfiguration { get; } - /// /// Sets the FirebirdSql username. /// - /// - /// Can be set to 'sysdba'. In that case please use to set the password to connect with. - /// /// The FirebirdSql username. /// A configured instance of . public FirebirdSqlBuilder WithUsername(string username) { - var builder = Merge(DockerResourceConfiguration, new(username: username)); - if (username.ToLower() != FirebirdSysdba) - { - builder = builder - .WithEnvironment("FIREBIRD_USER", username); - } - - return builder; + return Merge(DockerResourceConfiguration, new(username: username)) + .WithEnvironment("FIREBIRD_USER", FirebirdSysdba.Equals(username, StringComparison.OrdinalIgnoreCase) ? string.Empty : username); } /// /// Sets the FirebirdSql password. /// - /// - /// To authenticate with the configured user. If the user is 'sysdba' please use - /// /// The FirebirdSql password. /// A configured instance of . public FirebirdSqlBuilder WithPassword(string password) { return Merge(DockerResourceConfiguration, new(password: password)) - .WithEnvironment("FIREBIRD_PASSWORD", password); - } - - /// - /// Sets the FirebirdSql sysdba password. - /// - /// - /// To authenticate with the sysdba user. If the user is not 'sysdba' please use - /// - /// The FirebirdSql password. - /// A configured instance of . - public FirebirdSqlBuilder WithSysdbaPassword(string sysdbaPassword) - { - return Merge(DockerResourceConfiguration, new(sysdbaPassword: sysdbaPassword)) - .WithEnvironment("ISC_PASSWORD", sysdbaPassword); + .WithEnvironment("FIREBIRD_PASSWORD", password) + .WithEnvironment("ISC_PASSWORD", password); } /// @@ -116,7 +90,6 @@ protected override FirebirdSqlBuilder Init() .WithDatabase(DefaultDatabase) .WithUsername(DefaultUsername) .WithPassword(DefaultPassword) - .WithSysdbaPassword(DefaultSysdbaPassword) .WithResourceMapping(Encoding.UTF8.GetBytes(FirebirdSqlContainer.TestQueryString), "/home/firebird_check.sql"); /// diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs index 033d1aa81..874fbc11b 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs @@ -10,17 +10,14 @@ public class FirebirdSqlConfiguration : ContainerConfiguration /// The FirebirdSql database. /// The FirebirdSql username. /// The FirebirdSql password. - /// The FirebirdSql sysdba password. public FirebirdSqlConfiguration( string? database = null, string? username = null, - string? password = null, - string? sysdbaPassword = null) + string? password = null) { Database = database; Username = username; Password = password; - SysdbaPassword = sysdbaPassword; } /// @@ -64,7 +61,6 @@ public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlCo Database = BuildConfiguration.Combine(oldValue.Database, newValue.Database); Username = BuildConfiguration.Combine(oldValue.Username, newValue.Username); Password = BuildConfiguration.Combine(oldValue.Password, newValue.Password); - SysdbaPassword = BuildConfiguration.Combine(oldValue.SysdbaPassword, newValue.SysdbaPassword); } /// @@ -81,9 +77,4 @@ public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlCo /// Gets the FirebirdSql password. /// public string? Password { get; } - - /// - /// Gets the FirebirdSql sysdba password. - /// - public string? SysdbaPassword { get; } } diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs index fe2f7807c..13722c5da 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs @@ -15,7 +15,7 @@ public class FirebirdSqlContainer : DockerContainer, IDatabaseContainer /// The logger. public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logger) : base(configuration, logger) { - this._configuration = configuration; + _configuration = configuration; } private string GetDatabaseName() @@ -47,21 +47,10 @@ public string GetConnectionString() { var properties = new Dictionary(); properties.Add("User", _configuration.Username); - properties.Add("Password", _configuration.Username == FirebirdSqlBuilder.FirebirdSysdba - ? _configuration.SysdbaPassword - : _configuration.Password); + properties.Add("Password", _configuration.Password); properties.Add("Database", GetDatabaseName()); properties.Add("DataSource", $"{Hostname}"); properties.Add("Port", $"{GetMappedPublicPort(FirebirdSqlBuilder.FirebirdSqlPort)}"); - properties.Add("Dialect", "3"); - properties.Add("Charset", "utf8"); - properties.Add("Role", ""); - properties.Add("Connection lifetime", "15"); - properties.Add("Pooling", "true"); - properties.Add("MinPoolSize", "0"); - properties.Add("MaxPoolSize", "50"); - properties.Add("Packet Size", "8192"); - properties.Add("ServerType", "0"); return string.Join(";", properties.Select(p => $"{p.Key}={p.Value}")); } diff --git a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs index f020cbdd2..d4d041f2a 100644 --- a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs +++ b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs @@ -68,8 +68,8 @@ public class Firebird40 : FirebirdSqlContainerTests new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:v4.0").Build(); } -public class FirebirdDefault : FirebirdSqlContainerTests +public class FirebirdSysdba : FirebirdSqlContainerTests { protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().Build(); + new FirebirdSqlBuilder().WithUsername("sysdba").WithPassword("some-password").Build(); } From 11353ca8c986178dc890d13a51b6287db8903612 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:44:20 +0100 Subject: [PATCH 4/9] chore: Order projects; remove BOM --- Testcontainers.sln | 28 +++++++++---------- src/Testcontainers.FirebirdSql/.editorconfig | 1 + .../Testcontainers.FirebirdSql.csproj | 2 +- src/Testcontainers.FirebirdSql/Usings.cs | 4 +-- 4 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 src/Testcontainers.FirebirdSql/.editorconfig diff --git a/Testcontainers.sln b/Testcontainers.sln index afc8600f0..49143c3ac 100644 --- a/Testcontainers.sln +++ b/Testcontainers.sln @@ -41,6 +41,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.EventStoreDb EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FakeGcsServer", "src\Testcontainers.FakeGcsServer\Testcontainers.FakeGcsServer.csproj", "{FF86B509-2F9E-4269-ABC2-912B3339DE29}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql", "src\Testcontainers.FirebirdSql\Testcontainers.FirebirdSql.csproj", "{31BAF2C4-0608-4C0F-845A-14FE7C0A1670}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Firestore", "src\Testcontainers.Firestore\Testcontainers.Firestore.csproj", "{B3CC460D-0DFD-48A8-9502-54E9828B7B05}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.InfluxDb", "src\Testcontainers.InfluxDb\Testcontainers.InfluxDb.csproj", "{8F483B83-7BD4-4BD5-9F03-DFC26E1CE678}" @@ -125,6 +127,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.EventStoreDb EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FakeGcsServer.Tests", "tests\Testcontainers.FakeGcsServer.Tests\Testcontainers.FakeGcsServer.Tests.csproj", "{9F27AA1B-C25D-400C-BCB0-6B0BF1A1DCEA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql.Tests", "tests\Testcontainers.FirebirdSql.Tests\Testcontainers.FirebirdSql.Tests.csproj", "{E39095AC-9B34-4178-A486-04C902B6FD33}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Firestore.Tests", "tests\Testcontainers.Firestore.Tests\Testcontainers.Firestore.Tests.csproj", "{2F0D7CD6-7EA9-46FC-B8F2-25D55699525F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.InfluxDb.Tests", "tests\Testcontainers.InfluxDb.Tests\Testcontainers.InfluxDb.Tests.csproj", "{B45B0EF2-5852-4ED3-904A-8FC62A3253D7}" @@ -183,10 +187,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Tests", "tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.WebDriver.Tests", "tests\Testcontainers.WebDriver.Tests\Testcontainers.WebDriver.Tests.csproj", "{EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql", "src\Testcontainers.FirebirdSql\Testcontainers.FirebirdSql.csproj", "{31BAF2C4-0608-4C0F-845A-14FE7C0A1670}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.FirebirdSql.Tests", "tests\Testcontainers.FirebirdSql.Tests\Testcontainers.FirebirdSql.Tests.csproj", "{E39095AC-9B34-4178-A486-04C902B6FD33}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -252,6 +252,10 @@ Global {FF86B509-2F9E-4269-ABC2-912B3339DE29}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF86B509-2F9E-4269-ABC2-912B3339DE29}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF86B509-2F9E-4269-ABC2-912B3339DE29}.Release|Any CPU.Build.0 = Release|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.Build.0 = Release|Any CPU {B3CC460D-0DFD-48A8-9502-54E9828B7B05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B3CC460D-0DFD-48A8-9502-54E9828B7B05}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3CC460D-0DFD-48A8-9502-54E9828B7B05}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -420,6 +424,10 @@ Global {9F27AA1B-C25D-400C-BCB0-6B0BF1A1DCEA}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F27AA1B-C25D-400C-BCB0-6B0BF1A1DCEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F27AA1B-C25D-400C-BCB0-6B0BF1A1DCEA}.Release|Any CPU.Build.0 = Release|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.Build.0 = Release|Any CPU {2F0D7CD6-7EA9-46FC-B8F2-25D55699525F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F0D7CD6-7EA9-46FC-B8F2-25D55699525F}.Debug|Any CPU.Build.0 = Debug|Any CPU {2F0D7CD6-7EA9-46FC-B8F2-25D55699525F}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -536,14 +544,6 @@ Global {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Release|Any CPU.Build.0 = Release|Any CPU - {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31BAF2C4-0608-4C0F-845A-14FE7C0A1670}.Release|Any CPU.Build.0 = Release|Any CPU - {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E39095AC-9B34-4178-A486-04C902B6FD33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E39095AC-9B34-4178-A486-04C902B6FD33}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {5365F780-0E6C-41F0-B1B9-7DC34368F80C} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -560,6 +560,7 @@ Global {641DDEA5-B6E0-41E6-BA11-7A28C0913127} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {84D707E0-C9FA-4327-85DC-0AFEBEA73572} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {FF86B509-2F9E-4269-ABC2-912B3339DE29} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} + {31BAF2C4-0608-4C0F-845A-14FE7C0A1670} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {B3CC460D-0DFD-48A8-9502-54E9828B7B05} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {8F483B83-7BD4-4BD5-9F03-DFC26E1CE678} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {C5AF86A8-2F11-41B6-BB01-325AD9016B94} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -602,6 +603,7 @@ Global {DD5B3678-468F-4D73-AECE-705E3D66CD43} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {64F8E9B9-78FD-4E13-BDDF-0340E2D4E1D0} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {9F27AA1B-C25D-400C-BCB0-6B0BF1A1DCEA} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} + {E39095AC-9B34-4178-A486-04C902B6FD33} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {2F0D7CD6-7EA9-46FC-B8F2-25D55699525F} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {B45B0EF2-5852-4ED3-904A-8FC62A3253D7} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {BEFC4109-4511-4FBD-AC4F-3D3B388B8CAD} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} @@ -631,7 +633,5 @@ Global {1A1983E6-5297-435F-B467-E8E1F11277D6} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {27CDB869-A150-4593-958F-6F26E5391E7C} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} - {31BAF2C4-0608-4C0F-845A-14FE7C0A1670} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} - {E39095AC-9B34-4178-A486-04C902B6FD33} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} EndGlobalSection EndGlobal diff --git a/src/Testcontainers.FirebirdSql/.editorconfig b/src/Testcontainers.FirebirdSql/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/src/Testcontainers.FirebirdSql/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj index 4b662f072..84433f17d 100644 --- a/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj +++ b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1 latest diff --git a/src/Testcontainers.FirebirdSql/Usings.cs b/src/Testcontainers.FirebirdSql/Usings.cs index 709e0557c..a01abde62 100644 --- a/src/Testcontainers.FirebirdSql/Usings.cs +++ b/src/Testcontainers.FirebirdSql/Usings.cs @@ -1,4 +1,4 @@ -global using System; +global using System; global using System.Collections.Generic; global using System.IO; global using System.Linq; @@ -11,4 +11,4 @@ global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; +global using Microsoft.Extensions.Logging; \ No newline at end of file From 5ebb903206381e053c8066d7fae004be6b03a5b7 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:47:04 +0100 Subject: [PATCH 5/9] chore: Align csproj --- .../Testcontainers.FirebirdSql.csproj | 3 +-- .../Testcontainers.FirebirdSql.Tests.csproj | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj index 84433f17d..7048179d1 100644 --- a/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj +++ b/src/Testcontainers.FirebirdSql/Testcontainers.FirebirdSql.csproj @@ -2,7 +2,6 @@ netstandard2.0;netstandard2.1 latest - enable @@ -10,4 +9,4 @@ - + \ No newline at end of file diff --git a/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj b/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj index 115f9e8a6..39556943d 100644 --- a/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj +++ b/tests/Testcontainers.FirebirdSql.Tests/Testcontainers.FirebirdSql.Tests.csproj @@ -1,19 +1,18 @@ - net8.0 false false - + - + \ No newline at end of file From 391e59ecf0554e47600ba95897e8e6e53289d211 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:56:51 +0100 Subject: [PATCH 6/9] chore: Align with other TC modules --- .../FirebirdSqlBuilder.cs | 94 ++++++++++-------- .../FirebirdSqlConfiguration.cs | 16 ++-- .../FirebirdSqlContainer.cs | 52 ++++------ .../.editorconfig | 1 + .../FirebirdSqlContainerTest.cs | 95 +++++++++++++++++++ .../FirebirdSqlContainerTests.cs | 75 --------------- .../Usings.cs | 3 +- 7 files changed, 178 insertions(+), 158 deletions(-) create mode 100644 tests/Testcontainers.FirebirdSql.Tests/.editorconfig create mode 100644 tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs delete mode 100644 tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index 0350bde3d..c0c47774f 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -2,18 +2,22 @@ namespace Testcontainers.FirebirdSql; /// [PublicAPI] -public class FirebirdSqlBuilder : ContainerBuilder +public sealed class FirebirdSqlBuilder : ContainerBuilder { public const string FirebirdSqlImage = "jacobalberty/firebird:v4.0"; public const ushort FirebirdSqlPort = 3050; public const string DefaultDatabase = "test"; + public const string DefaultUsername = "test"; + public const string DefaultPassword = "test"; - public const string FirebirdSysdba = "sysdba"; + public const string DefaultSysdbaPassword = "masterkey"; + private const string TestQueryString = "SELECT 1 FROM RDB$DATABASE;"; + /// /// Initializes a new instance of the class. /// @@ -27,15 +31,26 @@ public FirebirdSqlBuilder() /// Initializes a new instance of the class. /// /// The Docker resource configuration. - public FirebirdSqlBuilder(FirebirdSqlConfiguration dockerResourceConfiguration) - : base(dockerResourceConfiguration) + public FirebirdSqlBuilder(FirebirdSqlConfiguration resourceConfiguration) + : base(resourceConfiguration) { - DockerResourceConfiguration = dockerResourceConfiguration; + DockerResourceConfiguration = resourceConfiguration; } /// protected override FirebirdSqlConfiguration DockerResourceConfiguration { get; } + /// + /// Sets the FirebirdSql database. + /// + /// The FirebirdSql database. + /// A configured instance of . + public FirebirdSqlBuilder WithDatabase(string database) + { + return Merge(DockerResourceConfiguration, new FirebirdSqlConfiguration(database: database)) + .WithEnvironment("FIREBIRD_DATABASE", database); + } + /// /// Sets the FirebirdSql username. /// @@ -43,8 +58,8 @@ public FirebirdSqlBuilder(FirebirdSqlConfiguration dockerResourceConfiguration) /// A configured instance of . public FirebirdSqlBuilder WithUsername(string username) { - return Merge(DockerResourceConfiguration, new(username: username)) - .WithEnvironment("FIREBIRD_USER", FirebirdSysdba.Equals(username, StringComparison.OrdinalIgnoreCase) ? string.Empty : username); + return Merge(DockerResourceConfiguration, new FirebirdSqlConfiguration(username: username)) + .WithEnvironment("FIREBIRD_USER", "sysdba".Equals(username, StringComparison.OrdinalIgnoreCase) ? string.Empty : username); } /// @@ -54,26 +69,16 @@ public FirebirdSqlBuilder WithUsername(string username) /// A configured instance of . public FirebirdSqlBuilder WithPassword(string password) { - return Merge(DockerResourceConfiguration, new(password: password)) + return Merge(DockerResourceConfiguration, new FirebirdSqlConfiguration(password: password)) .WithEnvironment("FIREBIRD_PASSWORD", password) .WithEnvironment("ISC_PASSWORD", password); } - /// - /// Sets the FirebirdSql database. - /// - /// The FirebirdSql database. - /// A configured instance of . - public FirebirdSqlBuilder WithDatabase(string database) - { - return Merge(DockerResourceConfiguration, new(database: database)) - .WithEnvironment("FIREBIRD_DATABASE", database); - } - /// public override FirebirdSqlContainer Build() { Validate(); + var compoundWaitStrategy = Wait.ForUnixContainer() .UntilContainerIsHealthy() .AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration)); @@ -84,13 +89,15 @@ public override FirebirdSqlContainer Build() /// protected override FirebirdSqlBuilder Init() - => base.Init() + { + return base.Init() .WithImage(FirebirdSqlImage) .WithPortBinding(FirebirdSqlPort, true) .WithDatabase(DefaultDatabase) .WithUsername(DefaultUsername) .WithPassword(DefaultPassword) - .WithResourceMapping(Encoding.UTF8.GetBytes(FirebirdSqlContainer.TestQueryString), "/home/firebird_check.sql"); + .WithResourceMapping(Encoding.UTF8.GetBytes(TestQueryString), "/home/firebird_check.sql"); + } /// protected override void Validate() @@ -104,40 +111,43 @@ protected override void Validate() /// protected override FirebirdSqlBuilder Clone(IResourceConfiguration resourceConfiguration) - => Merge(DockerResourceConfiguration, new(resourceConfiguration)); + { + return Merge(DockerResourceConfiguration, new FirebirdSqlConfiguration(resourceConfiguration)); + } /// protected override FirebirdSqlBuilder Clone(IContainerConfiguration resourceConfiguration) - => Merge(DockerResourceConfiguration, new(resourceConfiguration)); + { + return Merge(DockerResourceConfiguration, new FirebirdSqlConfiguration(resourceConfiguration)); + } /// protected override FirebirdSqlBuilder Merge(FirebirdSqlConfiguration oldValue, FirebirdSqlConfiguration newValue) - => new(new(oldValue, newValue)); + { + return new FirebirdSqlBuilder(new FirebirdSqlConfiguration(oldValue, newValue)); + } /// - /// - /// Uses the isql Firebird Interactive SQL Utility to detect the readiness of the FirebirdSql container: - /// https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/isql/firebird-isql.html. - /// - private sealed class WaitUntil(FirebirdSqlConfiguration configuration) : IWaitUntil + private sealed class WaitUntil : IWaitUntil { - private readonly string[] checkDatabaseCommand = + private readonly IList _command; + + /// + /// Initializes a new instance of the class. + /// + /// The container configuration. + public WaitUntil(FirebirdSqlConfiguration configuration) { - "/usr/local/firebird/bin/isql", - "-i", - "/home/firebird_check.sql", - $"localhost:{configuration.Database}", - "-user", - configuration.Username, - "-pass", - configuration.Password, - }; + _command = new List { "/usr/local/firebird/bin/isql", "-i", "/home/firebird_check.sql", $"localhost:{configuration.Database}", "-user", configuration.Username, "-pass", configuration.Password }; + } + /// public async Task UntilAsync(IContainer container) { - var executionResult = await container.ExecAsync(checkDatabaseCommand) + var execResult = await container.ExecAsync(_command) .ConfigureAwait(false); - return 0L.Equals(executionResult.ExitCode); + + return 0L.Equals(execResult.ExitCode); } } -} +} \ No newline at end of file diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs index 874fbc11b..7c271c8bd 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs @@ -2,7 +2,7 @@ namespace Testcontainers.FirebirdSql; /// [PublicAPI] -public class FirebirdSqlConfiguration : ContainerConfiguration +public sealed class FirebirdSqlConfiguration : ContainerConfiguration { /// /// Initializes a new instance of the class. @@ -11,9 +11,9 @@ public class FirebirdSqlConfiguration : ContainerConfiguration /// The FirebirdSql username. /// The FirebirdSql password. public FirebirdSqlConfiguration( - string? database = null, - string? username = null, - string? password = null) + string database = null, + string username = null, + string password = null) { Database = database; Username = username; @@ -66,15 +66,15 @@ public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlCo /// /// Gets the FirebirdSql database. /// - public string? Database { get; } + public string Database { get; } /// /// Gets the FirebirdSql username. /// - public string? Username { get; } + public string Username { get; } /// /// Gets the FirebirdSql password. /// - public string? Password { get; } -} + public string Password { get; } +} \ No newline at end of file diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs index 13722c5da..5aa4d908c 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs @@ -2,10 +2,8 @@ namespace Testcontainers.FirebirdSql; /// [PublicAPI] -public class FirebirdSqlContainer : DockerContainer, IDatabaseContainer +public sealed class FirebirdSqlContainer : DockerContainer, IDatabaseContainer { - public const string TestQueryString = "select 1 from RDB$DATABASE;"; - private readonly FirebirdSqlConfiguration _configuration; /// @@ -13,45 +11,36 @@ public class FirebirdSqlContainer : DockerContainer, IDatabaseContainer /// /// The container configuration. /// The logger. - public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logger) : base(configuration, logger) + public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logger) + : base(configuration, logger) { _configuration = configuration; } - private string GetDatabaseName() + /// + /// Gets the FirebirdSql connection string. + /// + /// The FirebirdSql connection string. + public string GetConnectionString() { - if (State == TestcontainersStates.Running && IsFirebird2_5Image) + string database; + + if (_configuration.Image.Tag.StartsWith("2.5") || _configuration.Image.Tag.StartsWith("v2.5")) { - var dbPath = _configuration.Environments.TryGetValue("DBPATH", out var path) - ? path - : "/firebird/data"; - return $"{dbPath}/{_configuration.Database}"; + database = string.Join("/", [_configuration.Environments.TryGetValue("DBPATH", out var dbPath) && !string.IsNullOrEmpty(dbPath) ? dbPath : "/firebird/data", _configuration.Database]); } else { - return _configuration.Database; + database = _configuration.Database; } - } - /// - /// Indicates whether the used image is an EOL v2.5 version of firebird - /// - /// True if the image is a v2.5 version, false otherwise - public bool IsFirebird2_5Image => Image.Tag.StartsWith("2.5") || Image.Tag.StartsWith("v2.5"); - - /// - /// Gets the FirebirdSql connection string. - /// - /// The FirebirdSql connection string. - public string GetConnectionString() - { var properties = new Dictionary(); + properties.Add("DataSource", Hostname); + properties.Add("Port", GetMappedPublicPort(FirebirdSqlBuilder.FirebirdSqlPort).ToString()); + properties.Add("Database", database); properties.Add("User", _configuration.Username); properties.Add("Password", _configuration.Password); - properties.Add("Database", GetDatabaseName()); - properties.Add("DataSource", $"{Hostname}"); - properties.Add("Port", $"{GetMappedPublicPort(FirebirdSqlBuilder.FirebirdSqlPort)}"); - return string.Join(";", properties.Select(p => $"{p.Key}={p.Value}")); + return string.Join(";", properties.Select(property => string.Join("=", property.Key, property.Value))); } /// @@ -62,13 +51,12 @@ public string GetConnectionString() /// Task that completes when the SQL script has been executed. public async Task ExecScriptAsync(string scriptContent, CancellationToken ct = default) { - var scriptFilePath = - string.Join("/", string.Empty, "tmp", Guid.NewGuid().ToString("D"), Path.GetRandomFileName()); + var scriptFilePath = string.Join("/", string.Empty, "tmp", Guid.NewGuid().ToString("D"), Path.GetRandomFileName()); await CopyAsync(Encoding.Default.GetBytes(scriptContent), scriptFilePath, Unix.FileMode644, ct) .ConfigureAwait(false); - return await ExecAsync(new[] { "/usr/local/firebird/bin/isql", "-user", _configuration.Username, "-pass", _configuration.Password, "-i", scriptFilePath, $"localhost:{_configuration.Database}" }, ct) + return await ExecAsync(new[] { "/usr/local/firebird/bin/isql", "-i", scriptFilePath, $"localhost:{_configuration.Database}", "-user", _configuration.Username, "-pass", _configuration.Password }, ct) .ConfigureAwait(false); } -} +} \ No newline at end of file diff --git a/tests/Testcontainers.FirebirdSql.Tests/.editorconfig b/tests/Testcontainers.FirebirdSql.Tests/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/tests/Testcontainers.FirebirdSql.Tests/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs new file mode 100644 index 000000000..06282d8da --- /dev/null +++ b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs @@ -0,0 +1,95 @@ +namespace Testcontainers.FirebirdSql; + +public abstract class FirebirdSqlContainerTest : IAsyncLifetime +{ + private readonly FirebirdSqlContainer _firebirdSqlContainer; + + private FirebirdSqlContainerTest(FirebirdSqlContainer firebirdSqlContainer) + { + _firebirdSqlContainer = firebirdSqlContainer; + } + + public Task InitializeAsync() + { + return _firebirdSqlContainer.StartAsync(); + } + + public Task DisposeAsync() + { + return _firebirdSqlContainer.DisposeAsync().AsTask(); + } + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public void ConnectionStateReturnsOpen() + { + // Given + using DbConnection connection = new FbConnection(_firebirdSqlContainer.GetConnectionString()); + + // When + connection.Open(); + + // Then + Assert.Equal(ConnectionState.Open, connection.State); + } + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public async Task ExecScriptReturnsSuccessful() + { + // Given + const string scriptContent = "SELECT 1 FROM RDB$DATABASE;"; + + // When + var execResult = await _firebirdSqlContainer.ExecScriptAsync(scriptContent) + .ConfigureAwait(false); + + // When + Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr); + } + + [UsedImplicitly] + public sealed class FirebirdSql25Sc : FirebirdSqlContainerTest + { + public FirebirdSql25Sc() + : base(new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-sc").Build()) + { + } + } + + [UsedImplicitly] + public sealed class FirebirdSql25Ss : FirebirdSqlContainerTest + { + public FirebirdSql25Ss() + : base(new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-ss").Build()) + { + } + } + + [UsedImplicitly] + public sealed class FirebirdSql30 : FirebirdSqlContainerTest + { + public FirebirdSql30() + : base(new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:v3.0").Build()) + { + } + } + + [UsedImplicitly] + public sealed class FirebirdSql40 : FirebirdSqlContainerTest + { + public FirebirdSql40() + : base(new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:v4.0").Build()) + { + } + } + + [UsedImplicitly] + public sealed class FirebirdSqlSysdba : FirebirdSqlContainerTest + { + public FirebirdSqlSysdba() + : base(new FirebirdSqlBuilder().WithUsername("sysdba").WithPassword("some-password").Build()) + { + } + } +} \ No newline at end of file diff --git a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs deleted file mode 100644 index d4d041f2a..000000000 --- a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace Testcontainers.FirebirdSql.Tests; - -public abstract class FirebirdSqlContainerTests : IAsyncLifetime -{ - protected abstract FirebirdSqlContainer FirebirdSqlContainer { get; } - - public Task InitializeAsync() - { - return FirebirdSqlContainer.StartAsync(); - } - - public Task DisposeAsync() - { - return FirebirdSqlContainer.DisposeAsync().AsTask(); - } - - [Fact] - [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] - public void ConnectionStateReturnsOpen() - { - // Given - using DbConnection connection = new FbConnection(FirebirdSqlContainer.GetConnectionString()); - - // When - connection.Open(); - - // Then - Assert.Equal(ConnectionState.Open, connection.State); - } - - [Fact] - [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] - public async Task ExecScriptReturnsSuccessful() - { - // Given - const string scriptContent = FirebirdSqlContainer.TestQueryString; - - // When - var execResult = await FirebirdSqlContainer.ExecScriptAsync(scriptContent) - .ConfigureAwait(false); - - // When - Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr); - } -} - -public class Firebird25SC : FirebirdSqlContainerTests -{ - protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-sc").Build(); -} - -public class Firebird25SS : FirebirdSqlContainerTests -{ - protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:2.5-ss").Build(); -} - -public class Firebird30 : FirebirdSqlContainerTests -{ - protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:3.0").Build(); -} - -public class Firebird40 : FirebirdSqlContainerTests -{ - protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().WithImage("jacobalberty/firebird:v4.0").Build(); -} - -public class FirebirdSysdba : FirebirdSqlContainerTests -{ - protected override FirebirdSqlContainer FirebirdSqlContainer { get; } = - new FirebirdSqlBuilder().WithUsername("sysdba").WithPassword("some-password").Build(); -} diff --git a/tests/Testcontainers.FirebirdSql.Tests/Usings.cs b/tests/Testcontainers.FirebirdSql.Tests/Usings.cs index b58783ce4..28861332f 100644 --- a/tests/Testcontainers.FirebirdSql.Tests/Usings.cs +++ b/tests/Testcontainers.FirebirdSql.Tests/Usings.cs @@ -3,4 +3,5 @@ global using System.Threading.Tasks; global using DotNet.Testcontainers.Commons; global using FirebirdSql.Data.FirebirdClient; -global using Xunit; +global using JetBrains.Annotations; +global using Xunit; \ No newline at end of file From bed8e0614c95562f10b28645ae866d06e891879f Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:28:03 +0100 Subject: [PATCH 7/9] chore: Create database name in configuration class --- .../FirebirdSqlBuilder.cs | 15 +++++++-------- .../FirebirdSqlConfiguration.cs | 8 +++++--- .../FirebirdSqlContainer.cs | 15 ++------------- .../FirebirdSqlContainerTest.cs | 1 + 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index c0c47774f..749f09882 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -79,12 +79,10 @@ public override FirebirdSqlContainer Build() { Validate(); - var compoundWaitStrategy = Wait.ForUnixContainer() - .UntilContainerIsHealthy() - .AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration)); - return new FirebirdSqlContainer( - WithWaitStrategy(compoundWaitStrategy).DockerResourceConfiguration, - TestcontainersSettings.Logger); + // By default, the base builder waits until the container is running. However, for FirebirdSql, a more advanced waiting strategy is necessary that requires access to the configured database, username and password. + // If the user does not provide a custom waiting strategy, append the default MySql waiting strategy. + // var firebirdSqlBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); + return new FirebirdSqlContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); } /// @@ -96,7 +94,8 @@ protected override FirebirdSqlBuilder Init() .WithDatabase(DefaultDatabase) .WithUsername(DefaultUsername) .WithPassword(DefaultPassword) - .WithResourceMapping(Encoding.UTF8.GetBytes(TestQueryString), "/home/firebird_check.sql"); + .WithResourceMapping(Encoding.UTF8.GetBytes(TestQueryString), "/home/firebird_check.sql") + .WithWaitStrategy(Wait.ForUnixContainer().UntilContainerIsHealthy()); } /// @@ -138,7 +137,7 @@ private sealed class WaitUntil : IWaitUntil /// The container configuration. public WaitUntil(FirebirdSqlConfiguration configuration) { - _command = new List { "/usr/local/firebird/bin/isql", "-i", "/home/firebird_check.sql", $"localhost:{configuration.Database}", "-user", configuration.Username, "-pass", configuration.Password }; + _command = new List { "/usr/local/firebird/bin/isql", "-i", "/home/firebird_check.sql", "-user", configuration.Username, "-pass", configuration.Password, configuration.Database }; } /// diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs index 7c271c8bd..26b799d3f 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlConfiguration.cs @@ -4,6 +4,8 @@ namespace Testcontainers.FirebirdSql; [PublicAPI] public sealed class FirebirdSqlConfiguration : ContainerConfiguration { + private readonly string _database; + /// /// Initializes a new instance of the class. /// @@ -15,7 +17,7 @@ public FirebirdSqlConfiguration( string username = null, string password = null) { - Database = database; + _database = database; Username = username; Password = password; } @@ -58,7 +60,7 @@ public FirebirdSqlConfiguration(FirebirdSqlConfiguration resourceConfiguration) public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlConfiguration newValue) : base(oldValue, newValue) { - Database = BuildConfiguration.Combine(oldValue.Database, newValue.Database); + _database = BuildConfiguration.Combine(oldValue._database, newValue._database); Username = BuildConfiguration.Combine(oldValue.Username, newValue.Username); Password = BuildConfiguration.Combine(oldValue.Password, newValue.Password); } @@ -66,7 +68,7 @@ public FirebirdSqlConfiguration(FirebirdSqlConfiguration oldValue, FirebirdSqlCo /// /// Gets the FirebirdSql database. /// - public string Database { get; } + public string Database => Image.Tag.StartsWith("2.5") || Image.Tag.StartsWith("v2.5") ? string.Join("/", "/firebird/data", _database) : _database; /// /// Gets the FirebirdSql username. diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs index 5aa4d908c..f12568949 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs @@ -23,21 +23,10 @@ public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logg /// The FirebirdSql connection string. public string GetConnectionString() { - string database; - - if (_configuration.Image.Tag.StartsWith("2.5") || _configuration.Image.Tag.StartsWith("v2.5")) - { - database = string.Join("/", [_configuration.Environments.TryGetValue("DBPATH", out var dbPath) && !string.IsNullOrEmpty(dbPath) ? dbPath : "/firebird/data", _configuration.Database]); - } - else - { - database = _configuration.Database; - } - var properties = new Dictionary(); properties.Add("DataSource", Hostname); properties.Add("Port", GetMappedPublicPort(FirebirdSqlBuilder.FirebirdSqlPort).ToString()); - properties.Add("Database", database); + properties.Add("Database", _configuration.Database); properties.Add("User", _configuration.Username); properties.Add("Password", _configuration.Password); return string.Join(";", properties.Select(property => string.Join("=", property.Key, property.Value))); @@ -56,7 +45,7 @@ public async Task ExecScriptAsync(string scriptContent, Cancellation await CopyAsync(Encoding.Default.GetBytes(scriptContent), scriptFilePath, Unix.FileMode644, ct) .ConfigureAwait(false); - return await ExecAsync(new[] { "/usr/local/firebird/bin/isql", "-i", scriptFilePath, $"localhost:{_configuration.Database}", "-user", _configuration.Username, "-pass", _configuration.Password }, ct) + return await ExecAsync(new[] { "/usr/local/firebird/bin/isql", "-i", scriptFilePath, "-user", _configuration.Username, "-pass", _configuration.Password, _configuration.Database }, ct) .ConfigureAwait(false); } } \ No newline at end of file diff --git a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs index 06282d8da..1537a6d8f 100644 --- a/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs +++ b/tests/Testcontainers.FirebirdSql.Tests/FirebirdSqlContainerTest.cs @@ -46,6 +46,7 @@ public async Task ExecScriptReturnsSuccessful() // When Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr); + Assert.Empty(execResult.Stderr); } [UsedImplicitly] From 70d150dbd35d20a232a0ff08bd3ab60fa9b70734 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Tue, 2 Jan 2024 16:05:07 +0100 Subject: [PATCH 8/9] chore: Remove obsolete wait strategy --- .../FirebirdSqlBuilder.cs | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index 749f09882..1e677f47f 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -78,10 +78,6 @@ public FirebirdSqlBuilder WithPassword(string password) public override FirebirdSqlContainer Build() { Validate(); - - // By default, the base builder waits until the container is running. However, for FirebirdSql, a more advanced waiting strategy is necessary that requires access to the configured database, username and password. - // If the user does not provide a custom waiting strategy, append the default MySql waiting strategy. - // var firebirdSqlBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); return new FirebirdSqlContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); } @@ -125,28 +121,4 @@ protected override FirebirdSqlBuilder Merge(FirebirdSqlConfiguration oldValue, F { return new FirebirdSqlBuilder(new FirebirdSqlConfiguration(oldValue, newValue)); } - - /// - private sealed class WaitUntil : IWaitUntil - { - private readonly IList _command; - - /// - /// Initializes a new instance of the class. - /// - /// The container configuration. - public WaitUntil(FirebirdSqlConfiguration configuration) - { - _command = new List { "/usr/local/firebird/bin/isql", "-i", "/home/firebird_check.sql", "-user", configuration.Username, "-pass", configuration.Password, configuration.Database }; - } - - /// - public async Task UntilAsync(IContainer container) - { - var execResult = await container.ExecAsync(_command) - .ConfigureAwait(false); - - return 0L.Equals(execResult.ExitCode); - } - } } \ No newline at end of file From 6990cb388d3b00e7f44135572a32a4ee599823cd Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Tue, 2 Jan 2024 16:10:23 +0100 Subject: [PATCH 9/9] chore: Use default encoding --- src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index 1e677f47f..19b957eba 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -90,7 +90,7 @@ protected override FirebirdSqlBuilder Init() .WithDatabase(DefaultDatabase) .WithUsername(DefaultUsername) .WithPassword(DefaultPassword) - .WithResourceMapping(Encoding.UTF8.GetBytes(TestQueryString), "/home/firebird_check.sql") + .WithResourceMapping(Encoding.Default.GetBytes(TestQueryString), "/home/firebird_check.sql") .WithWaitStrategy(Wait.ForUnixContainer().UntilContainerIsHealthy()); }