[jboss-cvs] JBossCache/tests/functional/org/jboss/cache/transaction ...
Manik Surtani
msurtani at jboss.com
Thu Dec 14 09:38:59 EST 2006
User: msurtani
Date: 06/12/14 09:38:59
Added: tests/functional/org/jboss/cache/transaction
IsolationLevelRepeatableReadTest.java
Log:
Added more in-depth tests
Revision Changes Path
1.2 +166 -0 JBossCache/tests/functional/org/jboss/cache/transaction/IsolationLevelRepeatableReadTest.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: IsolationLevelRepeatableReadTest.java
===================================================================
RCS file: IsolationLevelRepeatableReadTest.java
diff -N IsolationLevelRepeatableReadTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ IsolationLevelRepeatableReadTest.java 14 Dec 2006 14:38:59 -0000 1.2
@@ -0,0 +1,166 @@
+package org.jboss.cache.transaction;
+
+import EDU.oswego.cs.dl.util.concurrent.Latch;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.jboss.cache.DummyTransactionManagerLookup;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.TreeCache;
+import org.jboss.cache.lock.IsolationLevel;
+import org.jboss.cache.lock.TimeoutException;
+
+import javax.transaction.NotSupportedException;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+
+/**
+ * Tests READ_COMMITED isolation level.
+ *
+ * @author <a href="mailto:ovidiu at jboss.org">Ovidiu Feodorov</a>
+ * @version $Id: IsolationLevelRepeatableReadTest.java,v 1.2 2006/12/14 14:38:59 msurtani Exp $
+ */
+
+public class IsolationLevelRepeatableReadTest extends TestCase
+{
+
+ private TreeCache cache = null;
+ private final Fqn FQN = Fqn.fromString("/a");
+ private final String KEY = "key";
+ private final String VALUE = "value";
+
+ private volatile boolean writerFailed;
+ private volatile AssertionFailedError writerError;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ writerFailed = false;
+ writerError = null;
+
+ cache = new TreeCache();
+ cache.getConfiguration().setCacheMode("LOCAL");
+ cache.getConfiguration().setIsolationLevel(IsolationLevel.REPEATABLE_READ);
+ cache.getConfiguration().setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+ cache.getConfiguration().setLockAcquisitionTimeout(1000);
+ cache.start();
+ }
+
+
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ cache.stop();
+ }
+
+ /**
+ * Test creates a cache node then starts a separate thread that removes
+ * the node inside a tx. Test confirms that the removal cannot be seen
+ * before the test commits.
+ *
+ * @throws Exception
+ */
+ public void testNodeRemoved() throws Exception
+ {
+ final Latch readerCanRead = new Latch();
+ final Latch readerDone = new Latch();
+ final Latch writerDone = new Latch();
+
+ cache.put(FQN, KEY, VALUE);
+ assertEquals(VALUE, cache.get(FQN, KEY));
+
+ // start a writer thread and a transaction
+
+ Thread writerThread = new Thread(new Runnable()
+ {
+ public void run()
+ {
+ try
+ {
+ Transaction tx = startTransaction();
+
+ // change VALUE in a transaction
+ cache.remove(FQN);
+
+ // notify the reading thread
+ readerCanRead.release();
+
+ readerDone.acquire();
+
+ tx.commit();
+ }
+ catch (AssertionFailedError e)
+ {
+ writerError = e;
+ }
+ catch (Throwable t)
+ {
+ t.printStackTrace();
+ writerFailed = true;
+ }
+ finally
+ {
+ System.out.println("writer thread exits");
+ readerCanRead.release();
+ writerDone.release();
+ }
+ }
+ }, "WRITER");
+ writerThread.start();
+
+ try
+ {
+ // wait until the writer thread changes the value in a transaction,
+ // but it did not yet commit or roll back.
+ readerCanRead.acquire();
+
+ // I shouldn't be able to see the "dirty" value
+ assertEquals("2nd thread cannot see uncommitted changes",
+ VALUE, cache.get(FQN, KEY));
+ }
+ catch (TimeoutException t)
+ {
+ // ignore, this is good
+ }
+ finally
+ {
+ System.out.println("reader thread exits");
+ readerDone.release();
+ }
+
+ // wait for the writer to finish
+ writerDone.acquire();
+
+ assertNull("Node was not removed", cache.get(FQN));
+
+ // If any assertion failed, throw on the AssertionFailedError
+
+ if (writerError != null)
+ {
+ throw writerError;
+ }
+
+ if (writerFailed)
+ {
+ fail("The writer thread exited incorrectly. Watch the log for previous stack traces");
+ }
+
+ }
+
+ private Transaction startTransaction() throws SystemException, NotSupportedException
+ {
+ DummyTransactionManager mgr = DummyTransactionManager.getInstance();
+ mgr.begin();
+ return mgr.getTransaction();
+ }
+
+ public static Test suite()
+ {
+
+ return new TestSuite(IsolationLevelRepeatableReadTest.class);
+
+ }
+
+}
More information about the jboss-cvs-commits
mailing list