Skip to content

Commit 97ef199

Browse files
committed
workflow running against 5 different dbs
1 parent d0551df commit 97ef199

File tree

10 files changed

+274
-40
lines changed

10 files changed

+274
-40
lines changed

.github/workflows/dotnet.yml

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,81 @@
11
name: .NET
22

3-
on:
4-
push:
5-
branches: [ setupbuild ]
6-
#pull_request:
7-
# branches: [ master ]
3+
on: [push, pull_request]
84

95
jobs:
10-
build:
11-
6+
db:
7+
strategy:
8+
fail-fast: false
9+
matrix:
10+
include:
11+
- db: SqlServer2008
12+
connectionstring: "Server=localhost;initial catalog=envers;User Id=sa;Password=P@ssw0rd"
13+
dialect: "NHibernate.Dialect.MsSql2008Dialect"
14+
driverclass: "NHibernate.Driver.SqlClientDriver"
15+
- db: PostgreSQL
16+
connectionstring: "Host=localhost;Username=envers;Password=envers;Database=envers;Enlist=true;"
17+
dialect: "NHibernate.Dialect.PostgreSQL83Dialect"
18+
driverclass: "NHibernate.Driver.NpgsqlDriver"
19+
- db: Firebird
20+
connectionstring: "DataSource=localhost;Database=envers;User=SYSDBA;Password=envers;charset=utf8;"
21+
dialect: "NHibernate.Dialect.FirebirdDialect"
22+
driverclass: "NHibernate.Driver.FirebirdClientDriver"
23+
allow_failure: true
24+
- db: MySQL
25+
connectionstring: "Server=localhost;Uid=root;Password=envers;Database=envers;Old Guids=True;"
26+
dialect: "NHibernate.Dialect.MySQL5Dialect"
27+
driverclass: "NHibernate.Driver.MySqlDataDriver"
28+
allow_failure: true
29+
- db: Oracle
30+
connectionstring: "User ID=envers;Password=envers;Metadata Pooling=false;Self Tuning=false;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1)))"
31+
dialect: "NHibernate.Dialect.Oracle10gDialect"
32+
driverclass: "NHibernate.Driver.OracleManagedDataClientDriver"
33+
allow_failure: true
34+
1235
runs-on: ubuntu-latest
36+
continue-on-error: ${{matrix.allow_failure == true}}
37+
env:
38+
connection.connection_string: ${{matrix.connectionstring}}
39+
dialect: ${{matrix.dialect}}
40+
connection.driver_class: ${{matrix.driverclass}}
41+
LANG: en-US.UTF-8
42+
43+
name: ${{matrix.db}}
1344

1445
steps:
46+
- name: Set up SqlServer
47+
if: matrix.db == 'SqlServer2008'
48+
run: |
49+
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd" -e "MSSQL_PID=Express" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest;
50+
- name: Set up MySQL
51+
if: matrix.db == 'MySQL'
52+
run: |
53+
sudo service mysql stop
54+
docker run --name mysql -e MYSQL_ROOT_PASSWORD=envers -e MYSQL_USER=envers -e MYSQL_PASSWORD=envers -e MYSQL_DATABASE=envers -p 3306:3306 --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 -d mysql:5.7 mysqld --lower_case_table_names=1 --character-set-server=utf8 --collation-server=utf8_general_ci
55+
- name: Set up Oracle
56+
if: matrix.db == 'Oracle'
57+
run: |
58+
docker run -d -p 1521:1521 -e APP_USER=envers -e APP_USER_PASSWORD=envers -e ORACLE_PASSWORD=envers gvenzl/oracle-xe:18-slim
59+
- name: Set up PostgreSQL
60+
if: matrix.db == 'PostgreSQL'
61+
run: |
62+
docker run -d -e POSTGRES_USER=envers -e POSTGRES_PASSWORD=envers -e POSTGRES_DB=envers -p 5432:5432 postgres:13
63+
- name: Set up Firebird
64+
if: matrix.db == 'Firebird'
65+
run: |
66+
docker run --name firebird -e EnableWireCrypt=true -e FIREBIRD_USER=envers -e FIREBIRD_PASSWORD=envers -e ISC_PASSWORD=envers -e FIREBIRD_DATABASE=envers -p 3050:3050 -d jacobalberty/firebird:v3.0
67+
68+
1569
- uses: actions/checkout@v2
70+
1671
- name: Setup .NET
17-
uses: actions/setup-dotnet@v1
72+
uses: actions/setup-dotnet@v1.8.0
1873
with:
19-
dotnet-version: 5.0.x
74+
dotnet-version: 2.1.x
75+
2076
- name: Restore dependencies
21-
run: dotnet restore src\\envers.sln
77+
run: dotnet restore Src\\Envers.sln
2278
- name: Build
23-
run: dotnet build --no-restore src\\envers.sln
79+
run: dotnet build --no-restore Src\\Envers.sln -f netcoreapp2.0
2480
- name: Test
25-
run: dotnet test --no-build src\\envers.sln
81+
run: dotnet test --no-build Src\\Envers.sln -f netcoreapp2.0
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data.SqlClient;
4+
using FirebirdSql.Data.FirebirdClient;
5+
using NHibernate.Envers.Tests.Tools;
6+
using Npgsql;
7+
8+
namespace NHibernate.Envers.Tests
9+
{
10+
public class DatabaseSetup
11+
{
12+
private static readonly IDictionary<string, Action<Cfg.Configuration>> setupMethods = new Dictionary<string, Action<Cfg.Configuration>>
13+
{
14+
{"NHibernate.Driver.SqlClientDriver", setupSqlServer},
15+
{"NHibernate.Driver.MySqlDataDriver", setupMySql},
16+
{"NHibernate.Driver.FirebirdClientDriver", setupFirebird},
17+
{"NHibernate.Driver.NpgsqlDriver", setupNpgsql},
18+
{"NHibernate.Driver.OracleManagedDataClientDriver", setupOracle}
19+
};
20+
21+
public static void CreateEmptyDatabase(Cfg.Configuration cfg)
22+
{
23+
var driver = cfg.Properties[Cfg.Environment.ConnectionDriver];
24+
25+
setupMethods[driver](cfg);
26+
}
27+
28+
private static void setupFirebird(Cfg.Configuration cfg)
29+
{
30+
var connStr = cfg.Properties[Cfg.Environment.ConnectionString];
31+
try
32+
{
33+
FbConnection.DropDatabase(connStr);
34+
}
35+
catch (Exception e)
36+
{
37+
Console.WriteLine(e);
38+
}
39+
// With UTF8 charset, string takes up to four times as many space, causing the
40+
// default page-size of 4096 to no more be enough for index key sizes. (Index key
41+
// size is limited to a quarter of the page size.)
42+
FbConnection.CreateDatabase(connStr, pageSize:16384, forcedWrites:false);
43+
}
44+
45+
private static void setupNpgsql(Cfg.Configuration cfg)
46+
{
47+
var connStr = cfg.Properties[Cfg.Environment.ConnectionString].ReplaceCaseInsensitive("Database=envers", "Database=postgres");
48+
49+
using (var conn = new NpgsqlConnection(connStr))
50+
{
51+
conn.Open();
52+
53+
using (var cmd = conn.CreateCommand())
54+
{
55+
cmd.CommandText = "drop database envers";
56+
57+
try
58+
{
59+
cmd.ExecuteNonQuery();
60+
}
61+
catch (Exception e)
62+
{
63+
Console.WriteLine(e);
64+
}
65+
66+
cmd.CommandText = "create database envers";
67+
cmd.ExecuteNonQuery();
68+
}
69+
}
70+
}
71+
72+
private static void setupSqlServer(Cfg.Configuration cfg)
73+
{
74+
var connStr = cfg.Properties[Cfg.Environment.ConnectionString].ReplaceCaseInsensitive("initial catalog=envers", "initial catalog=master");
75+
76+
using (var conn = new SqlConnection(connStr))
77+
{
78+
conn.Open();
79+
80+
using (var cmd = conn.CreateCommand())
81+
{
82+
cmd.CommandText = "drop database envers";
83+
84+
try
85+
{
86+
cmd.ExecuteNonQuery();
87+
}
88+
catch(Exception e)
89+
{
90+
Console.WriteLine(e);
91+
}
92+
93+
cmd.CommandText = "create database envers";
94+
cmd.ExecuteNonQuery();
95+
}
96+
}
97+
}
98+
99+
private static void setupMySql(Cfg.Configuration obj)
100+
{
101+
//do nothing
102+
}
103+
104+
private static void setupOracle(Cfg.Configuration obj)
105+
{
106+
//do nothing
107+
}
108+
}
109+
}

Src/NHibernate.Envers.Tests/HOW_TO_RUN_TESTS.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
1. Create an empty database
2-
2. Build NHibernate.Envers.Test
3-
3. Modify hibernate.cfg.xml to point to your database
4-
4. Run the tests
1+
1. Build NHibernate.Envers.Test
2+
2. Modify hibernate.cfg.xml to point to your database (if there's been modification of hibernate.cfg.xml.template after you pulled latest, your hibernate.cfg.xml need to reflect these changes)
3+
3. Run the tests
54

65

76
NHibernate Envers' tests are using Parameterized Test Fixtures

Src/NHibernate.Envers.Tests/NHibernate.Envers.Tests.csproj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@
1818
</ItemGroup>
1919

2020
<ItemGroup>
21+
<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="8.5.3" />
22+
<PackageReference Include="MySql.Data" Version="8.0.26" />
23+
<PackageReference Include="Npgsql" Version="5.0.10" />
2124
<PackageReference Include="NUnit" Version="3.9.0" />
2225
<PackageReference Include="NUnit3TestAdapter" Version="3.9.0" />
2326
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.1" />
2427
<PackageReference Include="SharpTestsEx" Version="2.0.0" />
2528
<PackageReference Include="log4net" Version="2.0.8" />
29+
<PackageReference Include="System.Data.OracleClient" Version="1.0.8" />
30+
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="2.19.120" />
2631
<PackageReference Include="System.Data.SqlClient" Version="4.4.2" />
2732
</ItemGroup>
2833

@@ -36,7 +41,11 @@
3641
</None>
3742
</ItemGroup>
3843

44+
<ItemGroup>
45+
<Reference Include="System.Data.OracleClient" />
46+
</ItemGroup>
47+
3948
<Target Name="PreBuild" AfterTargets="PreBuildEvent">
40-
<Exec Command="if not exist &quot;$(ProjectDir)\hibernate.cfg.xml&quot; copy &quot;$(ProjectDir)\hibernate.cfg.xml.template&quot; &quot;$(ProjectDir)\hibernate.cfg.xml&quot;" />
49+
<Copy SourceFiles="$(ProjectDir)\hibernate.cfg.xml.template" DestinationFiles="$(ProjectDir)\hibernate.cfg.xml" Condition="!Exists('$(ProjectDir)\hibernate.cfg.xml')" />
4150
</Target>
4251
</Project>

Src/NHibernate.Envers.Tests/NetSpecific/Integration/Configuration/AuditConfigurationTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using NHibernate.Envers.Configuration;
44
using NHibernate.Envers.Configuration.Attributes;
55
using NHibernate.Envers.Event;
6+
using NHibernate.Envers.Tests.Tools;
67
using NHibernate.Event;
78
using NUnit.Framework;
89
using SharpTestsEx;
@@ -26,7 +27,7 @@ public class AuditConfigurationTests
2627
public void WhenGetAuditConfMultipleTimesThenDoesNotThrowsForDupicatedMappings()
2728
{
2829
var cfg = new Cfg.Configuration();
29-
cfg.Configure();
30+
cfg.Configure().OverrideSettingsFromEnvironmentVariables();
3031

3132
cfg.AddXml(SimpleMapping);
3233
AuditConfiguration.GetFor(cfg); //<< external call
@@ -65,8 +66,7 @@ public void WhenCallIntegrationThenMappingsShouldBeAvailableImmediately()
6566
public void WhenIntegrateThenBuildSessionFactoryDoesNotThrows()
6667
{
6768
var cfg = new Cfg.Configuration();
68-
cfg.Configure();
69-
69+
cfg.Configure().OverrideSettingsFromEnvironmentVariables();
7070
cfg.AddXml(SimpleMapping);
7171
cfg.IntegrateWithEnvers();
7272

Src/NHibernate.Envers.Tests/OneStrategyTestBase.cs

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Reflection;
4+
using FirebirdSql.Data.FirebirdClient;
45
using NHibernate.Cfg;
56
using NHibernate.Dialect;
7+
using NHibernate.Driver;
68
using NHibernate.Engine;
79
using NHibernate.Envers.Configuration;
810
using NHibernate.Envers.Configuration.Attributes;
911
using NHibernate.Envers.Configuration.Store;
1012
using NHibernate.Envers.Event;
1113
using NHibernate.Envers.Strategy;
14+
using NHibernate.Envers.Tests.Tools;
15+
using NHibernate.Tool.hbm2ddl;
1216
using NUnit.Framework;
1317

1418
namespace NHibernate.Envers.Tests
1519
{
1620
public abstract class OneStrategyTestBase
1721
{
18-
private ISessionFactory _sessionFactory;
22+
private ISessionFactoryImplementor _sessionFactory;
1923
private IAuditReader _auditReader;
2024

2125
protected string TestAssembly { get; private set; }
@@ -47,36 +51,68 @@ private void setStrategyType(AuditStrategyForTest strategyType)
4751
public void BaseSetup()
4852
{
4953
TestAssembly = GetType().Assembly.GetName().Name;
50-
Cfg = new Cfg.Configuration();
51-
Cfg.SetEnversProperty(ConfigurationKey.AuditStrategy, StrategyType);
54+
Cfg = new Cfg.Configuration().SetEnversProperty(ConfigurationKey.AuditStrategy, StrategyType);
5255
AddToConfiguration(Cfg);
53-
Cfg.Configure();
56+
Cfg.Configure().OverrideSettingsFromEnvironmentVariables();
5457
addMappings();
5558
Cfg.IntegrateWithEnvers(new AuditEventListener(), EnversConfiguration());
56-
_sessionFactory = Cfg.BuildSessionFactory();
57-
var notRun = TestShouldNotRunMessage();
58-
if (!string.IsNullOrEmpty(notRun))
59-
Assert.Ignore(notRun);
59+
createDb();
60+
_sessionFactory = (ISessionFactoryImplementor)Cfg.BuildSessionFactory();
61+
if (!testShouldRun())
62+
Assert.Ignore(TestShouldNotRunMessage());
63+
createDbSchema();
6064
Session = openSession(_sessionFactory);
6165
Initialize();
6266
closeSessionAndAuditReader();
6367
Session = openSession(_sessionFactory);
6468
}
6569

70+
private void createDbSchema()
71+
{
72+
new SchemaExport(Cfg).Create(false, true);
73+
}
74+
75+
76+
private void dropDbSchema()
77+
{
78+
if (_sessionFactory.ConnectionProvider.Driver is FirebirdClientDriver)
79+
{
80+
// necessary firebird hack to be able to drop used tables
81+
FbConnection.ClearAllPools();
82+
}
83+
new SchemaExport(Cfg).Drop(false, true);
84+
}
85+
86+
private static bool hasCreatedDatabase;
87+
private void createDb()
88+
{
89+
if (hasCreatedDatabase)
90+
return;
91+
hasCreatedDatabase = true;
92+
DatabaseSetup.CreateEmptyDatabase(Cfg);
93+
}
94+
6695
[TearDown]
6796
public void BaseTearDown()
6897
{
6998
closeSessionAndAuditReader();
7099
AuditConfiguration.Remove(Cfg);
100+
if(testShouldRun())
101+
dropDbSchema();
71102
_sessionFactory?.Close();
72103
}
73104

105+
private bool testShouldRun()
106+
{
107+
return TestShouldNotRunMessage() == null;
108+
}
109+
74110
protected virtual string TestShouldNotRunMessage()
75111
{
76112
return null;
77113
}
78114

79-
protected Dialect.Dialect Dialect => ((ISessionFactoryImplementor)_sessionFactory).Dialect;
115+
protected Dialect.Dialect Dialect => _sessionFactory.Dialect;
80116

81117
protected virtual IMetaDataProvider EnversConfiguration()
82118
{
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Linq;
2+
3+
namespace NHibernate.Envers.Tests.Tools
4+
{
5+
public static class ConfigurationExtensions
6+
{
7+
public static Cfg.Configuration OverrideSettingsFromEnvironmentVariables(this Cfg.Configuration configuration)
8+
{
9+
foreach (var nhProperty in configuration.Properties.ToArray())
10+
{
11+
var envVar = System.Environment.GetEnvironmentVariable(nhProperty.Key);
12+
if (envVar != null)
13+
{
14+
configuration.SetProperty(nhProperty.Key, envVar);
15+
}
16+
}
17+
18+
return configuration;
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)