Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Mark DBDatetimeTest skipped on wrong offsets, rather than error out.

While well-intentioned, this test keeps causing problems
due to wrong timezone settings in test mode.
It shouldn't completely abort test execution,
since its more of an environment sanity check than a failed test.

Refactored to mark test skipped (regardless of offset, as long as
its greater than 5 seconds). And skipping tests altogether
on SQLite3 with new supportsTimezoneOverride() check.
SapphireTest->setUp() sets the PHP timezone to UTC (see 5954774),
but SQLite doesn't support this for a DB connection.
Since changing it on a global UNIX system level is infeasible,
the tests need to be skipped.
  • Loading branch information...
commit 664903433deea72c2ae0f0e644587a1e911d5080 1 parent 683d420
Ingo Schommer chillu authored
Showing with 82 additions and 86 deletions.
  1. +82 −86 tests/model/DbDatetimeTest.php
168 tests/model/DbDatetimeTest.php
View
@@ -6,20 +6,16 @@ class DbDatetimeTest extends FunctionalTest {
protected $extraDataObjects = array('DbDatetimeTest_Team');
- private static $offset = 0; // number of seconds of php and db time are out of sync
- private static $offset_thresholds = array( // throw an error if the offset exceeds 30 minutes
- E_USER_ERROR => 1800,
- E_USER_NOTICE => 5,
- );
+ protected $offset;
+
+ protected $adapter;
- private $adapter;
-
/**
* Check if dates match more or less. This takes into the account the db query
* can overflow to the next second giving offset readings.
*/
- private function matchesRoughly($date1, $date2, $comment = '') {
- $allowedDifference = 5 + abs(self::$offset); // seconds
+ private function matchesRoughly($date1, $date2, $comment = '', $offset) {
+ $allowedDifference = 5 + abs($offset); // seconds
$time1 = is_numeric($date1) ? $date1 : strtotime($date1);
$time2 = is_numeric($date2) ? $date2 : strtotime($date2);
@@ -31,104 +27,104 @@ private function getDbNow() {
$query = 'SELECT ' . $this->adapter->formattedDatetimeClause('now', '%U');
return DB::query($query)->value();
}
-
- function setUpOnce() {
- parent::setUpOnce();
-
- self::$offset = time() - strtotime(DB::query('SELECT ' . DB::getConn()->now())->value());
- foreach(self::$offset_thresholds as $code => $offset) {
- if(abs(self::$offset) > $offset) {
- if($code == E_USER_NOTICE) {
- Debug::show('The time of the database is out of sync with the webserver by ' . abs(self::$offset) . ' seconds.');
- } else {
- trigger_error('The time of the database is out of sync with the webserver by ' . abs(self::$offset) . ' seconds.', $code);
- }
- break;
- }
+
+ /**
+ * Needs to be run within a test*() context.
+ *
+ * @return Int Offset in seconds
+ */
+ private function checkPreconditions() {
+ // number of seconds of php and db time are out of sync
+ $offset = time() - strtotime(DB::query('SELECT ' . DB::getConn()->now())->value());
+ $threshold = 5; // seconds
+
+ if($offset > 5) {
+ $this->markTestSkipped('The time of the database is out of sync with the webserver by ' . abs($offset) . ' seconds.');
+ }
+
+ if(method_exists($this->adapter, 'supportsTimezoneOverride') && !$this->adapter->supportsTimezoneOverride()) {
+ $this->markTestSkipped("Database doesn't support timezone overrides");
}
+
+ return $offset;
}
function setUp() {
parent::setUp();
$this->adapter = DB::getConn();
- $this->supportDbDatetime = method_exists($this->adapter, 'datetimeIntervalClause');
}
function testCorrectNow() {
- if($this->supportDbDatetime) {
- $clause = $this->adapter->formattedDatetimeClause('now', '%U');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->assertRegExp('/^\d*$/', (string) $result);
- $this->assertTrue($result>0);
- }
+ $offset = $this->checkPreconditions();
+
+ $clause = $this->adapter->formattedDatetimeClause('now', '%U');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->assertRegExp('/^\d*$/', (string) $result);
+ $this->assertTrue($result>0);
}
function testDbDatetimeFormat() {
- if($this->supportDbDatetime) {
- $clause = $this->adapter->formattedDatetimeClause('1973-10-14 10:30:00', '%H:%i, %d/%m/%Y');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, date('H:i, d/m/Y', strtotime('1973-10-14 10:30:00')), 'nice literal time');
-
- $clause = $this->adapter->formattedDatetimeClause('now', '%d');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, date('d', $this->getDbNow()), 'todays day');
-
- $clause = $this->adapter->formattedDatetimeClause('"Created"', '%U') . ' AS test FROM "DbDateTimeTest_Team"';
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created), 'fixture ->Created as timestamp');
- }
+ $offset = $this->checkPreconditions();
+
+ $clause = $this->adapter->formattedDatetimeClause('1973-10-14 10:30:00', '%H:%i, %d/%m/%Y');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, date('H:i, d/m/Y', strtotime('1973-10-14 10:30:00')), 'nice literal time', $offset);
+
+ $clause = $this->adapter->formattedDatetimeClause('now', '%d');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, date('d', $this->getDbNow()), 'todays day', $offset);
+
+ $clause = $this->adapter->formattedDatetimeClause('"Created"', '%U') . ' AS test FROM "DbDateTimeTest_Team"';
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created), 'fixture ->Created as timestamp', $offset);
}
function testDbDatetimeInterval() {
- if($this->supportDbDatetime) {
-
- $clause = $this->adapter->datetimeIntervalClause('1973-10-14 10:30:00', '+18 Years');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, '1991-10-14 10:30:00', 'add 18 years');
+ $offset = $this->checkPreconditions();
- $clause = $this->adapter->datetimeIntervalClause('now', '+1 Day');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime('+1 Day', $this->getDbNow())), 'tomorrow');
+ $clause = $this->adapter->datetimeIntervalClause('1973-10-14 10:30:00', '+18 Years');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, '1991-10-14 10:30:00', 'add 18 years', $offset);
- $query = new SQLQuery();
- $query->setSelect(array());
- $query->selectField($this->adapter->datetimeIntervalClause('"Created"', '-15 Minutes'), 'test')
- ->setFrom('"DbDateTimeTest_Team"')
- ->setLimit(1);
+ $clause = $this->adapter->datetimeIntervalClause('now', '+1 Day');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime('+1 Day', $this->getDbNow())), 'tomorrow', $offset);
- $result = $query->execute()->value();
- $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created) - 900), '15 Minutes before creating fixture');
+ $query = new SQLQuery();
+ $query->setSelect(array());
+ $query->selectField($this->adapter->datetimeIntervalClause('"Created"', '-15 Minutes'), 'test')
+ ->setFrom('"DbDateTimeTest_Team"')
+ ->setLimit(1);
- }
+ $result = $query->execute()->value();
+ $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created) - 900), '15 Minutes before creating fixture', $offset);
}
function testDbDatetimeDifference() {
- if($this->supportDbDatetime) {
-
- $clause = $this->adapter->datetimeDifferenceClause('1974-10-14 10:30:00', '1973-10-14 10:30:00');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result/86400, 365, '1974 - 1973 = 365 * 86400 sec');
-
- $clause = $this->adapter->datetimeDifferenceClause(date('Y-m-d H:i:s', strtotime('-15 seconds')), 'now');
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, -15, '15 seconds ago - now');
-
- $clause = $this->adapter->datetimeDifferenceClause('now', $this->adapter->datetimeIntervalClause('now', '+45 Minutes'));
- $result = DB::query('SELECT ' . $clause)->value();
- $this->matchesRoughly($result, -45 * 60, 'now - 45 minutes ahead');
-
- $query = new SQLQuery();
- $query->setSelect(array());
- $query->selectField($this->adapter->datetimeDifferenceClause('"LastEdited"', '"Created"'), 'test')
- ->setFrom('"DbDateTimeTest_Team"')
- ->setLimit(1);
-
- $result = $query->execute()->value();
- $lastedited = Dataobject::get_one('DbDateTimeTest_Team')->LastEdited;
- $created = Dataobject::get_one('DbDateTimeTest_Team')->Created;
- $this->matchesRoughly($result, strtotime($lastedited) - strtotime($created), 'age of HomePage record in seconds since unix epoc');
-
- }
+ $offset = $this->checkPreconditions();
+
+ $clause = $this->adapter->datetimeDifferenceClause('1974-10-14 10:30:00', '1973-10-14 10:30:00');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result/86400, 365, '1974 - 1973 = 365 * 86400 sec', $offset);
+
+ $clause = $this->adapter->datetimeDifferenceClause(date('Y-m-d H:i:s', strtotime('-15 seconds')), 'now');
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, -15, '15 seconds ago - now', $offset);
+
+ $clause = $this->adapter->datetimeDifferenceClause('now', $this->adapter->datetimeIntervalClause('now', '+45 Minutes'));
+ $result = DB::query('SELECT ' . $clause)->value();
+ $this->matchesRoughly($result, -45 * 60, 'now - 45 minutes ahead', $offset);
+
+ $query = new SQLQuery();
+ $query->setSelect(array());
+ $query->selectField($this->adapter->datetimeDifferenceClause('"LastEdited"', '"Created"'), 'test')
+ ->setFrom('"DbDateTimeTest_Team"')
+ ->setLimit(1);
+
+ $result = $query->execute()->value();
+ $lastedited = Dataobject::get_one('DbDateTimeTest_Team')->LastEdited;
+ $created = Dataobject::get_one('DbDateTimeTest_Team')->Created;
+ $this->matchesRoughly($result, strtotime($lastedited) - strtotime($created), 'age of HomePage record in seconds since unix epoc', $offset);
}
}
@@ -137,4 +133,4 @@ class DbDateTimeTest_Team extends DataObject implements TestOnly {
static $db = array(
'Title' => 'Varchar'
);
-}
+}
Please sign in to comment.
Something went wrong with that request. Please try again.