8174128: [testbug] Remove implementation dependency from java.time TCK tests
Reviewed-by: dfuchs, scolebourne
--- a/jdk/test/java/time/TEST.properties Wed Feb 08 16:33:52 2017 +0000
+++ b/jdk/test/java/time/TEST.properties Wed Feb 08 13:17:31 2017 -0500
@@ -1,6 +1,5 @@
-# Threeten test uses TestNG
+# java.time tests use TestNG
TestNG.dirs = .
othervm.dirs = tck/java/time/chrono test/java/time/chrono test/java/time/format
lib.dirs = ../../lib/testlibrary
lib.build = jdk.testlibrary.RandomFactory
-modules = java.base/java.time:open java.base/java.time.chrono:open java.base/java.time.zone:open
--- a/jdk/test/java/time/tck/java/time/AbstractTCKTest.java Wed Feb 08 16:33:52 2017 +0000
+++ b/jdk/test/java/time/tck/java/time/AbstractTCKTest.java Wed Feb 08 13:17:31 2017 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,14 +69,35 @@
import java.io.ObjectOutputStream;
import java.io.ObjectStreamConstants;
import java.io.Serializable;
-import java.lang.reflect.Field;
import java.util.Formatter;
+import java.util.Map;
/**
* Base test class.
*/
public abstract class AbstractTCKTest {
+ /**
+ * Map from package name to the serialVersionUID of the .Ser class for the package.
+ */
+ private static Map<String, Long> serialVersionUIDs = Map.of(
+ "java.time", -7683839454370182990L,
+ "java.time.chrono", -6103370247208168577L,
+ "java.time.zone", -8885321777449118786L
+ );
+
+ /**
+ * Returns the serialVersionUID for the class.
+ * The SUIDs are defined by the specification for each class.
+ * @param serClass the class to return the SUID of
+ * @return returns the serialVersionUID for the class
+ */
+ public final static long getSUID(Class<?> serClass) {
+ String pkgName = serClass.getPackageName();
+ return serialVersionUIDs.get(pkgName);
+ }
+
+
protected static boolean isIsoLeap(long year) {
if (year % 4 != 0) {
return false;
@@ -111,10 +132,8 @@
protected static void assertSerializedBySer(Object object, byte[] expectedBytes, byte[]... matches) throws Exception {
String serClass = object.getClass().getPackage().getName() + ".Ser";
- Class<?> serCls = Class.forName(serClass);
- Field field = serCls.getDeclaredField("serialVersionUID");
- field.setAccessible(true);
- long serVer = (Long) field.get(null);
+ long serVer = getSUID(object.getClass());
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos) ) {
oos.writeObject(object);
@@ -172,9 +191,8 @@
* @throws Exception if an unexpected condition occurs
*/
protected static void assertNotSerializable(Class<?> serClass) throws Exception {
- Field field = serClass.getDeclaredField("serialVersionUID");
- field.setAccessible(true);
- long serVer = (Long) field.get(null);
+ long serVer = getSUID(serClass);
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream out = new DataOutputStream(baos)) {
out.writeShort(ObjectStreamConstants.STREAM_MAGIC);
@@ -201,7 +219,6 @@
fail("Class should not be deserializable " + serClass.getName());
}
-
/**
* Utility method to dump a byte array in a java syntax.
* @param bytes and array of bytes
--- a/jdk/test/java/time/tck/java/time/TCKOffsetDateTime.java Wed Feb 08 16:33:52 2017 +0000
+++ b/jdk/test/java/time/tck/java/time/TCKOffsetDateTime.java Wed Feb 08 13:17:31 2017 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -104,8 +104,6 @@
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
import java.time.Clock;
import java.time.DateTimeException;
import java.time.Duration;
@@ -470,24 +468,12 @@
//-----------------------------------------------------------------------
@Test(expectedExceptions=NullPointerException.class)
public void constructor_nullTime() throws Throwable {
- Constructor<OffsetDateTime> con = OffsetDateTime.class.getDeclaredConstructor(LocalDateTime.class, ZoneOffset.class);
- con.setAccessible(true);
- try {
- con.newInstance(null, OFFSET_PONE);
- } catch (InvocationTargetException ex) {
- throw ex.getCause();
- }
+ OffsetDateTime.of(null, OFFSET_PONE);
}
@Test(expectedExceptions=NullPointerException.class)
public void constructor_nullOffset() throws Throwable {
- Constructor<OffsetDateTime> con = OffsetDateTime.class.getDeclaredConstructor(LocalDateTime.class, ZoneOffset.class);
- con.setAccessible(true);
- try {
- con.newInstance(LocalDateTime.of(LocalDate.of(2008, 6, 30), LocalTime.of(11, 30)), null);
- } catch (InvocationTargetException ex) {
- throw ex.getCause();
- }
+ OffsetDateTime.of(LocalDateTime.of(LocalDate.of(2008, 6, 30), LocalTime.of(11, 30)), null);
}
//-----------------------------------------------------------------------
--- a/jdk/test/java/time/tck/java/time/TCKOffsetTime.java Wed Feb 08 16:33:52 2017 +0000
+++ b/jdk/test/java/time/tck/java/time/TCKOffsetTime.java Wed Feb 08 13:17:31 2017 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -89,8 +89,6 @@
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
import java.time.Clock;
import java.time.DateTimeException;
import java.time.Instant;
@@ -465,28 +463,16 @@
}
//-----------------------------------------------------------------------
- // constructor
+ // constructor via factory
//-----------------------------------------------------------------------
@Test(expectedExceptions=NullPointerException.class)
public void constructor_nullTime() throws Throwable {
- Constructor<OffsetTime> con = OffsetTime.class.getDeclaredConstructor(LocalTime.class, ZoneOffset.class);
- con.setAccessible(true);
- try {
- con.newInstance(null, OFFSET_PONE);
- } catch (InvocationTargetException ex) {
- throw ex.getCause();
- }
+ OffsetTime.of(null, OFFSET_PONE);
}
@Test(expectedExceptions=NullPointerException.class)
public void constructor_nullOffset() throws Throwable {
- Constructor<OffsetTime> con = OffsetTime.class.getDeclaredConstructor(LocalTime.class, ZoneOffset.class);
- con.setAccessible(true);
- try {
- con.newInstance(LocalTime.of(11, 30, 0, 0), null);
- } catch (InvocationTargetException ex) {
- throw ex.getCause();
- }
+ OffsetTime.of(LocalTime.of(11, 30, 0, 0), null);
}
//-----------------------------------------------------------------------
--- a/jdk/test/java/time/tck/java/time/serial/TCKZoneIdSerialization.java Wed Feb 08 16:33:52 2017 +0000
+++ b/jdk/test/java/time/tck/java/time/serial/TCKZoneIdSerialization.java Wed Feb 08 13:17:31 2017 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,8 +63,11 @@
import org.testng.annotations.Test;
import tck.java.time.AbstractTCKTest;
-import java.io.*;
-import java.lang.reflect.Field;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamConstants;
import java.time.DateTimeException;
import java.time.ZoneId;
import java.time.zone.ZoneRulesException;
@@ -153,10 +156,8 @@
private ZoneId deserialize(String id) throws Exception {
String serClass = ZoneId.class.getPackage().getName() + ".Ser";
- Class<?> serCls = Class.forName(serClass);
- Field field = serCls.getDeclaredField("serialVersionUID");
- field.setAccessible(true);
- long serVer = (Long) field.get(null);
+ long serVer = getSUID(ZoneId.class);
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream dos = new DataOutputStream(baos)) {
dos.writeShort(ObjectStreamConstants.STREAM_MAGIC);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/time/test/java/time/TEST.properties Wed Feb 08 13:17:31 2017 -0500
@@ -0,0 +1,2 @@
+# java.time test system clock
+modules = java.base/java.time:open