aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/cron/manager.php125
-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.php23
-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.php43
-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.php8
-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.php8
-rw-r--r--tests/extension/finder_test.php30
-rw-r--r--tests/mock/extension_manager.php4
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;
}
}