Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Data/Core
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv29810/Data/Core
Added Files:
TxScopeTransactionManagerIntegrationTests.cs
TxScopeTransactionManagerTests.cs
TxScopeTransactionManagerTypeMockTests.cs
Log Message:
SPRNET-761 - Add unit tests for TxScopePlatformTransactionManager
Introduce ITransactionScopeAdapter to make it testable with Mocks
added TypeMock based unit test that is not used but nice to have for future reference
--- NEW FILE: TxScopeTransactionManagerTests.cs ---
#if NET_2_0
#region License
/*
* Copyright © 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#endregion
#region Imports
using System;
using System.Transactions;
using NUnit.Framework;
using Rhino.Mocks;
using Spring.Data.Support;
using Spring.Transaction;
using Spring.Transaction.Support;
#endregion
namespace Spring.Data.Core
{
/// <summary>
/// This calss contains tests for
/// </summary>
/// <author>Mark Pollack</author>
/// <version>$Id: TxScopeTransactionManagerTests.cs,v 1.1 2007/11/30 18:38:59 markpollack Exp $</version>
[TestFixture]
public class TxScopeTransactionManagerTests
{
private MockRepository mocks;
[SetUp]
public void Setup()
{
mocks = new MockRepository();
}
[Test]
public void TransactionCommit()
{
ITransactionScopeAdapter txAdapter = (ITransactionScopeAdapter) mocks.CreateMock(typeof(ITransactionScopeAdapter));
using (mocks.Ordered())
{
TransactionOptions txOptions = new TransactionOptions();
txOptions.IsolationLevel = IsolationLevel.Unspecified;
txAdapter.CreateTransactionScope(TransactionScopeOption.Required, txOptions, EnterpriseServicesInteropOption.None);
Expect.Call(txAdapter.RollbackOnly).Return(false);
txAdapter.Complete();
txAdapter.Dispose();
}
mocks.ReplayAll();
IPlatformTransactionManager tm = new TxScopeTransactionManager(txAdapter);
TransactionTemplate tt = new TransactionTemplate(tm);
tt.Execute(delegate(ITransactionStatus status)
{
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
return null;
});
Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
mocks.VerifyAll();
}
[Test]
public void TransactionRollback()
{
ITransactionScopeAdapter txAdapter = (ITransactionScopeAdapter)mocks.CreateMock(typeof(ITransactionScopeAdapter));
using (mocks.Ordered())
{
TransactionOptions txOptions = new TransactionOptions();
txOptions.IsolationLevel = IsolationLevel.Unspecified;
txAdapter.CreateTransactionScope(TransactionScopeOption.Required, txOptions, EnterpriseServicesInteropOption.None);
txAdapter.Dispose();
}
mocks.ReplayAll();
IPlatformTransactionManager tm = new TxScopeTransactionManager(txAdapter);
TransactionTemplate tt = new TransactionTemplate(tm);
Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
Exception ex = new ArgumentException("test exception");
try
{
tt.Execute(delegate(ITransactionStatus status)
{
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
if (ex != null) throw ex;
return null;
});
Assert.Fail("Should have thrown exception");
}
catch (ArgumentException e)
{
Assert.AreEqual(ex, e);
}
Assert.IsTrue(!TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active");
mocks.VerifyAll();
}
[Test]
public void PropagationRequiresNewWithExistingTransaction()
{
ITransactionScopeAdapter txAdapter = (ITransactionScopeAdapter)mocks.CreateMock(typeof(ITransactionScopeAdapter));
using (mocks.Ordered())
{
TransactionOptions txOptions = new TransactionOptions();
txOptions.IsolationLevel = IsolationLevel.Unspecified;
txAdapter.CreateTransactionScope(TransactionScopeOption.RequiresNew, txOptions, EnterpriseServicesInteropOption.None);
//inner tx actions
txAdapter.CreateTransactionScope(TransactionScopeOption.RequiresNew, txOptions, EnterpriseServicesInteropOption.None);
txAdapter.Dispose();
//end inner tx actions
Expect.Call(txAdapter.RollbackOnly).Return(false);
txAdapter.Complete();
txAdapter.Dispose();
}
mocks.ReplayAll();
IPlatformTransactionManager tm = new TxScopeTransactionManager(txAdapter);
TransactionTemplate tt = new TransactionTemplate(tm);
tt.PropagationBehavior = TransactionPropagation.RequiresNew;
tt.Execute(delegate(ITransactionStatus status)
{
Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
tt.Execute(delegate(ITransactionStatus status2)
{
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive, "Synchronization active");
Assert.IsTrue(status2.IsNewTransaction, "Is new transaction");
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
status2.RollbackOnly = true;
return null;
});
Assert.IsTrue(status.IsNewTransaction, "Is new transaction");
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive);
return null;
});
mocks.VerifyAll();
}
}
}
#endif
--- NEW FILE: TxScopeTransactionManagerTypeMockTests.cs ---
(This appears to be a binary file; contents omitted.)
--- NEW FILE: TxScopeTransactionManagerIntegrationTests.cs ---
#if NET_2_0
#region License
/*
* Copyright © 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#endregion
#region Imports
using System.Reflection;
using NUnit.Framework;
using Rhino.Mocks;
using Spring.Data.Core;
using Spring.Objects;
using Spring.Transaction;
using Spring.Transaction.Support;
#endregion
namespace Spring.Data.Core
{
/// <summary>
/// This class contains tests for TxScopeTransactionManager and will directly a real TransactionScope object
/// but does not access any database
/// </summary>
/// <author>Mark Pollack</author>
/// <version>$Id: TxScopeTransactionManagerIntegrationTests.cs,v 1.1 2007/11/30 18:38:59 markpollack Exp $</version>
[TestFixture]
public class TxScopeTransactionManagerIntegrationTests
{
private MockRepository mocks;
[SetUp]
public void Setup()
{
mocks = new MockRepository();
}
[TearDown]
public void TearDown()
{
Assert.IsTrue(TransactionSynchronizationManager.ResourceDictionary.Count == 0);
Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsNull(TransactionSynchronizationManager.CurrentTransactionName);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
Assert.AreEqual(System.Data.IsolationLevel.Unspecified, TransactionSynchronizationManager.CurrentTransactionIsolationLevel);
Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive);
}
[Test]
public void Commit()
{
TxScopeTransactionManager tm = new TxScopeTransactionManager();
TransactionTemplate tt = new TransactionTemplate(tm);
//tt.Name = "txName";
Assert.AreEqual(TransactionSynchronizationState.Always, tm.TransactionSynchronization);
Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsNull(TransactionSynchronizationManager.CurrentTransactionName);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
tt.Execute(CommitTxDelegate);
Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsNull(TransactionSynchronizationManager.CurrentTransactionName);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
}
public object CommitTxDelegate(ITransactionStatus status)
{
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
return null;
}
[Test]
public void TransactionInformation()
{
TxScopeTransactionManager tm = new TxScopeTransactionManager();
TransactionTemplate tt = new TransactionTemplate(tm);
tt.TransactionIsolationLevel = System.Data.IsolationLevel.ReadUncommitted;
tt.Execute(TransactionInformationTxDelegate);
}
public object TransactionInformationTxDelegate(ITransactionStatus status)
{
Assert.AreEqual(System.Transactions.IsolationLevel.ReadUncommitted,
System.Transactions.Transaction.Current.IsolationLevel);
Assert.AreEqual(System.Data.IsolationLevel.ReadUncommitted,
TransactionSynchronizationManager.CurrentTransactionIsolationLevel);
return null;
}
[Test]
public void Rollback()
{
ITransactionSynchronization sync =
(ITransactionSynchronization) mocks.DynamicMock(typeof (ITransactionSynchronization));
sync.BeforeCompletion();
LastCall.On(sync).Repeat.Once();
sync.AfterCompletion(TransactionSynchronizationStatus.Rolledback);
LastCall.On(sync).Repeat.Once();
mocks.ReplayAll();
TxScopeTransactionManager tm = new TxScopeTransactionManager();
TransactionTemplate tt = new TransactionTemplate(tm);
tt.TransactionTimeout = 10;
tt.Name = "txName";
Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive);
Assert.IsNull(TransactionSynchronizationManager.CurrentTransactionName);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
tt.Execute(delegate (ITransactionStatus status)
{
Assert.IsTrue(TransactionSynchronizationManager.SynchronizationActive);
TransactionSynchronizationManager.RegisterSynchronization(sync);
Assert.AreEqual("txName", TransactionSynchronizationManager.CurrentTransactionName);
Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly);
status.RollbackOnly = true;
return null;
}
);
mocks.VerifyAll();
}
}
}
#endif
|