From be564b5866a15e17c98a1b1e618282d034358195 Mon Sep 17 00:00:00 2001 From: Gunnar Liljas Date: Wed, 29 Oct 2025 15:26:40 +0100 Subject: [PATCH 1/2] Enable use of Testcontainers --- src/NHibernate.Test/NHibernate.Test.csproj | 7 ++ .../TestConfigurationHelper.cs | 8 +- src/NHibernate.Test/TestContainerSetup.cs | 76 +++++++++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/NHibernate.Test/TestContainerSetup.cs diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index 847687acb95..ff728f12045 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -69,6 +69,13 @@ + + + + + + + diff --git a/src/NHibernate.Test/TestConfigurationHelper.cs b/src/NHibernate.Test/TestConfigurationHelper.cs index 89299bbd825..457c41e10a4 100644 --- a/src/NHibernate.Test/TestConfigurationHelper.cs +++ b/src/NHibernate.Test/TestConfigurationHelper.cs @@ -47,6 +47,12 @@ public static Configuration GetDefaultConfiguration() Configuration result = new Configuration(); if (hibernateConfigFile != null) result.Configure(hibernateConfigFile); + + var connectionString = result.GetProperty(Cfg.Environment.ConnectionString); + if (connectionString?.StartsWith("testcontainers=") == true) + { + result.SetProperty(Cfg.Environment.ConnectionString, TestContainerSetup.GetConnectionString(connectionString)); + } return result; } @@ -71,4 +77,4 @@ private static string FindCurrentTestConfigurationFile(string filename) return null; } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/TestContainerSetup.cs b/src/NHibernate.Test/TestContainerSetup.cs new file mode 100644 index 00000000000..08211aad9a9 --- /dev/null +++ b/src/NHibernate.Test/TestContainerSetup.cs @@ -0,0 +1,76 @@ +namespace NHibernate.Test +{ + using System; + using System.Threading.Tasks; + using DotNet.Testcontainers.Containers; + using NUnit.Framework; + using Testcontainers.Db2; + using Testcontainers.FirebirdSql; + using Testcontainers.MariaDb; + using Testcontainers.MsSql; + using Testcontainers.MySql; + using Testcontainers.Oracle; + using Testcontainers.PostgreSql; + + [SetUpFixture] + public class TestContainerSetup + { + private static IDatabaseContainer _container; + private static readonly object _lock = new object(); + + internal static string GetConnectionString(string connectionString) + { + var parts = connectionString.Split('='); + if (parts.Length != 2 || parts[0] != "testcontainers") + { + throw new System.ArgumentException("Invalid testcontainers connection string format. Expected format: testcontainers=DbType"); + } + // For now, only one container is supported. In the future, we can extend this to support multiple containers. + if (_container == null) + { + lock (_lock) + { + if (_container == null) + { + var container = GetContainer(parts[1]); + Task.Run(() => container.StartAsync()).GetAwaiter().GetResult(); + _container = container; + } + } + } + return _container.GetConnectionString(); + } + + private static IDatabaseContainer GetContainer(string dbType) + { + switch (dbType.ToLower()) + { + case "db2": + return new Db2Builder().Build(); + case "firebirdsql": + return new FirebirdSqlBuilder().Build(); + case "mariadb": + return new MariaDbBuilder().Build(); + case "mssql": + return new MsSqlBuilder().Build(); + case "mysql": + return new MySqlBuilder().Build(); + case "oracle": + return new OracleBuilder().Build(); + case "postgresql": + return new PostgreSqlBuilder().Build(); + default: + throw new NotSupportedException("Database type not supported: " + dbType); + } + } + + [OneTimeTearDown] + public async Task TearDown() + { + if (_container != null) + { + await _container.DisposeAsync(); + } + } + } +} From 84b917798d3013c2c58cb4ef8efb04da949bc0bd Mon Sep 17 00:00:00 2001 From: Gunnar Liljas Date: Sun, 2 Nov 2025 21:18:05 +0100 Subject: [PATCH 2/2] Update src/NHibernate.Test/TestContainerSetup.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> --- src/NHibernate.Test/TestContainerSetup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate.Test/TestContainerSetup.cs b/src/NHibernate.Test/TestContainerSetup.cs index 08211aad9a9..0d9ac9888ab 100644 --- a/src/NHibernate.Test/TestContainerSetup.cs +++ b/src/NHibernate.Test/TestContainerSetup.cs @@ -15,7 +15,7 @@ namespace NHibernate.Test [SetUpFixture] public class TestContainerSetup { - private static IDatabaseContainer _container; + private static volatile IDatabaseContainer _container; private static readonly object _lock = new object(); internal static string GetConnectionString(string connectionString)