1 21 22 package org.opensubsystems.core.persist.db.driver; 23 24 import java.sql.PreparedStatement ; 25 import java.sql.ResultSet ; 26 import java.sql.SQLException ; 27 import java.text.DateFormat ; 28 import java.util.Calendar ; 29 30 import junit.extensions.TestSetup; 31 import junit.framework.Test; 32 import junit.framework.TestSuite; 33 34 import org.opensubsystems.core.error.OSSException; 35 import org.opensubsystems.core.persist.db.Database; 36 import org.opensubsystems.core.persist.db.DatabaseImpl; 37 import org.opensubsystems.core.persist.db.DatabaseTest; 38 import org.opensubsystems.core.persist.db.DatabaseTestSetup; 39 import org.opensubsystems.core.persist.db.DatabaseTestSuite; 40 import org.opensubsystems.core.util.DatabaseUtils; 41 import org.opensubsystems.core.util.DateUtils; 42 43 60 public final class TimestampTest 61 { 62 64 67 private TimestampTest( 68 ) 69 { 70 } 72 73 75 81 public static Test suite( 82 ) 83 { 84 TestSuite suite = new DatabaseTestSuite("TimestampTest"); 85 suite.addTestSuite(TimestampTestInternal.class); 86 TestSetup wrapper = new DatabaseTestSetup(suite); 87 88 return wrapper; 89 } 90 91 96 public static class TimestampTestInternal extends DatabaseTest 97 { 98 101 static 102 { 103 Database dbDatabase; 105 106 try 107 { 108 dbDatabase = DatabaseImpl.getInstance(); 109 dbDatabase.add(DatabaseTestSchema.class); 111 } 112 catch (OSSException bfeExc) 113 { 114 throw new RuntimeException ("Unexpected exception.", bfeExc); 115 } 116 } 117 118 123 public TimestampTestInternal( 124 String strTestName 125 ) 126 { 127 super(strTestName); 128 } 129 130 143 public void testBasicTimestampSupport( 144 ) throws Throwable 145 { 146 final String INSERT_TIMESTAMP = "insert into TIMESTAMP_TEST(TIMESTAMP_TEST) values (?)"; 147 final String SELECT_TIMESTAMP = "select TIMESTAMP_TEST.* from TIMESTAMP_TEST " + 149 "where TIMESTAMP_TEST = ?"; 150 final String DELETE_TIMESTAMP = "delete from TIMESTAMP_TEST where TIMESTAMP_TEST = ?"; 151 final int PRESET_NANOSECONDS = 999999999; 154 155 Calendar calGenerate = Calendar.getInstance(); 156 java.sql.Timestamp insertTimestamp; 157 PreparedStatement insertStatement; 158 int iUpdateCount; 159 160 calGenerate.set(1974, 9, 15, 1, 2, 3); 162 insertTimestamp = new java.sql.Timestamp (calGenerate.getTimeInMillis()); 163 insertTimestamp.setNanos(PRESET_NANOSECONDS); 165 166 m_transaction.begin(); 168 170 try 171 { 172 insertStatement = m_connection.prepareStatement(INSERT_TIMESTAMP); 173 insertStatement.setTimestamp(1, insertTimestamp); 174 175 iUpdateCount = DatabaseUtils.executeUpdateAndClose(insertStatement); 176 177 m_transaction.commit(); 178 } 179 catch (Throwable throwable) 180 { 181 m_transaction.rollback(); 182 throw throwable; 183 } 184 185 assertEquals("Exactly one record with time data shoud have been inserted.", 186 iUpdateCount, 1); 187 188 PreparedStatement selectStatement = null; 190 PreparedStatement deleteStatement = null; 191 192 ResultSet results = null; 193 java.sql.Timestamp retrievedTimestamp; 194 boolean bHasMoreThanOne; 195 int iDeletedCount = 0; 196 197 m_transaction.begin(); 199 201 try 202 { 203 java.sql.Timestamp selectTimestamp; 204 boolean bUpdatableResultSet = true; 205 206 try 207 { 208 selectStatement = m_connection.prepareStatement( 209 SELECT_TIMESTAMP, 210 ResultSet.TYPE_SCROLL_SENSITIVE, 211 ResultSet.CONCUR_UPDATABLE); 212 } 213 catch (SQLException sqleExc) 214 { 215 bUpdatableResultSet = false; 218 selectStatement = m_connection.prepareStatement(SELECT_TIMESTAMP); 219 } 222 223 calGenerate.set(1974, 9, 15, 1, 2, 3); 225 selectTimestamp = new java.sql.Timestamp (calGenerate.getTimeInMillis()); 226 selectTimestamp.setNanos(PRESET_NANOSECONDS); 228 229 selectStatement.setTimestamp(1, selectTimestamp); 230 results = selectStatement.executeQuery(); 231 232 assertTrue("The inserted timestamp is not in the database.", results.next()); 234 retrievedTimestamp = results.getTimestamp(1); 235 if (bUpdatableResultSet) 237 { 238 try 242 { 243 results.deleteRow(); 244 iDeletedCount = 1; 245 } 246 catch (SQLException sqleExc) 247 { 248 bUpdatableResultSet = false; 251 } 252 } 253 if (!bUpdatableResultSet) 254 { 255 deleteStatement = m_connection.prepareStatement(DELETE_TIMESTAMP); 256 deleteStatement.setTimestamp(1, insertTimestamp); 257 iDeletedCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); 258 } 259 bHasMoreThanOne = results.next(); 262 m_transaction.commit(); 263 } 264 catch (Throwable throwable) 265 { 266 m_transaction.rollback(); 267 throw throwable; 268 } 269 finally 270 { 271 DatabaseUtils.closeResultSetAndStatement(results, selectStatement); 272 273 m_transaction.begin(); 275 try 277 { 278 deleteStatement = m_connection.prepareStatement( 279 "delete from TIMESTAMP_TEST"); 280 deleteStatement.execute(); 281 m_transaction.commit(); 282 } 283 catch (Throwable thr) 284 { 285 m_transaction.rollback(); 286 throw thr; 287 } 288 finally 289 { 290 DatabaseUtils.closeStatement(deleteStatement); 291 } 292 } 293 294 assertFalse("There should be only one inserted timestamp in the database.", 295 bHasMoreThanOne); 296 297 assertEquals("Exactly one record with date data shoud have been deleted.", 298 iDeletedCount, 1); 299 300 assertNotNull("The inserted timestamp shouldn't be retrieved" + 302 " as null from the database", 303 retrievedTimestamp); 304 assertTrue("The timestamp retrieved from database " 307 + retrievedTimestamp.toString() 308 + " is not the same as the inserted one " 309 + insertTimestamp.toString(), 310 DateUtils.dateAndTimeEquals(retrievedTimestamp, insertTimestamp)); 311 312 assertEquals("The database doesn't support correct retrieval of large nanosecond " + 314 "portion of the timestamp. The retrieved one is not the same as the " + 315 "inserted one.", 316 insertTimestamp.getNanos(), retrievedTimestamp.getNanos()); 317 } 318 319 333 public void testSmallNanosTimestampSupport( 334 ) throws Throwable 335 { 336 final String INSERT_TIMESTAMP = "insert into TIMESTAMP_TEST(TIMESTAMP_TEST) values (?)"; 337 final String SELECT_TIMESTAMP 339 = "select TIMESTAMP_TEST.* from TIMESTAMP_TEST where TIMESTAMP_TEST = ?"; 340 final String DELETE_TIMESTAMP = "delete from TIMESTAMP_TEST where TIMESTAMP_TEST = ?"; 341 final int PRESET_NANOSECONDS = 5; 343 344 Calendar calGenerate = Calendar.getInstance(); 345 java.sql.Timestamp insertTimestamp; 346 PreparedStatement insertStatement; 347 int iUpdateCount; 348 349 calGenerate.set(1974, 9, 15, 1, 2, 3); 351 insertTimestamp = new java.sql.Timestamp (calGenerate.getTimeInMillis()); 352 insertTimestamp.setNanos(PRESET_NANOSECONDS); 354 355 m_transaction.begin(); 357 359 try 360 { 361 insertStatement = m_connection.prepareStatement(INSERT_TIMESTAMP); 362 insertStatement.setTimestamp(1, insertTimestamp); 363 364 iUpdateCount = DatabaseUtils.executeUpdateAndClose(insertStatement); 365 366 m_transaction.commit(); 367 } 368 catch (Throwable throwable) 369 { 370 m_transaction.rollback(); 371 throw throwable; 372 } 373 374 assertEquals("Exactly one record with time data shoud have been inserted.", 375 1, iUpdateCount); 376 377 PreparedStatement selectStatement = null; 379 PreparedStatement deleteStatement = null; 380 ResultSet results = null; 381 java.sql.Timestamp retrievedTimestamp; 382 boolean bHasMoreThanOne; 383 int iDeletedCount = 0; 384 385 m_transaction.begin(); 387 389 try 390 { 391 java.sql.Timestamp selectTimestamp; 392 boolean bUpdatableResultSet = true; 393 394 try 395 { 396 selectStatement = m_connection.prepareStatement( 397 SELECT_TIMESTAMP, 398 ResultSet.TYPE_SCROLL_SENSITIVE, 399 ResultSet.CONCUR_UPDATABLE); 400 } 401 catch (SQLException sqleExc) 402 { 403 bUpdatableResultSet = false; 406 selectStatement = m_connection.prepareStatement(SELECT_TIMESTAMP); 407 } 410 411 calGenerate.set(1974, 9, 15, 1, 2, 3); 413 selectTimestamp = new java.sql.Timestamp (calGenerate.getTimeInMillis()); 414 selectTimestamp.setNanos(PRESET_NANOSECONDS); 416 417 selectStatement.setTimestamp(1, selectTimestamp); 418 results = selectStatement.executeQuery(); 419 420 assertTrue("The inserted timestamp is not in the database.", 422 results.next()); 423 retrievedTimestamp = results.getTimestamp(1); 424 if (bUpdatableResultSet) 426 { 427 try 431 { 432 results.deleteRow(); 433 iDeletedCount = 1; 434 } 435 catch (SQLException sqleExc) 436 { 437 bUpdatableResultSet = false; 440 } 441 } 442 if (!bUpdatableResultSet) 443 { 444 deleteStatement = m_connection.prepareStatement(DELETE_TIMESTAMP); 445 deleteStatement.setTimestamp(1, insertTimestamp); 446 iDeletedCount = DatabaseUtils.executeUpdateAndClose(deleteStatement); 447 } 448 bHasMoreThanOne = results.next(); 451 m_transaction.commit(); 452 } 453 catch (Throwable throwable) 454 { 455 m_transaction.rollback(); 456 throw throwable; 457 } 458 finally 459 { 460 DatabaseUtils.closeResultSetAndStatement(results, selectStatement); 461 462 m_transaction.begin(); 464 466 try 467 { 468 deleteStatement = m_connection.prepareStatement( 469 "delete from TIMESTAMP_TEST"); 470 deleteStatement.execute(); 471 m_transaction.commit(); 472 } 473 catch (Throwable thr) 474 { 475 m_transaction.rollback(); 476 throw thr; 477 } 478 finally 479 { 480 DatabaseUtils.closeStatement(deleteStatement); 481 } 482 } 483 484 assertFalse("There should be only one inserted timestamp in the database.", 485 bHasMoreThanOne); 486 487 assertEquals("Exactly one record with date data shoud have been deleted.", 488 iDeletedCount, 1); 489 490 assertNotNull("The inserted timestamp shouldn't be retrieved" + 492 " as null from the database", 493 retrievedTimestamp); 494 assertTrue("The timestamp retrieved from database " 495 + DateFormat.getDateTimeInstance().format(retrievedTimestamp) 496 + " is not the same as the inserted one " 497 + DateFormat.getDateTimeInstance().format(insertTimestamp), 498 DateUtils.dateAndTimeEquals(retrievedTimestamp, insertTimestamp)); 499 500 assertEquals("The database doesn't support correct retrieval of small nanosecond " + 502 "portion of the timestamp. The retrieved one is not the same as the " + 503 "inserted one.", 504 insertTimestamp.getNanos(), retrievedTimestamp.getNanos()); 505 } 506 507 520 public void testTimestampNanosSupport( 521 ) throws Throwable 522 { 523 final String INSERT_TIMESTAMP = "insert into TIMESTAMP_TEST(TIMESTAMP_TEST) values (?)"; 524 final String SELECT_TIMESTAMP 526 = "select TIMESTAMP_TEST.* from TIMESTAMP_TEST where TIMESTAMP_TEST = ?"; 527 final int PRESET_NANOSECONDS = 5; 528 final int DIFFERENT_PRESET_NANOSECONDS = 999999999; 529 530 Calendar calGenerate = Calendar.getInstance(); 531 java.sql.Timestamp insertTimestamp; 532 PreparedStatement insertStatement; 533 int iUpdateCount; 534 535 calGenerate.set(1974, 9, 15, 1, 2, 3); 537 insertTimestamp = new java.sql.Timestamp (calGenerate.getTimeInMillis()); 538 insertTimestamp.setNanos(PRESET_NANOSECONDS); 540 541 m_transaction.begin(); 543 545 try 546 { 547 insertStatement = m_connection.prepareStatement(INSERT_TIMESTAMP); 548 insertStatement.setTimestamp(1, insertTimestamp); 549 550 iUpdateCount = DatabaseUtils.executeUpdateAndClose(insertStatement); 551 552 m_transaction.commit(); 553 } 554 catch (Throwable throwable) 555 { 556 m_transaction.rollback(); 557 throw throwable; 558 } 559 560 assertEquals("Exactly one record with time data shoud have been inserted.", 561 iUpdateCount, 1); 562 563 PreparedStatement selectStatement = null; 565 PreparedStatement deleteStatement = null; 566 ResultSet results = null; 567 568 try 569 { 570 java.sql.Timestamp selectTimestamp; 571 572 selectStatement = m_connection.prepareStatement(SELECT_TIMESTAMP); 573 574 selectTimestamp = new java.sql.Timestamp (insertTimestamp.getTime()); 576 selectTimestamp.setNanos(DIFFERENT_PRESET_NANOSECONDS); 577 578 selectStatement.setTimestamp(1, selectTimestamp); 579 results = selectStatement.executeQuery(); 580 581 assertFalse("The inserted timestamp was retrieved from" + 583 " the database even though different nanoseconds" + 584 " were specified and no result should have been retrieved.", 585 results.next()); 586 } 587 catch (Throwable throwable) 588 { 589 throw throwable; 590 } 591 finally 592 { 593 DatabaseUtils.closeResultSetAndStatement(results, selectStatement); 594 595 m_transaction.begin(); 597 599 try 600 { 601 deleteStatement = m_connection.prepareStatement( 602 "delete from TIMESTAMP_TEST"); 603 deleteStatement.executeUpdate(); 604 m_transaction.commit(); 605 } 606 catch (Throwable thr) 607 { 608 m_transaction.rollback(); 609 throw thr; 610 } 611 finally 612 { 613 DatabaseUtils.closeStatement(deleteStatement); 614 } 615 } 616 } 617 } 618 } 619 | Popular Tags |