Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1722
Modified Files:
HibernateTransactionManagerTests.cs
Log Message:
SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction.
SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager
Index: HibernateTransactionManagerTests.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate/HibernateTransactionManagerTests.cs,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** HibernateTransactionManagerTests.cs 29 Aug 2007 03:42:26 -0000 1.1
--- HibernateTransactionManagerTests.cs 30 Aug 2007 20:00:21 -0000 1.2
***************
*** 363,379 ****
ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction));
! Expect.Call(sessionFactory.OpenSession()).Return(session).Repeat.Twice();
! Expect.Call(session.Connection).Return(connection);
-
- Expect.Call(session.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
- Expect.Call(session.IsOpen).Return(true);
- Expect.Call(session.FlushMode).Return(FlushMode.Auto).Repeat.Twice();
- session.Flush();
- LastCall.On(session).Repeat.Twice();
- transaction.Commit();
- LastCall.On(transaction).Repeat.Once();
- Expect.Call(session.Close()).Return(null).Repeat.Twice();
mocks.ReplayAll();
--- 363,381 ----
ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction));
! //using (mocks.Ordered())
! //{
! Expect.Call(sessionFactory.OpenSession()).Return(session).Repeat.Twice();
! Expect.Call(session.Connection).Return(connection);
+ Expect.Call(session.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ Expect.Call(session.IsOpen).Return(true);
+ Expect.Call(session.FlushMode).Return(FlushMode.Auto).Repeat.Twice();
+ session.Flush();
+ LastCall.On(session).Repeat.Twice();
+ transaction.Commit();
+ LastCall.On(transaction).Repeat.Once();
+ Expect.Call(session.Close()).Return(null).Repeat.Twice();
+ //}
mocks.ReplayAll();
***************
*** 394,397 ****
--- 396,497 ----
}
+ [Test]
+ public void TransactionWithPropagationSupports()
+ {
+ ISessionFactory sessionFactory = (ISessionFactory)mocks.CreateMock(typeof(ISessionFactory));
+ ISession session = (ISession)mocks.CreateMock(typeof(ISession));
+
+ Expect.Call(sessionFactory.OpenSession()).Return(session);
+ Expect.Call(session.FlushMode).Return(FlushMode.Never);
+ session.FlushMode = FlushMode.Auto;
+ LastCall.IgnoreArguments();
+ session.Flush();
+ LastCall.IgnoreArguments();
+ session.FlushMode = FlushMode.Never;
+ Expect.Call(session.FlushMode).Return(FlushMode.Never);
+ Expect.Call(session.Close()).Return(null);
+
+ mocks.ReplayAll();
+
+
+ LocalSessionFactoryObjectStub lsfo = new LocalSessionFactoryObjectStub(sessionFactory);
+ lsfo.AfterPropertiesSet();
+ ISessionFactory sfProxy = (ISessionFactory) lsfo.GetObject();
+ Assert.IsNotNull(sfProxy);
+
+ HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory);
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.Supports;
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+
+ tt.Execute(new TransactionWithPropagationSupportsTxCallback(sessionFactory));
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+
+ mocks.VerifyAll();
+
+ }
+
+ [Test]
+ public void TransactionWithPropagationSupportsAndInnerTransaction()
+ {
+ IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
+ ISessionFactory sessionFactory = (ISessionFactory)mocks.CreateMock(typeof(ISessionFactory));
+ ISession session1 = (ISession)mocks.CreateMock(typeof(ISession));
+ ISession session2 = (ISession)mocks.CreateMock(typeof(ISession));
+ ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction));
+
+ Expect.Call(sessionFactory.OpenSession()).Return(session1);
+ Expect.Call(session1.Connection).Return(connection);
+ Expect.Call(session1.SessionFactory).Return(sessionFactory);
+ Expect.Call(session1.FlushMode).Return(FlushMode.Auto).Repeat.Twice();
+
+ session1.Flush();
+ LastCall.IgnoreArguments().Repeat.Twice();
+ Expect.Call(session1.Close()).Return(null);
+
+ Expect.Call(sessionFactory.OpenSession()).Return(session2);
+ Expect.Call(session2.Connection).Return(connection).Repeat.Twice();
+ Expect.Call(session2.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ Expect.Call(session2.FlushMode).Return(FlushMode.Auto);
+ session2.Flush();
+ LastCall.IgnoreArguments();
+ Expect.Call(session2.IsOpen).Return(true);
+
+
+ transaction.Commit();
+ LastCall.On(transaction).Repeat.Once();
+
+
+ Expect.Call(session2.Close()).Return(null);
+
+ mocks.ReplayAll();
+
+ LocalSessionFactoryObjectStub lsfo = new LocalSessionFactoryObjectStub(sessionFactory);
+ lsfo.AfterPropertiesSet();
+ ISessionFactory sfProxy = (ISessionFactory)lsfo.GetObject();
+ Assert.IsNotNull(sfProxy);
+
+ HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory);
+
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ tt.PropagationBehavior = TransactionPropagation.Supports;
+ TransactionTemplate tt2 = new TransactionTemplate(tm);
+ tt2.PropagationBehavior = TransactionPropagation.Required;
+
+ HibernateTemplate ht = new HibernateTemplate(sessionFactory);
+ ht.TemplateFlushMode = TemplateFlushMode.Eager;
+ ht.ExposeNativeSession = true;
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+
+ tt.Execute(new TransactionWithPropagationSupportsAndInnerTransactionTxCallback(tt2, sessionFactory, ht, session1, session2));
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+
+ mocks.ReplayAll();
+
+ }
}
***************
*** 717,719 ****
--- 817,932 ----
#endregion
+ #region Supporting classes for test TransactionWithPropagationSupports
+
+ public class TransactionWithPropagationSupportsTxCallback : ITransactionCallback
+ {
+ private ISessionFactory sf;
+ public TransactionWithPropagationSupportsTxCallback(ISessionFactory sf)
+ {
+
+ this.sf = sf;
+
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sf), "Hasn't thread session");
+ Assert.IsTrue(!status.IsNewTransaction, "Is not new transaction");
+
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive);
+
+ HibernateTemplate ht = new HibernateTemplate(sf);
+ ht.TemplateFlushMode = TemplateFlushMode.Eager;
+ object returnValue = ht.Execute(new HibernateDelegate(Del));
+ Assert.IsTrue(TransactionSynchronizationManager.HasResource(sf), "Has thread session");
+ return null;
+ }
+
+ private object Del(ISession session)
+ {
+ return null;
+ }
+ }
+
+ #endregion
+
+
+ #region Supporting classes for test ParticipatingTransactionWithWithNotSupported
+
+ public class TransactionWithPropagationSupportsAndInnerTransactionTxCallback : ITransactionCallback
+ {
+ private TransactionTemplate tt;
+ private ISessionFactory sf;
+ private HibernateTemplate ht;
+ private ISession session1;
+ private ISession session2;
+
+ public TransactionWithPropagationSupportsAndInnerTransactionTxCallback(TransactionTemplate tt,
+ ISessionFactory sf, HibernateTemplate ht, ISession session1, ISession session2)
+ {
+ this.tt = tt;
+ this.sf = sf;
+ this.ht = ht;
+ this.session1 = session1;
+ this.session2 = session2;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sf), "Hasn't thread session");
+ Assert.IsTrue(!status.IsNewTransaction, "Is not new transaction");
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive);
+
+ ht.Execute(new HibernateDelegate(HibernateDelegate));
+
+ Assert.IsTrue(TransactionSynchronizationManager.HasResource(sf), "Has thread session");
+
+ tt.Execute(new PropagationSupportsTxCallback(ht, session2));
+
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive);
+
+ return null;
+ }
+
+ private object HibernateDelegate(ISession session)
+ {
+ Assert.AreSame(session1, session);
+ return null;
+ }
+
+ public class PropagationSupportsTxCallback : ITransactionCallback
+ {
+ private HibernateTemplate ht;
+ private ISession session2;
+
+ public PropagationSupportsTxCallback(HibernateTemplate ht, ISession session2)
+ {
+ this.ht = ht;
+ this.session2 = session2;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ return ht.Execute(new HibernateDelegate(HibernateDelegate));
+ }
+
+ private object HibernateDelegate(ISession session)
+ {
+ Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
+ Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
+ Assert.AreSame(session2, session);
+ return null;
+ }
+ }
+
+
+ }
+
+
+
+ #endregion
+
}
\ No newline at end of file
|