diff options
-rw-r--r-- | phpBB/includes/cron/manager.php | 125 | ||||
-rw-r--r-- | tests/cron/ext/testext/cron/dummy_task.php (renamed from tests/cron/task/testmod/dummy_task.php) | 2 | ||||
-rw-r--r-- | tests/cron/includes/cron/task/core/dummy_task.php | 23 | ||||
-rw-r--r-- | tests/cron/includes/cron/task/core/second_dummy_task.php (renamed from tests/cron/task/testmod/second_dummy_task.php) | 2 | ||||
-rw-r--r-- | tests/cron/manager_test.php | 43 | ||||
-rw-r--r-- | tests/cron/root2/includes/cron/task/core/simple_not_runnable.php (renamed from tests/cron/task2/testmod/simple_not_runnable.php) | 2 | ||||
-rw-r--r-- | tests/cron/root2/includes/cron/task/core/simple_ready.php | 8 | ||||
-rw-r--r-- | tests/cron/root2/includes/cron/task/core/simple_should_not_run.php (renamed from tests/cron/task2/testmod/simple_should_not_run.php) | 2 | ||||
-rw-r--r-- | tests/cron/task2/testmod/simple_ready.php | 8 | ||||
-rw-r--r-- | tests/extension/finder_test.php | 30 | ||||
-rw-r--r-- | tests/mock/extension_manager.php | 4 |
11 files changed, 102 insertions, 147 deletions
diff --git a/phpBB/includes/cron/manager.php b/phpBB/includes/cron/manager.php index 31be1a69cb..ae48e233e0 100644 --- a/phpBB/includes/cron/manager.php +++ b/phpBB/includes/cron/manager.php @@ -33,126 +33,53 @@ class phpbb_cron_manager protected $tasks = array(); /** - * Path to the root of directory tree with tasks. - * For bundled phpBB tasks, this is the path to includes/cron/tasks - * under phpBB root. - * @var string + * An extension manager to search for cron tasks in extensions. + * @var phpbb_extension_manager */ - protected $task_path; - - /** - * PHP file extension - * @var string - */ - protected $phpEx; - - /** - * Cache driver - * @var phpbb_cache_driver_interface - */ - protected $cache; + protected $extension_manager; /** * Constructor. Loads all available tasks. * - * Tasks will be looked up in directory tree rooted at $task_path. - * Task classes will be autoloaded and must be named according to - * autoloading naming conventions. To load cron tasks shipped with - * phpbb, pass $phpbb_root_path . 'includes/cron/task' as $task_path. + * Tasks will be looked up in the core task directory located in + * includes/cron/task/core/ and in extensions. Task classes will be + * autoloaded and must be named according to autoloading naming conventions. * - * If $cache is given, names of found cron tasks will be cached in it - * for one hour. Note that the cron task names are stored without - * namespacing; if two different phbb_cron_manager instances are - * constructed with different $task_path arguments but the same $cache, - * the second instance will use task names found by the first instance. + * Tasks in extensions must be located in a directory called cron or a subdir + * of a directory called cron. The class and filename must end in a _task + * suffix. * - * @param string $task_path Directory containing cron tasks - * @param string $phpEx PHP file extension - * @param phpbb_cache_driver_interface $cache Cache for task names (optional) - * @return void + * @param phpbb_extension_manager $extension_manager phpBB extension manager */ - public function __construct($task_path, $phpEx, phpbb_cache_driver_interface $cache = null) + public function __construct(phpbb_extension_manager $extension_manager) { - if (DIRECTORY_SEPARATOR != '/') - { - // Need this on some platforms since the code elsewhere uses / - // to separate directory components, but PHP iterators return - // paths with platform-specific directory separators. - $task_path = str_replace('/', DIRECTORY_SEPARATOR, $task_path); - } - - $this->task_path = $task_path; - $this->phpEx = $phpEx; - $this->cache = $cache; + $this->extension_manager = $extension_manager; $task_names = $this->find_cron_task_names(); $this->load_tasks($task_names); } /** - * Finds cron task names. + * Finds cron task names using the extension manager. * - * A cron task file must follow the naming convention: - * includes/cron/task/$mod/$name.php. - * $mod is core for tasks that are part of phpbb. - * Modifications should use their name as $mod. - * $name is the name of the cron task. - * Cron task is expected to be a class named phpbb_cron_task_${mod}_${name}. + * All PHP files in includes/cron/task/core/ are considered tasks. Tasks + * in extensions have to be located in a directory called cron or a subdir + * of a directory called cron. The class and filename must end in a _task + * suffix. * * @return array List of task names */ public function find_cron_task_names() { - if ($this->cache) - { - $task_names = $this->cache->get('_cron_tasks'); - - if ($task_names !== false) - { - return $task_names; - } - } - - $task_names = array(); - $ext = '.' . $this->phpEx; - $ext_length = strlen($ext); - - $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->task_path)); - - foreach ($iterator as $fileinfo) - { - $file = preg_replace('#^' . preg_quote($this->task_path, '#') . '#', '', $fileinfo->getPathname()); - - // skip directories and files direclty in the task root path - if ($fileinfo->isFile() && strpos($file, DIRECTORY_SEPARATOR) !== false) - { - $task_name = str_replace(DIRECTORY_SEPARATOR, '_', substr($file, 0, -$ext_length)); - if (substr($file, -$ext_length) == $ext && $this->is_valid_name($task_name)) - { - $task_names[] = 'phpbb_cron_task_' . $task_name; - } - } - } - - if ($this->cache) - { - $this->cache->put('_cron_tasks', $task_names, 3600); - } - - return $task_names; - } - - /** - * Checks whether $name is a valid identifier, and - * therefore part of valid cron task class name. - * - * @param string $name Name to check - * - * @return bool - */ - public function is_valid_name($name) - { - return (bool) preg_match('/^[a-zA-Z][a-zA-Z0-9_]*$/', $name); + $finder = $this->extension_manager->get_finder(); + + return $finder + ->suffix('_task') + ->directory('/cron') + ->default_path('includes/cron/task/core/') + ->default_suffix('') + ->default_directory('') + ->get_classes(); } /** diff --git a/tests/cron/task/testmod/dummy_task.php b/tests/cron/ext/testext/cron/dummy_task.php index 5941157589..06546ada05 100644 --- a/tests/cron/task/testmod/dummy_task.php +++ b/tests/cron/ext/testext/cron/dummy_task.php @@ -7,7 +7,7 @@ * */ -class phpbb_cron_task_testmod_dummy_task extends phpbb_cron_task_base +class phpbb_ext_testext_cron_dummy_task extends phpbb_cron_task_base { public static $was_run = 0; diff --git a/tests/cron/includes/cron/task/core/dummy_task.php b/tests/cron/includes/cron/task/core/dummy_task.php new file mode 100644 index 0000000000..ddaf6a9b7c --- /dev/null +++ b/tests/cron/includes/cron/task/core/dummy_task.php @@ -0,0 +1,23 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_cron_task_core_dummy_task extends phpbb_cron_task_base +{ + public static $was_run = 0; + + public function run() + { + self::$was_run++; + } + + public function should_run() + { + return true; + } +} diff --git a/tests/cron/task/testmod/second_dummy_task.php b/tests/cron/includes/cron/task/core/second_dummy_task.php index 7118b2ebe7..36c3912c30 100644 --- a/tests/cron/task/testmod/second_dummy_task.php +++ b/tests/cron/includes/cron/task/core/second_dummy_task.php @@ -7,7 +7,7 @@ * */ -class phpbb_cron_task_testmod_second_dummy_task extends phpbb_cron_task_base +class phpbb_cron_task_core_second_dummy_task extends phpbb_cron_task_base { public static $was_run = 0; diff --git a/tests/cron/manager_test.php b/tests/cron/manager_test.php index 65d8360fbb..80f2cd55a8 100644 --- a/tests/cron/manager_test.php +++ b/tests/cron/manager_test.php @@ -7,25 +7,35 @@ * */ -require_once dirname(__FILE__) . '/../mock/cache.php'; -require_once dirname(__FILE__) . '/task/testmod/dummy_task.php'; -require_once dirname(__FILE__) . '/task/testmod/second_dummy_task.php'; -require_once dirname(__FILE__) . '/task2/testmod/simple_ready.php'; -require_once dirname(__FILE__) . '/task2/testmod/simple_not_runnable.php'; -require_once dirname(__FILE__) . '/task2/testmod/simple_should_not_run.php'; +require_once dirname(__FILE__) . '/../mock/extension_manager.php'; +require_once dirname(__FILE__) . '/includes/cron/task/core/dummy_task.php'; +require_once dirname(__FILE__) . '/includes/cron/task/core/second_dummy_task.php'; +require_once dirname(__FILE__) . '/ext/testext/cron/dummy_task.php'; +require_once dirname(__FILE__) . '/root2/includes/cron/task/core/simple_ready.php'; +require_once dirname(__FILE__) . '/root2/includes/cron/task/core/simple_not_runnable.php'; +require_once dirname(__FILE__) . '/root2/includes/cron/task/core/simple_should_not_run.php'; class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase { public function setUp() { - $this->manager = new phpbb_cron_manager(dirname(__FILE__) . '/task/', 'php'); - $this->task_name = 'phpbb_cron_task_testmod_dummy_task'; + $this->extension_manager = new phpbb_mock_extension_manager( + dirname(__FILE__) . '/', + array( + 'testext' => array( + 'ext_name' => 'testext', + 'ext_active' => true, + 'ext_path' => dirname(__FILE__) . '/ext/testext/' + ), + )); + $this->manager = new phpbb_cron_manager($this->extension_manager); + $this->task_name = 'phpbb_cron_task_core_dummy_task'; } public function test_manager_finds_shipped_tasks() { $tasks = $this->manager->find_cron_task_names(); - $this->assertEquals(2, sizeof($tasks)); + $this->assertEquals(3, sizeof($tasks)); } public function test_manager_finds_shipped_task_by_name() @@ -45,7 +55,7 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase public function test_manager_finds_all_ready_tasks() { $tasks = $this->manager->find_all_ready_tasks(); - $this->assertEquals(2, sizeof($tasks)); + $this->assertEquals(3, sizeof($tasks)); } public function test_manager_finds_one_ready_task() @@ -54,21 +64,12 @@ class phpbb_cron_manager_test extends PHPUnit_Framework_TestCase $this->assertInstanceOf('phpbb_cron_task_wrapper', $task); } - public function test_manager_finds_all_ready_tasks_cached() - { - $cache = new phpbb_mock_cache(array('_cron_tasks' => array($this->task_name))); - $manager = new phpbb_cron_manager(dirname(__FILE__) . '/../../phpBB/', 'php', $cache); - - $tasks = $manager->find_all_ready_tasks(); - $this->assertEquals(1, sizeof($tasks)); - } - public function test_manager_finds_only_ready_tasks() { - $manager = new phpbb_cron_manager(dirname(__FILE__) . '/task2/', 'php'); + $manager = new phpbb_cron_manager(new phpbb_mock_extension_manager(dirname(__FILE__) . '/root2/')); $tasks = $manager->find_all_ready_tasks(); $task_names = $this->tasks_to_names($tasks); - $this->assertEquals(array('phpbb_cron_task_testmod_simple_ready'), $task_names); + $this->assertEquals(array('phpbb_cron_task_core_simple_ready'), $task_names); } private function tasks_to_names($tasks) diff --git a/tests/cron/task2/testmod/simple_not_runnable.php b/tests/cron/root2/includes/cron/task/core/simple_not_runnable.php index 54869fa1cc..837f28f1c0 100644 --- a/tests/cron/task2/testmod/simple_not_runnable.php +++ b/tests/cron/root2/includes/cron/task/core/simple_not_runnable.php @@ -1,6 +1,6 @@ <?php -class phpbb_cron_task_testmod_simple_not_runnable extends phpbb_cron_task_base +class phpbb_cron_task_core_simple_not_runnable extends phpbb_cron_task_base { public function run() { diff --git a/tests/cron/root2/includes/cron/task/core/simple_ready.php b/tests/cron/root2/includes/cron/task/core/simple_ready.php new file mode 100644 index 0000000000..de5f10e491 --- /dev/null +++ b/tests/cron/root2/includes/cron/task/core/simple_ready.php @@ -0,0 +1,8 @@ +<?php + +class phpbb_cron_task_core_simple_ready extends phpbb_cron_task_base +{ + public function run() + { + } +} diff --git a/tests/cron/task2/testmod/simple_should_not_run.php b/tests/cron/root2/includes/cron/task/core/simple_should_not_run.php index 14ba4cdbd3..c2a41616f6 100644 --- a/tests/cron/task2/testmod/simple_should_not_run.php +++ b/tests/cron/root2/includes/cron/task/core/simple_should_not_run.php @@ -1,6 +1,6 @@ <?php -class phpbb_cron_task_testmod_simple_should_not_run extends phpbb_cron_task_base +class phpbb_cron_task_core_simple_should_not_run extends phpbb_cron_task_base { public function run() { diff --git a/tests/cron/task2/testmod/simple_ready.php b/tests/cron/task2/testmod/simple_ready.php deleted file mode 100644 index e407441e90..0000000000 --- a/tests/cron/task2/testmod/simple_ready.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -class phpbb_cron_task_testmod_simple_ready extends phpbb_cron_task_base -{ - public function run() - { - } -} diff --git a/tests/extension/finder_test.php b/tests/extension/finder_test.php index a1b216face..b0c98da554 100644 --- a/tests/extension/finder_test.php +++ b/tests/extension/finder_test.php @@ -17,20 +17,22 @@ class phpbb_extension_finder_test extends phpbb_test_case public function setUp() { - $this->extension_manager = new phpbb_mock_extension_manager(array( - 'foo' => array( - 'ext_name' => 'foo', - 'ext_active' => '1', - 'ext_path' => dirname(__FILE__) . '/ext/foo/', - ), - 'bar' => array( - 'ext_name' => 'bar', - 'ext_active' => '1', - 'ext_path' => dirname(__FILE__) . '/ext/bar/', - ), - )); - - $this->finder = new phpbb_extension_finder($this->extension_manager, dirname(__FILE__) . '/'); + $this->extension_manager = new phpbb_mock_extension_manager( + dirname(__FILE__) . '/', + array( + 'foo' => array( + 'ext_name' => 'foo', + 'ext_active' => '1', + 'ext_path' => dirname(__FILE__) . '/ext/foo/', + ), + 'bar' => array( + 'ext_name' => 'bar', + 'ext_active' => '1', + 'ext_path' => dirname(__FILE__) . '/ext/bar/', + ), + )); + + $this->finder = $this->extension_manager->get_finder(); } public function test_suffix_get_classes() diff --git a/tests/mock/extension_manager.php b/tests/mock/extension_manager.php index 49d727db37..5155716181 100644 --- a/tests/mock/extension_manager.php +++ b/tests/mock/extension_manager.php @@ -9,8 +9,10 @@ class phpbb_mock_extension_manager extends phpbb_extension_manager { - public function __construct($extensions = array()) + public function __construct($phpbb_root_path, $extensions = array()) { + $this->phpbb_root_path = $phpbb_root_path; + $this->phpEx = '.php'; $this->extensions = $extensions; } } |