diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
index 9aff73e4e83..0cff9650e6a 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoForcedTableSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoForcedTableSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoForcedTableSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.HiLo.hbm.xml" }; }
@@ -54,9 +58,15 @@ public async Task TestNormalBoundaryAsync()
long expectedId = i + 1;
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
@@ -64,9 +74,15 @@ public async Task TestNormalBoundaryAsync()
await (session.SaveAsync(entities[increment]));
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
await (transaction.CommitAsync());
}
@@ -85,4 +101,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
index f792da88124..03924789aaa 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledForcedTableSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledForcedTableSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public PooledForcedTableSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.Pooled.hbm.xml" }; }
@@ -55,8 +59,13 @@ public async Task TestNormalBoundaryAsync()
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
// NOTE : initialization calls table twice
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
@@ -66,8 +75,14 @@ public async Task TestNormalBoundaryAsync()
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
// initialization (2) + clock over
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment*2 + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+
await (transaction.CommitAsync());
}
@@ -86,4 +101,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
index e7e5c23fad0..a047e3aec35 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
@@ -8,8 +8,8 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced
{
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
index cb185e72c6f..9942b263e6a 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
@@ -11,13 +11,18 @@
using System.Collections;
using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.HiLo.hbm.xml" }; }
@@ -51,18 +56,30 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (session.SaveAsync(entities[i]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (session.SaveAsync(entities[increment]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
await (transaction.CommitAsync());
}
@@ -80,4 +97,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
index 7d0d4d11763..47c2ca1a82d 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using System.Collections;
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public PooledSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.Pooled.hbm.xml" }; }
@@ -51,16 +55,26 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (session.SaveAsync(entities[i]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (session.SaveAsync(entities[increment]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
@@ -79,4 +93,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
index 0f9615a2ccd..85fc9520c87 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
@@ -46,4 +46,4 @@ public Task GetNextValueAsync(CancellationToken cancellationToken)
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
index 962460f90e0..9938d691506 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
@@ -10,14 +10,19 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoTableTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.HiLo.hbm.xml" }; }
@@ -50,18 +55,30 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
index d721443bdd6..a5afc87bb50 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
@@ -10,14 +10,19 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledLoTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledLoTableTestAsync : TestCaseWithMultiTenancy
{
+ public PooledLoTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.PooledLo.hbm.xml" }; }
@@ -50,16 +55,26 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
index 00c921da834..439de62e4cd 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledTableTestAsync : TestCaseWithMultiTenancy
{
+ public PooledTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.Pooled.hbm.xml" }; }
@@ -50,16 +54,26 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
index c2ba2b1f589..2411dfada16 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
@@ -1,12 +1,16 @@
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
- [TestFixture]
- public class HiLoForcedTableSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoForcedTableSequenceTest : TestCaseWithMultiTenancy
{
+ public HiLoForcedTableSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.HiLo.hbm.xml" }; }
@@ -43,9 +47,15 @@ public void TestNormalBoundary()
long expectedId = i + 1;
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
@@ -53,9 +63,15 @@ public void TestNormalBoundary()
session.Save(entities[increment]);
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
transaction.Commit();
}
@@ -74,4 +90,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
index 91839abf07f..4add7229bba 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
@@ -1,12 +1,16 @@
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
- [TestFixture]
- public class PooledForcedTableSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledForcedTableSequenceTest : TestCaseWithMultiTenancy
{
+ public PooledForcedTableSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.Pooled.hbm.xml" }; }
@@ -44,8 +48,13 @@ public void TestNormalBoundary()
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
// NOTE : initialization calls table twice
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
@@ -55,8 +64,14 @@ public void TestNormalBoundary()
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
// initialization (2) + clock over
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment*2 + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+
transaction.Commit();
}
@@ -75,4 +90,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs b/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
index 8f0fd01986f..90842a1048e 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
@@ -1,5 +1,5 @@
-using NUnit.Framework;
-using NHibernate.Id.Enhanced;
+using NHibernate.Id.Enhanced;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced
{
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
index 3cac164ec72..10db766ed8b 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
- [TestFixture]
- public class HiLoSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoSequenceTest : TestCaseWithMultiTenancy
{
+ public HiLoSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.HiLo.hbm.xml" }; }
@@ -40,18 +45,30 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
session.Save(entities[i]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
session.Save(entities[increment]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
transaction.Commit();
}
@@ -69,4 +86,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
index 3e73cc21a9d..669c03376db 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
@@ -1,12 +1,16 @@
-using System.Collections;
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
- [TestFixture]
- public class PooledSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledSequenceTest : TestCaseWithMultiTenancy
{
+ public PooledSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.Pooled.hbm.xml" }; }
@@ -40,16 +44,26 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
session.Save(entities[i]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
session.Save(entities[increment]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
@@ -68,4 +82,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs b/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
index d7fcce2f9ec..3097d3f3814 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
@@ -6,15 +6,20 @@ public partial class SourceMock : IAccessCallback
{
private long _val;
private readonly long _initialValue;
+ private readonly string _tenantId;
private readonly int _increment;
private int _timesCalled;
public SourceMock(long initialValue) : this(initialValue, 1) { }
- public SourceMock(long initialValue, int increment) : this(initialValue, increment, 0) { }
+ public SourceMock(long initialValue, int increment) : this(null, initialValue, increment, 0) { }
- public SourceMock(long initialValue, int increment, int timesCalled)
+ public SourceMock(long initialValue, int increment, int timesCalled): this(null, initialValue, increment, timesCalled)
{
+ }
+ public SourceMock(string tenantId, long initialValue, int increment, int timesCalled)
+ {
+ _tenantId = tenantId;
_increment = increment;
_timesCalled = timesCalled;
@@ -57,6 +62,8 @@ private void InitValue()
_val = _initialValue;
}
+ public string GetTenantIdentifier() => _tenantId;
+
public int TimesCalled
{
get { return _timesCalled; }
@@ -71,4 +78,4 @@ public long CurrentValue
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
index 878252ce3dd..d25c772661c 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class HiLoTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoTableTest : TestCaseWithMultiTenancy
{
+ public HiLoTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.HiLo.hbm.xml" }; }
@@ -39,18 +44,30 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
index bd5245dbe9a..4181a25372e 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class PooledLoTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledLoTableTest : TestCaseWithMultiTenancy
{
+ public PooledLoTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.PooledLo.hbm.xml" }; }
@@ -39,16 +44,26 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
index 3a7ca042514..383b2925b03 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
@@ -1,12 +1,16 @@
-using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class PooledTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledTableTest : TestCaseWithMultiTenancy
{
+ public PooledTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.Pooled.hbm.xml" }; }
@@ -39,16 +43,26 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ if (TenantIdentifier == null)
+ {
+ Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ }
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs b/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs
new file mode 100644
index 00000000000..5ce6ae74477
--- /dev/null
+++ b/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs
@@ -0,0 +1,60 @@
+using System.Data.Common;
+using NHibernate.Cfg;
+using NHibernate.Dialect;
+using NHibernate.Driver;
+using NHibernate.MultiTenancy;
+
+namespace NHibernate.Test.MultiTenancy
+{
+ public abstract class TestCaseWithMultiTenancy : TestCase
+ {
+ protected TestCaseWithMultiTenancy(string tenantIdentifier)
+ {
+ TenantIdentifier = tenantIdentifier;
+ }
+
+ public string TenantIdentifier { get; }
+
+ protected override void Configure(Configuration configuration)
+ {
+ if (TenantIdentifier != null)
+ {
+ configuration.DataBaseIntegration(
+ x =>
+ {
+ x.MultiTenancy = MultiTenancyStrategy.Database;
+ x.MultiTenancyConnectionProvider();
+ });
+ }
+ base.Configure(configuration);
+ }
+
+ protected override DbConnection OpenConnectionForSchemaExport()
+ {
+ if (TenantIdentifier != null)
+ {
+ return Sfi.Settings.MultiTenancyConnectionProvider
+ .GetConnectionAccess(GetTenantConfig("defaultTenant"), Sfi).GetConnection();
+ }
+ return base.OpenConnectionForSchemaExport();
+ }
+
+ private TenantConfiguration GetTenantConfig(string tenantId)
+ {
+ return new TestTenantConfiguration(tenantId, IsSqlServerDialect);
+ }
+
+ protected override ISession OpenSession()
+ {
+ if (TenantIdentifier != null)
+ {
+ return Sfi.WithOptions().Tenant(new TestTenantConfiguration(TenantIdentifier, IsSqlServerDialect)).OpenSession();
+ }
+ return base.OpenSession();
+ }
+
+ //Create extension method for this?
+ private bool IsSqlServerDialect => Sfi.Dialect is MsSql2000Dialect && !(Sfi.ConnectionProvider.Driver is OdbcDriver);
+
+ }
+}
diff --git a/src/NHibernate.Test/TestCase.cs b/src/NHibernate.Test/TestCase.cs
index 1335b6a722a..5db87e14a72 100644
--- a/src/NHibernate.Test/TestCase.cs
+++ b/src/NHibernate.Test/TestCase.cs
@@ -21,6 +21,8 @@
using NHibernate.SqlTypes;
using NHibernate.Util;
using NSubstitute;
+using NHibernate.MultiTenancy;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test
{
diff --git a/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs b/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
index b52c3e524b5..8fbb5c27826 100644
--- a/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
+++ b/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
@@ -20,4 +20,4 @@ public partial interface IAccessCallback
/// A cancellation token that can be used to cancel the work
Task GetNextValueAsync(CancellationToken cancellationToken);
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs b/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
index 5ba08f4a31e..1e9350f3e94 100644
--- a/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
+++ b/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
@@ -10,7 +10,6 @@
using System;
using System.Reflection;
-using System.Runtime.CompilerServices;
using NHibernate.Util;
namespace NHibernate.Id.Enhanced
@@ -28,29 +27,32 @@ public partial class HiLoOptimizer : OptimizerSupport
public override async Task
///
/// The user may specify a max_lo value to determine how often new hi values are
- /// fetched. If sequences are not avaliable, TableHiLoGenerator might be an
+ /// fetched. If sequences are not available, TableHiLoGenerator might be an
/// alternative.
///
///
@@ -43,10 +44,15 @@ public partial class SequenceHiLoGenerator : SequenceGenerator
public const string MaxLo = "max_lo";
private int maxLo;
- private int lo;
- private long hi;
private System.Type returnClass;
- private readonly AsyncLock _asyncLock = new AsyncLock();
+ private TenantStateStore _stateStore;
+
+ private class GenerationState
+ {
+ public AsyncLock AsyncLock { get; } = new AsyncLock();
+ public long Lo { get; internal set; }
+ public long Hi { get; internal set; }
+ }
#region IConfigurable Members
@@ -61,8 +67,8 @@ public override void Configure(IType type, IDictionary parms, Di
{
base.Configure(type, parms, dialect);
maxLo = PropertiesHelper.GetInt32(MaxLo, parms, 9);
- lo = maxLo + 1; // so we "clock over" on the first invocation
returnClass = type.ReturnedClass;
+ _stateStore = new TenantStateStore(state => state.Lo = maxLo + 1);// so we "clock over" on the first invocation
}
#endregion
@@ -78,7 +84,9 @@ public override void Configure(IType type, IDictionary parms, Di
/// The new identifier as a , , or .
public override object Generate(ISessionImplementor session, object obj)
{
- using (_asyncLock.Lock())
+ var generationState = _stateStore.LocateGenerationState(session.GetTenantIdentifier());
+
+ using (generationState.AsyncLock.Lock())
{
if (maxLo < 1)
{
@@ -89,15 +97,15 @@ public override object Generate(ISessionImplementor session, object obj)
return IdentifierGeneratorFactory.CreateNumber(val, returnClass);
}
- if (lo > maxLo)
+ if (generationState.Lo > maxLo)
{
long hival = Convert.ToInt64(base.Generate(session, obj));
- lo = (hival == 0) ? 1 : 0;
- hi = hival * (maxLo + 1);
+ generationState.Lo = (hival == 0) ? 1 : 0;
+ generationState.Hi = hival * (maxLo + 1);
if (log.IsDebugEnabled())
log.Debug("new hi value: {0}", hival);
}
- return IdentifierGeneratorFactory.CreateNumber(hi + lo++, returnClass);
+ return IdentifierGeneratorFactory.CreateNumber(generationState.Hi + generationState.Lo++, returnClass);
}
}
diff --git a/src/NHibernate/Id/TableGenerator.cs b/src/NHibernate/Id/TableGenerator.cs
index 09180687efc..3fbd16e4015 100644
--- a/src/NHibernate/Id/TableGenerator.cs
+++ b/src/NHibernate/Id/TableGenerator.cs
@@ -157,7 +157,7 @@ public virtual object Generate(ISessionImplementor session, object obj)
using (_asyncLock.Lock())
{
// This has to be done using a different connection to the containing
- // transaction becase the new hi value must remain valid even if the
+ // transaction because the new hi value must remain valid even if the
// containing transaction rolls back.
return DoWorkInNewTransaction(session);
}
@@ -220,7 +220,7 @@ public override object DoWorkInCurrentTransaction(ISessionImplementor session, D
int rows;
do
{
- //the loop ensure atomicitiy of the
+ //the loop ensures atomicity of the
//select + update even for no transaction
//or read committed isolation level (needed for .net?)
diff --git a/src/NHibernate/Id/TableHiLoGenerator.cs b/src/NHibernate/Id/TableHiLoGenerator.cs
index c64de1d3323..9cf03db31ac 100644
--- a/src/NHibernate/Id/TableHiLoGenerator.cs
+++ b/src/NHibernate/Id/TableHiLoGenerator.cs
@@ -6,6 +6,7 @@
using NHibernate.Type;
using NHibernate.Util;
using System.Collections.Generic;
+using System.Collections.Concurrent;
namespace NHibernate.Id
{
@@ -48,11 +49,16 @@ public partial class TableHiLoGenerator : TableGenerator
///
public const string MaxLo = "max_lo";
- private long hi;
- private long lo;
private long maxLo;
private System.Type returnClass;
- private readonly AsyncLock _asyncLock = new AsyncLock();
+ private TenantStateStore _stateStore;
+
+ private class GenerationState
+ {
+ public AsyncLock AsyncLock { get; } = new AsyncLock();
+ public long Lo { get; internal set; }
+ public long Hi { get; internal set; }
+ }
#region IConfigurable Members
@@ -67,8 +73,8 @@ public override void Configure(IType type, IDictionary parms, Di
{
base.Configure(type, parms, dialect);
maxLo = PropertiesHelper.GetInt64(MaxLo, parms, Int16.MaxValue);
- lo = maxLo + 1; // so we "clock over" on the first invocation
returnClass = type.ReturnedClass;
+ _stateStore = new TenantStateStore(state => state.Lo = maxLo + 1);// so we "clock over" on the first invocation
}
#endregion
@@ -83,7 +89,9 @@ public override void Configure(IType type, IDictionary parms, Di
/// The new identifier as a .
public override object Generate(ISessionImplementor session, object obj)
{
- using (_asyncLock.Lock())
+ var generationState = _stateStore.LocateGenerationState(session.GetTenantIdentifier());
+
+ using (generationState.AsyncLock.Lock())
{
if (maxLo < 1)
{
@@ -93,15 +101,15 @@ public override object Generate(ISessionImplementor session, object obj)
val = Convert.ToInt64(base.Generate(session, obj));
return IdentifierGeneratorFactory.CreateNumber(val, returnClass);
}
- if (lo > maxLo)
+ if (generationState.Lo > maxLo)
{
long hival = Convert.ToInt64(base.Generate(session, obj));
- lo = (hival == 0) ? 1 : 0;
- hi = hival * (maxLo + 1);
+ generationState.Lo = (hival == 0) ? 1 : 0;
+ generationState.Hi = hival * (maxLo + 1);
log.Debug("New high value: {0}", hival);
}
- return IdentifierGeneratorFactory.CreateNumber(hi + lo++, returnClass);
+ return IdentifierGeneratorFactory.CreateNumber(generationState.Hi + generationState.Lo++, returnClass);
}
}
diff --git a/src/NHibernate/Id/TenantStateStore.cs b/src/NHibernate/Id/TenantStateStore.cs
new file mode 100644
index 00000000000..276df6a3e81
--- /dev/null
+++ b/src/NHibernate/Id/TenantStateStore.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Concurrent;
+
+namespace NHibernate.Id
+{
+ internal class TenantStateStore where TState : new()
+ {
+ private Lazy _noTenantState;
+ private Action _initializer;
+ private ConcurrentDictionary _tenantSpecificState = new ConcurrentDictionary();
+
+ public TenantStateStore(Action initializer) : this()
+ {
+ _initializer = initializer;
+ }
+
+ public TenantStateStore()
+ {
+ _noTenantState = new Lazy(() => CreateNewState());
+ }
+
+ internal TState LocateGenerationState(string tenantIdentifier)
+ {
+ if (tenantIdentifier == null)
+ {
+ return _noTenantState.Value;
+ }
+ else
+ {
+ return _tenantSpecificState.GetOrAdd(tenantIdentifier, _ => CreateNewState());
+ }
+ }
+
+ internal TState NoTenantGenerationState => _noTenantState.IsValueCreated ?
+ _noTenantState.Value :
+ throw new HibernateException("Could not locate previous generation state for no-tenant");
+
+
+ private TState CreateNewState()
+ {
+ var state = new TState();
+ _initializer?.Invoke(state);
+ return state;
+ }
+ }
+}