Skip to content

Commit a407fda

Browse files
authored
Merge pull request #160 from jbogard/fixing-build
Fixing build and converting to TestContainers
2 parents 1e2368a + 3df7b84 commit a407fda

17 files changed

+310
-147
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ jobs:
1111
build:
1212
strategy:
1313
matrix:
14-
os: [windows-latest]
14+
os: [ubuntu-latest]
1515
fail-fast: false
16-
runs-on: windows-latest
16+
runs-on: ubuntu-latest
1717
steps:
1818
- name: Checkout
1919
uses: actions/checkout@v2
@@ -23,8 +23,6 @@ jobs:
2323
uses: actions/setup-dotnet@v1
2424
with:
2525
dotnet-version: '8.0.x'
26-
- name: Start SQL Local DB
27-
run: sqllocaldb start mssqllocaldb
2826
- name: Build and Test
2927
run: ./Build.ps1
3028
shell: pwsh

.github/workflows/release.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ jobs:
2020
uses: actions/setup-dotnet@v1
2121
with:
2222
dotnet-version: '8.0.x'
23-
- name: Start SQL Local DB
24-
run: sqllocaldb start mssqllocaldb
2523
- name: Build and Test
2624
run: ./Build.ps1
2725
shell: pwsh

Build.ps1

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ exec { & dotnet clean --configuration Release }
3030

3131
exec { & dotnet build --configuration Release }
3232

33-
if (-Not (Test-Path 'env:CI')) {
34-
exec { & docker-compose up -d }
35-
}
36-
3733
exec { & dotnet test --configuration Release --results-directory $artifacts --no-build --logger trx --verbosity=normal }
3834

3935
exec { & dotnet pack .\Respawn\Respawn.csproj --configuration Release --output $artifacts --no-build }

Directory.Build.props

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<Project>
22
<PropertyGroup>
3-
<LangVersion>10.0</LangVersion>
3+
<LangVersion>12.0</LangVersion>
44
<NoWarn>$(NoWarn);CS1701;CS1702;CS1591</NoWarn>
55
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
6+
7+
<IsMac>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_OSX())))</IsMac>
8+
<IsWindows>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_Windows())))</IsWindows>
69
</PropertyGroup>
710
</Project>

Push.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ if ([string]::IsNullOrEmpty($Env:NUGET_API_KEY)) {
66
} else {
77
Get-ChildItem $artifacts -Filter "*.nupkg" | ForEach-Object {
88
Write-Host "$($scriptName): Pushing $($_.Name)"
9-
dotnet nuget push $_ --source $Env:NUGET_URL --api-key $Env:NUGET_API_KEY
9+
dotnet nuget push $_ --source $Env:NUGET_URL --api-key $Env:NUGET_API_KEY --skip-duplicate
1010
if ($lastexitcode -ne 0) {
1111
throw ("Exec: " + $errorMessage)
1212
}

Respawn.DatabaseTests/DB2Tests.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,49 @@
1-
using IBM.Data.DB2.Core;
2-
using Shouldly;
1+
using Shouldly;
32
using System;
43
using System.Threading.Tasks;
4+
using DotNet.Testcontainers.Builders;
5+
using DotNet.Testcontainers.Images;
6+
using IBM.Data.Db2;
57
using NPoco;
68
using Respawn.Graph;
9+
using Testcontainers.Db2;
710
using Xunit;
811
using Xunit.Abstractions;
912

1013
namespace Respawn.DatabaseTests
1114
{
1215
public class DB2Tests : IAsyncLifetime
1316
{
17+
private Db2Container _sqlContainer;
1418
private DB2Connection _connection;
1519
private readonly ITestOutputHelper _output;
1620

17-
private const string _connectionString = "Server=127.0.0.1:50000;Database=SAMPLEDB;UID=db2inst1;PWD=password;Persist Security Info=True;Authentication=Server;";
18-
1921
public DB2Tests(ITestOutputHelper output)
2022
{
2123
_output = output;
2224
}
2325

24-
public Task DisposeAsync()
26+
public async Task InitializeAsync()
2527
{
26-
_connection?.Close();
27-
_connection?.Dispose();
28-
_connection = null;
29-
return Task.FromResult(0);
28+
_sqlContainer = new Db2Builder()
29+
.WithAcceptLicenseAgreement(true)
30+
.Build();
31+
await _sqlContainer.StartAsync();
32+
33+
_connection = new DB2Connection(_sqlContainer.GetConnectionString());
34+
35+
await _connection.OpenAsync();
3036
}
3137

32-
public async Task InitializeAsync()
38+
public async Task DisposeAsync()
3339
{
34-
_connection = new DB2Connection(_connectionString);
40+
_connection?.Close();
41+
_connection?.Dispose();
42+
_connection = null;
3543

36-
await _connection.OpenAsync();
44+
await _sqlContainer.StopAsync();
45+
await _sqlContainer.DisposeAsync();
46+
_sqlContainer = null;
3747
}
3848

3949
[SkipOnCI]

Respawn.DatabaseTests/EmptyDbTests.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Threading.Tasks;
22
using Microsoft.Data.SqlClient;
33
using Respawn.Graph;
4+
using Testcontainers.MsSql;
45
using Xunit;
56
using Xunit.Abstractions;
67

@@ -15,6 +16,7 @@ public class EmptyDbTests : IAsyncLifetime
1516
{
1617
private SqlConnection _connection;
1718
private Database _database;
19+
private MsSqlContainer _msSqlContainer;
1820

1921

2022
public EmptyDbTests(ITestOutputHelper output)
@@ -23,7 +25,10 @@ public EmptyDbTests(ITestOutputHelper output)
2325

2426
public async Task InitializeAsync()
2527
{
26-
var connString = @"Server=(LocalDb)\mssqllocaldb;Database=tempdb;Integrated Security=True";
28+
_msSqlContainer = new MsSqlBuilder().Build();
29+
await _msSqlContainer.StartAsync();
30+
31+
var connString = _msSqlContainer.GetConnectionString();
2732

2833
await using (var connection = new SqlConnection(connString))
2934
{
@@ -35,10 +40,13 @@ public async Task InitializeAsync()
3540
await database.ExecuteAsync("create database [EmptyDbTests]");
3641
}
3742
}
43+
44+
var newConnString = new SqlConnectionStringBuilder(connString)
45+
{
46+
InitialCatalog = "EmptyDbTests"
47+
}.ConnectionString;
3848

39-
connString = @"Server=(LocalDb)\mssqllocaldb;Database=EmptyDbTests;Integrated Security=True";
40-
41-
_connection = new SqlConnection(connString);
49+
_connection = new SqlConnection(newConnString);
4250
_connection.Open();
4351

4452
_database = new Database(_connection);

Respawn.DatabaseTests/InformixTests.cs

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
//#if INFORMIX
2-
using IBM.Data.DB2.Core;
32
using Respawn;
43
using Shouldly;
54
using System;
65
using System.Data;
6+
using System.IO;
77
using System.Linq;
88
using System.Threading.Tasks;
9+
using DotNet.Testcontainers.Builders;
10+
using DotNet.Testcontainers.Configurations;
11+
using DotNet.Testcontainers.Containers;
12+
using IBM.Data.Db2;
913
using NPoco;
1014
using Respawn.Graph;
1115
using Xunit;
@@ -18,24 +22,76 @@ public class InformixTests : IAsyncLifetime
1822
private DB2Connection _connection;
1923
private readonly ITestOutputHelper _output;
2024
private string _databaseName;
25+
private IContainer _sqlContainer;
2126

2227
public InformixTests(ITestOutputHelper output)
2328
{
2429
_output = output;
2530
}
2631

27-
public Task DisposeAsync()
32+
public async Task DisposeAsync()
2833
{
2934
_connection?.Close();
3035
_connection?.Dispose();
3136
_connection = null;
32-
return Task.FromResult(0);
37+
38+
await _sqlContainer.StopAsync();
39+
await _sqlContainer.DisposeAsync();
40+
_sqlContainer = null;
3341
}
3442

3543
public async Task InitializeAsync()
3644
{
37-
const string connString = "Server=127.0.0.1:9089;Database=sysadmin;UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";
38-
45+
//const string connString = "Server=127.0.0.1:9089;Database=sysadmin;UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";
46+
47+
_sqlContainer = new ContainerBuilder()
48+
.WithImage("ibmcom/informix-developer-database:14.10.FC5DE")
49+
50+
// = environment:
51+
.WithEnvironment("LICENSE", "accept")
52+
.WithEnvironment("ONCONFIG_FILE", "onconfig")
53+
.WithEnvironment("RUN_FILE_PRE_INIT", "my_post.sh")
54+
55+
// = ports:
56+
.WithPortBinding(9088, 9088)
57+
.WithPortBinding(9089, 9089)
58+
.WithPortBinding(27017, 27017)
59+
.WithPortBinding(27018, 27018)
60+
.WithPortBinding(27883, 27883)
61+
62+
// = volumes:
63+
.WithBindMount(
64+
source: Path.GetFullPath("./informix-server"),
65+
destination: "/opt/ibm/config",
66+
AccessMode.ReadWrite)
67+
68+
// = privileged: true
69+
.WithPrivileged(true)
70+
71+
// = user: root
72+
//.WithUser("root")
73+
74+
// = tty: true
75+
//.WithTty(true)
76+
77+
// optional: equivalent to "restart: always" but Testcontainers
78+
// does not automatically restart containers (it recreates instead)
79+
// .WithAutoRemove(false)
80+
81+
.WithWaitStrategy(Wait.ForUnixContainer()
82+
.UntilExternalTcpPortIsAvailable(9088)
83+
.UntilExternalTcpPortIsAvailable(9089)
84+
.UntilInternalTcpPortIsAvailable(9088)
85+
.UntilInternalTcpPortIsAvailable(9089)
86+
// This is the last success message
87+
.UntilMessageIsLogged("starting mqtt listener on port 27883")
88+
)
89+
.Build();
90+
91+
await _sqlContainer.StartAsync();
92+
93+
var connString = GetConnectionString(_sqlContainer);
94+
3995
await using (var connection = new DB2Connection(connString))
4096
{
4197
await connection.OpenAsync();
@@ -47,13 +103,33 @@ public async Task InitializeAsync()
47103
await database.ExecuteAsync($"CREATE DATABASE {_databaseName} WITH BUFFERED LOG;");
48104
}
49105

50-
var testDbConnString = $"Server=127.0.0.1:9089;Database={_databaseName};UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";
106+
var testDbConnString = new DB2ConnectionStringBuilder(connString)
107+
{
108+
Database = _databaseName
109+
}.ToString();
51110

52111
_connection = new DB2Connection(testDbConnString);
53112

54113
await _connection.OpenAsync();
55114
}
56115

116+
private static string GetConnectionString(
117+
IContainer container,
118+
string database = "sysadmin",
119+
string user = "informix",
120+
string password = "in4mix")
121+
{
122+
var host = container.Hostname;
123+
var port = container.GetMappedPublicPort(9089); // SQL port
124+
125+
return
126+
$"Server={host}:{port};" +
127+
$"Database={database};" +
128+
$"UID={user};" +
129+
$"Password={password};" +
130+
$"Persist Security Info=True;Authentication=Server;";
131+
}
132+
57133
[SkipOnCI]
58134
public async Task ShouldDeleteData()
59135
{

Respawn.DatabaseTests/MySqlTests.cs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Threading.Tasks;
22
using MySql.Data.MySqlClient;
33
using Respawn.Graph;
4+
using Testcontainers.MySql;
45
using Xunit;
56
using Xunit.Abstractions;
67

@@ -11,12 +12,13 @@ namespace Respawn.DatabaseTests
1112
using NPoco;
1213
using Shouldly;
1314

14-
public class MySqlTests : IDisposable
15+
public class MySqlTests : IAsyncLifetime
1516
{
1617
private readonly ITestOutputHelper _output;
1718
private MySqlConnection _connection;
18-
private readonly IDatabase _database;
19-
19+
private IDatabase _database;
20+
private MySqlContainer _sqlContainer;
21+
2022
public class Foo
2123
{
2224
public int Value { get; set; }
@@ -26,24 +28,35 @@ public class Bar
2628
public int Value { get; set; }
2729
}
2830

29-
public MySqlTests(ITestOutputHelper output)
31+
32+
public async Task InitializeAsync()
3033
{
31-
_output = output;
32-
var isCI = Environment.GetEnvironmentVariable("CI")?.ToUpperInvariant() == "TRUE";
33-
34-
var connString =
35-
isCI
36-
? @"Server=127.0.0.1; port = 3306; User Id = root; Password = Password12!"
37-
: @"Server=127.0.0.1; port = 8082; User Id = root; Password = testytest";
34+
_sqlContainer = new MySqlBuilder()
35+
.WithImage("mysql:8.0")
36+
.WithDatabase("MySqlTests")
37+
.Build();
38+
await _sqlContainer.StartAsync();
39+
40+
var connString = _sqlContainer.GetConnectionString();
3841

3942
_connection = new MySqlConnection(connString);
4043
_connection.Open();
4144

4245
_database = new Database(_connection);
46+
}
4347

44-
_database.Execute(@"DROP DATABASE IF EXISTS MySqlTests");
45-
_database.Execute("create database MySqlTests");
46-
_database.Execute("use MySqlTests");
48+
public async Task DisposeAsync()
49+
{
50+
_connection?.Close();
51+
_connection?.Dispose();
52+
_connection = null;
53+
await _sqlContainer.StopAsync();
54+
await _sqlContainer.DisposeAsync();
55+
}
56+
57+
public MySqlTests(ITestOutputHelper output)
58+
{
59+
_output = output;
4760
}
4861

4962
[SkipOnCI]
@@ -364,5 +377,6 @@ public void Dispose()
364377
_connection.Close();
365378
_connection.Dispose();
366379
}
380+
367381
}
368382
}

0 commit comments

Comments
 (0)