package org.castor.cpa.test.test87;
import java.sql.Connection;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.castor.cpa.test.framework.CPATestCase;
import org.castor.cpa.test.framework.xml.types.DatabaseEngineType;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.JDOManager;
public final class TestRelation extends CPATestCase {
private static final String DBNAME = "test87";
private static final String MAPPING = "/org/castor/cpa/test/test87/mapping.xml";
private static final Log LOG = LogFactory.getLog(TestRelation.class);
private static long _productTimeStamp;
private static long _groupTimeStamp;
public static Test suite() throws Exception {
TestSuite suite = new TestSuite(TestRelation.class.getName());
suite.addTest(new TestRelation("delete"));
suite.addTest(new TestRelation("create"));
suite.addTest(new TestRelation("load"));
suite.addTest(new TestRelation("updateShort"));
suite.addTest(new TestRelation("updateLongCached"));
suite.addTest(new TestRelation("updateLongExpired"));
suite.addTest(new TestRelation("remove"));
return suite;
}
public TestRelation(final String name) {
super(name);
}
// Test are only included/excluded for engines that have been tested with this test suite.
public boolean include(final DatabaseEngineType engine) {
return (engine == DatabaseEngineType.DERBY)
|| (engine == DatabaseEngineType.HSQL)
|| (engine == DatabaseEngineType.MYSQL)
|| (engine == DatabaseEngineType.ORACLE)
|| (engine == DatabaseEngineType.POSTGRESQL)
|| (engine == DatabaseEngineType.SAPDB)
|| (engine == DatabaseEngineType.SQL_SERVER);
}
public void delete() throws Exception {
JDOManager jdo = getJDOManager(DBNAME, MAPPING);
// Delete all records to avoid problems with previous runs
Connection conn = jdo.getConnectionFactory().createConnection();
conn.setAutoCommit(true);
conn.createStatement().execute("DELETE FROM test87_product");
conn.createStatement().execute("DELETE FROM test87_group");
conn.close();
LOG.debug("Deleted all records from database.");
// Expire all objects in cache
Database db = jdo.getDatabase();
db.getCacheManager().expireCache();
db.close();
LOG.debug("Expired all objects from cache.");
}
public void create() throws Exception {
TimeStampableGroup group = new TimeStampableGroup(
TimeStampableGroup.DEFAULT_ID, TimeStampableGroup.DEFAULT_NAME);
TimeStampableProduct product = new TimeStampableProduct(
TimeStampableProduct.DEFAULT_ID, TimeStampableProduct.DEFAULT_NAME, group);
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
db.begin();
db.create(group);
// Timestamp of group should have been changed at create of group.
long groupTimestamp1 = group.jdoGetTimeStamp();
LOG.debug("Timestamp of group after create: " + groupTimestamp1);
assertTrue(TimeStampableGroup.DEFAULT_TIMESTAMP != groupTimestamp1);
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.create(product);
// Timestamp of product should have been changed at create of product.
long productTimestamp1 = product.jdoGetTimeStamp();
LOG.debug("Timestamp of product after create: " + productTimestamp1);
assertTrue(TimeStampableProduct.DEFAULT_TIMESTAMP != productTimestamp1);
// Timestamp of group related by product should not have been changed at create of product.
long groupTimestamp2 = product.getGroup().jdoGetTimeStamp();
LOG.debug("Timestamp of group refered by product after create: " + groupTimestamp2);
assertEquals(groupTimestamp1, groupTimestamp2);
// Timestamp of group should not have been changed at create of product.
long groupTimestamp3 = group.jdoGetTimeStamp();
LOG.debug("Timestamp of group after create of product: " + groupTimestamp3);
assertEquals(groupTimestamp1, groupTimestamp3);
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.commit();
// Timestamp of product should not been changed by commit.
long productTimestamp2 = product.jdoGetTimeStamp();
LOG.debug("Timestamp of product after commit: " + productTimestamp2);
assertEquals(productTimestamp1, productTimestamp2);
// Timestamp of group related by product should not been changed by commit.
long groupTimestamp4 = product.getGroup().jdoGetTimeStamp();
LOG.debug("Timestamp of group refered by product after commit: " + groupTimestamp4);
assertEquals(groupTimestamp1, groupTimestamp4);
// Timestamp of group should not been changed by commit.
long groupTimestamp5 = group.jdoGetTimeStamp();
LOG.debug("Timestamp of group after commit: " + groupTimestamp5);
assertEquals(groupTimestamp1, groupTimestamp5);
db.close();
// Remember timestamps for later compare.
_productTimeStamp = productTimestamp1;
_groupTimeStamp = groupTimestamp1;
}
public void load() throws Exception {
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableGroup firstGroup = db.load(
TimeStampableGroup.class, TimeStampableGroup.DEFAULT_ID);
TimeStampableProduct firstProduct = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
db.commit();
assertEquals(TimeStampableGroup.DEFAULT_ID, firstGroup.getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, firstGroup.getName());
assertEquals(TimeStampableProduct.DEFAULT_ID, firstProduct.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, firstProduct.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, firstProduct.getGroup().getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, firstProduct.getGroup().getName());
LOG.debug("Timestamp of group after first load: " + firstGroup.jdoGetTimeStamp());
LOG.debug("Timestamp of product after first load: " + firstProduct.jdoGetTimeStamp());
LOG.debug("Timestamp of group refered by product after first load: "
+ firstProduct.getGroup().jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_groupTimeStamp, firstGroup.jdoGetTimeStamp());
assertEquals(_productTimeStamp, firstProduct.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, firstProduct.getGroup().jdoGetTimeStamp());
// Expire all objects in cache
db.getCacheManager().expireCache();
LOG.debug("Expired all objects from cache.");
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableGroup secondGroup = db.load(
TimeStampableGroup.class, TimeStampableGroup.DEFAULT_ID);
db.commit();
assertEquals(TimeStampableGroup.DEFAULT_ID, secondGroup.getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, secondGroup.getName());
LOG.debug("Timestamp of group after second load: " + secondGroup.jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_groupTimeStamp, secondGroup.jdoGetTimeStamp());
// Expire all objects in cache
db.getCacheManager().expireCache();
LOG.debug("Expired all objects from cache.");
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableProduct secondProduct = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
db.commit();
db.close();
assertEquals(TimeStampableProduct.DEFAULT_ID, secondProduct.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, secondProduct.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, secondProduct.getGroup().getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, secondProduct.getGroup().getName());
LOG.debug("Timestamp of product after first load: " + secondProduct.jdoGetTimeStamp());
LOG.debug("Timestamp of group refered by product after first load: "
+ secondProduct.getGroup().jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, secondProduct.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, secondProduct.getGroup().jdoGetTimeStamp());
// Remember timestamp for later compare.
_productTimeStamp = secondProduct.jdoGetTimeStamp();
_groupTimeStamp = secondProduct.getGroup().jdoGetTimeStamp();
}
public void updateShort() throws Exception {
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableGroup group = db.load(
TimeStampableGroup.class, TimeStampableGroup.DEFAULT_ID);
LOG.debug("Timestamp before short update of group: " + group.jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_groupTimeStamp, group.jdoGetTimeStamp());
group.setName(TimeStampableGroup.ALTERNATE_NAME);
db.commit();
assertEquals(TimeStampableGroup.DEFAULT_ID, group.getId());
assertEquals(TimeStampableGroup.ALTERNATE_NAME, group.getName());
LOG.debug("Timestamp after short update of group: " + group.jdoGetTimeStamp());
// Timestamp should have been changed at update.
assertFalse(_groupTimeStamp == group.getTimeStamp());
// Remember timestamp for later compare.
_groupTimeStamp = group.jdoGetTimeStamp();
// Expire all objects in cache
db.getCacheManager().expireCache();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableProduct product = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
db.commit();
db.close();
assertEquals(TimeStampableProduct.DEFAULT_ID, product.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, product.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, product.getGroup().getId());
assertEquals(TimeStampableGroup.ALTERNATE_NAME, product.getGroup().getName());
LOG.debug("Timestamp check of product after short update of group: "
+ product.jdoGetTimeStamp());
LOG.debug("Timestamp check of group after short update of group: "
+ product.getGroup().jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, product.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, product.getGroup().jdoGetTimeStamp());
}
public void updateLongCached() throws Exception {
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableGroup group = db.load(
TimeStampableGroup.class, TimeStampableGroup.DEFAULT_ID);
db.commit();
LOG.debug("Timestamp before long update of group (cached): " + group.jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_groupTimeStamp, group.jdoGetTimeStamp());
group.setName(TimeStampableGroup.DEFAULT_NAME);
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
db.update(group);
db.commit();
assertEquals(TimeStampableGroup.DEFAULT_ID, group.getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, group.getName());
LOG.debug("Timestamp after long update of group (cached): " + group.jdoGetTimeStamp());
// Timestamp should have been changed at update.
assertFalse(_groupTimeStamp == group.getTimeStamp());
// Remember timestamp for later compare.
_groupTimeStamp = group.jdoGetTimeStamp();
// Expire all objects in cache
db.getCacheManager().expireCache();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableProduct product = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
db.commit();
db.close();
assertEquals(TimeStampableProduct.DEFAULT_ID, product.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, product.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, product.getGroup().getId());
assertEquals(TimeStampableGroup.DEFAULT_NAME, product.getGroup().getName());
LOG.debug("Timestamp check of product after short update of group: "
+ product.jdoGetTimeStamp());
LOG.debug("Timestamp check of group after short update of group: "
+ product.getGroup().jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, product.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, product.getGroup().jdoGetTimeStamp());
}
public void updateLongExpired() throws Exception {
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableGroup group = db.load(
TimeStampableGroup.class, TimeStampableGroup.DEFAULT_ID);
db.commit();
LOG.debug("Timestamp before long update of group (expired): " + group.jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_groupTimeStamp, group.jdoGetTimeStamp());
// Expire all objects in cache
db.getCacheManager().expireCache();
group.setName(TimeStampableGroup.ALTERNATE_NAME);
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
db.update(group);
db.commit();
assertEquals(TimeStampableGroup.DEFAULT_ID, group.getId());
assertEquals(TimeStampableGroup.ALTERNATE_NAME, group.getName());
LOG.debug("Timestamp after long update of group (expired): " + group.jdoGetTimeStamp());
// Timestamp should have been changed at update.
assertFalse(_groupTimeStamp == group.getTimeStamp());
// Remember timestamp for later compare.
_groupTimeStamp = group.jdoGetTimeStamp();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableProduct product = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
db.commit();
db.close();
assertEquals(TimeStampableProduct.DEFAULT_ID, product.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, product.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, product.getGroup().getId());
assertEquals(TimeStampableGroup.ALTERNATE_NAME, product.getGroup().getName());
LOG.debug("Timestamp check of product after short update of group: "
+ product.jdoGetTimeStamp());
LOG.debug("Timestamp check of group after short update of group: "
+ product.getGroup().jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, product.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, product.getGroup().jdoGetTimeStamp());
}
public void remove() throws Exception {
Database db = getJDOManager(DBNAME, MAPPING).getDatabase();
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.begin();
TimeStampableProduct product = db.load(
TimeStampableProduct.class, TimeStampableProduct.DEFAULT_ID);
TimeStampableGroup group = product.getGroup();
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, product.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, product.getGroup().jdoGetTimeStamp());
assertEquals(_groupTimeStamp, group.jdoGetTimeStamp());
LOG.debug("Timestamp of product before remove: " + product.jdoGetTimeStamp());
LOG.debug("Timestamp of group before remove: " + group.jdoGetTimeStamp());
// Wait 10ms to ensure System.currentTimeMillis() return different values.
Thread.sleep(10);
db.remove(product);
db.remove(group);
db.commit();
db.close();
assertEquals(TimeStampableProduct.DEFAULT_ID, product.getId());
assertEquals(TimeStampableProduct.DEFAULT_NAME, product.getName());
assertEquals(TimeStampableGroup.DEFAULT_ID, group.getId());
assertEquals(TimeStampableGroup.ALTERNATE_NAME, group.getName());
LOG.debug("Timestamp of product after remove: " + product.jdoGetTimeStamp());
LOG.debug("Timestamp of group after remove: " + group.jdoGetTimeStamp());
// Compare current timestamp with the remembert one;
assertEquals(_productTimeStamp, product.jdoGetTimeStamp());
assertEquals(_groupTimeStamp, product.getGroup().jdoGetTimeStamp());
assertEquals(_groupTimeStamp, group.jdoGetTimeStamp());
}
}