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; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.QueryResults; public final class TestSimple 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(TestSimple.class); private static long _timestamp; public static Test suite() throws Exception { TestSuite suite = new TestSuite(TestSimple.class.getName()); suite.addTest(new TestSimple("delete")); suite.addTest(new TestSimple("create")); suite.addTest(new TestSimple("load")); suite.addTest(new TestSimple("query")); suite.addTest(new TestSimple("updateShort")); suite.addTest(new TestSimple("updateLongCached")); suite.addTest(new TestSimple("updateLongExpired")); suite.addTest(new TestSimple("remove")); return suite; } public TestSimple(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_entity"); 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 { TimeStampableEntity entity = new TimeStampableEntity( TimeStampableEntity.DEFAULT_ID, TimeStampableEntity.DEFAULT_NAME); Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); db.begin(); // Timestamp should have been initialized to 0 by constructor long beginTimestamp = entity.jdoGetTimeStamp(); LOG.debug("Timestamp after begin: " + beginTimestamp); assertEquals(TimeStampableEntity.DEFAULT_TIMESTAMP, beginTimestamp); db.create(entity); // Timestamp should have been changed at create. long createTimestamp = entity.jdoGetTimeStamp(); LOG.debug("Timestamp after create: " + createTimestamp); assertTrue(beginTimestamp != createTimestamp); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.commit(); // Timestamp should not been changed by commit. long commitTimestamp = entity.jdoGetTimeStamp(); LOG.debug("Timestamp after commit: " + commitTimestamp); assertEquals(createTimestamp, commitTimestamp); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.close(); // Timestamp should not been changed by database close. long closeTimestamp = entity.jdoGetTimeStamp(); LOG.debug("Timestamp after close: " + closeTimestamp); assertEquals(commitTimestamp, closeTimestamp); // Properties should not been changed assertEquals(TimeStampableEntity.DEFAULT_ID, entity.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, entity.getName()); // Remember timestamp for later compare. _timestamp = commitTimestamp; } 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(); TimeStampableEntity first = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); assertEquals(TimeStampableEntity.DEFAULT_ID, first.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, first.getName()); LOG.debug("Timestamp after first load: " + first.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, first.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(); TimeStampableEntity second = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, second.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, second.getName()); LOG.debug("Timestamp after second load: " + second.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, second.jdoGetTimeStamp()); // Remember timestamp for later compare. _timestamp = second.jdoGetTimeStamp(); } public void query() throws Exception { OQLQuery query; QueryResults results; Database db = getJDOManager(DBNAME, MAPPING).getDatabase(); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.begin(); query = db.getOQLQuery("SELECT entity FROM " + TimeStampableEntity.class.getName() + " entity WHERE id = $1"); query.bind(TimeStampableEntity.DEFAULT_ID); results = query.execute(); assertTrue(results.hasMore()); TimeStampableEntity first = (TimeStampableEntity) results.next(); db.commit(); assertEquals(TimeStampableEntity.DEFAULT_ID, first.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, first.getName()); LOG.debug("Timestamp after first query: " + first.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, first.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(); query = db.getOQLQuery("SELECT entity FROM " + TimeStampableEntity.class.getName() + " entity WHERE id = $1"); query.bind(TimeStampableEntity.DEFAULT_ID); results = query.execute(); assertTrue(results.hasMore()); TimeStampableEntity second = (TimeStampableEntity) results.next(); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, second.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, second.getName()); LOG.debug("Timestamp after second query: " + second.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, second.jdoGetTimeStamp()); // Remember timestamp for later compare. _timestamp = second.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(); TimeStampableEntity entity = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); LOG.debug("Timestamp before short update: " + entity.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, entity.jdoGetTimeStamp()); entity.setName(TimeStampableEntity.ALTERNATE_NAME); db.commit(); assertEquals(TimeStampableEntity.DEFAULT_ID, entity.getId()); assertEquals(TimeStampableEntity.ALTERNATE_NAME, entity.getName()); LOG.debug("Timestamp after short update: " + entity.jdoGetTimeStamp()); // Timestamp should have been changed at update. assertFalse(_timestamp == entity.getTimeStamp()); // Remember timestamp for later compare. _timestamp = entity.jdoGetTimeStamp(); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.begin(); TimeStampableEntity check = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, check.getId()); assertEquals(TimeStampableEntity.ALTERNATE_NAME, check.getName()); LOG.debug("Timestamp check after short update: " + check.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, check.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(); TimeStampableEntity entity = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); LOG.debug("Timestamp before long update (cached): " + entity.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, entity.jdoGetTimeStamp()); entity.setName(TimeStampableEntity.DEFAULT_NAME); db.begin(); db.update(entity); db.commit(); assertEquals(TimeStampableEntity.DEFAULT_ID, entity.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, entity.getName()); LOG.debug("Timestamp after long update (cached): " + entity.jdoGetTimeStamp()); // Timestamp should have been changed at update. assertFalse(_timestamp == entity.getTimeStamp()); // Remember timestamp for later compare. _timestamp = entity.jdoGetTimeStamp(); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.begin(); TimeStampableEntity check = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, check.getId()); assertEquals(TimeStampableEntity.DEFAULT_NAME, check.getName()); LOG.debug("Timestamp check after long update (cached): " + check.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, check.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(); TimeStampableEntity entity = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); LOG.debug("Timestamp before long update (expired): " + entity.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, entity.jdoGetTimeStamp()); // Expire all objects in cache db.getCacheManager().expireCache(); entity.setName(TimeStampableEntity.ALTERNATE_NAME); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.begin(); db.update(entity); db.commit(); assertEquals(TimeStampableEntity.DEFAULT_ID, entity.getId()); assertEquals(TimeStampableEntity.ALTERNATE_NAME, entity.getName()); LOG.debug("Timestamp after long update (expired): " + entity.jdoGetTimeStamp()); // Timestamp should have been changed at update. assertFalse(_timestamp == entity.getTimeStamp()); // Remember timestamp for later compare. _timestamp = entity.jdoGetTimeStamp(); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.begin(); TimeStampableEntity check = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, check.getId()); assertEquals(TimeStampableEntity.ALTERNATE_NAME, check.getName()); LOG.debug("Timestamp check after long update (expired): " + check.jdoGetTimeStamp()); // Compare current timestamp with the remembert one; assertEquals(_timestamp, check.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(); TimeStampableEntity entity = db.load( TimeStampableEntity.class, TimeStampableEntity.DEFAULT_ID); // Compare current timestamp with the remembert one; assertEquals(_timestamp, entity.jdoGetTimeStamp()); LOG.debug("Timestamp before remove: " + entity.jdoGetTimeStamp()); // Wait 10ms to ensure System.currentTimeMillis() return different values. Thread.sleep(10); db.remove(entity); db.commit(); db.close(); assertEquals(TimeStampableEntity.DEFAULT_ID, entity.getId()); assertEquals(TimeStampableEntity.ALTERNATE_NAME, entity.getName()); LOG.debug("Timestamp after remove: " + entity.jdoGetTimeStamp()); } }