|
Perforce Chronicle 2012.2/486814
API Documentation
|
Test the cron model. More...
Public Member Functions | |
| testRunDependent () | |
| Test run() method where each run may not trigger all cycles. | |
| testRunIndependent () | |
| Test run() method where each cron run should trigger all cycles. | |
| testRunPeriodic () | |
| Perform series of cron runs in constant intervals. | |
Static Public Member Functions | |
| static | updateCounter ($counter) |
| Updates specified counter by one. | |
Protected Member Functions | |
| _initSubscribe () | |
| Helper function to subscribe to all cron topics. | |
| _verifyCounters (array $expected, $message= '') | |
| Helper function to compare counters with expected values. | |
| _verifyResult (array $result, $expected=null) | |
| Helper function to compare result of Cron_Model_Cron::run() method with provided $expected values where $expected is string of length 4 where first letter represents expected result for hourly frequency, second for daily, third for weekly and fourth for monthly. | |
Static Protected Member Functions | |
| static | _resetCounters () |
| Resets counters. | |
Static Protected Attributes | |
| static | $_counters = array() |
Test the cron model.
| Cron_Test_CronTest::_initSubscribe | ( | ) | [protected] |
Helper function to subscribe to all cron topics.
{
// prepare callback for the pubsub
$callback = function ($frequency)
{
return function() use ($frequency)
{
Cron_Test_CronTest::updateCounter($frequency);
return array(
"foo",
"p4cms.cron.$frequency published"
);
};
};
P4Cms_PubSub::subscribe('p4cms.cron.hourly', $callback('hourly'));
P4Cms_PubSub::subscribe('p4cms.cron.daily', $callback('daily'));
P4Cms_PubSub::subscribe('p4cms.cron.weekly', $callback('weekly'));
P4Cms_PubSub::subscribe('p4cms.cron.monthly', $callback('monthly'));
}
| static Cron_Test_CronTest::_resetCounters | ( | ) | [static, protected] |
Resets counters.
{
static::$_counters = array();
}
| Cron_Test_CronTest::_verifyCounters | ( | array $ | expected, |
| $ | message = '' |
||
| ) | [protected] |
Helper function to compare counters with expected values.
| array | $expected | list of expected counters and their values |
| type | $message | (optional) message for assert |
{
$counters = static::$_counters;
ksort($counters);
ksort($expected);
$this->assertSame($expected, $counters, $message);
}
| Cron_Test_CronTest::_verifyResult | ( | array $ | result, |
| $ | expected = null |
||
| ) | [protected] |
Helper function to compare result of Cron_Model_Cron::run() method with provided $expected values where $expected is string of length 4 where first letter represents expected result for hourly frequency, second for daily, third for weekly and fourth for monthly.
Letters are mapped as follows: e ... executed s ... skipped f ... failed
| array | $result | result array returned by the Cron_Model_Cron::run() method |
| string | null | $expected | (optional) encoded expected result, defaults to 'eeee' |
{
if ($expected === null) {
$expected = 'eeee';
}
$cron = array('hourly', 'daily', 'weekly', 'monthly');
$expectedResult = array();
$statusMap = array(
'e' => 'executed',
's' => 'skipped',
'f' => 'failed'
);
foreach ($cron as $index => $frequence) {
$statusShort = substr($expected, $index, 1);
$expectedResult[$frequence] = $statusMap[$statusShort];
}
$this->assertSame(
$expectedResult,
$result,
"Expected cron run result."
);
}
| Cron_Test_CronTest::testRunDependent | ( | ) |
Test run() method where each run may not trigger all cycles.
{
$this->_initSubscribe();
static::_resetCounters();
$timestamp = strtotime("2012-09-02 13:13:13");
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result);
$this->_verifyCounters(
array('hourly' => 1, 'daily' => 1, 'weekly' => 1, 'monthly' => 1),
"Expected each cron cycle was run once."
);
// run the same cron and ensure no cycles were run
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result, 'ssss');
$this->_verifyCounters(
array(),
"Expected no cron cycle was run."
);
// run with time shifted towards by half an hour
$timestamp = strtotime("2012-09-02 13:43:13");
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result, 'ssss');
$this->_verifyCounters(
array(),
"Unexpected cron run cycle."
);
// run with time in next hour, should update only cron.hourly
$timestamp = strtotime("2012-09-02 14:02:01");
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result, 'esss');
$this->_verifyCounters(
array('hourly' => 1),
"Unexpected cron run cycle."
);
// run next day
$timestamp = strtotime("2012-09-03 01:00:05");
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result, 'eees');
$this->_verifyCounters(
array('hourly' => 1, 'daily' => 1, 'weekly' => 1),
"Unexpected cron run cycle."
);
// run next day
$timestamp = strtotime("2012-09-04 01:00:05");
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result, 'eess');
$this->_verifyCounters(
array('hourly' => 1, 'daily' => 1),
"Unexpected cron run cycle."
);
}
| Cron_Test_CronTest::testRunIndependent | ( | ) |
Test run() method where each cron run should trigger all cycles.
{
$tests = array(
array(
'line' => __LINE__,
'date' => '2011-01-01 15:45:27'
),
array(
'line' => __LINE__,
'date' => '2001-11-17 00:00:01'
),
array(
'line' => __LINE__,
'date' => '2007-02-25 07:00:01'
),
array(
'line' => __LINE__,
'date' => '2020-05-31 23:59:59'
),
array(
'line' => __LINE__,
'date' => '2020-06-01 00:00:00'
)
);
// run tests
$this->_initSubscribe();
$revisionsCount = 2;
$cronFiles = array('hourly', 'daily', 'weekly', 'monthly');
foreach ($tests as $test) {
static::_resetCounters();
$timestamp = strtotime($test['date']);
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result);
$this->_verifyCounters(
array('hourly' => 1, 'daily' => 1, 'weekly' => 1, 'monthly' => 1),
"Line {$test['line']}: Expected each cron cycle was run once."
);
// verify cron file revisions and attributes
foreach ($cronFiles as $record) {
$cronFile = Cron_Model_Cron::fetch($record);
// ensure 2 new revisions of each cron file have been created
$this->assertSame(
$revisionsCount,
count($cronFile->toP4File()->getChanges()),
"Line {$test['line']}: Expected 2 new revisions created."
);
// verify last run attribute
$this->assertSame(
$timestamp,
$cronFile->getRunTime(),
"Line {$test['line']}: Expected value for lastRun attribute."
);
// verify completed attribute
$this->assertSame(
true,
$cronFile->getCompleted(),
"Line {$test['line']}: Expected value for completed attribute."
);
// ensure that returned messages are contained in the data attribute
// of the cron file
$messages = array(
"foo",
"p4cms.cron.$record published"
);
$this->assertTrue(
in_array($messages, $cronFile->getData()),
"Line {$test['line']}: Expected messages are captured in the cron data attribute."
);
// verify filetype of cron log file
$this->assertSame(
'ctext',
$cronFile->toP4File()->getStatus('headType'),
"LINE {$test['line']}: Expected ctext filetype"
);
}
$revisionsCount += 2;
}
}
| Cron_Test_CronTest::testRunPeriodic | ( | ) |
Perform series of cron runs in constant intervals.
{
$this->_initSubscribe();
$timestamp = strtotime("2012-10-31 00:00:01");
$result = Cron_Model_Cron::run(null, $timestamp);
$this->_verifyResult($result);
// simulate running cron for a day in 30-min intervals
for ($i = 1; $i < 24; $i++) {
// add 30 minutes
$timestamp += 1800;
static::_resetCounters();
$result = Cron_Model_Cron::run(null, $timestamp);
$expected = $i % 2 === 0 ? array('hourly' => 1) : array();
$this->_verifyResult($result, count($expected) ? 'esss' : 'ssss');
$this->_verifyCounters(
$expected,
"Unexpected cron run cycle."
);
}
// simulate running cron for a month in 1-day intervals
$timeStart = strtotime("2010-01-16 00:00:01");
$timeStop = strtotime("2010-02-16 00:00:00");
static::_resetCounters();
$timestamp = $timeStart;
while ($timestamp < $timeStop) {
$result = Cron_Model_Cron::run(null, $timestamp);
$timestamp += 86400;
}
$this->_verifyCounters(
array('hourly' => 31, 'daily' => 31, 'weekly' => 6, 'monthly' => 2),
"Unexpected cron run cycle."
);
// ensure cron files have ctext filetype
$records = Cron_Model_Cron::fetchAll();
$this->assertSame(
4,
$records->count(),
"Expected 4 cron log files."
);
foreach ($records as $record) {
$this->assertSame(
'ctext',
$record->toP4File()->getStatus('headType'),
"Expected ctext filetype of {$record->getId()} file."
);
}
}
| static Cron_Test_CronTest::updateCounter | ( | $ | counter | ) | [static] |
Updates specified counter by one.
| string | $counter | counter to update |
{
if (!isset(static::$_counters[$counter])) {
static::$_counters[$counter] = 1;
} else {
static::$_counters[$counter]++;
}
}
Cron_Test_CronTest::$_counters = array() [static, protected] |