Commit 05f77ccc authored by webchick's avatar webchick
Browse files

Issue #978944 by Aron Novak, chx, ksenzee: Fixed Handle exceptions thrown in cron.

parent ded28c5a
......@@ -5041,7 +5041,15 @@ function drupal_cron_run() {
drupal_register_shutdown_function('drupal_cron_cleanup');
// Iterate through the modules calling their cron handlers (if any):
module_invoke_all('cron');
foreach (module_implements('cron') as $module) {
// Do not let an exception thrown by one module disturb another.
try {
module_invoke($module, 'cron');
}
catch (Exception $e) {
watchdog_exception('cron', $e);
}
}
// Record cron time
variable_set('cron_last', REQUEST_TIME);
......
......@@ -225,3 +225,16 @@ function common_test_js_and_css_querystring() {
drupal_add_css('/' . drupal_get_path('module', 'node') . '/node-fake.css?arg1=value1&arg2=value2');
return '';
}
/**
* Implements hook_cron().
*
* System module should handle if a module does not catch an exception and keep
* cron going.
*
* @see common_test_cron_helper()
*
*/
function common_test_cron() {
throw new Exception(t('Uncaught exception'));
}
name = "Common Test Cron Helper"
description = "Helper module for CronRunTestCase::testCronExceptions()."
package = Testing
version = VERSION
core = 7.x
hidden = TRUE
<?php
/**
* @file
* Helper module for the testCronExceptions in addition to common_test module.
*/
/**
* Implements hook_cron().
*
* common_test_cron() throws an exception, but the execution should reach this
* function as well.
*
* @see common_test_cron()
*/
function common_test_cron_helper_cron() {
variable_set('common_test_cron', 'success');
}
......@@ -695,6 +695,10 @@ class CronRunTestCase extends DrupalWebTestCase {
);
}
function setUp() {
parent::setUp(array('common_test', 'common_test_cron_helper'));
}
/**
* Test cron runs.
*/
......@@ -799,6 +803,19 @@ class CronRunTestCase extends DrupalWebTestCase {
$this->assertTrue(file_exists($perm_old->uri), t('Old permanent file was correctly ignored.'));
$this->assertTrue(file_exists($perm_new->uri), t('New permanent file was correctly ignored.'));
}
/**
* Make sure exceptions thrown on hook_cron() don't affect other modules.
*/
function testCronExceptions() {
variable_del('common_test_cron');
// The common_test module throws an exception. If it isn't caught, the tests
// won't finish successfully.
// The common_test_cron_helper module sets the 'common_test_cron' variable.
$this->cronRun();
$result = variable_get('common_test_cron');
$this->assertEqual($result, 'success', t('Cron correctly handles exceptions thrown during hook_cron() invocations.'));
}
}
class AdminMetaTagTestCase extends DrupalWebTestCase {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment