Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Data
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv23289
Modified Files:
AdoPlatformTransactionManagerTests.cs
Log Message:
SPRNET-770 Nested RequiresNew propagaion options not working in AdoPlatformTransaction manager
SPRNET-769 Resume and throw exception if exception is thrown at start of transaction.
Index: AdoPlatformTransactionManagerTests.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Data/AdoPlatformTransactionManagerTests.cs,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** AdoPlatformTransactionManagerTests.cs 16 Oct 2007 00:28:49 -0000 1.4
--- AdoPlatformTransactionManagerTests.cs 12 Nov 2007 19:58:13 -0000 1.5
***************
*** 55,60 ****
public void TransactionCommit()
{
! IDbProvider dbProvider = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
! IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
--- 55,60 ----
public void TransactionCommit()
{
! IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
! IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
***************
*** 66,74 ****
Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
//standard tx timeout.
-
-
transaction.Commit();
LastCall.On(transaction).Repeat.Once();
-
connection.Dispose();
}
--- 66,71 ----
***************
*** 77,80 ****
--- 74,78 ----
AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+
TransactionTemplate tt = new TransactionTemplate(tm);
***************
*** 88,92 ****
mocks.VerifyAll();
-
}
--- 86,89 ----
***************
*** 94,100 ****
public void TransactionRollback()
{
! IDbProvider dbProvider = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
! IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
! IDbTransaction transaction = (IDbTransaction)mocks.CreateMock(typeof(IDbTransaction));
using (mocks.Ordered())
--- 91,97 ----
public void TransactionRollback()
{
! IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
! IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
! IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
using (mocks.Ordered())
***************
*** 131,135 ****
Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
!
mocks.VerifyAll();
--- 128,132 ----
Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
!
mocks.VerifyAll();
***************
*** 137,155 ****
[Test]
- [Ignore]
public void ParticipatingTransactionWithRollbackOnly()
{
! IDbProvider dbProvider = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
! IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
! IDbTransaction transaction = (IDbTransaction)mocks.CreateMock(typeof(IDbTransaction));
! Expect.Call(dbProvider.CreateConnection()).Return(connection);
! connection.Open();
! LastCall.On(connection).Repeat.Once();
! Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
! //standard tx timeout.
! transaction.Rollback();
! LastCall.On(transaction).Repeat.Once();
! connection.Dispose();
AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
--- 134,155 ----
[Test]
public void ParticipatingTransactionWithRollbackOnly()
{
! IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
! IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
! IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
! using (mocks.Ordered())
! {
! Expect.Call(dbProvider.CreateConnection()).Return(connection);
! connection.Open();
! LastCall.On(connection).Repeat.Once();
! Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
! //standard tx timeout.
! transaction.Rollback();
! LastCall.On(transaction).Repeat.Once();
! connection.Dispose();
! }
! mocks.ReplayAll();
AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
***************
*** 172,176 ****
outerTransactionBoundaryReached = true;
tm.Commit(ts);
! } catch (UnexpectedRollbackException)
{
// expected
--- 172,178 ----
outerTransactionBoundaryReached = true;
tm.Commit(ts);
! Assert.Fail("Should have thrown UnexpectedRollbackException");
! }
! catch (UnexpectedRollbackException)
{
// expected
***************
*** 182,188 ****
--- 184,531 ----
}
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsFalse(synch.beforeCommitCalled);
+ Assert.IsTrue(synch.beforeCompletionCalled);
+ Assert.IsFalse(synch.afterCommitCalled);
+ Assert.IsTrue(synch.afterCompletionCalled);
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ [Ignore]
+ public void ParticipatingTransactionWithTransactionStartedFromSynch()
+ {
+ }
+
+ [Test]
+ [Ignore]
+ public void ParticipatingTransactionWithRollbackOnlyAndInnerSynch()
+ {
+ }
+
+ [Test]
+ public void PropagationRequiresNewWithExistingTransaction()
+ {
+ IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
+ IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
+ IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
+
+ Expect.Call(dbProvider.CreateConnection()).Return(connection).Repeat.Twice();
+ connection.Open();
+ LastCall.On(connection).Repeat.Twice();
+ Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction).Repeat.Twice();
+ //standard tx timeout.
+ transaction.Rollback();
+ LastCall.On(transaction).Repeat.Once();
+
+ transaction.Commit();
+ LastCall.On(transaction).Repeat.Once();
+
+ connection.Dispose();
+ LastCall.On(connection).Repeat.Twice();
+ //}
+ mocks.ReplayAll();
+
+
+ AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.RequiresNew;
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ tt.Execute(new PropagationRequiresNewWithExistingTransactionCallback(tt, dbProvider));
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void PropagationRequiresNewWithExistingTransactionAndUnrelatedDataSource()
+ {
+ IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
+ IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
+ IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
+
+ Expect.Call(dbProvider.CreateConnection()).Return(connection);
+ connection.Open();
+ LastCall.On(connection).Repeat.Once();
+ Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ transaction.Commit();
+ LastCall.On(transaction).Repeat.Once();
+ connection.Dispose();
+
+ IDbProvider dbProvider2 = (IDbProvider) mocks.CreateMock(typeof (IDbProvider));
+ IDbConnection connection2 = (IDbConnection) mocks.CreateMock(typeof (IDbConnection));
+ IDbTransaction transaction2 = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction));
+
+ Expect.Call(dbProvider2.CreateConnection()).Return(connection2);
+ connection2.Open();
+ LastCall.On(connection2).Repeat.Once();
+ Expect.Call(connection2.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction2);
+ transaction2.Rollback();
+ LastCall.On(transaction2).Repeat.Once();
+ connection2.Dispose();
+
+ mocks.ReplayAll();
+
+ AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.RequiresNew;
+
+ AdoPlatformTransactionManager tm2 = new AdoPlatformTransactionManager(dbProvider2);
+ TransactionTemplate tt2 = new TransactionTemplate(tm2);
+ tt2.PropagationBehavior = TransactionPropagation.RequiresNew;
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider2), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+
+ tt.Execute(new PropagationRequiresNewWithExistingTransactionCallback(tt2, dbProvider));
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider2), "Hasn't thread db provider");
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSource()
+ {
+ #region Mock Setup
+ IDbProvider dbProvider = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
+ IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
+ IDbTransaction transaction = (IDbTransaction)mocks.CreateMock(typeof(IDbTransaction));
+
+ Expect.Call(dbProvider.CreateConnection()).Return(connection);
+ connection.Open();
+ LastCall.On(connection).Repeat.Once();
+ Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ transaction.Rollback();
+ LastCall.On(transaction).Repeat.Once();
+ connection.Dispose();
+
+ IDbProvider dbProvider2 = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
+ IDbConnection connection2 = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
+ IDbTransaction transaction2 = (IDbTransaction)mocks.CreateMock(typeof(IDbTransaction));
+
+ Expect.Call(dbProvider2.CreateConnection()).Return(connection2);
+ connection2.Open();
+ Exception failure = new Exception("can't open connection");
+ LastCall.On(connection2).Throw(failure);
+
+ #endregion
+
+ mocks.ReplayAll();
+
+ AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.RequiresNew;
+
+ AdoPlatformTransactionManager tm2 = new AdoPlatformTransactionManager(dbProvider2);
+ tm2.TransactionSynchronization = TransactionSynchronizationState.Never;
+ TransactionTemplate tt2 = new TransactionTemplate(tm2);
+ tt2.PropagationBehavior = TransactionPropagation.RequiresNew;
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider2), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ try
+ {
+ tt.Execute(
+ new PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSourceCallback(tt2));
+ Assert.Fail("Should have thrown CannotCreateTransactionException");
+ } catch(CannotCreateTransactionException ex)
+ {
+ Assert.AreSame(failure, ex.InnerException);
+ }
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider2), "Hasn't thread db provider");
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void PropagationNotSupportedWithExistingTransaction()
+ {
+ #region Mock Setup
+ IDbProvider dbProvider = (IDbProvider)mocks.CreateMock(typeof(IDbProvider));
+ IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
+ IDbTransaction transaction = (IDbTransaction)mocks.CreateMock(typeof(IDbTransaction));
+
+ using (mocks.Ordered())
+ {
+ Expect.Call(dbProvider.CreateConnection()).Return(connection);
+ connection.Open();
+ LastCall.On(connection).Repeat.Once();
+ Expect.Call(connection.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ //standard tx timeout.
+ transaction.Commit();
+ LastCall.On(transaction).Repeat.Once();
+ connection.Dispose();
+ }
+ #endregion
+
+ mocks.ReplayAll();
+
+ AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.RequiresNew;
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ tt.Execute(new PropagationNotSupportedWithExistingTransactionCallback(tt, dbProvider));
+
+ mocks.VerifyAll();
+ }
+
+ [Test]
+ public void PropagationNeverWithExistingTransaction()
+ {
+
+ }
+ }
+
+ #region Supporting classes for PropagationNotSupportedWithExistingTransaction
+
+ internal class PropagationNotSupportedWithExistingTransactionCallback : ITransactionCallback
+ {
+ private TransactionTemplate innerTxTemplate;
+ private IDbProvider dbProvider;
+
+ public PropagationNotSupportedWithExistingTransactionCallback(TransactionTemplate transactionTemplate, IDbProvider provider)
+ {
+ innerTxTemplate = transactionTemplate;
+ dbProvider = provider;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ innerTxTemplate.PropagationBehavior = TransactionPropagation.NotSupported;
+ innerTxTemplate.Execute(new PropagationNotSupportedWithExistingTransactionCallback2(dbProvider));
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ return null;
+ }
+ }
+
+ internal class PropagationNotSupportedWithExistingTransactionCallback2 : ITransactionCallback
+ {
+ private IDbProvider provider;
+
+ public PropagationNotSupportedWithExistingTransactionCallback2(IDbProvider provider)
+ {
+ this.provider = provider;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(provider), "Hasn't thread db provider");
+ Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
+ Assert.IsTrue(!status.IsNewTransaction, "Isn't new transaction");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive);
+ status.RollbackOnly = true;
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region Supporting class for PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSource
+
+ internal class PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSourceCallback : ITransactionCallback
+ {
+ private TransactionTemplate innerTxTemplate;
+
+
+ public PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSourceCallback(TransactionTemplate transactionTemplate)
+ {
+ innerTxTemplate = transactionTemplate;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ innerTxTemplate.Execute(new PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSourceCallback2());
+ return null;
+ }
+ }
+
+ internal class PropagationRequiresNewWithExistingTransactionAndUnrelatedFailingDataSourceCallback2 : ITransactionCallback
+ {
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ status.RollbackOnly = true;
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region Supporting class for PropagationRequiresNewWithExistingTransaction
+
+ internal class PropagationRequiresNewWithExistingTransactionCallback : ITransactionCallback
+ {
+ private TransactionTemplate innerTxTemplate;
+ private IDbProvider dbProvider;
+
+ public PropagationRequiresNewWithExistingTransactionCallback(TransactionTemplate transactionTemplate,
+ IDbProvider provider)
+ {
+ innerTxTemplate = transactionTemplate;
+ dbProvider = provider;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ innerTxTemplate.Execute(new PropagationRequiresNewWithExistingTransactionCallback2(dbProvider));
+
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ return null;
+ }
+ }
+
+ internal class PropagationRequiresNewWithExistingTransactionCallback2 : ITransactionCallback
+ {
+ private IDbProvider dbProvider;
+
+ public PropagationRequiresNewWithExistingTransactionCallback2(IDbProvider dbProvider)
+ {
+ this.dbProvider = dbProvider;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(TransactionSynchronizationManager.HasResource(dbProvider), "Has thread connection");
+ Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
+ Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ status.RollbackOnly = true;
+ return null;
}
}
+ #endregion
+
#region Supporting class for TransactionCommit test
***************
*** 201,207 ****
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
return null;
-
}
}
--- 544,550 ----
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
return null;
}
}
***************
*** 250,254 ****
{
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
! Assert.IsFalse(status.RollbackOnly,"Is not rollback-only");
innerTxTemplate.Execute(new ParticipatingTxWithRollbackOnlyTxCallback2(dbProvider));
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
--- 593,597 ----
{
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
! Assert.IsFalse(status.RollbackOnly, "Is not rollback-only");
innerTxTemplate.Execute(new ParticipatingTxWithRollbackOnlyTxCallback2(dbProvider));
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
***************
*** 272,276 ****
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
! //status.RollbackOnly;
return null;
}
--- 615,619 ----
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
Assert.IsTrue(!status.IsNewTransaction, "Is existing transaction");
! status.RollbackOnly = true;
return null;
}
***************
*** 291,295 ****
public bool afterCompletionCalled;
! public TestTransactionSynchronization(IDbProvider provider, TransactionSynchronizationStatus synchronizationStatus)
{
this.provider = provider;
--- 634,639 ----
public bool afterCompletionCalled;
! public TestTransactionSynchronization(IDbProvider provider,
! TransactionSynchronizationStatus synchronizationStatus)
{
this.provider = provider;
***************
*** 300,309 ****
public void Suspend()
{
-
}
public void Resume()
{
-
}
--- 644,651 ----
|