blob: 0b2763f48aaeca94105c5add98c74e7b931cca0b [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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:
// ailitchev ported the original test written by dminsky
package org.eclipse.persistence.testing.tests.types;
import java.text.*;
import java.util.*;
import oracle.sql.*;
import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.platform.database.oracle.*;
import org.eclipse.persistence.testing.framework.*;
/**
* Testcase for resolution of issues with TIMESTAMPTZ compatibility and correctness.
* @author dminsky
*/
public class CalendarToTSTZWithBindingTest extends TestCase {
// persistent fields
private Calendar calendar;
private int testId;
// transient fields
private boolean oldBindingValue;
private boolean printCalendarIntoTimestampTZ;
private DatabaseRecord result;
// test data
private String originalCalendarString;
private static final String[] calendarStrings = new String[] {
"01/01/2006 00:00:00 US/Eastern",
"01/01/2006 00:00:00 US/Pacific",
"04/01/2006 19:00:00 US/Eastern",
"04/01/2006 19:00:00 US/Pacific",
"04/01/2006 20:59:00 US/Eastern",
"04/01/2006 20:59:00 US/Pacific",
"04/01/2006 21:00:00 US/Eastern",
"04/01/2006 21:00:00 US/Pacific",
"04/01/2006 21:01:00 US/Eastern",
"04/01/2006 21:01:00 US/Pacific",
"04/01/2006 22:00:00 US/Eastern",
"04/01/2006 22:00:00 US/Pacific",
"10/29/2006 01:00:00 US/Eastern",
"10/29/2006 01:00:00 PST",
"10/29/2006 01:00:00 EST",
"10/29/2006 01:00:00 PST",
"03/10/2007 21:00:00 EST",
"03/10/2007 21:00:00 PST",
"03/10/2007 22:00:00 EST",
"03/10/2007 22:00:00 PST",
"10/28/2007 01:00:00 US/Eastern",
"10/28/2007 01:00:00 PST",
"11/04/2007 01:00:00 EST",
"11/04/2007 01:00:00 PST",
"12/31/2007 23:00:00 US/Eastern",
"12/31/2007 23:00:00 US/Pacific"
};
public CalendarToTSTZWithBindingTest() {
super();
}
public CalendarToTSTZWithBindingTest(int testId, String calendarString, boolean printCalendarIntoTimestampTZ) {
super();
this.printCalendarIntoTimestampTZ = printCalendarIntoTimestampTZ;
setTestId(testId);
setOriginalCalendarString(calendarString);
setCalendar(formatStringAsCalendar(calendarString));
}
public Calendar getCalendar() {
return calendar;
}
public void setCalendar(Calendar calendar) {
this.calendar = calendar;
}
public int getTestId() {
return testId;
}
public void setTestId(int testId) {
this.testId = testId;
}
public void setOriginalCalendarString(String originalCalendarString) {
this.originalCalendarString = originalCalendarString;
}
public String getOriginalCalendarString() {
return this.originalCalendarString;
}
public String toString() {
return "Test #: " + getTestId() + " -> " + getOriginalCalendarString();
}
/* public static Vector testInstancesWithBindingAndCalendarPrinting() {
Vector tests = new Vector(calendarStrings.length);
for (int i = 0; i < calendarStrings.length; i++) {
tests.add(new CalendarToTSTZWithBindingTest(i + 1, calendarStrings[i], true));
}
return tests;
}*/
public static Vector testInstancesWithBindingAndNoCalendarPrinting() {
Vector tests = new Vector(calendarStrings.length);
for (int i = 0; i < calendarStrings.length; i++) {
tests.add(new CalendarToTSTZWithBindingTest(i + (calendarStrings.length + 1), calendarStrings[i], false));
}
return tests;
}
@Override
public void setup() {
if (!(getSession().getPlatform() instanceof Oracle9Platform)) {
throw new TestWarningException("Test is only supported on Oracle9 platform and above, as TIMESTAMPTZ is used");
}
Oracle9Platform platform = (Oracle9Platform) getSession().getPlatform();
// this.oldPrintingValue = platform.getPrintCalendarIntoTimestampTZ();
this.oldBindingValue = platform.shouldBindAllParameters();
// platform.setPrintCalendarIntoTimestampTZ(Boolean.TRUE);
platform.setShouldBindAllParameters(true);
// write myself out
UnitOfWork uow = getSession().acquireUnitOfWork();
uow.registerObject(this);
uow.commit();
}
@Override
public void test() {
// read data back from database literally in order to check contents of database rather than the driver's TIMESTAMPTZ
String sql = "select TEST_ID, to_char(TSTZ_DATA,'MM/DD/YYYY hh24:mi:ss TZR') as TSTZ_DATA FROM " + commonDescriptor().getTableName() + " where TEST_ID = " + getTestId();
Vector result = getSession().executeSQL(sql);
if (result != null & !result.isEmpty()) {
this.result = (DatabaseRecord) result.firstElement();
}
}
@Override
public void verify() throws Exception {
String expectedResult = getOriginalCalendarString();
if (this.result == null) {
throw new TestErrorException("Unexpected exception - database returned no data for test id: " + getTestId() + " expected: " + expectedResult);
}
String actualResult = (String) result.get("TSTZ_DATA");
if (!expectedResult.equalsIgnoreCase(actualResult)) {
throw new TestErrorException("Data from database is not equal for test id: " + getTestId() + " - got: " + actualResult + " expected: " + expectedResult);
}
}
@Override
public void reset() {
// Compatibility for Oracle 9 and above is checked in the setup() method
Oracle9Platform platform = (Oracle9Platform) getSession().getPlatform();
// platform.setPrintCalendarIntoTimestampTZ(this.oldPrintingValue);
platform.setShouldBindAllParameters(this.oldBindingValue);
// delete myself
UnitOfWork uow = getSession().acquireUnitOfWork();
uow.deleteObject(this);
uow.commit();
}
// Calendar formatting behaviour
protected Calendar formatStringAsCalendar(String calendarString) {
try {
String dateOnly = calendarString.substring(0,19);
String timeZoneStr = calendarString.substring(20,calendarString.length());
TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
simpleDateFormat.setTimeZone(timeZone);
Date referenceDate = simpleDateFormat.parse(dateOnly.toUpperCase());
Calendar referenceCalendar = new GregorianCalendar(timeZone);
referenceCalendar.setTime(referenceDate);
simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(timeZone);
return referenceCalendar;
} catch (ParseException p) {
throw new TestErrorException("Could not parse Calendar String: " + calendarString);
}
}
// Descriptor and Table information
private static RelationalDescriptor commonDescriptor() {
RelationalDescriptor descriptor = new RelationalDescriptor();
descriptor.setJavaClass(CalendarToTSTZWithBindingTest.class);
descriptor.setTableName("CALENDARTOTSTZ_BINDING");
descriptor.setPrimaryKeyFieldName("TEST_ID");
descriptor.addDirectMapping("testId", "getTestId", "setTestId", "TEST_ID");
return descriptor;
}
public static RelationalDescriptor descriptorWithAccessors() {
RelationalDescriptor descriptor = commonDescriptor();
descriptor.addDirectMapping("calendar", "getCalendar", "setCalendar", "TSTZ_DATA");
return descriptor;
}
public static RelationalDescriptor descriptor() {
RelationalDescriptor descriptor = commonDescriptor();
descriptor.addDirectMapping("calendar", "TSTZ_DATA");
return descriptor;
}
public static TableDefinition tableDefinition() {
TableDefinition definition = new TableDefinition();
definition.setName("CALENDARTOTSTZ_BINDING");
definition.addField("TEST_ID", Integer.class);
definition.addField("TSTZ_DATA", TIMESTAMPTZ.class);
return definition;
}
}