You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ol...@apache.org on 2003/05/18 17:11:58 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/otm TestKit.java OtmExamples.java
olegnitz 2003/05/18 08:11:58
Modified: src/test/org/apache/ojb/otm OtmExamples.java
Added: src/test/org/apache/ojb/otm TestKit.java
Log:
Added test for TimeoutStrategy
Revision Changes Path
1.7 +89 -15 db-ojb/src/test/org/apache/ojb/otm/OtmExamples.java
Index: OtmExamples.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/otm/OtmExamples.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- OtmExamples.java 18 May 2003 09:50:02 -0000 1.6
+++ OtmExamples.java 18 May 2003 15:11:58 -0000 1.7
@@ -8,9 +8,10 @@
import org.apache.ojb.broker.PersistenceBrokerFactory;
import org.apache.ojb.otm.core.BaseConnection;
import org.apache.ojb.otm.core.Transaction;
-import org.apache.ojb.otm.kit.SimpleKit;
import org.apache.ojb.otm.lock.LockType;
import org.apache.ojb.otm.lock.LockingException;
+import org.apache.ojb.otm.lock.wait.NoWaitStrategy;
+import org.apache.ojb.otm.lock.wait.TimeoutStrategy;
/**
* Demo Application that shows basic concepts for Applications
@@ -19,7 +20,7 @@
public class OtmExamples extends TestCase
{
private static Class CLASS = OtmExamples.class;
- private OTMKit _kit;
+ private TestKit _kit;
private OTMConnection _conn;
public OtmExamples(String name)
@@ -29,7 +30,7 @@
public void setUp()
{
- _kit = SimpleKit.getInstance();
+ _kit = TestKit.getTestInstance();
_conn = _kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
}
@@ -179,24 +180,81 @@
tx2 = _kit.getTransaction(conn2);
tx2.begin();
- try {
- pg = (ProductGroup) conn2.getObjectByIdentity(pgOid,
- LockType.WRITE_LOCK);
- fail("LockingException was not thrown");
- } catch (LockingException ex) {
- // ok
- tx2.rollback();
- } catch (Throwable ex) {
- tx2.rollback();
-System.err.println("ex " + ex.getClass() + " " + (ex instanceof LockingException));
+ pg = (ProductGroup) conn2.getObjectByIdentity(pgOid);
+ assertEquals("should be equal", "1", pg.getName());
+ tx2.commit();
+
+ _conn.deletePersistent(pg);
+ tx.commit();
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ if (tx != null && tx.isInProgress())
+ {
+ tx.rollback();
+ }
}
+ catch (Exception ex2)
+ {
+ }
+ throw ex;
+ }
+ }
+
+ public void testOtmLocks() throws Exception
+ {
+ Transaction tx = null;
+ Transaction tx2 = null;
+ OTMConnection conn2;
+ conn2 = _kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
+
+ try
+ {
+ tx = _kit.getTransaction(_conn);
+ tx.begin();
+
+ ProductGroup pg = new ProductGroup();
+ pg.setId(77777);
+ pg.setName("1");
+ _conn.makePersistent(pg);
+ tx.commit();
+
+ Identity pgOid = _conn.getIdentity(pg);
+
+ final Transaction tx3 = _kit.getTransaction(_conn);
+ tx3.begin();
+ _conn.getObjectByIdentity(pgOid, LockType.WRITE_LOCK);
+ // we can write lock twice from the same tx
+ _conn.getObjectByIdentity(pgOid, LockType.WRITE_LOCK);
+
+ // test different LockWaitStrategies
+ _kit.setLockWaitStrategy(new NoWaitStrategy());
+ failIfLockForWrite(conn2, pgOid);
+ _kit.setLockWaitStrategy(new TimeoutStrategy(1));
+ failIfLockForWrite(conn2, pgOid);
+
+ // Second test for the TimeoutStrategy:
+ // let the second tx to lock
+ _kit.setLockWaitStrategy(new TimeoutStrategy(2000));
tx2 = _kit.getTransaction(conn2);
tx2.begin();
- pg = (ProductGroup) conn2.getObjectByIdentity(pgOid);
- assertEquals("should be equal", "1", pg.getName());
+ (new Thread() {
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ tx3.commit();
+ } catch (InterruptedException ex) {
+ }
+ }
+ }).start();
+ conn2.getObjectByIdentity(pgOid, LockType.WRITE_LOCK);
tx2.commit();
+ tx = _kit.getTransaction(_conn);
+ tx.begin();
_conn.deletePersistent(pg);
tx.commit();
}
@@ -213,6 +271,22 @@
{
}
throw ex;
+ }
+ }
+
+ private void failIfLockForWrite(OTMConnection conn2, Identity oid)
+ throws Exception
+ {
+ Transaction tx2 = null;
+
+ tx2 = _kit.getTransaction(conn2);
+ tx2.begin();
+ try {
+ conn2.getObjectByIdentity(oid, LockType.WRITE_LOCK);
+ fail("LockingException was not thrown");
+ } catch (LockingException ex) {
+ // ok: we cannot write lock from another tx
+ tx2.rollback();
}
}
1.1 db-ojb/src/test/org/apache/ojb/otm/TestKit.java
Index: TestKit.java
===================================================================
package org.apache.ojb.otm;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache ObjectRelationalBridge" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache ObjectRelationalBridge", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
import org.apache.ojb.otm.kit.SimpleKit;
import org.apache.ojb.otm.lock.wait.LockWaitStrategy;
/**
* @author <a href="mailto:olegnitz@apache.org">Oleg Nitz</a>
*
*/
public class TestKit extends SimpleKit
{
private static TestKit _instance;
/**
* Constructor for SimpleKit.
*/
protected TestKit()
{
super();
}
public static TestKit getTestInstance()
{
if (_instance == null)
{
_instance = new TestKit();
}
return _instance;
}
/**
* This allows to test different LockWaitStrategies
*/
public void setLockWaitStrategy(LockWaitStrategy lockWaitStrategy)
{
_lockWaitStrategy = lockWaitStrategy;
}
}