1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 package test.sql;
24 
25 import java.sql.Date;
26 import java.sql.Time;
27 import java.sql.Timestamp;
28 import java.time.Instant;
29 import java.time.LocalDateTime;
30 import java.time.ZoneId;
31 import java.util.Calendar;
32 import java.util.TimeZone;
33 import static org.testng.Assert.*;
34 import org.testng.annotations.AfterClass;
35 import org.testng.annotations.BeforeClass;
36 import org.testng.annotations.DataProvider;
37 import org.testng.annotations.Test;
38 import util.BaseTest;
39 
40 public class TimestampTests extends BaseTest {
41 
42     private static TimeZone defaultTimeZone = null;
43 
44     /*
45      * Need to set and use a custom TimeZone which does not
46      * observe daylight savings time for this test.
47      */
48     @BeforeClass
setUpClass()49     public static void setUpClass() throws Exception {
50         defaultTimeZone = TimeZone.getDefault();
51         TimeZone tzone = TimeZone.getTimeZone("GMT+01");
52         assertFalse(tzone.observesDaylightTime());
53         TimeZone.setDefault(tzone);
54     }
55 
56     /*
57      * Conservatively reset the default time zone after test.
58      */
59     @AfterClass
tearDownClass()60     public static void tearDownClass() throws Exception {
61         TimeZone.setDefault(defaultTimeZone);
62     }
63 
64     /*
65      * Validate an IllegalArgumentException is thrown for an invalid Timestamp
66      */
67     @Test(dataProvider = "invalidTimestampValues",
68             expectedExceptions = IllegalArgumentException.class)
test(String ts)69     public void test(String ts) throws Exception {
70         Timestamp.valueOf(ts);
71     }
72 
73     /*
74      * Validate that two Timestamp are equal when the leading 0 in seconds is
75      * omitted
76      */
77     @Test
test01()78     public void test01() throws Exception {
79         String testTS = "2009-01-01 10:50:00";
80         String ExpectedTS = "2009-01-01 10:50:0";
81         Timestamp ts = Timestamp.valueOf(testTS);
82         Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
83         assertEquals(ts, ts2, "Error ts1 != ts2");
84     }
85 
86     /*
87      * Validate two Timestamps created from the same string are equal
88      */
89     @Test
test02()90     public void test02() throws Exception {
91         String testTS = "2009-01-01 10:50:0";
92         Timestamp ts = Timestamp.valueOf(testTS);
93         Timestamp ts2 = Timestamp.valueOf(testTS);
94         assertEquals(ts, ts2, "Error ts1 != ts2");
95     }
96 
97     /*
98      * Validate that two Timestamp values one with leading 0s for month and day
99      * equals same string without the leading 0s.
100      */
101     @Test
test03()102     public void test03() throws Exception {
103         String testTS = "2009-1-1 10:50:0";
104         String ExpectedTS = "2009-01-01 10:50:0";
105         Timestamp ts = Timestamp.valueOf(testTS);
106         Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
107         assertEquals(ts, ts2, "Error ts1 != ts2");
108     }
109 
110     /*
111      * Validate that two Timestamp values one with leading 0s for day omitted
112      * are equal
113      */
114     @Test
test04()115     public void test04() throws Exception {
116         String testTS = "2009-01-1 10:50:0";
117         String ExpectedTS = "2009-01-01 10:50:0";
118         Timestamp ts = Timestamp.valueOf(testTS);
119         Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
120         assertEquals(ts, ts2, "Error ts1 != ts2");
121     }
122 
123     /*
124      * Validate that two Timestamp values one with leading 0s for month omitted
125      * and both with leading 0s for seconds omitted are equal
126      */
127     @Test
test05()128     public void test05() throws Exception {
129         String testTS = "2009-1-01 10:50:0";
130         String ExpectedTS = "2009-01-01 10:50:0";
131         Timestamp ts = Timestamp.valueOf(testTS);
132         Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
133         assertEquals(ts, ts2, "Error ts1 != ts2");
134     }
135 
136     /*
137      * Validate that two Timestamp values one with leading 0s for month omitted
138      */
139     @Test
test06()140     public void test06() throws Exception {
141         String testTS = "2005-1-01 10:20:50.00";
142         String ExpectedTS = "2005-01-01 10:20:50.00";
143         Timestamp ts = Timestamp.valueOf(testTS);
144         Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
145         assertEquals(ts, ts2, "Error ts1 != ts2");
146     }
147 
148     /*
149      * Validate that two Timestamp values one created using valueOf and another
150      * via a constructor are equal
151      */
152     @Test
test07()153     public void test07() {
154 
155         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
156         Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 1000000);
157         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
158     }
159 
160     /*
161      * Validate that two Timestamp values one created using valueOf and another
162      * via a constructor are equal
163      */
164     @Test
test08()165     public void test08() {
166         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
167         Timestamp ts2 = new Timestamp(ts1.getTime());
168         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
169     }
170 
171     /*
172      * Validate that two Timestamp values one created using valueOf and another
173      * via a constructor are equal
174      */
175     @Test
test09()176     public void test09() {
177 
178         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.0");
179         Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 0);
180         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
181     }
182 
183     /*
184      * Validate that a Timestamp cannot be equal to null
185      */
186     @Test
test10()187     public void test10() {
188 
189         Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25.745634");
190         Timestamp ts2 = null;
191         assertFalse(ts1.equals(ts2), "Error ts1 == null");
192     }
193 
194     /*
195      * Validate that a Timestamp is equal to another timestamp created with the
196      * using the same value but not equal to a Timestamp which is one day later
197      */
198     @Test
test11()199     public void test11() {
200 
201         Timestamp ts1 = Timestamp.valueOf("1996-12-10 12:26:19.12");
202         Timestamp ts2 = Timestamp.valueOf("1996-12-10 12:26:19.12");
203         Timestamp ts3 = Timestamp.valueOf("1996-12-11 12:24:19.12");
204         assertTrue(ts1.equals(ts2) && ts2.equals(ts1), "Error ts1 != ts2");
205         assertFalse(ts1.equals(ts3) && ts3.equals(ts1), "Error ts1 == ts3");
206 
207     }
208 
209     /*
210      * Validate that a Timestamp is equal to itself
211      */
212     @Test
test12()213     public void test12() {
214         Timestamp ts1 = Timestamp.valueOf("1996-10-15 12:26:19.12");
215         assertTrue(ts1.equals(ts1), "Error ts1 != ts1");
216     }
217 
218     /*
219      * Validate that two Timestamps are equal when one is created from the
220      * toString() of the other
221      */
222     @Test(dataProvider = "validTimestampValues")
test13(String ts, String expectedTS)223     public void test13(String ts, String expectedTS) {
224         Timestamp ts1 = Timestamp.valueOf(ts);
225         Timestamp ts2 = Timestamp.valueOf(ts1.toString());
226         assertTrue(ts1.equals(ts2) && ts2.equals(ts1)
227                 && ts1.toString().equals(expectedTS), "Error ts1 != ts2");
228     }
229 
230     // Before Tests
231     /*
232      * Validate that Timestamp ts1 is before Timestamp ts2
233      */
234     @Test
test14()235     public void test14() {
236         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
237         Timestamp ts2 = Timestamp.valueOf("1996-12-13 15:15:25.645634");
238         assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
239     }
240 
241     /*
242      * Validate that Timestamp ts1 is before Timestamp ts2
243      */
244     @Test
test15()245     public void test15() {
246         Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25");
247         Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25");
248         assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
249     }
250 
251     /*
252      * Validate that Timestamp ts1 is before Timestamp ts2
253      */
254     @Test
test16()255     public void test16() {
256 
257         Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
258         Timestamp ts2 = Timestamp.valueOf("1999-11-13 15:15:25.645634");
259         assertFalse(ts1.before(ts2), "Error ts1 before ts2");
260     }
261 
262     /*
263      * Validate that a NullPointerException is thrown if a null is passed to
264      * the before method
265      */
266     @Test(expectedExceptions = NullPointerException.class)
test17()267     public void test17() throws Exception {
268         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
269         ts1.before(null);
270     }
271 
272     /*
273      * Validate a Timestamp cannot be before itself
274      */
275     @Test
test18()276     public void test18() {
277         Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
278         assertFalse(ts1.before(ts1), "Error ts1 before ts1!");
279     }
280 
281     /*
282      * Create 3 Timestamps and make sure the 1st is before the other two
283      * Timestamps which are each greater than the one before it
284      */
285     @Test
test19()286     public void test19() {
287 
288         Timestamp ts1 = new Timestamp(1234560000);
289         Timestamp ts2 = new Timestamp(1234567000);
290         Timestamp ts3 = new Timestamp(1234569000);
291         assertTrue(ts1.before(ts2) && ts2.before(ts3) && ts1.before(ts3));
292     }
293 
294     /*
295      * Validate that Timestamp ts1 is not after Timestamp ts2
296      */
297     @Test
test20()298     public void test20() {
299         Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
300         Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25.645634");
301         assertFalse(ts1.after(ts2), "Error ts1 is after ts2");
302 
303     }
304 
305     /*
306      * Validate that Timestamp ts1 is after Timestamp ts2
307      */
308     @Test
test21()309     public void test21() {
310         Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
311         Timestamp ts2 = Timestamp.valueOf("1996-11-13 15:15:25.645634");
312         assertTrue(ts1.after(ts2), "Error ts1 not after ts2");
313     }
314 
315     /*
316      * Validate that a NullPointerException is thrown if a null is passed to the
317      * after method
318      */
319     @Test(expectedExceptions = NullPointerException.class)
test22()320     public void test22() throws Exception {
321         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
322         ts1.after(null);
323     }
324 
325     /*
326      * Validate that a Timestamp cannot be after itself
327      */
328     @Test
test23()329     public void test23() {
330         Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
331         assertFalse(ts1.after(ts1), "Error ts1 is after itself");
332     }
333 
334     /*
335      * Validate that a Timestamp after() works correctly with Timestamp created
336      * using milliseconds
337      */
338     @Test
test24()339     public void test24() {
340 
341         Timestamp ts1 = new Timestamp(1234568000);
342         Timestamp ts2 = new Timestamp(1234565000);
343         Timestamp ts3 = new Timestamp(1234562000);
344         assertTrue(ts1.after(ts2) && ts2.after(ts3) && ts1.after(ts3));
345     }
346 
347     /*
348      * Validate compareTo returns 0 for Timestamps that are the same
349      */
350     @Test
test25()351     public void test25() {
352         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
353         Timestamp ts2 = new Timestamp(ts1.getTime());
354         assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
355     }
356 
357     /*
358      * Validate compareTo returns -1 for when the 1st Timestamp is earlier than
359      * the 2nd Timestamp
360      */
361     @Test
test26()362     public void test26() {
363         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
364         Timestamp ts2 = new Timestamp(ts1.getTime() + 1000);
365         assertTrue(ts1.compareTo(ts2) == -1, "Error ts1 not before ts2");
366         assertTrue(ts2.compareTo(ts1) == 1, "Error ts1 is not before ts2");
367     }
368 
369     /*
370      * Validate compareTo returns 1 for when the 1st Timestamp is later than the
371      * 2nd Timestamp
372      */
373     @Test
test27()374     public void test27() {
375         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
376         Timestamp ts2 = new Timestamp(ts1.getTime() - 1000);
377         assertTrue(ts1.compareTo(ts2) == 1, "Error ts1 not after ts2");
378         assertTrue(ts2.compareTo(ts1) == -1, "Error ts1 not after ts2");
379     }
380 
381     /*
382      * Validate compareTo returns 0 for Timestamps that are the same
383      */
384     @Test
test28()385     public void test28() {
386         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
387         java.util.Date ts2 = new java.util.Date(ts1.getTime());
388         assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
389     }
390 
391     /*
392      * Validate compareTo returns 0 for Timestamps that are the same
393      */
394     @Test
test29()395     public void test29() {
396         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
397         java.util.Date d = new java.util.Date(ts1.getTime());
398         assertFalse(ts1.equals(d), "Error ts1 == d");
399     }
400 
401     /*
402      * Validate compareTo returns 0 for Timestamps that are the same
403      */
404     @Test
test30()405     public void test30() {
406         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
407         java.util.Date d = new Timestamp(ts1.getTime());
408         assertTrue(ts1.equals(d), "Error ts1 != d");
409     }
410 
411     /*
412      * Validate equals returns false when a Date object is passed to equals
413      */
414     @Test
test31()415     public void test31() {
416         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
417         Date d = new Date(ts1.getTime());
418         assertFalse(ts1.equals(d), "Error ts1 != d");
419     }
420 
421     /*
422      * Validate equals returns false when a Date object is passed to equals
423      */
424     @Test
test32()425     public void test32() {
426         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
427         java.util.Date d = new Date(ts1.getTime());
428         assertFalse(ts1.equals(d), "Error ts1 != d");
429     }
430 
431     /*
432      * Validate equals returns false when a Time object is passed to equals
433      */
434     @Test
test33()435     public void test33() {
436         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
437         Time t1 = new Time(ts1.getTime());
438         assertFalse(ts1.equals(t1), "Error ts1 == t1");
439     }
440 
441     /*
442      * Validate equals returns false when a String object is passed to equals
443      */
444     @Test
test34()445     public void test34() {
446         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
447         assertFalse(ts1.equals("1966-08-30 08:08:08"), "Error ts1 == a String");
448     }
449 
450     /*
451      * Validate getTime() returns the same value from 2 timeStamps created by
452      */
453     @Test
test35()454     public void test35() {
455         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
456         Timestamp ts2 = Timestamp.valueOf("1966-08-30 08:08:08");
457         assertTrue(ts2.getTime() == ts1.getTime(),
458                 "ts1.getTime() != ts2.getTime()");
459         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
460     }
461 
462     /*
463      * Validate getTime() returns the same value from 2 timeStamps when
464      * setTime() is used to specify the same value for both Timestamps
465      */
466     @Test
test36()467     public void test36() {
468         Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
469         Timestamp ts2 = Timestamp.valueOf("1961-08-30 00:00:00");
470         ts2.setTime(ts1.getTime());
471         assertTrue(ts2.getTime() == ts1.getTime(),
472                 "ts1.getTime() != ts2.getTime()");
473         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
474     }
475 
476     /*
477      * Validate an IllegalArgumentException is thrown for an invalid nanos value
478      */
479     @Test(expectedExceptions = IllegalArgumentException.class)
test38()480     public void test38() throws Exception {
481         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
482         ts1.setNanos(-1);
483 
484     }
485 
486     /*
487      * Validate an IllegalArgumentException is thrown for an invalid nanos value
488      */
489     @Test(expectedExceptions = IllegalArgumentException.class)
test39()490     public void test39() throws Exception {
491         int nanos = 999999999;
492         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
493         ts1.setNanos(nanos + 1);
494     }
495 
496     /*
497      * Validate you can set nanos to 999999999
498      */
499     @Test
test40()500     public void test40() throws Exception {
501         int nanos = 999999999;
502         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
503         ts1.setNanos(nanos);
504         assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
505     }
506 
507     /*
508      * Validate you can set nanos to 0
509      */
510     @Test
test41()511     public void test41() throws Exception {
512         int nanos = 0;
513         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
514         ts1.setNanos(nanos);
515         assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
516     }
517 
518     /*
519      * Validate that a Timestamp made from a LocalDateTime are equal
520      */
521     @Test
test42()522     public void test42() throws Exception {
523         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
524         LocalDateTime ldt = ts1.toLocalDateTime();
525         Timestamp ts2 = Timestamp.valueOf(ldt);
526         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
527     }
528 
529     /*
530      * Validate that a Timestamp LocalDateTime value, made from a LocalDateTime
531      * are equal
532      */
533     @Test
test43()534     public void test43() throws Exception {
535         LocalDateTime ldt = LocalDateTime.now();
536         Timestamp ts2 = Timestamp.valueOf(ldt);
537         assertTrue(ldt.equals(ts2.toLocalDateTime()),
538                 "Error LocalDateTime values are not equal");
539     }
540 
541     /*
542      * Validate an NPE occurs when a null LocalDateTime is passed to valueOF
543      */
544     @Test(expectedExceptions = NullPointerException.class)
test44()545     public void test44() throws Exception {
546         LocalDateTime ldt = null;
547         Timestamp.valueOf(ldt);
548     }
549 
550     /*
551      * Validate that a Timestamp made from a Instant are equal
552      */
553     @Test
test45()554     public void test45() throws Exception {
555         Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
556         Instant instant = ts1.toInstant();
557         Timestamp ts2 = Timestamp.from(instant);
558         assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
559     }
560 
561     /*
562      * Validate that a Timestamp made from a Instant are equal
563      */
564     @Test
test46()565     public void test46() throws Exception {
566         Instant instant = Instant.now();
567         Timestamp ts2 = Timestamp.from(instant);
568         assertTrue(instant.equals(ts2.toInstant()),
569                 "Error Instant values do not match");
570     }
571 
572     /*
573      * Validate an NPE occurs when a null instant is passed to from
574      */
575     @Test(expectedExceptions = NullPointerException.class)
test47()576     public void test47() throws Exception {
577         Instant instant = null;
578         Timestamp.from(instant);
579     }
580 
581     // Added SQE tests
582     /*
583      * Create a Timestamp and a 2nd Timestamp that is 1 month earlier and
584      * validate that it is not before or after the original Timestamp
585      */
586     @Test
test48()587     public void test48() {
588         Calendar cal = Calendar.getInstance();
589         Timestamp ts1 = new Timestamp(System.currentTimeMillis());
590         cal.setTimeInMillis(ts1.getTime());
591         cal.add(Calendar.MONTH, -1);
592         cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
593         Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
594         assertFalse(ts1.before(ts2) || ts2.after(ts1));
595     }
596 
597     /*
598      * Create two Timestamps and validate that compareTo returns 1 to indicate
599      * the 1st Timestamp is greater than the 2nd Timestamp
600      */
601     @Test
test49()602     public void test49() {
603         Calendar cal = Calendar.getInstance();
604         Timestamp ts1 = new Timestamp(System.currentTimeMillis());
605         cal.setTimeInMillis(ts1.getTime());
606         cal.add(Calendar.MONTH, -1);
607         cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
608         Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
609         assertTrue(ts1.compareTo(ts2) == 1);
610     }
611 
612     /*
613      * Create two Timestamps and validate that the 1st Timestamp is not equal to
614      * the 2nd Timestamp but equal to itself
615      */
616     @Test
test50()617     public void test50() {
618         Calendar cal = Calendar.getInstance();
619         Timestamp ts1 = new Timestamp(System.currentTimeMillis());
620         cal.setTimeInMillis(ts1.getTime());
621         cal.add(Calendar.MONTH, -1);
622         cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
623         Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
624         assertTrue(!ts1.equals(ts2) && ts1.equals(ts1));
625     }
626 
627     /*
628      * Validate that two Timestamps are equal when one is created from the
629      * toString() of the other
630      */
631     @Test(dataProvider = "validateNanos")
test51(String ts, int nanos)632     public void test51(String ts, int nanos) {
633         Timestamp ts1 = Timestamp.valueOf(ts);
634         Timestamp ts2 = Timestamp.valueOf(ts1.toString());
635         assertTrue(ts1.getNanos() == nanos && ts1.equals(ts2),
636                 "Error with Nanos");
637     }
638 
639     @Test(dataProvider = "validTimestampLongValues")
test52(long value, String ts)640     public void test52(long value, String ts) {
641         Timestamp ts1 = new Timestamp(value);
642         assertEquals(ts1.toString(), ts, "ts1.toString() != ts");
643     }
644 
645     /*
646      * DataProvider used to provide Timestamps which are not valid and are used
647      * to validate that an IllegalArgumentException will be thrown from the
648      * valueOf method
649      */
650     @DataProvider(name = "invalidTimestampValues")
invalidTimestampValues()651     private Object[][] invalidTimestampValues() {
652         return new Object[][]{
653             {"2009-11-01-01 10:50:01"},
654             {"aaaa-11-01-01 10:50"},
655             {"aaaa-11-01 10:50"},
656             {"1961--30 00:00:00"},
657             {"--30 00:00:00"},
658             {"-- 00:00:00"},
659             {"1961-1- 00:00:00"},
660             {"2009-11-01"},
661             {"10:50:01"},
662             {"1961-a-30 00:00:00"},
663             {"1961-01-bb 00:00:00"},
664             {"1961-08-30 00:00:00."},
665             {"1961-08-30 :00:00"},
666             {"1961-08-30 00::00"},
667             {"1961-08-30 00:00:"},
668             {"1961-08-30 ::"},
669             {"1961-08-30 0a:00:00"},
670             {"1961-08-30 00:bb:00"},
671             {"1961-08-30 00:01:cc"},
672             {"1961-08-30 00:00:00.01a"},
673             {"1961-08-30 00:00:00.a"},
674             {"1996-12-10 12:26:19.1234567890"},
675             {null}
676         };
677     }
678 
679     /*
680      * DataProvider used to provide Timestamps which are  valid and are used
681      * to validate that an IllegalArgumentException will not be thrown from the
682      * valueOf method and the corect value from toString() is returned
683      */
684     @DataProvider(name = "validTimestampValues")
validTimestampValues()685     private Object[][] validTimestampValues() {
686         return new Object[][]{
687             {"1961-08-30 00:00:00", "1961-08-30 00:00:00.0"},
688             {"1961-08-30 11:22:33", "1961-08-30 11:22:33.0"},
689             {"1961-8-30 00:00:00", "1961-08-30 00:00:00.0"},
690             {"1966-08-1 00:00:00", "1966-08-01 00:00:00.0"},
691             {"1996-12-10 12:26:19.1", "1996-12-10 12:26:19.1"},
692             {"1996-12-10 12:26:19.12", "1996-12-10 12:26:19.12"},
693             {"1996-12-10 12:26:19.123", "1996-12-10 12:26:19.123"},
694             {"1996-12-10 12:26:19.1234", "1996-12-10 12:26:19.1234"},
695             {"1996-12-10 12:26:19.12345", "1996-12-10 12:26:19.12345"},
696             {"1996-12-10 12:26:19.123456", "1996-12-10 12:26:19.123456"},
697             {"1996-12-10 12:26:19.1234567", "1996-12-10 12:26:19.1234567"},
698             {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
699             {"1996-12-10 12:26:19.123456789", "1996-12-10 12:26:19.123456789"},
700             {"1996-12-10 12:26:19.000000001", "1996-12-10 12:26:19.000000001"},
701             {"1996-12-10 12:26:19.000000012", "1996-12-10 12:26:19.000000012"},
702             {"1996-12-10 12:26:19.000000123", "1996-12-10 12:26:19.000000123"},
703             {"1996-12-10 12:26:19.000001234", "1996-12-10 12:26:19.000001234"},
704             {"1996-12-10 12:26:19.000012345", "1996-12-10 12:26:19.000012345"},
705             {"1996-12-10 12:26:19.000123456", "1996-12-10 12:26:19.000123456"},
706             {"1996-12-10 12:26:19.001234567", "1996-12-10 12:26:19.001234567"},
707             {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
708             {"1996-12-10 12:26:19.0", "1996-12-10 12:26:19.0"},
709             {"1996-12-10 12:26:19.01230", "1996-12-10 12:26:19.0123"}
710         };
711     }
712 
713     @DataProvider(name = "validTimestampLongValues")
validTimestampLongValues()714     private Object[][] validTimestampLongValues() {
715         return new Object[][]{
716             {1L, "1970-01-01 01:00:00.001"},
717             {-3600*1000L - 1, "1969-12-31 23:59:59.999"},
718             {-(20000L*365*24*60*60*1000), "18018-08-28 01:00:00.0"},
719             {Timestamp.valueOf("1961-08-30 11:22:33").getTime(), "1961-08-30 11:22:33.0"},
720             {Timestamp.valueOf("1961-08-30 11:22:33.54321000").getTime(), "1961-08-30 11:22:33.543"}, // nanoprecision lost
721             {new Timestamp(114, 10, 10, 10, 10, 10, 100000000).getTime(), "2014-11-10 10:10:10.1"},
722             {new Timestamp(0, 10, 10, 10, 10, 10, 100000).getTime(), "1900-11-10 10:10:10.0"}, // nanoprecision lost
723             {new Date(114, 10, 10).getTime(), "2014-11-10 00:00:00.0"},
724             {new Date(0, 10, 10).getTime(), "1900-11-10 00:00:00.0"},
725             {LocalDateTime.of(1960, 10, 10, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
726                 .toInstant().toEpochMilli(), "1960-10-10 19:10:10.0"},
727 
728             // millisecond timestamps wraps around at year 1, so Long.MIN_VALUE looks similar
729             // Long.MAX_VALUE, while actually representing 292278994 BCE
730             {Long.MIN_VALUE, "292278994-08-17 08:12:55.192"},
731             {Long.MAX_VALUE + 1, "292278994-08-17 08:12:55.192"},
732             {Long.MAX_VALUE, "292278994-08-17 08:12:55.807"},
733             {Long.MIN_VALUE - 1, "292278994-08-17 08:12:55.807"},
734 
735             // wrap around point near 0001-01-01, test that we never get a negative year:
736             {-(1970L*365*24*60*60*1000), "0001-04-25 01:00:00.0"},
737             {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L), "0001-12-31 01:00:00.0"},
738             {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L - 23*60*60*1000L), "0001-01-01 00:00:00.0"},
739 
740             {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
741                 .toInstant().toEpochMilli() - 2*24*60*60*1000L, "0001-01-01 19:03:08.0"}, // 1 BCE
742             {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
743                 .toInstant().toEpochMilli() - 3*24*60*60*1000L, "0002-12-31 19:03:08.0"} // 2 BCE
744         };
745     }
746 
747     /*
748      * DataProvider used to provide Timestamp and Nanos values in order to
749      * validate that the correct Nanos value is generated from the specified
750      * Timestamp
751      */
752     @DataProvider(name = "validateNanos")
validateNanos()753     private Object[][] validateNanos() {
754         return new Object[][]{
755             {"1961-08-30 00:00:00", 0},
756             {"1996-12-10 12:26:19.1", 100000000},
757             {"1996-12-10 12:26:19.12", 120000000},
758             {"1996-12-10 12:26:19.123", 123000000},
759             {"1996-12-10 12:26:19.1234", 123400000},
760             {"1996-12-10 12:26:19.12345", 123450000},
761             {"1996-12-10 12:26:19.123456", 123456000},
762             {"1996-12-10 12:26:19.1234567", 123456700},
763             {"1996-12-10 12:26:19.12345678", 123456780},
764             {"1996-12-10 12:26:19.123456789", 123456789},
765             {"1996-12-10 12:26:19.000000001", 1},
766             {"1996-12-10 12:26:19.000000012", 12},
767             {"1996-12-10 12:26:19.000000123", 123},
768             {"1996-12-10 12:26:19.000001234", 1234},
769             {"1996-12-10 12:26:19.000012345", 12345},
770             {"1996-12-10 12:26:19.000123456", 123456},
771             {"1996-12-10 12:26:19.001234567", 1234567},
772             {"1996-12-10 12:26:19.012345678", 12345678},
773             {"1996-12-10 12:26:19.0", 0},
774             {"1996-12-10 12:26:19.01230", 12300000}
775         };
776     }
777 }
778