blob: 0f0fee996137d8f7754b13fd36c2663d493be12f [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.timestamptz;
import java.util.Calendar;
import java.util.TimeZone;
import jakarta.persistence.EntityManager;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.timestamptz.TStamp;
import org.eclipse.persistence.testing.models.jpa.timestamptz.TimestampTableCreator;
import junit.framework.Test;
import junit.framework.TestSuite;
public class TimeStampTZJUnitTestSuite extends JUnitTestCase {
public TimeStampTZJUnitTestSuite() {
super();
}
public TimeStampTZJUnitTestSuite(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("TimeStampTZJUnitTestSuite");
suite.addTest(new TimeStampTZJUnitTestSuite("testSetup"));
suite.addTest(new TimeStampTZJUnitTestSuite("testNoZone"));
suite.addTest(new TimeStampTZJUnitTestSuite("testTimeStampTZ"));
suite.addTest(new TimeStampTZJUnitTestSuite("testTimeStampLTZ"));
suite.addTest(new TimeStampTZJUnitTestSuite("testTimeStampTZDST"));
return suite;
}
public void testSetup() {
new TimestampTableCreator().replaceTables(JUnitTestCase.getServerSession("timestamptz"));
}
/* Test TimeStampTZ with no zone set */
public void testNoZone() {
int year = 2000, month = 1, date = 10, hour = 11, minute = 21, second = 31;
Integer tsId = null;
Calendar originalCal = null, dbCal;
EntityManager em = createEntityManager("timestamptz");
beginTransaction(em);
try {
TStamp ts = new TStamp();
originalCal = Calendar.getInstance();
originalCal.set(year, month, date, hour, minute, second);
ts.setNoZone(originalCal);
em.persist(ts);
em.flush();
tsId = ts.getId();
commitTransaction(em);
} catch (Exception e) {
e.printStackTrace();
rollbackTransaction(em);
} finally {
clearCache("timestamptz");
dbCal = em.find(TStamp.class, tsId).getNoZone();
closeEntityManager(em);
}
assertEquals("The date retrieved from db is not the one set to the child ", dbCal, originalCal);
assertEquals("The year is not match", year, dbCal.get(Calendar.YEAR));
assertEquals("The month is not match", month, dbCal.get(Calendar.MONTH));
assertEquals("The date is not match", date, dbCal.get(Calendar.DATE));
assertEquals("The hour is not match", hour, dbCal.get(Calendar.HOUR));
assertEquals("The minute is not match", minute, dbCal.get(Calendar.MINUTE));
assertEquals("The second is not match", second, dbCal.get(Calendar.SECOND));
}
/* Test TimeStampTZ with time zone set with midnight time */
public void testTimeStampTZ() {
int year = 2000, month = 1, date = 10, hour = 0, minute = 0, second = 0;
Integer tsId;
Calendar originalCal, dbCal;
String zoneId = "Europe/London";
EntityManager em = createEntityManager("timestamptz");
beginTransaction(em);
try {
TStamp ts = new TStamp();
originalCal = Calendar.getInstance(TimeZone.getTimeZone(zoneId));
originalCal.set(Calendar.AM_PM, Calendar.AM);
originalCal.set(year, month, date, 0, 0, 0);
originalCal.set(Calendar.MILLISECOND, 0);
ts.setTsTZ(originalCal);
em.persist(ts);
em.flush();
tsId = ts.getId();
commitTransaction(em);
closeEntityManager(em);
clearCache("timestamptz");
em = createEntityManager("timestamptz");
dbCal = em.find(TStamp.class, tsId).getTsTZ();
assertEquals("The timezone id is not the one set to the field", dbCal.getTimeZone().getID(), zoneId);
assertEquals("The AM is not match", Calendar.AM, dbCal.get(Calendar.AM_PM));
assertEquals("The year is not match", year, dbCal.get(Calendar.YEAR));
assertEquals("The month is not match", month, dbCal.get(Calendar.MONTH));
assertEquals("The date is not match", date, dbCal.get(Calendar.DATE));
assertEquals("The hour is not match", hour, dbCal.get(Calendar.HOUR));
assertEquals("The minute is not match", minute, dbCal.get(Calendar.MINUTE));
assertEquals("The second is not match", second, dbCal.get(Calendar.SECOND));
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
}
}
/* Test TimeStampLTZ */
public void testTimeStampLTZ() {
int year = 2000, month = 3, date = 21, hour = 11, minute = 45, second = 50;
Integer tsId = null;
Calendar originalCal = null, dbCal;
String zoneId = "America/Los_Angeles";
EntityManager em = createEntityManager("timestamptz");
beginTransaction(em);
try {
TStamp ts = new TStamp();
originalCal = Calendar.getInstance(TimeZone.getTimeZone(zoneId));
originalCal.set(Calendar.AM_PM, Calendar.AM);
originalCal.set(year, month, date, hour, minute, second);
originalCal.set(Calendar.MILLISECOND, 0);
ts.setTsLTZ(originalCal);
em.persist(ts);
em.flush();
tsId = ts.getId();
commitTransaction(em);
} catch (Exception e) {
e.printStackTrace();
rollbackTransaction(em);
throw e;
} finally {
clearCache("timestamptz");
dbCal = em.find(TStamp.class, tsId).getTsLTZ();
closeEntityManager(em);
}
// Bug 464499 - Comparing values in same time zone
dbCal.getTime(); // Need to instantiate before changing time zone
dbCal.setTimeZone(TimeZone.getTimeZone(zoneId));
assertEquals("The year is not match", year, dbCal.get(Calendar.YEAR));
assertEquals("The month is not match", month, dbCal.get(Calendar.MONTH));
assertEquals("The date is not match", date, dbCal.get(Calendar.DATE));
assertEquals("The hour is not match", originalCal.get(Calendar.HOUR_OF_DAY), dbCal.get(Calendar.HOUR_OF_DAY));
assertEquals("The minute is not match", minute, dbCal.get(Calendar.MINUTE));
assertEquals("The second is not match", second, dbCal.get(Calendar.SECOND));
}
/* Test TimeStampTZ with daylight saving time */
public void testTimeStampTZDST() {
int year = 2008, month = 2, date = 10, hour = 11, minute = 0, second = 0;
Integer tsId;
Calendar originalCal, dbCal;
String zoneIdRemote = "Europe/London";
EntityManager em = createEntityManager("timestamptz");
beginTransaction(em);
try {
TStamp ts = new TStamp();
originalCal = Calendar.getInstance(TimeZone.getTimeZone(zoneIdRemote));
originalCal.set(Calendar.AM_PM, Calendar.AM);
originalCal.set(year, month, date, hour, minute, second);
originalCal.set(Calendar.MILLISECOND, 0);
ts.setTsLTZ(originalCal);
em.persist(ts);
em.flush();
tsId = ts.getId();
commitTransaction(em);
closeEntityManager(em);
clearCache("timestamptz");
em = createEntityManager("timestamptz");
dbCal = em.find(TStamp.class, tsId).getTsLTZ();
int hourDiffFromDB = dbCal.get(Calendar.HOUR_OF_DAY) - originalCal.get(Calendar.HOUR_OF_DAY);
int hourDiffFromZone = (dbCal.get(Calendar.ZONE_OFFSET) - originalCal.get(Calendar.ZONE_OFFSET))/ 3600000;
assertEquals("The hour is not match", (hourDiffFromZone + dbCal.get(Calendar.DST_OFFSET)/3600000), hourDiffFromDB);
} finally {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
}
}
}