diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 80f7cbee3..496cd9f21 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -48,6 +48,7 @@ jobs: { name: "Testcontainers.CosmosDb", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.Couchbase", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.CouchDb", runs-on: "ubuntu-22.04" }, + { name: "Testcontainers.Db2", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.DynamoDb", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.Elasticsearch", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.EventStoreDb", runs-on: "ubuntu-22.04" }, diff --git a/Directory.Packages.props b/Directory.Packages.props index cae45c862..8e9a696b3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -41,6 +41,8 @@ + + diff --git a/Testcontainers.sln b/Testcontainers.sln index 4afa799e9..06e1381fc 100644 --- a/Testcontainers.sln +++ b/Testcontainers.sln @@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Couchbase", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.CouchDb", "src\Testcontainers.CouchDb\Testcontainers.CouchDb.csproj", "{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Db2", "src\Testcontainers.Db2\Testcontainers.Db2.csproj", "{ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.DynamoDb", "src\Testcontainers.DynamoDb\Testcontainers.DynamoDb.csproj", "{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Elasticsearch", "src\Testcontainers.Elasticsearch\Testcontainers.Elasticsearch.csproj", "{641DDEA5-B6E0-41E6-BA11-7A28C0913127}" @@ -135,6 +137,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.CouchDb.Test EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Databases.Tests", "tests\Testcontainers.Databases.Tests\Testcontainers.Databases.Tests.csproj", "{DA54916E-1128-4200-B6AE-9F5BF02D832D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Db2.Tests", "tests\Testcontainers.Db2.Tests\Testcontainers.Db2.Tests.csproj", "{AF9853AB-86E7-49DE-8DF8-454838E90D6F}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.DynamoDb.Tests", "tests\Testcontainers.DynamoDb.Tests\Testcontainers.DynamoDb.Tests.csproj", "{101515E6-74C1-40F9-85C8-871F742A378D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Elasticsearch.Tests", "tests\Testcontainers.Elasticsearch.Tests\Testcontainers.Elasticsearch.Tests.csproj", "{DD5B3678-468F-4D73-AECE-705E3D66CD43}" @@ -266,6 +270,10 @@ Global {DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Debug|Any CPU.Build.0 = Debug|Any CPU {DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Release|Any CPU.Build.0 = Release|Any CPU + {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Release|Any CPU.Build.0 = Release|Any CPU {2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -466,6 +474,10 @@ Global {DA54916E-1128-4200-B6AE-9F5BF02D832D}.Debug|Any CPU.Build.0 = Debug|Any CPU {DA54916E-1128-4200-B6AE-9F5BF02D832D}.Release|Any CPU.ActiveCfg = Release|Any CPU {DA54916E-1128-4200-B6AE-9F5BF02D832D}.Release|Any CPU.Build.0 = Release|Any CPU + {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Release|Any CPU.Build.0 = Release|Any CPU {101515E6-74C1-40F9-85C8-871F742A378D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {101515E6-74C1-40F9-85C8-871F742A378D}.Debug|Any CPU.Build.0 = Debug|Any CPU {101515E6-74C1-40F9-85C8-871F742A378D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -635,6 +647,7 @@ Global {A724806F-8C94-4438-8011-04A9A1575318} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {58E94721-2681-4D82-8D94-0B2F9DB0D575} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} + {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {641DDEA5-B6E0-41E6-BA11-7A28C0913127} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {84D707E0-C9FA-4327-85DC-0AFEBEA73572} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -685,6 +698,7 @@ Global {809322BA-D690-4F2B-B884-23F895663963} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {E4520FB1-4466-4DCA-AD08-4075102C68D3} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {DA54916E-1128-4200-B6AE-9F5BF02D832D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} + {AF9853AB-86E7-49DE-8DF8-454838E90D6F} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {101515E6-74C1-40F9-85C8-871F742A378D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {DD5B3678-468F-4D73-AECE-705E3D66CD43} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {64F8E9B9-78FD-4E13-BDDF-0340E2D4E1D0} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} diff --git a/docs/modules/db2.md b/docs/modules/db2.md new file mode 100644 index 000000000..8df65e230 --- /dev/null +++ b/docs/modules/db2.md @@ -0,0 +1,31 @@ +# Db2 + +[Db2](https://www.ibm.com/db2) is a relational database engine developed by IBM. + +Add the following dependency to your project file: + +```shell title="NuGet" +dotnet add package Testcontainers.Db2 +``` + +!!! warning + + The Linux client dependency, [Net.IBM.Data.Db2-lnx](https://www.nuget.org/packages/Net.IBM.Data.Db2-lnx), requires additional configurations. We use the [Testcontainers.Db2.Tests.targets](https://github.com/testcontainers/testcontainers-dotnet/blob/develop/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets) file to configure the environment variables: `LD_LIBRARY_PATH`, `PATH`, `DB2_CLI_DRIVER_INSTALL_PATH`, at runtime. + +You can start an Db2 container instance from any .NET application. This example uses xUnit.net's `IAsyncLifetime` interface to manage the lifecycle of the container. The container is started in the `InitializeAsync` method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the `DisposeAsync` method. + +=== "Usage Example" + ```csharp + --8<-- "tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs:UseDb2Container" + ``` + +The test example uses the following NuGet dependencies: + +=== "Package References" + ```xml + --8<-- "tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj:PackageReferences" + ``` + +To execute the tests, use the command `dotnet test` from a terminal. + +--8<-- "docs/modules/_call_out_test_projects.txt" \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index bf65d57f9..f0c491d57 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -47,6 +47,7 @@ nav: - examples/aspnet.md - Modules: - modules/index.md + - modules/db2.md - modules/elasticsearch.md - modules/mongodb.md - modules/mssql.md diff --git a/src/Testcontainers.Db2/.editorconfig b/src/Testcontainers.Db2/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/src/Testcontainers.Db2/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/src/Testcontainers.Db2/Db2Builder.cs b/src/Testcontainers.Db2/Db2Builder.cs new file mode 100644 index 000000000..3f1b9ccf1 --- /dev/null +++ b/src/Testcontainers.Db2/Db2Builder.cs @@ -0,0 +1,149 @@ +namespace Testcontainers.Db2; + +/// +[PublicAPI] +public sealed class Db2Builder : ContainerBuilder +{ + public const string Db2Image = "icr.io/db2_community/db2:12.1.0.0"; + + public const ushort Db2Port = 50000; + + public const string DefaultDatabase = "test"; + + public const string DefaultUsername = "db2inst1"; + + public const string DefaultPassword = "db2inst1"; + + private const string AcceptLicenseAgreementEnvVar = "LICENSE"; + + private const string AcceptLicenseAgreement = "accept"; + + private const string DeclineLicenseAgreement = "decline"; + + /// + /// Initializes a new instance of the class. + /// + public Db2Builder() + : this(new Db2Configuration()) + { + DockerResourceConfiguration = Init().DockerResourceConfiguration; + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + private Db2Builder(Db2Configuration resourceConfiguration) + : base(resourceConfiguration) + { + DockerResourceConfiguration = resourceConfiguration; + } + + /// + protected override Db2Configuration DockerResourceConfiguration { get; } + + /// + /// Accepts the license agreement. + /// + /// + /// When is set to true, the Db2 license is accepted. + /// + /// A boolean value indicating whether the Db2 license agreement is accepted. + /// A configured instance of . + public Db2Builder WithAcceptLicenseAgreement(bool acceptLicenseAgreement) + { + var licenseAgreement = acceptLicenseAgreement ? AcceptLicenseAgreement : DeclineLicenseAgreement; + return WithEnvironment(AcceptLicenseAgreementEnvVar, licenseAgreement); + } + + /// + /// Sets the Db2 database name. + /// + /// The Db2 database. + /// A configured instance of . + public Db2Builder WithDatabase(string database) + { + return Merge(DockerResourceConfiguration, new Db2Configuration(database: database)) + .WithEnvironment("DBNAME", database); + } + + /// + /// Sets the Db2 username. + /// + /// The Db2 username. + /// A configured instance of . + public Db2Builder WithUsername(string username) + { + return Merge(DockerResourceConfiguration, new Db2Configuration(username: username)) + .WithEnvironment("DB2INSTANCE", username) + .WithTmpfsMount(string.Join("/", string.Empty, "home", username, "data")); + } + + /// + /// Sets the Db2 password. + /// + /// The Db2 password. + /// A configured instance of . + public Db2Builder WithPassword(string password) + { + return Merge(DockerResourceConfiguration, new Db2Configuration(password: password)) + .WithEnvironment("DB2INST1_PASSWORD", password); + } + + /// + public override Db2Container Build() + { + Validate(); + return new Db2Container(DockerResourceConfiguration); + } + + /// + protected override Db2Builder Init() => base.Init() + .WithImage(Db2Image) + .WithPortBinding(Db2Port, true) + .WithDatabase(DefaultDatabase) + .WithUsername(DefaultUsername) + .WithPassword(DefaultPassword) + .WithPrivileged(true) + .WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("Setup has completed.")); + + /// + protected override void Validate() + { + const string message = "The image '{0}' requires you to accept a license agreement."; + + base.Validate(); + + Predicate licenseAgreementNotAccepted = value => + !value.Environments.TryGetValue(AcceptLicenseAgreementEnvVar, out var licenseAgreementValue) || !AcceptLicenseAgreement.Equals(licenseAgreementValue, StringComparison.Ordinal); + + _ = Guard.Argument(DockerResourceConfiguration, nameof(DockerResourceConfiguration.Image)) + .ThrowIf(argument => licenseAgreementNotAccepted(argument.Value), argument => throw new ArgumentException(string.Format(message, DockerResourceConfiguration.Image.FullName), argument.Name)); + + _ = Guard.Argument(DockerResourceConfiguration.Username, nameof(DockerResourceConfiguration.Username)) + .NotNull() + .NotEmpty(); + + _ = Guard.Argument(DockerResourceConfiguration.Password, nameof(DockerResourceConfiguration.Password)) + .NotNull() + .NotEmpty(); + } + + /// + protected override Db2Builder Clone(IResourceConfiguration resourceConfiguration) + { + return Merge(DockerResourceConfiguration, new Db2Configuration(resourceConfiguration)); + } + + /// + protected override Db2Builder Clone(IContainerConfiguration resourceConfiguration) + { + return Merge(DockerResourceConfiguration, new Db2Configuration(resourceConfiguration)); + } + + /// + protected override Db2Builder Merge(Db2Configuration oldValue, Db2Configuration newValue) + { + return new Db2Builder(new Db2Configuration(oldValue, newValue)); + } +} \ No newline at end of file diff --git a/src/Testcontainers.Db2/Db2Configuration.cs b/src/Testcontainers.Db2/Db2Configuration.cs new file mode 100644 index 000000000..97208985b --- /dev/null +++ b/src/Testcontainers.Db2/Db2Configuration.cs @@ -0,0 +1,80 @@ +namespace Testcontainers.Db2; + +/// +[PublicAPI] +public sealed class Db2Configuration : ContainerConfiguration +{ + /// + /// Initializes a new instance of the class. + /// + /// The Db2 database. + /// The Db2 username. + /// The Db2 password. + public Db2Configuration( + string database = null, + string username = null, + string password = null) + { + Database = database; + Username = username; + Password = password; + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public Db2Configuration(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 Db2Configuration(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 Db2Configuration(Db2Configuration resourceConfiguration) + : this(new Db2Configuration(), 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 Db2Configuration(Db2Configuration oldValue, Db2Configuration 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); + } + + /// + /// Gets the Db2 database. + /// + public string Database { get; } + + /// + /// Gets the Db2 username. + /// + public string Username { get; } + + /// + /// Gets the Db2 password. + /// + public string Password { get; } +} \ No newline at end of file diff --git a/src/Testcontainers.Db2/Db2Container.cs b/src/Testcontainers.Db2/Db2Container.cs new file mode 100644 index 000000000..a52dd5642 --- /dev/null +++ b/src/Testcontainers.Db2/Db2Container.cs @@ -0,0 +1,48 @@ +namespace Testcontainers.Db2; + +/// +[PublicAPI] +public sealed class Db2Container : DockerContainer, IDatabaseContainer +{ + private readonly Db2Configuration _configuration; + + public Db2Container(Db2Configuration configuration) : base(configuration) + { + _configuration = configuration; + } + + /// + /// Gets the Db2 connection string. + /// + /// The Db2 connection string. + public string GetConnectionString() + { + var properties = new Dictionary(); + properties.Add("Server", Hostname + ":" + GetMappedPublicPort(Db2Builder.Db2Port)); + properties.Add("Database", _configuration.Database); + properties.Add("UID", _configuration.Username); + properties.Add("PWD", _configuration.Password); + return string.Join(";", properties.Select(property => string.Join("=", property.Key, property.Value))); + } + + /// + /// Executes the SQL script in the Db2 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) + { + const string db2ShellCommandFormat = "su - {1} -c \"db2 connect to {0} && db2 -tvf '{2}'\""; + + var scriptFilePath = string.Join("/", string.Empty, "tmp", Guid.NewGuid().ToString("D"), Path.GetRandomFileName()); + + var db2ShellCommand = string.Format(db2ShellCommandFormat, _configuration.Database, _configuration.Username, scriptFilePath); + + await CopyAsync(Encoding.Default.GetBytes(scriptContent), scriptFilePath, Unix.FileMode644, ct) + .ConfigureAwait(false); + + return await ExecAsync(new [] { "/bin/sh", "-c", db2ShellCommand}, ct) + .ConfigureAwait(false); + } +} \ No newline at end of file diff --git a/src/Testcontainers.Db2/Testcontainers.Db2.csproj b/src/Testcontainers.Db2/Testcontainers.Db2.csproj new file mode 100644 index 000000000..9a25b9c4d --- /dev/null +++ b/src/Testcontainers.Db2/Testcontainers.Db2.csproj @@ -0,0 +1,12 @@ + + + net8.0;net9.0;netstandard2.0;netstandard2.1 + latest + + + + + + + + \ No newline at end of file diff --git a/src/Testcontainers.Db2/Usings.cs b/src/Testcontainers.Db2/Usings.cs new file mode 100644 index 000000000..e2b02a51e --- /dev/null +++ b/src/Testcontainers.Db2/Usings.cs @@ -0,0 +1,13 @@ +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; \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/.editorconfig b/tests/Testcontainers.Db2.Tests/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/tests/Testcontainers.Db2.Tests/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs b/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs new file mode 100644 index 000000000..3b74470d7 --- /dev/null +++ b/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs @@ -0,0 +1,48 @@ +namespace Testcontainers.Db2; + +public sealed class Db2ContainerTest : IAsyncLifetime +{ + // # --8<-- [start:UseDb2Container] + private readonly Db2Container _db2Container = new Db2Builder().WithAcceptLicenseAgreement(true).Build(); + + public Task InitializeAsync() + { + return _db2Container.StartAsync(); + } + + public Task DisposeAsync() + { + return _db2Container.DisposeAsync().AsTask(); + } + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public void ConnectionStateReturnsOpen() + { + // Given + using DbConnection connection = new DB2Connection(_db2Container.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 SYSIBM.SYSDUMMY1;"; + + // When + var execResult = await _db2Container.ExecScriptAsync(scriptContent) + .ConfigureAwait(true); + + // Then + Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr); + Assert.Empty(execResult.Stderr); + } + // # --8<-- [end:UseDb2Container] +} \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj new file mode 100644 index 000000000..58eff6fce --- /dev/null +++ b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj @@ -0,0 +1,26 @@ + + + net9.0 + false + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets new file mode 100644 index 000000000..32b2c12b2 --- /dev/null +++ b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets @@ -0,0 +1,22 @@ + + + $(MSBuildProjectDirectory)/linux.runsettings + + + + + + + \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/Usings.cs b/tests/Testcontainers.Db2.Tests/Usings.cs new file mode 100644 index 000000000..dbf73bb31 --- /dev/null +++ b/tests/Testcontainers.Db2.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 IBM.Data.Db2; +global using Xunit; \ No newline at end of file diff --git a/tests/Testcontainers.Db2.Tests/linux.runsettings b/tests/Testcontainers.Db2.Tests/linux.runsettings new file mode 100644 index 000000000..a6f6417c0 --- /dev/null +++ b/tests/Testcontainers.Db2.Tests/linux.runsettings @@ -0,0 +1,10 @@ + + + + + Set by MSBuild + Set by MSBuild + Set by MSBuild + + + \ No newline at end of file