Skip to content

Commit bef05d4

Browse files
committed
Adds tests for nested transation with active enumerator
1 parent f4803a4 commit bef05d4

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

Orm/Xtensive.Orm.Tests/Storage/NestedTransactionsTest.cs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
// Created by: Denis Krjuchkov
55
// Created: 2009.11.26
66

7+
using System.Collections.Generic;
8+
using System.Linq;
79
using NUnit.Framework;
810
using Xtensive.Core;
911
using Xtensive.Orm.Providers;
@@ -13,10 +15,12 @@ namespace Xtensive.Orm.Tests.Storage
1315
{
1416
public class NestedTransactionsTest : TransactionsTestBase
1517
{
18+
private StorageProviderInfo storageProviderInfo;
1619
public override void TestFixtureSetUp()
1720
{
1821
base.TestFixtureSetUp();
1922
Domain.OpenSession();
23+
storageProviderInfo = StorageProviderInfo.Instance;
2024
}
2125

2226
public override void TestFixtureTearDown()
@@ -130,5 +134,106 @@ public void WrongNestedTransactionUsageTest()
130134
Assert.IsNull(Session.Current.Transaction);
131135
Assert.IsNull(StorageTestHelper.GetNativeTransaction());
132136
}
137+
138+
[Test]
139+
public void RollbackNestedTransactionWithActiveEnumeratorTest()
140+
{
141+
var session = Session.Demand();
142+
using (var outerTx = session.OpenTransaction()) {
143+
_ = new Hexagon();
144+
_ = new Hexagon();
145+
_ = new Hexagon();
146+
147+
IEnumerator<int> enumerator = null;
148+
var innerTx = session.OpenTransaction(TransactionOpenMode.New);
149+
150+
enumerator = session.Query.All<Hexagon>()
151+
.Select(item => item.Id).AsEnumerable().GetEnumerator();
152+
_ = enumerator.MoveNext();
153+
154+
if (storageProviderInfo.CheckProviderIs(StorageProvider.SqlServer)) {
155+
_ = Assert.Throws<StorageException>(() => innerTx.Dispose());
156+
}
157+
else {
158+
Assert.DoesNotThrow(() => innerTx.Dispose());
159+
}
160+
}
161+
}
162+
163+
[Test]
164+
public void RollbackNestedTransactionWithActiveEnumeratorAndThenCompleteOutermostTest()
165+
{
166+
var session = Session.Demand();
167+
using (var outerTx = session.OpenTransaction()) {
168+
_ = new Hexagon();
169+
_ = new Hexagon();
170+
_ = new Hexagon();
171+
172+
IEnumerator<int> enumerator = null;
173+
var innerTx = session.OpenTransaction(TransactionOpenMode.New);
174+
175+
enumerator = session.Query.All<Hexagon>()
176+
.Select(item => item.Id).AsEnumerable().GetEnumerator();
177+
_ = enumerator.MoveNext();
178+
179+
if (storageProviderInfo.CheckProviderIs(StorageProvider.SqlServer)) {
180+
_ = Assert.Throws<StorageException>(() => innerTx.Dispose());
181+
}
182+
else {
183+
Assert.DoesNotThrow(() => innerTx.Dispose());
184+
}
185+
outerTx.Complete();
186+
}
187+
}
188+
189+
[Test]
190+
public void CommitNestedTransactionWithActiveEnumeratorAndRollbackOutermostTest()
191+
{
192+
var session = Session.Demand();
193+
using (var outerTx = session.OpenTransaction()) {
194+
_ = new Hexagon();
195+
_ = new Hexagon();
196+
_ = new Hexagon();
197+
198+
IEnumerator<int> enumerator = null;
199+
var innerTx = session.OpenTransaction(TransactionOpenMode.New);
200+
201+
enumerator = session.Query.All<Hexagon>()
202+
.Select(item => item.Id).AsEnumerable().GetEnumerator();
203+
_ = enumerator.MoveNext();
204+
205+
innerTx.Complete();
206+
innerTx.Dispose();
207+
}
208+
}
209+
210+
[Test]
211+
public void CommitNestedTransactionWithActiveEnumeratorAndCommitOutermostTest()
212+
{
213+
var session = Session.Demand();
214+
var outerTx = session.OpenTransaction();
215+
_ = new Hexagon();
216+
_ = new Hexagon();
217+
_ = new Hexagon();
218+
219+
IEnumerator<int> enumerator = null;
220+
var innerTx = session.OpenTransaction(TransactionOpenMode.New);
221+
222+
enumerator = session.Query.All<Hexagon>()
223+
.Select(item => item.Id).AsEnumerable().GetEnumerator();
224+
_ = enumerator.MoveNext();
225+
226+
innerTx.Complete();
227+
innerTx.Dispose();
228+
229+
outerTx.Complete();
230+
if (storageProviderInfo.CheckProviderIs(StorageProvider.SqlServer)) {
231+
var exception = Assert.Throws<StorageException>(() => outerTx.Dispose());
232+
Assert.That(exception.InnerException, Is.InstanceOf<System.Data.SqlClient.SqlException>());
233+
}
234+
else {
235+
Assert.DoesNotThrow(() => outerTx.Dispose());
236+
}
237+
}
133238
}
134239
}

0 commit comments

Comments
 (0)