Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ jobs:
build:
strategy:
matrix:
os: [windows-latest]
os: [ubuntu-latest]
fail-fast: false
runs-on: windows-latest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
Expand All @@ -23,8 +23,6 @@ jobs:
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Start SQL Local DB
run: sqllocaldb start mssqllocaldb
- name: Build and Test
run: ./Build.ps1
shell: pwsh
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ jobs:
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Start SQL Local DB
run: sqllocaldb start mssqllocaldb
- name: Build and Test
run: ./Build.ps1
shell: pwsh
Expand Down
4 changes: 0 additions & 4 deletions Build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ exec { & dotnet clean --configuration Release }

exec { & dotnet build --configuration Release }

if (-Not (Test-Path 'env:CI')) {
exec { & docker-compose up -d }
}

exec { & dotnet test --configuration Release --results-directory $artifacts --no-build --logger trx --verbosity=normal }

exec { & dotnet pack .\Respawn\Respawn.csproj --configuration Release --output $artifacts --no-build }
5 changes: 4 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<Project>
<PropertyGroup>
<LangVersion>10.0</LangVersion>
<LangVersion>12.0</LangVersion>
<NoWarn>$(NoWarn);CS1701;CS1702;CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

<IsMac>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_OSX())))</IsMac>
<IsWindows>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_Windows())))</IsWindows>
</PropertyGroup>
</Project>
2 changes: 1 addition & 1 deletion Push.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ if ([string]::IsNullOrEmpty($Env:NUGET_API_KEY)) {
} else {
Get-ChildItem $artifacts -Filter "*.nupkg" | ForEach-Object {
Write-Host "$($scriptName): Pushing $($_.Name)"
dotnet nuget push $_ --source $Env:NUGET_URL --api-key $Env:NUGET_API_KEY
dotnet nuget push $_ --source $Env:NUGET_URL --api-key $Env:NUGET_API_KEY --skip-duplicate
if ($lastexitcode -ne 0) {
throw ("Exec: " + $errorMessage)
}
Expand Down
34 changes: 22 additions & 12 deletions Respawn.DatabaseTests/DB2Tests.cs
Original file line number Diff line number Diff line change
@@ -1,39 +1,49 @@
using IBM.Data.DB2.Core;
using Shouldly;
using Shouldly;
using System;
using System.Threading.Tasks;
using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Images;
using IBM.Data.Db2;
using NPoco;
using Respawn.Graph;
using Testcontainers.Db2;
using Xunit;
using Xunit.Abstractions;

namespace Respawn.DatabaseTests
{
public class DB2Tests : IAsyncLifetime
{
private Db2Container _sqlContainer;
private DB2Connection _connection;
private readonly ITestOutputHelper _output;

private const string _connectionString = "Server=127.0.0.1:50000;Database=SAMPLEDB;UID=db2inst1;PWD=password;Persist Security Info=True;Authentication=Server;";

public DB2Tests(ITestOutputHelper output)
{
_output = output;
}

public Task DisposeAsync()
public async Task InitializeAsync()
{
_connection?.Close();
_connection?.Dispose();
_connection = null;
return Task.FromResult(0);
_sqlContainer = new Db2Builder()
.WithAcceptLicenseAgreement(true)
.Build();
await _sqlContainer.StartAsync();

_connection = new DB2Connection(_sqlContainer.GetConnectionString());

await _connection.OpenAsync();
}

public async Task InitializeAsync()
public async Task DisposeAsync()
{
_connection = new DB2Connection(_connectionString);
_connection?.Close();
_connection?.Dispose();
_connection = null;

await _connection.OpenAsync();
await _sqlContainer.StopAsync();
await _sqlContainer.DisposeAsync();
_sqlContainer = null;
}

[SkipOnCI]
Expand Down
16 changes: 12 additions & 4 deletions Respawn.DatabaseTests/EmptyDbTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Respawn.Graph;
using Testcontainers.MsSql;
using Xunit;
using Xunit.Abstractions;

Expand All @@ -15,6 +16,7 @@ public class EmptyDbTests : IAsyncLifetime
{
private SqlConnection _connection;
private Database _database;
private MsSqlContainer _msSqlContainer;


public EmptyDbTests(ITestOutputHelper output)
Expand All @@ -23,7 +25,10 @@ public EmptyDbTests(ITestOutputHelper output)

public async Task InitializeAsync()
{
var connString = @"Server=(LocalDb)\mssqllocaldb;Database=tempdb;Integrated Security=True";
_msSqlContainer = new MsSqlBuilder().Build();
await _msSqlContainer.StartAsync();

var connString = _msSqlContainer.GetConnectionString();

await using (var connection = new SqlConnection(connString))
{
Expand All @@ -35,10 +40,13 @@ public async Task InitializeAsync()
await database.ExecuteAsync("create database [EmptyDbTests]");
}
}

var newConnString = new SqlConnectionStringBuilder(connString)
{
InitialCatalog = "EmptyDbTests"
}.ConnectionString;

connString = @"Server=(LocalDb)\mssqllocaldb;Database=EmptyDbTests;Integrated Security=True";

_connection = new SqlConnection(connString);
_connection = new SqlConnection(newConnString);
_connection.Open();

_database = new Database(_connection);
Expand Down
88 changes: 82 additions & 6 deletions Respawn.DatabaseTests/InformixTests.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
//#if INFORMIX
using IBM.Data.DB2.Core;
using Respawn;
using Shouldly;
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Configurations;
using DotNet.Testcontainers.Containers;
using IBM.Data.Db2;
using NPoco;
using Respawn.Graph;
using Xunit;
Expand All @@ -18,24 +22,76 @@ public class InformixTests : IAsyncLifetime
private DB2Connection _connection;
private readonly ITestOutputHelper _output;
private string _databaseName;
private IContainer _sqlContainer;

public InformixTests(ITestOutputHelper output)
{
_output = output;
}

public Task DisposeAsync()
public async Task DisposeAsync()
{
_connection?.Close();
_connection?.Dispose();
_connection = null;
return Task.FromResult(0);

await _sqlContainer.StopAsync();
await _sqlContainer.DisposeAsync();
_sqlContainer = null;
}

public async Task InitializeAsync()
{
const string connString = "Server=127.0.0.1:9089;Database=sysadmin;UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";

//const string connString = "Server=127.0.0.1:9089;Database=sysadmin;UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";

_sqlContainer = new ContainerBuilder()
.WithImage("ibmcom/informix-developer-database:14.10.FC5DE")

// = environment:
.WithEnvironment("LICENSE", "accept")
.WithEnvironment("ONCONFIG_FILE", "onconfig")
.WithEnvironment("RUN_FILE_PRE_INIT", "my_post.sh")

// = ports:
.WithPortBinding(9088, 9088)
.WithPortBinding(9089, 9089)
.WithPortBinding(27017, 27017)
.WithPortBinding(27018, 27018)
.WithPortBinding(27883, 27883)

// = volumes:
.WithBindMount(
source: Path.GetFullPath("./informix-server"),
destination: "/opt/ibm/config",
AccessMode.ReadWrite)

// = privileged: true
.WithPrivileged(true)

// = user: root
//.WithUser("root")

// = tty: true
//.WithTty(true)

// optional: equivalent to "restart: always" but Testcontainers
// does not automatically restart containers (it recreates instead)
// .WithAutoRemove(false)

.WithWaitStrategy(Wait.ForUnixContainer()
.UntilExternalTcpPortIsAvailable(9088)
.UntilExternalTcpPortIsAvailable(9089)
.UntilInternalTcpPortIsAvailable(9088)
.UntilInternalTcpPortIsAvailable(9089)
// This is the last success message
.UntilMessageIsLogged("starting mqtt listener on port 27883")
)
.Build();

await _sqlContainer.StartAsync();

var connString = GetConnectionString(_sqlContainer);

await using (var connection = new DB2Connection(connString))
{
await connection.OpenAsync();
Expand All @@ -47,13 +103,33 @@ public async Task InitializeAsync()
await database.ExecuteAsync($"CREATE DATABASE {_databaseName} WITH BUFFERED LOG;");
}

var testDbConnString = $"Server=127.0.0.1:9089;Database={_databaseName};UID=informix;PWD=in4mix;Persist Security Info=True;Authentication=Server;";
var testDbConnString = new DB2ConnectionStringBuilder(connString)
{
Database = _databaseName
}.ToString();

_connection = new DB2Connection(testDbConnString);

await _connection.OpenAsync();
}

private static string GetConnectionString(
IContainer container,
string database = "sysadmin",
string user = "informix",
string password = "in4mix")
{
var host = container.Hostname;
var port = container.GetMappedPublicPort(9089); // SQL port

return
$"Server={host}:{port};" +
$"Database={database};" +
$"UID={user};" +
$"Password={password};" +
$"Persist Security Info=True;Authentication=Server;";
}

[SkipOnCI]
public async Task ShouldDeleteData()
{
Expand Down
42 changes: 28 additions & 14 deletions Respawn.DatabaseTests/MySqlTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using Respawn.Graph;
using Testcontainers.MySql;
using Xunit;
using Xunit.Abstractions;

Expand All @@ -11,12 +12,13 @@ namespace Respawn.DatabaseTests
using NPoco;
using Shouldly;

public class MySqlTests : IDisposable
public class MySqlTests : IAsyncLifetime
{
private readonly ITestOutputHelper _output;
private MySqlConnection _connection;
private readonly IDatabase _database;

private IDatabase _database;
private MySqlContainer _sqlContainer;

public class Foo
{
public int Value { get; set; }
Expand All @@ -26,24 +28,35 @@ public class Bar
public int Value { get; set; }
}

public MySqlTests(ITestOutputHelper output)

public async Task InitializeAsync()
{
_output = output;
var isCI = Environment.GetEnvironmentVariable("CI")?.ToUpperInvariant() == "TRUE";

var connString =
isCI
? @"Server=127.0.0.1; port = 3306; User Id = root; Password = Password12!"
: @"Server=127.0.0.1; port = 8082; User Id = root; Password = testytest";
_sqlContainer = new MySqlBuilder()
.WithImage("mysql:8.0")
.WithDatabase("MySqlTests")
.Build();
await _sqlContainer.StartAsync();

var connString = _sqlContainer.GetConnectionString();

_connection = new MySqlConnection(connString);
_connection.Open();

_database = new Database(_connection);
}

_database.Execute(@"DROP DATABASE IF EXISTS MySqlTests");
_database.Execute("create database MySqlTests");
_database.Execute("use MySqlTests");
public async Task DisposeAsync()
{
_connection?.Close();
_connection?.Dispose();
_connection = null;
await _sqlContainer.StopAsync();
await _sqlContainer.DisposeAsync();
}

public MySqlTests(ITestOutputHelper output)
{
_output = output;
}

[SkipOnCI]
Expand Down Expand Up @@ -364,5 +377,6 @@ public void Dispose()
_connection.Close();
_connection.Dispose();
}

}
}
Loading