[jboss-cvs] JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels ...
Manik Surtani
manik at jboss.org
Tue Jun 12 11:31:49 EDT 2007
User: msurtani
Date: 07/06/12 11:31:49
Added: tests/functional/org/jboss/cache/transaction/isolationlevels
RepeatableReadTest.java NoneTest.java
IsolationLevelTestBase.java SerializableTest.java
ReadCommittedTest.java ReadUncommittedTest.java
Log:
Added more comprehensive set of tests around isolation levels - JBCACHE-1029
Revision Changes Path
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/RepeatableReadTest.java
Index: RepeatableReadTest.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import org.jboss.cache.lock.IsolationLevel;
/**
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public class RepeatableReadTest extends IsolationLevelTestBase
{
public RepeatableReadTest()
{
isolationLevel = IsolationLevel.REPEATABLE_READ;
}
}
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/NoneTest.java
Index: NoneTest.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import org.jboss.cache.lock.IsolationLevel;
/**
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public class NoneTest extends IsolationLevelTestBase
{
public NoneTest()
{
isolationLevel = IsolationLevel.NONE;
}
}
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/IsolationLevelTestBase.java
Index: IsolationLevelTestBase.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import junit.framework.TestCase;
import org.jboss.cache.Cache;
import org.jboss.cache.CacheFactory;
import org.jboss.cache.DefaultCacheFactory;
import org.jboss.cache.Fqn;
import org.jboss.cache.lock.IsolationLevel;
import static org.jboss.cache.lock.IsolationLevel.*;
import org.jboss.cache.transaction.DummyTransactionManagerLookup;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import java.util.Collection;
import java.util.HashSet;
/**
* Base class for testing isolation levels.
*
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public abstract class IsolationLevelTestBase extends TestCase
{
protected IsolationLevel isolationLevel;
protected Cache<String, String> cache;
protected TransactionManager transactionManager;
protected Fqn<String> fqn = Fqn.fromString("/a/b/c");
protected Fqn<String> fqnChild1 = Fqn.fromString("/a/b/c/child1");
protected Fqn<String> fqnChild2 = Fqn.fromString("/a/b/c/child2");
protected String k = "key", v = "value";
protected Collection<IsolationLevel> allowedLevels;
protected void setUp()
{
CacheFactory<String, String> cf = DefaultCacheFactory.getInstance();
cache = cf.createCache(false);
cache.getConfiguration().setIsolationLevel(isolationLevel);
cache.getConfiguration().setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
// very short so the tests don't take ages
cache.getConfiguration().setLockAcquisitionTimeout(250);
cache.start();
transactionManager = cache.getConfiguration().getRuntimeConfig().getTransactionManager();
allowedLevels = new HashSet<IsolationLevel>();
}
protected void tearDown()
{
if (transactionManager != null)
{
// roll back any ongoing, potentially stuck transactions from failed tests.
try
{
transactionManager.rollback();
}
catch (Exception e)
{
// no-op
}
}
cache.stop();
cache.destroy();
cache = null;
allowedLevels = null;
}
public void testDirtyRead() throws Exception
{
// should be allowed in all cases except R_C, R_R and Serializable
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
// do a write
transactionManager.begin();
cache.put(fqn, k, v);
Transaction t1 = transactionManager.suspend();
// and now a simultaneous read
transactionManager.begin();
try
{
assertEquals(v, cache.get(fqn, k));
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
transactionManager.rollback();
}
public void testDirtyReadWithNoData() throws Exception
{
// should be allowed in all cases except Serializable
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
allowedLevels.add(READ_COMMITTED);
allowedLevels.add(REPEATABLE_READ);
// do a write
transactionManager.begin();
assertNull(cache.get(fqn, k));
Transaction t1 = transactionManager.suspend();
// and now a simultaneous read
transactionManager.begin();
try
{
cache.put(fqn, k, v);
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
if (allowedLevels.contains(isolationLevel))
{
assertEquals(v, cache.get(fqn, k));
}
else
{
assertNull(cache.get(fqn, k));
}
transactionManager.rollback();
}
public void testTwoReads() throws Exception
{
// should be allowed in all cases except Serializable
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
allowedLevels.add(READ_COMMITTED);
allowedLevels.add(REPEATABLE_READ);
// set up some data
cache.put(fqn, k, v);
// do a read
transactionManager.begin();
assertEquals(v, cache.get(fqn, k));
Transaction t1 = transactionManager.suspend();
// and now another simultaneous read
transactionManager.begin();
try
{
assertEquals(v, cache.get(fqn, k));
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
transactionManager.rollback();
}
public void testTwoWrites() throws Exception
{
// should only be allowed for IsolationLevel.NONE
allowedLevels.add(NONE);
// set up some data
cache.put(fqn, k, v);
// do a write
transactionManager.begin();
cache.put(fqn, k, v);
Transaction t1 = transactionManager.suspend();
// and now another simultaneous write
transactionManager.begin();
try
{
cache.put(fqn, k, v);
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
transactionManager.rollback();
}
public void testNonRepeatableRead() throws Exception
{
// should be allowed in all cases except R_R and Serializable
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
allowedLevels.add(READ_COMMITTED);
// set up some data
cache.put(fqn, k, v);
// do a read
transactionManager.begin();
assertEquals(v, cache.get(fqn, k));
Transaction t1 = transactionManager.suspend();
// and now a simultaneous write
transactionManager.begin();
try
{
cache.put(fqn, k, v);
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
assertEquals(v, cache.get(fqn, k));
transactionManager.rollback();
}
public void testNonRepeatableReadWithNoData() throws Exception
{
// should be allowed in all cases except R_R and Serializable
// This still does happen with R_R though since the database analogy breaks down here.
// Since the node does not exist, it cannot be locked for repeatable read.
// See http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4036036
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
allowedLevels.add(READ_COMMITTED);
allowedLevels.add(REPEATABLE_READ);
// do a read
transactionManager.begin();
assertNull(cache.get(fqn, k));
Transaction t1 = transactionManager.suspend();
// and now a simultaneous write
transactionManager.begin();
try
{
cache.put(fqn, k, v);
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
if (allowedLevels.contains(isolationLevel))
{
assertEquals(v, cache.get(fqn, k));
}
else
{
assertNull(cache.get(fqn, k));
}
transactionManager.rollback();
}
public void testPhantomRead() throws Exception
{
// should be allowed in all cases except Serializable
allowedLevels.add(NONE);
allowedLevels.add(READ_UNCOMMITTED);
allowedLevels.add(READ_COMMITTED);
allowedLevels.add(REPEATABLE_READ);
// set up some data
cache.put(fqn, k, v);
cache.put(fqnChild1, k, v);
// do a read
transactionManager.begin();
int numChildren = cache.getRoot().getChild(fqn).getChildren().size();
assertEquals(1, numChildren);
Transaction t1 = transactionManager.suspend();
// and now a simultaneous write
transactionManager.begin();
try
{
cache.put(fqnChild2, k, v);
transactionManager.commit();
if (!allowedLevels.contains(isolationLevel))
{
fail("Should have thrown an exception");
}
}
catch (Exception e)
{
if (allowedLevels.contains(isolationLevel))
{
throw e;
}
}
transactionManager.resume(t1);
numChildren = cache.getRoot().getChild(fqn).getChildren().size();
assertEquals(allowedLevels.contains(isolationLevel) ? 2 : 1, numChildren);
transactionManager.rollback();
}
}
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/SerializableTest.java
Index: SerializableTest.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import org.jboss.cache.lock.IsolationLevel;
/**
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public class SerializableTest extends IsolationLevelTestBase
{
public SerializableTest()
{
isolationLevel = IsolationLevel.SERIALIZABLE;
}
}
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/ReadCommittedTest.java
Index: ReadCommittedTest.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import org.jboss.cache.lock.IsolationLevel;
/**
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public class ReadCommittedTest extends IsolationLevelTestBase
{
public ReadCommittedTest()
{
isolationLevel = IsolationLevel.READ_COMMITTED;
}
}
1.1 date: 2007/06/12 15:31:49; author: msurtani; state: Exp;JBossCache/tests/functional/org/jboss/cache/transaction/isolationlevels/ReadUncommittedTest.java
Index: ReadUncommittedTest.java
===================================================================
package org.jboss.cache.transaction.isolationlevels;
import org.jboss.cache.lock.IsolationLevel;
/**
* @author <a href="mailto:manik at jboss.org">Manik Surtani</a>
* @since 2.0.0
*/
public class ReadUncommittedTest extends IsolationLevelTestBase
{
public ReadUncommittedTest()
{
isolationLevel = IsolationLevel.READ_UNCOMMITTED;
}
}
More information about the jboss-cvs-commits
mailing list