Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Data
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv8307
Modified Files:
AdoPlatformTransactionManagerTests.cs
Log Message:
add some tests for AdoPlatformTransactionManager
Index: AdoPlatformTransactionManagerTests.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Data/AdoPlatformTransactionManagerTests.cs,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** AdoPlatformTransactionManagerTests.cs 3 Jul 2007 22:30:29 -0000 1.1
--- AdoPlatformTransactionManagerTests.cs 13 Oct 2007 22:42:39 -0000 1.2
***************
*** 21,25 ****
--- 21,32 ----
#region Imports
+ using System;
+ using System.Data;
using NUnit.Framework;
+ using Rhino.Mocks;
+ using Spring.Data.Common;
+ using Spring.Data.Core;
+ using Spring.Transaction;
+ using Spring.Transaction.Support;
#endregion
***************
*** 35,49 ****
public class AdoPlatformTransactionManagerTests
{
[SetUp]
public void Setup()
{
}
[Test]
! public void Test()
{
}
!
}
}
\ No newline at end of file
--- 42,345 ----
public class AdoPlatformTransactionManagerTests
{
+ private MockRepository mocks;
+
[SetUp]
public void Setup()
{
+ mocks = new MockRepository();
}
+ // todo test tx sync calls.
+
[Test]
! public void TransactionCommit()
{
+ 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();
+ }
+
+ mocks.ReplayAll();
+
+ AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider);
+ TransactionTemplate tt = new TransactionTemplate(tm);
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ object result = tt.Execute(new TransactionCommitTxCallback(dbProvider));
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ mocks.VerifyAll();
+
}
! [Test]
! 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())
! {
! 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);
! TransactionTemplate tt = new TransactionTemplate(tm);
!
! Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
! Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
!
! Exception ex = new ArgumentException("test exception");
! try
! {
! tt.Execute(new TransactionRollbackTxCallback(dbProvider, ex));
! Assert.Fail("Should have thrown exception");
! }
! catch (ArgumentException e)
! {
! Assert.AreEqual(ex, e);
! }
!
! Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
! Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
!
!
! mocks.VerifyAll();
! }
!
! [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));
!
! 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);
!
! Assert.IsTrue(!TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider");
! Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
!
! ITransactionStatus ts = tm.GetTransaction(new DefaultTransactionDefinition());
! TestTransactionSynchronization synch =
! new TestTransactionSynchronization(dbProvider, TransactionSynchronizationStatus.Rolledback);
! TransactionSynchronizationManager.RegisterSynchronization(synch);
!
! bool outerTransactionBoundaryReached = false;
! try
! {
! Assert.IsTrue(ts.IsNewTransaction);
! TransactionTemplate tt = new TransactionTemplate(tm);
! TransactionTemplate tt2 = new TransactionTemplate(tm);
! tt.Execute(new ParticipatingTxWithRollbackOnlyTxCallback(tt2, dbProvider));
! outerTransactionBoundaryReached = true;
! tm.Commit(ts);
! } catch (UnexpectedRollbackException ex)
! {
! // expected
! if (!outerTransactionBoundaryReached)
! {
! tm.Rollback(ts);
! }
! Assert.IsTrue(outerTransactionBoundaryReached);
! }
!
! }
! }
!
! #region Supporting class for TransactionCommit test
!
! internal class TransactionCommitTxCallback : ITransactionCallback
! {
! private IDbProvider provider;
!
! public TransactionCommitTxCallback(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, "Is new transaction");
! Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
! return null;
!
! }
! }
!
! #endregion
!
! #region Supporting class for TransactionRollback test
!
! internal class TransactionRollbackTxCallback : ITransactionCallback
! {
! private IDbProvider provider;
! private Exception exception;
!
! public TransactionRollbackTxCallback(IDbProvider provider, Exception exception)
! {
! this.provider = provider;
! this.exception = exception;
! }
!
! public object DoInTransaction(ITransactionStatus status)
! {
! Assert.IsTrue(TransactionSynchronizationManager.HasResource(provider), "Hasn't thread db provider");
! Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
! Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
! throw exception;
! }
! }
!
! #endregion
!
! #region Supporting class for ParticipatingTxWithRollbackOnly test
!
! internal class ParticipatingTxWithRollbackOnlyTxCallback : ITransactionCallback
! {
! private TransactionTemplate innerTxTemplate;
! private IDbProvider dbProvider;
!
!
! public ParticipatingTxWithRollbackOnlyTxCallback(TransactionTemplate transactionTemplate, IDbProvider dbProvider)
! {
! innerTxTemplate = transactionTemplate;
! this.dbProvider = dbProvider;
! }
!
! public object DoInTransaction(ITransactionStatus status)
! {
! 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");
! Assert.IsTrue(status.RollbackOnly, "Is rollback-only");
! return null;
! }
! }
!
! internal class ParticipatingTxWithRollbackOnlyTxCallback2 : ITransactionCallback
! {
! private IDbProvider dbProvider;
!
! public ParticipatingTxWithRollbackOnlyTxCallback2(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 existing transaction");
! //status.RollbackOnly;
! return null;
! }
}
+
+ #endregion
+
+ #region Helper class
+
+ internal class TestTransactionSynchronization : ITransactionSynchronization
+ {
+ private IDbProvider provider;
+ private TransactionSynchronizationStatus status;
+
+ public bool beforeCommitCalled;
+ public bool beforeCompletionCalled;
+ public bool afterCommitCalled;
+ public bool afterCompletionCalled;
+
+ public TestTransactionSynchronization(IDbProvider provider, TransactionSynchronizationStatus synchronizationStatus)
+ {
+ this.provider = provider;
+ status = synchronizationStatus;
+ }
+
+
+ public void Suspend()
+ {
+
+ }
+
+ public void Resume()
+ {
+
+ }
+
+ public void BeforeCommit(bool readOnly)
+ {
+ if (status == TransactionSynchronizationStatus.Committed)
+ {
+ Assert.Fail("Should never be called");
+ }
+ Assert.IsFalse(beforeCommitCalled);
+ beforeCommitCalled = true;
+ }
+
+ public void AfterCommit()
+ {
+ if (status != TransactionSynchronizationStatus.Committed)
+ {
+ Assert.Fail("Should never be called");
+ }
+ Assert.IsFalse(afterCommitCalled);
+ afterCommitCalled = true;
+ }
+
+ public void BeforeCompletion()
+ {
+ Assert.IsFalse(beforeCompletionCalled);
+ beforeCompletionCalled = true;
+ }
+
+ public void AfterCompletion(TransactionSynchronizationStatus status)
+ {
+ Assert.IsFalse(afterCompletionCalled);
+ afterCompletionCalled = true;
+ Assert.IsTrue(status == this.status);
+ Assert.IsTrue(TransactionSynchronizationManager.HasResource(provider));
+ }
+ }
+
+ #endregion
}
\ No newline at end of file
|