blob: b1b19b26522de230f0f66d12eb1404035cbee750 [file] [log] [blame]
/*
* TestClassDBSequenceFactory.java
*
* Created on October 6, 2006, 11:29 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.openjpa.persistence.jdbc.schema;
import java.util.*;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.kernel.ClassTableJDBCSeq;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.schema.Sequence;
import org.apache.openjpa.kernel.Broker;
import org.apache.openjpa.persistence.jdbc.common.apps.*;
import java.lang.annotation.Annotation;
import junit.framework.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
public class TestClassDBSequenceFactory extends org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest{
/** Creates a new instance of TestClassDBSequenceFactory */
public TestClassDBSequenceFactory() {
}
public TestClassDBSequenceFactory(String test) {
super(test);
}
public void setUp() {
deleteAll(SeqE.class);
}
boolean supportsPessimisticLocking() {
OpenJPAConfiguration conf = getConfiguration();
return conf instanceof JDBCConfiguration
&& ((JDBCConfiguration) conf).getDBDictionaryInstance().
supportsSelectForUpdate;
}
public void testVirtualSuperclass() {
OpenJPAEntityManagerFactory pmf =(OpenJPAEntityManagerFactory)
getEmf(getProps());
OpenJPAEntityManager pm = (OpenJPAEntityManager) pmf.createEntityManager();
//FIXME jthomas
//Sequence gen = pm.getIdentitySequence(SeqF.class);
Sequence gen=null;
long next = ((Number) gen.getIncrement()).longValue();
//FIXME jthomas
//gen = pm.getIdentitySequence(SeqG.class);
assertEquals(next + 1, ((Number) gen.getIncrement()).longValue());
pm.close();
pmf.close();
}
public void testIgnoreVirtualSuperclass() {
Map props=new HashMap();
props.put("TableName", "JDO_CLASS_SEQUENCE");
props.put("IgnoreVirtual", "true");
OpenJPAEntityManagerFactory pmf =(OpenJPAEntityManagerFactory)
getEmf(props);
OpenJPAEntityManager pm = pmf.createEntityManager();
//FIXME jthomas
//Sequence gen = pm.getIdentitySequence(SeqF.class);
Sequence gen =null;
long next = ((Number) gen.getIncrement()).longValue();
//FIXME jthomas
//Sequence gen2 = pm.getIdentitySequence(SeqG.class);
Sequence gen2 =null;
long next2 = ((Number) gen2.getIncrement()).longValue();
if (next2 != next + 1)
return; // valid.
assertTrue(((Number) gen.getIncrement()).longValue() != next2 + 1);
pm.close();
pmf.close();
}
/**
* Based on reported bug case.
*/
public void testNoSequenceHolesOnAttach() {
PerClassTestObject3 pc = new PerClassTestObject3();
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager();
startTx(pm);;
pm.persist(pc);
endTx(pm);;
long id1 = pc.getId();
pc = new PerClassTestObject3();
startTx(pm);;
pm.persist(pc);
long id2 = pc.getId();
endTx(pm);;
pm.close();
pc = new PerClassTestObject3();
pm = (OpenJPAEntityManager)currentEntityManager();
startTx(pm);;
pm.persist(pc);
endTx(pm);;
long id3 = pc.getId();
pm.close();
assertEquals(id1 + 1, id2);
assertEquals(id2 + 1, id3);
}
/**
* Tests that all sequence numbers are unique and in order.
* Will fail for dbs without pessimistic locking.
*/
public void testSequence()
throws Exception {
if (!(supportsPessimisticLocking()))
return;
Set set = new HashSet();
JDBCConfiguration conf = (JDBCConfiguration) getConfiguration();
Broker broker = getBrokerFactory().newBroker();
UpdateThread t1 = new UpdateThread(set, broker);
UpdateThread t2 = new UpdateThread(set, broker);
t1.start();
t2.start();
t1.join();
t2.join();
if (t1.error != null)
throw t1.error;
if (t2.error != null)
throw t2.error;
assertEquals(102, set.size());
}
public void testSequenceGenerator() {
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager();
// make sure the sequence generator creates separate
// instances.
for (int i = 0; i < 100; i++) {
//FIXME jthomas
/*assertEquals(((Number) pm.getIdentitySequence(SeqD.class).
next()).longValue() + 1,
((Number) pm.getIdentitySequence(SeqD.class).
getIncrement()).longValue());
*/
}
// make sure the sequence generate is not the same as is
// used elsewhere
for (int j = 0; j < 100; j++) {
//FIXME
/*
assertNotEquals(new Long(((Number) pm.getIdentitySequence
(SeqA.class).getIncrement()).longValue() + 1),
pm.getIdentitySequence(SeqD.class).next());
*/
}
}
public static void main(String[] args) {
//main();
}
private Map getProps() {
Map props=new HashMap();
props.put("openjpa.Sequence", "db-class(TableName=JDO_CLASS_SEQUENCE");
return props;
}
private static class UpdateThread
extends Thread {
private Set _set = null;
private Broker _broker = null;
public Exception error = null;
public UpdateThread(Set set, Broker broker) {
_set = set;
_broker = broker;
}
public void run() {
try {
ClassMapping mapping =
((JDBCConfiguration) _broker.getConfiguration()).
getMappingRepositoryInstance().
getMapping(SeqD.class, null, true);
ClassTableJDBCSeq seq = (ClassTableJDBCSeq)
_broker.getIdentitySequence(mapping);
for (int i = 0; i < 51; i++)
_set.add(seq.next(_broker, mapping));
} catch (Exception e) {
error = e;
}
}
}
}