001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.persistence.kernel;
020:
021: import java.util.ArrayList;
022: import java.util.List;
023: import javax.persistence.EntityManager;
024:
025: import org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1;
026: import org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest2;
027: import org.apache.openjpa.persistence.common.utils.AbstractTestCase;
028:
029: public class TestEJBEntityManager extends AbstractTestCase {
030:
031: private Object _id = null;
032:
033: private Object _id2 = null;
034:
035: public TestEJBEntityManager(String name) {
036: super (name, "kernelcactusapp");
037: }
038:
039: public void setUp() throws Exception {
040: deleteAll(RuntimeTest1.class);
041:
042: EntityManager em = currentEntityManager();
043: startTx(em);
044:
045: RuntimeTest1 a = new RuntimeTest1("STRING", 10);
046: RuntimeTest2 b = new RuntimeTest2("STRING2", 11);
047: em.persist(a);
048: em.persist(b);
049: _id = a.getIntField();
050: _id2 = b.getIntField();
051:
052: endTx(em);
053: endEm(em);
054: }
055:
056: /**
057: * Tests that the PM throws Exceptions on usage attempts after it has been
058: * closed.
059: */
060: /* Fix Me - aokeke - takes a lot of time to run */
061: // public void testClosed ()
062: // {
063: // EntityManager em = currentEntityManager();
064: // startTx(em);
065: // endEm(em);
066: //
067: // try
068: // {
069: // // this is the only method that should succeed
070: // if(em.isOpen ())
071: // fail("Supposed to be closed...but cannot be closed inside
072: // container..closed at the end of funct");
073: // }
074: // catch (RuntimeException re)
075: // {
076: // fail ("isClosed");
077: // }
078: // try
079: // {
080: // em.find(RuntimeTest1.class, _id);
081: // fail ("find");
082: // }
083: // catch (RuntimeException re)
084: // {
085: // }
086: // }
087: public void testMultipleCloseThreaded() throws Throwable {
088: final EntityManager em = currentEntityManager();
089: final List result = new ArrayList();
090: // EntityTransaction t = em.getTransaction();
091: // t.begin ();
092:
093: em.close();
094:
095: new Thread() {
096: @SuppressWarnings("unchecked")
097: public void run() {
098: try {
099: em.close();
100: result.add(new Integer(0));
101: } catch (Exception jdoe) {
102: result.add(jdoe);
103: } catch (Throwable t) {
104: result.add(t);
105: }
106: }
107: }.start();
108:
109: while (result.size() == 0)
110: Thread.currentThread().yield(); // wait for results
111: Object ret = result.get(0);
112:
113: if (ret instanceof Exception)
114: return; // good
115:
116: if (ret instanceof Throwable)
117: throw (Throwable) ret;
118: }
119:
120: /**
121: * This method tries to perform operations that should lead to illegal
122: * states, such as persisting instances outside of transactions, etc.
123: */
124: public void testIllegalState() {
125: EntityManager em = currentEntityManager();
126:
127: RuntimeTest1 a = new RuntimeTest1("foo", 10);
128: RuntimeTest1 a2 = (RuntimeTest1) em.find(RuntimeTest1.class,
129: _id);
130:
131: try {
132: em.persist(a);
133: fail("persist...");
134: } catch (Exception ise) {
135: }
136:
137: endEm(em);
138: }
139: }
|