Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv4404/Data/NHibernate
Modified Files:
HibernateTransactionManagerTests.cs
Log Message:
SPRNET-778 - AdoExceptionTranslator in HibernateTransactionManager did not have a default value
Index: HibernateTransactionManagerTests.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate/HibernateTransactionManagerTests.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** HibernateTransactionManagerTests.cs 30 Aug 2007 20:00:21 -0000 1.2
--- HibernateTransactionManagerTests.cs 20 Nov 2007 04:03:55 -0000 1.3
***************
*** 28,33 ****
--- 28,35 ----
using NUnit.Framework;
using Rhino.Mocks;
+ using Spring.Dao;
using Spring.Data.Common;
using Spring.Data.Support;
+ using Spring.Support;
using Spring.Transaction;
using Spring.Transaction.Support;
***************
*** 38,42 ****
{
/// <summary>
! /// This calss contains tests for
/// </summary>
/// <author>Mark Pollack</author>
--- 40,44 ----
{
/// <summary>
! /// This class contains tests for the HibernateTransactionManager
/// </summary>
/// <author>Mark Pollack</author>
***************
*** 494,497 ****
--- 496,591 ----
}
+
+
+ [Test]
+ public void TransactionCommitWithFlushFailure()
+ {
+ DoTransactionCommitWithFlushFailure(false);
+ }
+
+ [Test]
+ public void TransactionCommitWithFlushFailureAndFallbackTranslation()
+ {
+ DoTransactionCommitWithFlushFailure(true);
+ }
+
+ /// <summary>
+ /// Does the test transaction commit with flush failure.
+ /// </summary>
+ /// <param name="fallbackTranslation">if set to <c>true</c> if the exception throw
+ /// is of the type NHibernate.ADOException, in which case HibernateTransactionManager
+ /// will 'fallback' to using the error codes in the underlying exception thrown by
+ /// the provider, ie. a SqlException, MySqlException. Otherwise, if it is
+ /// another subclass of HibernateException, then perform a direct maping as
+ /// found in SessionFactoryUtils.ConvertHibernateAccessException.</param>
+ private void DoTransactionCommitWithFlushFailure(bool fallbackTranslation)
+ {
+ #region Mock Setup
+
+ IDbProvider provider = new TestDbProvider();
+ IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection));
+ ISessionFactory sessionFactory = (ISessionFactory)mocks.CreateMock(typeof(ISessionFactory));
+ ISession session = (ISession)mocks.CreateMock(typeof(ISession));
+ ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction));
+ Exception rootCause = null;
+ using (mocks.Ordered())
+ {
+ Expect.Call(sessionFactory.OpenSession()).Return(session);
+ Expect.Call(session.Connection).Return(connection);
+ Expect.Call(session.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction);
+ Expect.Call(session.IsOpen).Return(true);
+ transaction.Commit();
+ Exception sqlException = new TestSqlException("mymsg", "2627");
+ if (fallbackTranslation)
+ {
+ //error code 2627 will map to a DataAccessIntegrity exception in sqlserver, which is the metadata
+ //used by TestDbProvider.
+ rootCause = sqlException;
+ LastCall.On(transaction).Throw(new ADOException("mymsg", sqlException));
+ }
+ else
+ {
+ rootCause = new PropertyValueException("mymsg", typeof(string), "Name");
+ LastCall.On(transaction).Throw(rootCause);
+ }
+
+ transaction.Rollback();
+ LastCall.On(transaction).Repeat.Once();
+ Expect.Call(session.Close()).Return(null);
+ }
+
+ #endregion
+
+ mocks.ReplayAll();
+
+
+ HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory);
+ tm.DbProvider = provider;
+
+ TransactionTemplate tt = new TransactionTemplate(tm);
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ IList list = new ArrayList();
+ list.Add("test");
+ try
+ {
+ tt.Execute(new TransactionCommitWithFlushFailureCallback(sessionFactory, list));
+ Assert.Fail("Should have thrown DataIntegrityViolationException");
+ }
+ catch (DataIntegrityViolationException ex)
+ {
+ Assert.AreEqual(rootCause, ex.InnerException);
+ Assert.IsTrue(ex.Message.IndexOf("mymsg") != -1);
+ }
+
+ Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session");
+ Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
+
+ mocks.VerifyAll();
+
+
+ }
+
}
***************
*** 930,932 ****
--- 1024,1065 ----
#endregion
+ #region Supporting classes for DoTransactionCommitWithFlushFailure
+
+ public class TransactionCommitWithFlushFailureCallback : ITransactionCallback
+ {
+ private ISessionFactory sessionFactory;
+ private IList list;
+
+ public TransactionCommitWithFlushFailureCallback(ISessionFactory sessionFactory, IList list)
+ {
+ this.sessionFactory = sessionFactory;
+ this.list = list;
+ }
+
+ public object DoInTransaction(ITransactionStatus status)
+ {
+ Assert.IsTrue(TransactionSynchronizationManager.HasResource(sessionFactory), "Has thread session");
+ HibernateTemplate ht = new HibernateTemplate(sessionFactory);
+ return ht.ExecuteFind(new TransactionCommitWithFlushFailureHibernateCallback(list));
+ }
+
+
+ }
+
+ public class TransactionCommitWithFlushFailureHibernateCallback : IHibernateCallback
+ {
+ private IList list;
+ public TransactionCommitWithFlushFailureHibernateCallback(IList list)
+ {
+ this.list = list;
+ }
+
+ public object DoInHibernate(ISession session)
+ {
+ return list;
+ }
+ }
+
+ #endregion
+
}
\ No newline at end of file
|