diff options
Diffstat (limited to 'tests')
76 files changed, 3123 insertions, 251 deletions
| diff --git a/tests/bbcode/parser_test.php b/tests/bbcode/parser_test.php new file mode 100644 index 0000000000..9423383938 --- /dev/null +++ b/tests/bbcode/parser_test.php @@ -0,0 +1,29 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2008 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +// require_once dirname(__FILE__) . '/../../phpBB/includes/bbcode/bbcode_parser_base.php'; +// require_once dirname(__FILE__) . '/../../phpBB/includes/bbcode/bbcode_parser.php'; + +class phpbb_bbcode_parser_test extends PHPUnit_Framework_TestCase +{ +	public function test_both_passes() +	{ +	    $this->markTestIncomplete('New bbcode parser has not been backported from feature/ascraeus-experiment yet.'); +	     +		$parser = new phpbb_bbcode_parser(); + +		$result = $parser->first_pass('[i]Italic [u]underlined text[/u][/i]'); +		$result = $parser->second_pass($result); + +		$expected = '<span style="font-style: italic">Italic <span style="text-decoration: underline">underlined text</span></span>'; + +		$this->assertEquals($expected, $result, 'Simple nested BBCode first+second pass'); +	} +} diff --git a/tests/bbcode/url_bbcode_test.php b/tests/bbcode/url_bbcode_test.php index cd85dbd0d9..68c97ede50 100644 --- a/tests/bbcode/url_bbcode_test.php +++ b/tests/bbcode/url_bbcode_test.php @@ -12,6 +12,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';  require_once dirname(__FILE__) . '/../../phpBB/includes/bbcode.php';  require_once dirname(__FILE__) . '/../../phpBB/includes/message_parser.php';  require_once dirname(__FILE__) . '/../mock_user.php'; +require_once dirname(__FILE__) . '/../mock/request.php';  class phpbb_url_bbcode_test extends phpbb_test_case  { @@ -51,8 +52,9 @@ class phpbb_url_bbcode_test extends phpbb_test_case  	*/  	public function test_url($description, $message, $expected)  	{ -		global $user; +		global $user, $request;  		$user = new phpbb_mock_user; +		$request = new phpbb_mock_request;  		$bbcode = new bbcode_firstpass();  		$bbcode->message = $message; diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 6f3c93a374..b7c3534cde 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -30,6 +30,10 @@ else  }  require_once $phpbb_root_path . 'includes/constants.php'; +require_once $phpbb_root_path . 'includes/class_loader.' . $phpEx; + +$class_loader = new phpbb_class_loader($phpbb_root_path, '.php'); +$class_loader->register();  require_once 'test_framework/phpbb_test_case_helpers.php';  require_once 'test_framework/phpbb_test_case.php'; diff --git a/tests/cache/cache_test.php b/tests/cache/cache_test.php new file mode 100644 index 0000000000..b127c507f0 --- /dev/null +++ b/tests/cache/cache_test.php @@ -0,0 +1,70 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_cache_test extends phpbb_test_case +{ +	private $cache_dir; + +	public function __construct() +	{ +		$this->cache_dir = dirname(__FILE__) . '/../tmp/cache/'; +	} + +	protected function setUp() +	{ +		if (file_exists($this->cache_dir)) +		{ +			// cache directory possibly left after aborted +			// or failed run earlier +			$this->remove_cache_dir(); +		} +		$this->create_cache_dir(); +	} + +	protected function tearDown() +	{ +		if (file_exists($this->cache_dir)) +		{ +			$this->remove_cache_dir(); +		} +	} + +	private function create_cache_dir() +	{ +		$this->get_test_case_helpers()->makedirs($this->cache_dir); +	} + +	private function remove_cache_dir() +	{ +		$iterator = new DirectoryIterator($this->cache_dir); +		foreach ($iterator as $file) +		{ +			if ($file != '.' && $file != '..') +			{ +				unlink($this->cache_dir . '/' . $file); +			} +		} +		rmdir($this->cache_dir); +	} + +	public function test_cache_driver_file() +	{ +		$driver = new phpbb_cache_driver_file($this->cache_dir); +		$driver->put('test_key', 'test_value'); +		$driver->save(); + +		$this->assertEquals( +			'test_value', +			$driver->get('test_key'), +			'File ACM put and get' +		); +	} +} diff --git a/tests/class_loader/class_loader_test.php b/tests/class_loader/class_loader_test.php new file mode 100644 index 0000000000..0c7fe3f97a --- /dev/null +++ b/tests/class_loader/class_loader_test.php @@ -0,0 +1,86 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/cache.php'; + +class phpbb_class_loader_test extends PHPUnit_Framework_TestCase +{ +	public function setUp() +	{ +		global $class_loader; +		$class_loader->unregister(); +	} + +	public function tearDown() +	{ +		global $class_loader; +		$class_loader->register(); +	} + +	public function test_resolve_path() +	{ +		$prefix = dirname(__FILE__) . '/'; +		$class_loader = new phpbb_class_loader($prefix); + +		$prefix .= 'includes/'; + +		$this->assertEquals( +			'', +			$class_loader->resolve_path('phpbb_dir'), +			'Class with same name as a directory is unloadable' +		); + +		$this->assertEquals( +			$prefix . 'class_name.php', +			$class_loader->resolve_path('phpbb_class_name'), +			'Top level class' +		); +		$this->assertEquals( +			$prefix . 'dir/class_name.php', +			$class_loader->resolve_path('phpbb_dir_class_name'), +			'Class in a directory' +		); +		$this->assertEquals( +			$prefix . 'dir/subdir/class_name.php', +			$class_loader->resolve_path('phpbb_dir_subdir_class_name'), +			'Class in a sub-directory' +		); +		$this->assertEquals( +			$prefix . 'dir2/dir2.php', +			$class_loader->resolve_path('phpbb_dir2'), +			'Class with name of dir within dir (short class name)' +		); +	} + +	public function test_resolve_cached() +	{ +		$cacheMap = array('class_loader' => array('phpbb_a_cached_name' => 'a/cached_name')); +		$cache = new phpbb_mock_cache($cacheMap); + +		$prefix = dirname(__FILE__) . '/'; +		$class_loader = new phpbb_class_loader($prefix, '.php', $cache); + +		$prefix .= 'includes/'; + +		$this->assertEquals( +			$prefix . 'dir/class_name.php', +			$class_loader->resolve_path('phpbb_dir_class_name'), +			'Class in a directory' +		); + +		$this->assertEquals( +			$prefix . 'a/cached_name.php', +			$class_loader->resolve_path('phpbb_a_cached_name'), +			'Class in a directory' +		); + +		$cacheMap['class_loader']['phpbb_dir_class_name'] = 'dir/class_name'; +		$cache->check($this, $cacheMap); +	} +} diff --git a/tests/class_loader/includes/class_name.php b/tests/class_loader/includes/class_name.php new file mode 100644 index 0000000000..e941173cdd --- /dev/null +++ b/tests/class_loader/includes/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_class_name +{ +} + diff --git a/tests/class_loader/includes/dir.php b/tests/class_loader/includes/dir.php new file mode 100644 index 0000000000..1c8930d8e7 --- /dev/null +++ b/tests/class_loader/includes/dir.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir +{ +} + diff --git a/tests/class_loader/includes/dir/class_name.php b/tests/class_loader/includes/dir/class_name.php new file mode 100644 index 0000000000..0675aa8fc5 --- /dev/null +++ b/tests/class_loader/includes/dir/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir_class_name +{ +} + diff --git a/tests/class_loader/includes/dir/subdir/class_name.php b/tests/class_loader/includes/dir/subdir/class_name.php new file mode 100644 index 0000000000..7321a609cc --- /dev/null +++ b/tests/class_loader/includes/dir/subdir/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir_subdir_class_name +{ +} + diff --git a/tests/class_loader/includes/dir2/dir2.php b/tests/class_loader/includes/dir2/dir2.php new file mode 100644 index 0000000000..01cf4086ff --- /dev/null +++ b/tests/class_loader/includes/dir2/dir2.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir2 +{ +} + diff --git a/tests/config/config_test.php b/tests/config/config_test.php new file mode 100644 index 0000000000..9c91d9eb87 --- /dev/null +++ b/tests/config/config_test.php @@ -0,0 +1,120 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_config_test extends phpbb_test_case +{ +	public function test_offset_exists() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); + +		$this->assertTrue(isset($config['foo'])); +		$this->assertFalse(isset($config['foobar'])); +	} + +	public function test_offset_get() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); +		$this->assertEquals('bar', $config['foo']); +	} + +	public function test_offset_get_missing() +	{ +		$config = new phpbb_config(array()); +		$this->assertEquals('', $config['foo']); +	} + +	public function test_offset_set() +	{ +		$config = new phpbb_config(array()); +		$config['foo'] = 'x'; +		$this->assertEquals('x', $config['foo']); +	} + +	public function test_offset_unset_fails() +	{ +		$this->setExpectedTriggerError(E_USER_ERROR); +		$config = new phpbb_config(array('foo' => 'x')); +		unset($config['foo']); +	} + +	public function test_count() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); +		$this->assertEquals(1, count($config)); +	} + +	public function test_iterate() +	{ +		$vars = array('foo' => '23', 'bar' => '42'); +		$config = new phpbb_config($vars); + +		$count = 0; +		foreach ($config as $key => $value) +		{ +			$this->assertTrue(isset($vars[$key])); +			$this->assertEquals($vars[$key], $value); + +			$count++; +		} + +		$this->assertEquals(count($vars), $count); +	} + +	public function test_set_overwrite() +	{ +		$config = new phpbb_config(array('foo' => 'x')); +		$config->set('foo', 'bar'); +		$this->assertEquals('bar', $config['foo']); +	} + +	public function test_set_new() +	{ +		$config = new phpbb_config(array()); +		$config->set('foo', 'bar'); +		$this->assertEquals('bar', $config['foo']); +	} + +	public function test_set_atomic_overwrite() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); +		$this->assertTrue($config->set_atomic('foo', 'bar', '23')); +		$this->assertEquals('23', $config['foo']); +	} + +	public function test_set_atomic_new() +	{ +		$config = new phpbb_config(array()); +		$this->assertTrue($config->set_atomic('foo', false, '23')); +		$this->assertEquals('23', $config['foo']); +	} + +	public function test_set_atomic_failure() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); +		$this->assertFalse($config->set_atomic('foo', 'wrong', '23')); +		$this->assertEquals('bar', $config['foo']); +	} + +	public function test_increment() +	{ +		$config = new phpbb_config(array('foo' => '23')); +		$config->increment('foo', 3); +		$this->assertEquals(26, $config['foo']); +		$config->increment('foo', 1); +		$this->assertEquals(27, $config['foo']); +	} + +	public function test_delete() +	{ +		$config = new phpbb_config(array('foo' => 'bar')); + +		$config->delete('foo'); +		$this->assertFalse(isset($config['foo'])); +	} +} diff --git a/tests/config/db_test.php b/tests/config/db_test.php new file mode 100644 index 0000000000..e817545a54 --- /dev/null +++ b/tests/config/db_test.php @@ -0,0 +1,166 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/cache.php'; + +class phpbb_config_db_test extends phpbb_database_test_case +{ +	private $cache; +	private $db; +	private $config; + +	public function getDataSet() +	{ +		return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml'); +	} + +	public function setUp() +	{ +		parent::setUp(); + +		$this->cache = new phpbb_mock_cache; +		$this->db = $this->new_dbal(); +		$this->config = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +	} + +	public function test_load_config() +	{ +		$this->assertEquals('23', $this->config['foo']); +		$this->assertEquals('42', $this->config['bar']); +	} + +	public function test_load_cached() +	{ +		$cache = new phpbb_mock_cache(array('config' => array('x' => 'y'))); +		$this->config = new phpbb_config_db($this->db, $cache, 'phpbb_config'); + +		$this->assertTrue(!isset($this->config['foo'])); +		$this->assertEquals('42', $this->config['bar']); + +		$this->assertEquals('y', $this->config['x']); +	} + +	public function test_offset_set() +	{ +		$this->config['foo'] = 'x'; // temporary set +		$this->assertEquals('x', $this->config['foo']); + +		$config2 = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +		$this->assertEquals('23', $config2['foo']); +	} + +	public function test_set_overwrite() +	{ +		$this->config->set('foo', '17'); +		$this->assertEquals('17', $this->config['foo']); + +		// re-read config and populate cache +		$config2 = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +		$this->cache->checkVar($this, 'config', array('foo' => '17')); +	} + +	public function test_set_overwrite_uncached() +	{ +		$this->config->set('bar', '17', false); + +		// re-read config and populate cache +		$config2 = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +		$this->cache->checkVar($this, 'config', array('foo' => '23')); +	} + +	public function test_set_new() +	{ +		$this->config->set('foobar', '5'); +		$this->assertEquals('5', $this->config['foobar']); + +		// re-read config and populate cache +		$config2 = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +		$this->cache->checkVar($this, 'config', array('foo' => '23', 'foobar' => '5')); +	} + +	public function test_set_new_uncached() +	{ +		$this->config->set('foobar', '5', false); +		$this->assertEquals('5', $this->config['foobar']); + +		// re-read config and populate cache +		$config2 = new phpbb_config_db($this->db, $this->cache, 'phpbb_config'); +		$this->cache->checkVar($this, 'config', array('foo' => '23')); +	} + +	public function test_set_atomic_overwrite() +	{ +		$this->assertTrue($this->config->set_atomic('foo', '23', '17')); +		$this->assertEquals('17', $this->config['foo']); +	} + +	public function test_set_atomic_new() +	{ +		$this->assertTrue($this->config->set_atomic('foobar', false, '5')); +		$this->assertEquals('5', $this->config['foobar']); +	} + +	public function test_set_atomic_failure() +	{ +		$this->assertFalse($this->config->set_atomic('foo', 'wrong', '17')); +		$this->assertEquals('23', $this->config['foo']); +	} + +	public function test_increment() +	{ +		$this->config->increment('foo', 3); +		$this->assertEquals(26, $this->config['foo']); +		$this->config->increment('foo', 1); +		$this->assertEquals(27, $this->config['foo']); +	} + +	public function test_increment_new() +	{ +		$this->config->increment('foobar', 3); +		$this->assertEquals(3, $this->config['foobar']);; +	} + +	public function test_delete() +	{ +		$this->assertTrue(isset($this->config['foo'])); +		$this->config->delete('foo'); +		$this->cache->checkVarUnset($this, 'foo'); +		$this->assertFalse(isset($this->config['foo'])); + +		// re-read config and populate cache +		$cache2 = new phpbb_mock_cache; +		$config2 = new phpbb_config_db($this->db, $cache2, 'phpbb_config'); +		$cache2->checkVarUnset($this, 'foo'); +		$this->assertFalse(isset($config2['foo'])); +	} + +	public function test_delete_write_read_not_cacheable() +	{ +		// bar is dynamic +		$this->assertTrue(isset($this->config['bar'])); +		$this->config->delete('bar'); +		$this->cache->checkVarUnset($this, 'bar'); +		$this->assertFalse(isset($this->config['bar'])); +		 +		$this->config->set('bar', 'new bar', false); +		$this->assertEquals('new bar', $this->config['bar']); +	} + +	public function test_delete_write_read_cacheable() +	{ +		// foo is not dynamic +		$this->assertTrue(isset($this->config['foo'])); +		$this->config->delete('foo'); +		$this->cache->checkVarUnset($this, 'foo'); +		$this->assertFalse(isset($this->config['foo'])); +		 +		$this->config->set('foo', 'new foo', true); +		$this->assertEquals('new foo', $this->config['foo']); +	} +} diff --git a/tests/config/fixtures/config.xml b/tests/config/fixtures/config.xml new file mode 100644 index 0000000000..9d395b685c --- /dev/null +++ b/tests/config/fixtures/config.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<dataset> +	<table name="phpbb_config"> +		<column>config_name</column> +		<column>config_value</column> +		<column>is_dynamic</column> +		<row> +			<value>foo</value> +			<value>23</value> +			<value>0</value> +		</row> +		<row> +			<value>bar</value> +			<value>42</value> +			<value>1</value> +		</row> +	</table> +</dataset> diff --git a/tests/cron/manager_test.php b/tests/cron/manager_test.php new file mode 100644 index 0000000000..65d8360fbb --- /dev/null +++ b/tests/cron/manager_test.php @@ -0,0 +1,83 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +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'; + +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'; +	} + +	public function test_manager_finds_shipped_tasks() +	{ +		$tasks = $this->manager->find_cron_task_names(); +		$this->assertEquals(2, sizeof($tasks)); +	} + +	public function test_manager_finds_shipped_task_by_name() +	{ +		$task = $this->manager->find_task($this->task_name); +		$this->assertInstanceOf('phpbb_cron_task_wrapper', $task); +		$this->assertEquals($this->task_name, $task->get_name()); +	} + +	public function test_manager_instantiates_task_by_name() +	{ +		$task = $this->manager->instantiate_task($this->task_name, array()); +		$this->assertInstanceOf('phpbb_cron_task_wrapper', $task); +		$this->assertEquals($this->task_name, $task->get_name()); +	} + +	public function test_manager_finds_all_ready_tasks() +	{ +		$tasks = $this->manager->find_all_ready_tasks(); +		$this->assertEquals(2, sizeof($tasks)); +	} + +	public function test_manager_finds_one_ready_task() +	{ +		$task = $this->manager->find_one_ready_task(); +		$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'); +		$tasks = $manager->find_all_ready_tasks(); +		$task_names = $this->tasks_to_names($tasks); +		$this->assertEquals(array('phpbb_cron_task_testmod_simple_ready'), $task_names); +	} + +	private function tasks_to_names($tasks) +	{ +		$names = array(); +		foreach ($tasks as $task) +		{ +			$names[] = get_class($task->task); +		} +		return $names; +	} +} diff --git a/tests/cron/task/testmod/dummy_task.php b/tests/cron/task/testmod/dummy_task.php new file mode 100644 index 0000000000..5941157589 --- /dev/null +++ b/tests/cron/task/testmod/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_testmod_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/task/testmod/second_dummy_task.php new file mode 100644 index 0000000000..7118b2ebe7 --- /dev/null +++ b/tests/cron/task/testmod/second_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_testmod_second_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/task2/testmod/simple_not_runnable.php b/tests/cron/task2/testmod/simple_not_runnable.php new file mode 100644 index 0000000000..54869fa1cc --- /dev/null +++ b/tests/cron/task2/testmod/simple_not_runnable.php @@ -0,0 +1,13 @@ +<?php + +class phpbb_cron_task_testmod_simple_not_runnable extends phpbb_cron_task_base +{ +	public function run() +	{ +	} + +	public function is_runnable() +	{ +		return false; +	} +} diff --git a/tests/cron/task2/testmod/simple_ready.php b/tests/cron/task2/testmod/simple_ready.php new file mode 100644 index 0000000000..e407441e90 --- /dev/null +++ b/tests/cron/task2/testmod/simple_ready.php @@ -0,0 +1,8 @@ +<?php + +class phpbb_cron_task_testmod_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/task2/testmod/simple_should_not_run.php new file mode 100644 index 0000000000..14ba4cdbd3 --- /dev/null +++ b/tests/cron/task2/testmod/simple_should_not_run.php @@ -0,0 +1,13 @@ +<?php + +class phpbb_cron_task_testmod_simple_should_not_run extends phpbb_cron_task_base +{ +	public function run() +	{ +	} + +	public function should_run() +	{ +		return false; +	} +} diff --git a/tests/dbal/schema_test.php b/tests/dbal/schema_test.php new file mode 100644 index 0000000000..2475a85708 --- /dev/null +++ b/tests/dbal/schema_test.php @@ -0,0 +1,38 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_dbal_schema_test extends phpbb_database_test_case +{ +	public function getDataSet() +	{ +		return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml'); +	} + +	public function test_config_value_multibyte() +	{ +		$db = $this->new_dbal(); + +		$value = str_repeat("\xC3\x84", 255); +		$sql = "INSERT INTO phpbb_config +			(config_name, config_value) +			VALUES ('name', '$value')"; +		$result = $db->sql_query($sql); + +		$sql = "SELECT config_value +			FROM phpbb_config +			WHERE config_name = 'name'"; +		$result = $db->sql_query_limit($sql, 1); +		$row = $db->sql_fetchrow($result); +		$db->sql_freeresult($result); + +		$this->assertEquals($value, $row['config_value']); +	} +} diff --git a/tests/download/http_byte_range_test.php b/tests/download/http_byte_range_test.php new file mode 100644 index 0000000000..36cbcab0b0 --- /dev/null +++ b/tests/download/http_byte_range_test.php @@ -0,0 +1,65 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_download.php'; +require_once dirname(__FILE__) . '/../mock/request.php'; + +class phpbb_download_http_byte_range_test extends phpbb_test_case +{ +	public function test_find_range_request() +	{ +		// Missing 'bytes=' prefix +		$GLOBALS['request'] = new phpbb_mock_request(); +		$GLOBALS['request']->set_header('Range', 'bztes='); +		$this->assertEquals(false, phpbb_find_range_request()); +		unset($GLOBALS['request']); + +		$GLOBALS['request'] = new phpbb_mock_request(); +		$_ENV['HTTP_RANGE'] = 'bztes='; +		$this->assertEquals(false, phpbb_find_range_request()); +		unset($_ENV['HTTP_RANGE']); + +		$GLOBALS['request'] = new phpbb_mock_request(); +		$GLOBALS['request']->set_header('Range', 'bytes=0-0,123-125'); +		$this->assertEquals(array('0-0', '123-125'), phpbb_find_range_request()); +		unset($GLOBALS['request']); +	} + +	/** +	* @dataProvider parse_range_request_data() +	*/ +	public function test_parse_range_request($request_array, $filesize, $expected) +	{ +		$this->assertEquals($expected, phpbb_parse_range_request($request_array, $filesize)); +	} + +	public function parse_range_request_data() +	{ +		return array( +			// Does not read until the end of file. +			array( +				array('3-4'), +				10, +				false, +			), + +			// Valid request, handle second range. +			array( +				array('0-0', '120-125'), +				125, +				array( +					'byte_pos_start'	=> 120, +					'byte_pos_end'		=> 124, +					'bytes_requested'	=> 5, +					'bytes_total'		=> 125, +				) +			), +		); +	} +} diff --git a/tests/functions_acp/build_cfg_template_test.php b/tests/functions_acp/build_cfg_template_test.php new file mode 100644 index 0000000000..76e133181f --- /dev/null +++ b/tests/functions_acp/build_cfg_template_test.php @@ -0,0 +1,192 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/lang.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_acp.php'; + +class phpbb_functions_acp_build_cfg_template_test extends phpbb_test_case +{ +	public function build_cfg_template_text_data() +	{ +		return array( +			array( +				array('text', 20, 255), +				'key_name', +				array('config_key_name'	=> '1'), +				'config_key_name', +				array(), +				'<input id="key_name" type="text" size="20" maxlength="255" name="config[config_key_name]" value="1" />', +			), +			array( +				array('password', 20, 128), +				'key_name', +				array('config_key_name'	=> '2'), +				'config_key_name', +				array(), +				'<input id="key_name" type="password" size="20" maxlength="128" name="config[config_key_name]" value="2" autocomplete="off" />', +			), +			array( +				array('text', 0, 255), +				'key_name', +				array('config_key_name'	=> '3'), +				'config_key_name', +				array(), +				'<input id="key_name" type="text" maxlength="255" name="config[config_key_name]" value="3" />', +			), +		); +	} + +	/** +	* @dataProvider build_cfg_template_text_data +	*/ +	public function test_build_cfg_template_text($tpl_type, $key, $new, $config_key, $vars, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars)); +	} + +	public function build_cfg_template_dimension_data() +	{ +		return array( +			array( +				array('dimension', 20, 255), +				'key_name', +				array('config_key_name_width' => 10, 'config_key_name_height' => 20), +				'config_key_name', +				array(), +				'<input id="key_name" type="text" size="20" maxlength="255" name="config[config_key_name_width]" value="10" /> x <input type="text" size="20" maxlength="255" name="config[config_key_name_height]" value="20" />', +			), +			array( +				array('dimension', 0, 255), +				'key_name', +				array('config_key_name_width' => 10, 'config_key_name_height' => 20), +				'config_key_name', +				array(), +				'<input id="key_name" type="text" maxlength="255" name="config[config_key_name_width]" value="10" /> x <input type="text" maxlength="255" name="config[config_key_name_height]" value="20" />', +			), +		); +	} + +	/** +	* @dataProvider build_cfg_template_dimension_data +	*/ +	public function test_build_cfg_template_dimension($tpl_type, $key, $new, $config_key, $vars, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars)); +	} + +	public function build_cfg_template_textarea_data() +	{ +		return array( +			array( +				array('textarea', 5, 30), +				'key_name', +				array('config_key_name' => 'phpBB'), +				'config_key_name', +				array(), +				'<textarea id="key_name" name="config[config_key_name]" rows="5" cols="30">phpBB</textarea>', +			), +		); +	} + +	/** +	* @dataProvider build_cfg_template_textarea_data +	*/ +	public function test_build_cfg_template_textarea($tpl_type, $key, $new, $config_key, $vars, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars)); +	} + +	public function build_cfg_template_radio_data() +	{ +		return array( +			array( +				array('radio', 'enabled_disabled'), +				'key_name', +				array('config_key_name'	=> '0'), +				'config_key_name', +				array(), +				'<label><input type="radio" id="key_name" name="config[config_key_name]" value="1" class="radio" /> ENABLED</label><label><input type="radio" name="config[config_key_name]" value="0" checked="checked" class="radio" /> DISABLED</label>', +			), +			array( +				array('radio', 'enabled_disabled'), +				'key_name', +				array('config_key_name'	=> '1'), +				'config_key_name', +				array(), +				'<label><input type="radio" id="key_name" name="config[config_key_name]" value="1" checked="checked" class="radio" /> ENABLED</label><label><input type="radio" name="config[config_key_name]" value="0" class="radio" /> DISABLED</label>', +			), +			array( +				array('radio', 'yes_no'), +				'key_name', +				array('config_key_name'	=> '0'), +				'config_key_name', +				array(), +				'<label><input type="radio" id="key_name" name="config[config_key_name]" value="1" class="radio" /> YES</label><label><input type="radio" name="config[config_key_name]" value="0" checked="checked" class="radio" /> NO</label>', +			), +			array( +				array('radio', 'yes_no'), +				'key_name', +				array('config_key_name'	=> '1'), +				'config_key_name', +				array(), +				'<label><input type="radio" id="key_name" name="config[config_key_name]" value="1" checked="checked" class="radio" /> YES</label><label><input type="radio" name="config[config_key_name]" value="0" class="radio" /> NO</label>', +			), +		); +	} + +	/** +	* @dataProvider build_cfg_template_radio_data +	*/ +	public function test_build_cfg_template_radio($tpl_type, $key, $new, $config_key, $vars, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars)); +	} + +	public function build_cfg_template_append_data() +	{ +		return array( +			array( +				array('textarea', 5, 30), +				'key_name', +				array('config_key_name' => 'phpBB'), +				'config_key_name', +				array('append' => 'Bertie is cool!'), +				'<textarea id="key_name" name="config[config_key_name]" rows="5" cols="30">phpBB</textarea>Bertie is cool!', +			), +		); +	} + +	/** +	* @dataProvider build_cfg_template_append_data +	*/ +	public function test_build_cfg_template_append($tpl_type, $key, $new, $config_key, $vars, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_cfg_template($tpl_type, $key, $new, $config_key, $vars)); +	} +} diff --git a/tests/functions_acp/build_select_test.php b/tests/functions_acp/build_select_test.php new file mode 100644 index 0000000000..7079e69f12 --- /dev/null +++ b/tests/functions_acp/build_select_test.php @@ -0,0 +1,56 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/lang.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_acp.php'; + +class phpbb_functions_acp_built_select_test extends phpbb_test_case +{ +	public function build_select_data() +	{ +		return array( +			array( +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				false, +				'<option value="test">TEST</option><option value="second">SEC_OPTION</option>', +			), +			array( +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'test', +				'<option value="test" selected="selected">TEST</option><option value="second">SEC_OPTION</option>', +			), +			array( +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'second', +				'<option value="test">TEST</option><option value="second" selected="selected">SEC_OPTION</option>', +			), +		); +	} + +	/** +	* @dataProvider build_select_data +	*/ +	public function test_build_select($option_ary, $option_default, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, build_select($option_ary, $option_default)); +	} +} diff --git a/tests/functions_acp/h_radio_test.php b/tests/functions_acp/h_radio_test.php new file mode 100644 index 0000000000..18cb5d031e --- /dev/null +++ b/tests/functions_acp/h_radio_test.php @@ -0,0 +1,121 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/lang.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_acp.php'; + +class phpbb_functions_acp_h_radio_test extends phpbb_test_case +{ +	public function h_radio_data() +	{ +		return array( +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				false, +				false, +				false, +				'<label><input type="radio" name="test_name" value="test" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'test', +				false, +				false, +				'<label><input type="radio" name="test_name" value="test" checked="checked" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				false, +				'test_id', +				false, +				'<label><input type="radio" name="test_name" id="test_id" value="test" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'test', +				'test_id', +				false, +				'<label><input type="radio" name="test_name" id="test_id" value="test" checked="checked" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" class="radio" /> SEC_OPTION</label>', +			), + +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				false, +				false, +				'k', +				'<label><input type="radio" name="test_name" value="test" accesskey="k" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" accesskey="k" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'test', +				false, +				'k', +				'<label><input type="radio" name="test_name" value="test" checked="checked" accesskey="k" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" accesskey="k" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				false, +				'test_id', +				'k', +				'<label><input type="radio" name="test_name" id="test_id" value="test" accesskey="k" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" accesskey="k" class="radio" /> SEC_OPTION</label>', +			), +			array( +				'test_name', +				array( +					'test'		=> 'TEST', +					'second'	=> 'SEC_OPTION', +				), +				'test', +				'test_id', +				'k', +				'<label><input type="radio" name="test_name" id="test_id" value="test" checked="checked" accesskey="k" class="radio" /> TEST</label><label><input type="radio" name="test_name" value="second" accesskey="k" class="radio" /> SEC_OPTION</label>', +			), +		); +	} + +	/** +	* @dataProvider h_radio_data +	*/ +	public function test_h_radio($name, $input_ary, $input_default, $id, $key, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$this->assertEquals($expected, h_radio($name, $input_ary, $input_default, $id, $key)); +	} +} diff --git a/tests/functions_acp/validate_config_vars_test.php b/tests/functions_acp/validate_config_vars_test.php new file mode 100644 index 0000000000..761788e264 --- /dev/null +++ b/tests/functions_acp/validate_config_vars_test.php @@ -0,0 +1,159 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/lang.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_acp.php'; + +class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case +{ +	/** +	* Data sets that don't throw an error. +	*/ +	public function validate_config_vars_fit_data() +	{ +		return array( +			array( +				array( +					'test_bool'				=> array('lang' => 'TEST_BOOL',			'validate' => 'bool'), +					'test_string'			=> array('lang' => 'TEST_STRING',		'validate' => 'string'), +					'test_string'			=> array('lang' => 'TEST_STRING',		'validate' => 'string'), +					'test_string_128'		=> array('lang' => 'TEST_STRING_128',	'validate' => 'string:128'), +					'test_string_128'		=> array('lang' => 'TEST_STRING_128',	'validate' => 'string:128'), +					'test_string_32_64'		=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64'), +					'test_string_32_64'		=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64'), +					'test_int'				=> array('lang' => 'TEST_INT',			'validate' => 'int'), +					'test_int_32'			=> array('lang' => 'TEST_INT',			'validate' => 'int:32'), +					'test_int_32_64'		=> array('lang' => 'TEST_INT',			'validate' => 'int:32:64'), +					'test_lang'				=> array('lang' => 'TEST_LANG',			'validate' => 'lang'), +					/* +					'test_sp'				=> array('lang' => 'TEST_SP',			'validate' => 'script_path'), +					'test_rpath'			=> array('lang' => 'TEST_RPATH',		'validate' => 'rpath'), +					'test_rwpath'			=> array('lang' => 'TEST_RWPATH',		'validate' => 'rwpath'), +					'test_path'				=> array('lang' => 'TEST_PATH',			'validate' => 'path'), +					'test_wpath'			=> array('lang' => 'TEST_WPATH',		'validate' => 'wpath'), +					*/ +				), +				array( +					'test_bool'			=> true, +					'test_string'		=> str_repeat('a', 255), +					'test_string'		=> str_repeat("\xC3\x84", 255), +					'test_string_128'	=> str_repeat('a', 128), +					'test_string_128'	=> str_repeat("\xC3\x84", 128), +					'test_string_32_64'	=> str_repeat('a', 48), +					'test_string_32_64'	=> str_repeat("\xC3\x84", 48), +					'test_int'			=> 128, +					'test_int_32'		=> 32, +					'test_int_32_64'	=> 48, +					'test_lang'			=> 'en', +				), +			), +		); +	} + +	/** +	* @dataProvider validate_config_vars_fit_data +	*/ +	public function test_validate_config_vars_fit($test_data, $cfg_array) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_config_vars($test_data, $cfg_array, $phpbb_error); + +		$this->assertEquals(array(), $phpbb_error); +	} + +	/** +	* Data sets that throw the error. +	*/ +	public function validate_config_vars_error_data() +	{ +		return array( +			array( +				array('test_string_32_64'		=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64')), +				array('test_string_32_64'	=> str_repeat('a', 20)), +				array('SETTING_TOO_SHORT'), +			), +			array( +				array('test_string_32_64'		=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64')), +				array('test_string_32_64'	=> str_repeat("\xC3\x84", 20)), +				array('SETTING_TOO_SHORT'), +			), +			array( +				array('test_string'		=> array('lang' => 'TEST_STRING',	'validate' => 'string')), +				array('test_string'		=> str_repeat('a', 256)), +				array('SETTING_TOO_LONG'), +			), +			array( +				array('test_string'		=> array('lang' => 'TEST_STRING',	'validate' => 'string')), +				array('test_string'		=> str_repeat("\xC3\x84", 256)), +				array('SETTING_TOO_LONG'), +			), +			array( +				array('test_string_32_64'	=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64')), +				array('test_string_32_64'	=> str_repeat('a', 65)), +				array('SETTING_TOO_LONG'), +			), +			array( +				array('test_string_32_64'	=> array('lang' => 'TEST_STRING_32_64',	'validate' => 'string:32:64')), +				array('test_string_32_64'	=> str_repeat("\xC3\x84", 65)), +				array('SETTING_TOO_LONG'), +			), + +			array( +				array('test_int_32'		=> array('lang' => 'TEST_INT',			'validate' => 'int:32')), +				array('test_int_32'		=> 31), +				array('SETTING_TOO_LOW'), +			), +			array( +				array('test_int_32_64'	=> array('lang' => 'TEST_INT',			'validate' => 'int:32:64')), +				array('test_int_32_64'	=> 31), +				array('SETTING_TOO_LOW'), +			), +			array( +				array('test_int_32_64'	=> array('lang' => 'TEST_INT',			'validate' => 'int:32:64')), +				array('test_int_32_64'	=> 65), +				array('SETTING_TOO_BIG'), +			), +			array( +				array( +					'test_int_min'	=> array('lang' => 'TEST_INT_MIN',		'validate' => 'int:32:64'), +					'test_int_max'	=> array('lang' => 'TEST_INT_MAX',		'validate' => 'int:32:64'), +				), +				array( +					'test_int_min'	=> 52, +					'test_int_max'	=> 48, +				), +				array('SETTING_TOO_LOW'), +			), +			array( +				array('test_lang'		=> array('lang' => 'TEST_LANG',			'validate' => 'lang')), +				array('test_lang'		=> 'this_is_no_language'), +				array('WRONG_DATA_LANG'), +			), +		); +	} + +	/** +	* @dataProvider validate_config_vars_error_data +	*/ +	public function test_validate_config_vars_error($test_data, $cfg_array, $expected) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_config_vars($test_data, $cfg_array, $phpbb_error); + +		$this->assertEquals($expected, $phpbb_error); +	} +} diff --git a/tests/functions_acp/validate_range_test.php b/tests/functions_acp/validate_range_test.php new file mode 100644 index 0000000000..11b7f87957 --- /dev/null +++ b/tests/functions_acp/validate_range_test.php @@ -0,0 +1,171 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../mock/lang.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_acp.php'; + +class phpbb_functions_acp_validate_range_test extends phpbb_test_case +{ +	/** +	* Data sets that don't throw an error. +	*/ +	public function validate_range_data_fit() +	{ +		return array( +			array(array(array('column_type' => 'BOOL', 'lang' => 'TEST', 'value' => 0))), +			array(array(array('column_type' => 'BOOL', 'lang' => 'TEST', 'value' => 1))), + +			array(array(array('column_type' => 'USINT', 'lang' => 'TEST', 'value' => 0))), +			array(array(array('column_type' => 'USINT', 'lang' => 'TEST', 'value' => 65535))), +			array(array(array('column_type' => 'USINT:32:128', 'lang' => 'TEST', 'value' => 35))), + +			array(array(array('column_type' => 'UINT', 'lang' => 'TEST', 'value' => 0))), +			array(array(array('column_type' => 'UINT', 'lang' => 'TEST', 'value' => (int) 0x7fffffff))), +			array(array(array('column_type' => 'UINT:32:128', 'lang' => 'TEST', 'value' => 35))), + +			array(array(array('column_type' => 'INT', 'lang' => 'TEST', 'value' => (int) -2147483648))), +			array(array(array('column_type' => 'INT', 'lang' => 'TEST', 'value' => (int) 0x7fffffff))), +			array(array(array('column_type' => 'INT:-32:128', 'lang' => 'TEST', 'value' => -28))), +			array(array(array('column_type' => 'INT:-32:128', 'lang' => 'TEST', 'value' => 35))), + +			array(array(array('column_type' => 'TINT', 'lang' => 'TEST', 'value' => -128))), +			array(array(array('column_type' => 'TINT', 'lang' => 'TEST', 'value' => 127))), +			array(array(array('column_type' => 'TINT:-32:64', 'lang' => 'TEST', 'value' => -16))), +			array(array(array('column_type' => 'TINT:-32:64', 'lang' => 'TEST', 'value' => 16))), + +			array(array(array('column_type' => 'VCHAR', 'lang' => 'TEST', 'value' => ''))), +			array(array(array('column_type' => 'VCHAR', 'lang' => 'TEST', 'value' => str_repeat('a', 255)))), +			array(array(array('column_type' => 'VCHAR', 'lang' => 'TEST', 'value' => str_repeat("\xC3\x84", 255)))), +			array(array(array('column_type' => 'VCHAR:128', 'lang' => 'TEST', 'value' => str_repeat('a', 128)))), +			array(array(array('column_type' => 'VCHAR:128', 'lang' => 'TEST', 'value' => str_repeat("\xC3\x84", 128)))), +		); +	} + +	/** +	* @dataProvider validate_range_data_fit +	*/ +	public function test_validate_range_fit($test_data) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_range($test_data, $phpbb_error); + +		$this->assertEquals(array(), $phpbb_error); +	} + +	/** +	* Data sets that throw the SETTING_TOO_LOW-error. +	*/ +	public function validate_range_data_too_low() +	{ +		return array( +			array(array(array('column_type' => 'BOOL', 'lang' => 'TEST', 'value' => -1))), + +			array(array(array('column_type' => 'USINT', 'lang' => 'TEST', 'value' => -1))), +			array(array(array('column_type' => 'USINT:32:128', 'lang' => 'TEST', 'value' => 31))), + +			array(array(array('column_type' => 'UINT', 'lang' => 'TEST', 'value' => -1))), +			array(array(array('column_type' => 'UINT:32:128', 'lang' => 'TEST', 'value' => 31))), + +			array(array(array('column_type' => 'INT', 'lang' => 'TEST', 'value' => ((int) -2147483648) - 1))), +			array(array(array('column_type' => 'INT:32:128', 'lang' => 'TEST', 'value' => 31))), +			array(array(array('column_type' => 'INT:-32:128', 'lang' => 'TEST', 'value' => -33))), + +			array(array(array('column_type' => 'TINT', 'lang' => 'TEST', 'value' => -129))), +			array(array(array('column_type' => 'TINT:32:64', 'lang' => 'TEST', 'value' => 31))), +			array(array(array('column_type' => 'TINT:-32:64', 'lang' => 'TEST', 'value' => -33))), +		); +	} + +	/** +	* @dataProvider validate_range_data_too_low +	*/ +	public function test_validate_range_too_low($test_data) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_range($test_data, $phpbb_error); + +		$this->assertEquals(array('SETTING_TOO_LOW'), $phpbb_error); +	} + +	/** +	* Data sets that throw the SETTING_TOO_BIG-error. +	*/ +	public function validate_range_data_too_big() +	{ +		return array( +			array(array(array('column_type' => 'BOOL', 'lang' => 'TEST', 'value' => 2))), + +			array(array(array('column_type' => 'USINT', 'lang' => 'TEST', 'value' => 65536))), +			array(array(array('column_type' => 'USINT:32:128', 'lang' => 'TEST', 'value' => 129))), + +			array(array(array('column_type' => 'UINT', 'lang' => 'TEST', 'value' => ((int) 0x7fffffff) + 1))), +			array(array(array('column_type' => 'UINT:32:128', 'lang' => 'TEST', 'value' => 129))), + +			array(array(array('column_type' => 'INT', 'lang' => 'TEST', 'value' => ((int) 0x7fffffff) + 1))), +			array(array(array('column_type' => 'INT:-32:-16', 'lang' => 'TEST', 'value' => -15))), +			array(array(array('column_type' => 'INT:-32:128', 'lang' => 'TEST', 'value' => 129))), + +			array(array(array('column_type' => 'TINT', 'lang' => 'TEST', 'value' => 128))), +			array(array(array('column_type' => 'TINT:-32:-16', 'lang' => 'TEST', 'value' => -15))), +			array(array(array('column_type' => 'TINT:-32:64', 'lang' => 'TEST', 'value' => 65))), +		); +	} + +	/** +	* @dataProvider validate_range_data_too_big +	*/ +	public function test_validate_range_too_big($test_data) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_range($test_data, $phpbb_error); + +		$this->assertEquals(array('SETTING_TOO_BIG'), $phpbb_error); +	} + +	/** +	* Data sets that throw the SETTING_TOO_LONG-error. +	*/ +	public function validate_range_data_too_long() +	{ +		return array( +			array(array(array('column_type' => 'VCHAR', 'lang' => 'TEST', 'value' => str_repeat('a', 256)))), +			array(array(array('column_type' => 'VCHAR', 'lang' => 'TEST', 'value' => str_repeat("\xC3\x84", 256)))), +			array(array(array('column_type' => 'VCHAR:128', 'lang' => 'TEST', 'value' => str_repeat('a', 129)))), +			array(array(array('column_type' => 'VCHAR:128', 'lang' => 'TEST', 'value' => str_repeat("\xC3\x84", 129)))), +		); +	} + +	/** +	* @dataProvider validate_range_data_too_long +	*/ +	public function test_validate_range_too_long($test_data) +	{ +		global $user; + +		$user->lang = new phpbb_mock_lang(); + +		$phpbb_error = array(); +		validate_range($test_data, $phpbb_error); + +		$this->assertEquals(array('SETTING_TOO_LONG'), $phpbb_error); +	} +} diff --git a/tests/group_positions/fixtures/group_positions.xml b/tests/group_positions/fixtures/group_positions.xml new file mode 100644 index 0000000000..55b1c2e08d --- /dev/null +++ b/tests/group_positions/fixtures/group_positions.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<dataset> +	<table name="phpbb_groups"> +		<column>group_id</column> +		<column>group_teampage</column> +		<column>group_legend</column> +		<row> +			<value>1</value> +			<value>0</value> +			<value>0</value> +		</row> +		<row> +			<value>2</value> +			<value>1</value> +			<value>0</value> +		</row> +		<row> +			<value>3</value> +			<value>2</value> +			<value>1</value> +		</row> +	</table> +</dataset> diff --git a/tests/group_positions/group_positions_test.php b/tests/group_positions/group_positions_test.php new file mode 100644 index 0000000000..b68f205b37 --- /dev/null +++ b/tests/group_positions/group_positions_test.php @@ -0,0 +1,287 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + + +class phpbb_group_positions_test extends phpbb_database_test_case +{ +	public function getDataSet() +	{ +		return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/group_positions.xml'); +	} + +	public static function get_group_value_data() +	{ +		return array( +			array('teampage', 1, 0), +			array('teampage', 2, 1), +			array('legend', 1, 0), +			array('legend', 3, 1), +		); +	} + +	/** +	* @dataProvider get_group_value_data +	*/ +	public function test_get_group_value($field, $group_id, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); + +		$test_class = new phpbb_group_positions($db, $field); +		$this->assertEquals($expected, $test_class->get_group_value($group_id)); +	} + +	public static function get_group_count_data() +	{ +		return array( +			array('teampage', 2), +			array('legend', 1), +		); +	} + +	/** +	* @dataProvider get_group_count_data +	*/ +	public function test_get_group_count($field, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); + +		$test_class = new phpbb_group_positions($db, $field); +		$this->assertEquals($expected, $test_class->get_group_count()); +	} + +	public static function add_group_data() +	{ +		return array( +			array('teampage', 1, array( +				array('group_id' => 1, 'group_teampage' => 3, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +		); +	} + +	/** +	* @dataProvider add_group_data +	*/ +	public function test_add_group($field, $group_id, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); +		$test_class = new phpbb_group_positions($db, $field); +		$test_class->add_group($group_id); + +		$result = $db->sql_query('SELECT group_id, group_teampage, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_id ASC'); + +		$this->assertEquals($expected, $db->sql_fetchrowset($result)); +	} + +	public static function delete_group_data() +	{ +		return array( +			array('teampage', 1, false, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, false, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 3, false, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 0, 'group_legend' => 1), +			)), +			array('teampage', 1, true, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, true, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 3, true, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +		); +	} + +	/** +	* @dataProvider delete_group_data +	*/ +	public function test_delete_group($field, $group_id, $skip_group, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); +		$test_class = new phpbb_group_positions($db, $field); +		$test_class->delete_group($group_id, $skip_group); + +		$result = $db->sql_query('SELECT group_id, group_teampage, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_id ASC'); + +		$this->assertEquals($expected, $db->sql_fetchrowset($result)); +	} + +	public static function move_up_data() +	{ +		return array( +			array('teampage', 1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 3, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +		); +	} + +	/** +	* @dataProvider move_up_data +	*/ +	public function test_move_up($field, $group_id, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); +		$test_class = new phpbb_group_positions($db, $field); +		$test_class->move_up($group_id); + +		$result = $db->sql_query('SELECT group_id, group_teampage, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_id ASC'); + +		$this->assertEquals($expected, $db->sql_fetchrowset($result)); +	} + +	public static function move_down_data() +	{ +		return array( +			array('teampage', 1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 3, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +		); +	} + +	/** +	* @dataProvider move_down_data +	*/ +	public function test_move_down($field, $group_id, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); +		$test_class = new phpbb_group_positions($db, $field); +		$test_class->move_down($group_id); + +		$result = $db->sql_query('SELECT group_id, group_teampage, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_id ASC'); + +		$this->assertEquals($expected, $db->sql_fetchrowset($result)); +	} + +	public static function move_data() +	{ +		return array( +			array('teampage', 1, 1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 1, -1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 3, 3, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 2, 0, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +			array('teampage', 2, -1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 2, -3, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 2, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 1, 'group_legend' => 1), +			)), +			array('teampage', 3, -1, array( +				array('group_id' => 1, 'group_teampage' => 0, 'group_legend' => 0), +				array('group_id' => 2, 'group_teampage' => 1, 'group_legend' => 0), +				array('group_id' => 3, 'group_teampage' => 2, 'group_legend' => 1), +			)), +		); +	} + +	/** +	* @dataProvider move_data +	*/ +	public function test_move($field, $group_id, $increment, $expected) +	{ +		global $db; + +		$db = $this->new_dbal(); +		$test_class = new phpbb_group_positions($db, $field); +		$test_class->move($group_id, $increment); + +		$result = $db->sql_query('SELECT group_id, group_teampage, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_id ASC'); + +		$this->assertEquals($expected, $db->sql_fetchrowset($result)); +	} +} + diff --git a/tests/lock/db_test.php b/tests/lock/db_test.php new file mode 100644 index 0000000000..ed15423314 --- /dev/null +++ b/tests/lock/db_test.php @@ -0,0 +1,83 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_lock_db_test extends phpbb_database_test_case +{ +	private $db; +	private $config; +	private $lock; + +	public function getDataSet() +	{ +		return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml'); +	} + +	public function setUp() +	{ +		global $db, $config; + +		$db = $this->db = $this->new_dbal(); +		$config = $this->config = new phpbb_config(array('rand_seed' => '', 'rand_seed_last_update' => '0')); +		set_config(null, null, null, $this->config); +		$this->lock = new phpbb_lock_db('test_lock', $this->config, $this->db); +	} + +	public function test_new_lock() +	{ +		$this->assertTrue($this->lock->acquire()); +		$this->assertTrue(isset($this->config['test_lock']), 'Lock was created'); + +		$lock2 = new phpbb_lock_db('test_lock', $this->config, $this->db); +		$this->assertFalse($lock2->acquire()); + +		$this->lock->release(); +		$this->assertEquals('0', $this->config['test_lock'], 'Lock was released'); +	} + +	public function test_expire_lock() +	{ +		$lock = new phpbb_lock_db('foo_lock', $this->config, $this->db); +		$this->assertTrue($lock->acquire()); +	} + +	public function test_double_lock() +	{ +		$this->assertTrue($this->lock->acquire()); +		$this->assertTrue(isset($this->config['test_lock']), 'Lock was created'); + +		$value = $this->config['test_lock']; + +		$this->assertFalse($this->lock->acquire()); +		$this->assertEquals($value, $this->config['test_lock'], 'Second lock failed'); + +		$this->lock->release(); +		$this->assertEquals('0', $this->config['test_lock'], 'Lock was released'); +	} + +	public function test_double_unlock() +	{ +		$this->assertTrue($this->lock->acquire()); +		$this->assertFalse(empty($this->config['test_lock']), 'First lock is acquired'); + +		$this->lock->release(); +		$this->assertEquals('0', $this->config['test_lock'], 'First lock is released'); + +		$lock2 = new phpbb_lock_db('test_lock', $this->config, $this->db); +		$this->assertTrue($lock2->acquire()); +		$this->assertFalse(empty($this->config['test_lock']), 'Second lock is acquired'); + +		$this->lock->release(); +		$this->assertFalse(empty($this->config['test_lock']), 'Double release of first lock is ignored'); + +		$lock2->release(); +		$this->assertEquals('0', $this->config['test_lock'], 'Second lock is released'); +	} +} diff --git a/tests/lock/fixtures/config.xml b/tests/lock/fixtures/config.xml new file mode 100644 index 0000000000..f36c8b929a --- /dev/null +++ b/tests/lock/fixtures/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<dataset> +	<table name="phpbb_config"> +		<column>config_name</column> +		<column>config_value</column> +		<column>is_dynamic</column> +		<row> +			<value>foo_lock</value> +			<value>1 abcd</value> +			<value>1</value> +		</row> +	</table> +</dataset> diff --git a/tests/mock/cache.php b/tests/mock/cache.php index 020574b0bb..989180c256 100644 --- a/tests/mock/cache.php +++ b/tests/mock/cache.php @@ -2,21 +2,18 @@  /**  *  * @package testing -* @copyright (c) 2008 phpBB Group +* @copyright (c) 2011 phpBB Group  * @license http://opensource.org/licenses/gpl-license.php GNU Public License  *  */ -class phpbb_mock_cache +class phpbb_mock_cache implements phpbb_cache_driver_interface  { +	protected $data; +  	public function __construct($data = array())  	{  		$this->data = $data; - -		if (!isset($this->data['_bots'])) -		{ -			$this->data['_bots'] = array(); -		}  	}  	public function get($var_name) @@ -35,14 +32,6 @@ class phpbb_mock_cache  	}  	/** -	* Obtain active bots -	*/ -	public function obtain_bots() -	{ -		return $this->data['_bots']; -	} -	 -	/**  	 * Obtain list of word censors. We don't need to parse them here,  	 * that is tested elsewhere.  	 */ @@ -64,17 +53,17 @@ class phpbb_mock_cache  		);  	} -	public function set_bots($bots) -	{ -		$this->data['_bots'] = $bots; -	} -  	public function checkVar(PHPUnit_Framework_Assert $test, $var_name, $data)  	{  		$test->assertTrue(isset($this->data[$var_name]));  		$test->assertEquals($data, $this->data[$var_name]);  	} +	public function checkVarUnset(PHPUnit_Framework_Assert $test, $var_name) +	{ +		$test->assertFalse(isset($this->data[$var_name])); +	} +  	public function check(PHPUnit_Framework_Assert $test, $data, $ignore_db_info = true)  	{  		$cache_data = $this->data; @@ -91,5 +80,53 @@ class phpbb_mock_cache  		$test->assertEquals($data, $cache_data);  	} -} +	function load() +	{ +	} +	function unload() +	{ +	} +	function save() +	{ +	} +	function tidy() +	{ +	} +	function purge() +	{ +	} +	function destroy($var_name, $table = '') +	{ +		unset($this->data[$var_name]); +	} +	public function _exists($var_name) +	{ +	} +	public function sql_load($query) +	{ +	} +	public function sql_save($query, &$query_result, $ttl) +	{ +	} +	public function sql_exists($query_id) +	{ +	} +	public function sql_fetchrow($query_id) +	{ +	} +	public function sql_fetchfield($query_id, $field) +	{ +	} +	public function sql_rowseek($rownum, $query_id) +	{ +	} +	public function sql_freeresult($query_id) +	{ +	} + +	public function obtain_bots() +	{ +		return isset($this->data['_bots']) ? $this->data['_bots'] : array(); +	} +} diff --git a/tests/mock/lang.php b/tests/mock/lang.php new file mode 100644 index 0000000000..17a39629c1 --- /dev/null +++ b/tests/mock/lang.php @@ -0,0 +1,33 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* phpbb_mock_lang +* mock a user with some language-keys specified +*/ +class phpbb_mock_lang implements ArrayAccess +{ +	public function offsetExists($offset) +	{ +		return true; +	} + +	public function offsetGet($offset) +	{ +		return $offset; +	} + +	public function offsetSet($offset, $value) +	{ +	} + +	public function offsetUnset($offset) +	{ +	} +} diff --git a/tests/mock/request.php b/tests/mock/request.php new file mode 100644 index 0000000000..8b2708304c --- /dev/null +++ b/tests/mock/request.php @@ -0,0 +1,82 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_mock_request implements phpbb_request_interface +{ +	protected $data; + +	public function __construct($get = array(), $post = array(), $cookie = array(), $server = array(), $request = false) +	{ +		$this->data[phpbb_request_interface::GET] = $get; +		$this->data[phpbb_request_interface::POST] = $post; +		$this->data[phpbb_request_interface::COOKIE] = $cookie; +		$this->data[phpbb_request_interface::REQUEST] = ($request === false) ? $post + $get : $request; +		$this->data[phpbb_request_interface::SERVER] = $server; +	} + +	public function overwrite($var_name, $value, $super_global = phpbb_request_interface::REQUEST) +	{ +		$this->data[$super_global][$var_name] = $value; +	} + +	public function variable($var_name, $default, $multibyte = false, $super_global = phpbb_request_interface::REQUEST) +	{ +		return isset($this->data[$super_global][$var_name]) ? $this->data[$super_global][$var_name] : $default; +	} + +	public function server($var_name, $default = '') +	{ +		$super_global = phpbb_request_interface::SERVER; +		return isset($this->data[$super_global][$var_name]) ? $this->data[$super_global][$var_name] : $default; +	} + +	public function header($header_name, $default = '') +	{ +		$var_name = 'HTTP_' . str_replace('-', '_', strtoupper($header_name)); +		return $this->server($var_name, $default); +	} + +	public function is_set_post($name) +	{ +		return $this->is_set($name, phpbb_request_interface::POST); +	} + +	public function is_set($var, $super_global = phpbb_request_interface::REQUEST) +	{ +		return isset($this->data[$super_global][$var]); +	} + +	public function is_ajax() +	{ +		return false; +	} + +	public function is_secure() +	{ +		return false; +	} + +	public function variable_names($super_global = phpbb_request_interface::REQUEST) +	{ +		return array_keys($this->data[$super_global]); +	} + +	/* custom methods */ + +	public function set_header($header_name, $value) +	{ +		$var_name = 'HTTP_' . str_replace('-', '_', strtoupper($header_name)); +		$this->data[phpbb_request_interface::SERVER][$var_name] = $value; +	} + +	public function merge($super_global = phpbb_request_interface::REQUEST, $values) +	{ +		$this->data[$super_global] = array_merge($this->data[$super_global], $values); +	} +} diff --git a/tests/network/inet_ntop_pton_test.php b/tests/network/inet_ntop_pton_test.php new file mode 100644 index 0000000000..d3332f20c0 --- /dev/null +++ b/tests/network/inet_ntop_pton_test.php @@ -0,0 +1,54 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_network_inet_ntop_pton_test extends phpbb_test_case +{ +	public function data_provider() +	{ +		return array( +			array('127.0.0.1',						'7f000001'), +			array('192.232.131.223',				'c0e883df'), +			array('13.1.68.3',						'0d014403'), +			array('129.144.52.38',					'81903426'), + +			array('2001:280:0:10::5',				'20010280000000100000000000000005'), +			array('fe80::200:4cff:fefe:172f',		'fe8000000000000002004cfffefe172f'), + +			array('::',								'00000000000000000000000000000000'), +			array('::1',							'00000000000000000000000000000001'), +			array('1::',							'00010000000000000000000000000000'), + +			array('1:1:0:0:1::',					'00010001000000000001000000000000'), + +			array('0:2:3:4:5:6:7:8',				'00000002000300040005000600070008'), +			array('1:2:0:4:5:6:7:8',				'00010002000000040005000600070008'), +			array('1:2:3:4:5:6:7:0',				'00010002000300040005000600070000'), + +			array('2001:0:0:1::1',					'20010000000000010000000000000001'), +		); +	} + +	/** +	* @dataProvider data_provider +	*/ +	public function test_inet_ntop($address, $hex) +	{ +		$this->assertEquals($address, phpbb_inet_ntop(pack('H*', $hex))); +	} + +	/** +	* @dataProvider data_provider +	*/ +	public function test_inet_pton($address, $hex) +	{ +		$this->assertEquals($hex, bin2hex(phpbb_inet_pton($address))); +	} +} diff --git a/tests/network/ip_normalise_test.php b/tests/network/ip_normalise_test.php new file mode 100644 index 0000000000..dce0774d85 --- /dev/null +++ b/tests/network/ip_normalise_test.php @@ -0,0 +1,64 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2010 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_network_ip_normalise_test extends phpbb_test_case +{ +	public function data_provider() +	{ +		return array( +			// From: A Recommendation for IPv6 Address Text Representation +			// http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07 + +			// Section 4: A Recommendation for IPv6 Text Representation +			// Section 4.1: Handling Leading Zeros in a 16 Bit Field +			array('2001:0db8::0001', '2001:db8::1'), + +			// Section 4.2: "::" Usage +			// Section 4.2.1: Shorten As Much As Possible +			array('2001:db8::0:1', '2001:db8::1'), + +			// Section 4.2.2: Handling One 16 Bit 0 Field +			array('2001:db8::1:1:1:1:1', '2001:db8:0:1:1:1:1:1'), + +			// Section 4.2.3: Choice in Placement of "::" +			array('2001:db8:0:0:1:0:0:1', '2001:db8::1:0:0:1'), + +			// Section 4.3: Lower Case +			array('2001:DB8::1', '2001:db8::1'), + +			// Section 5: Text Representation of Special Addresses +			// We want to show IPv4-mapped addresses as plain IPv4 addresses, though. +			array('::ffff:192.168.0.1',			'192.168.0.1'), +			array('0000::0000:ffff:c000:0280',	'192.0.2.128'), + +			// IPv6 addresses with the last 32-bit written in dotted-quad notation +			// should be converted to hex-only IPv6 addresses. +			array('2001:db8::192.0.2.128', '2001:db8::c000:280'), + +			// Any string not passing the IPv4 or IPv6 regular expression +			// is supposed to result in false being returned. +			// Valid and invalid IP addresses are tested in  +			// tests/regex/ipv4.php and tests/regex/ipv6.php. +			array('', false), +			array('192.168.1.256', false), +			array('::ffff:192.168.255.256', false), +			array('::1111:2222:3333:4444:5555:6666::', false), +		); +	} + +	/** +	* @dataProvider data_provider +	*/ +	public function test_ip_normalise($ip_address, $expected) +	{ +		$this->assertEquals($expected, phpbb_ip_normalise($ip_address)); +	} +} diff --git a/tests/request/deactivated_super_global_test.php b/tests/request/deactivated_super_global_test.php new file mode 100644 index 0000000000..995f93443d --- /dev/null +++ b/tests/request/deactivated_super_global_test.php @@ -0,0 +1,22 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2009 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_deactivated_super_global_test extends phpbb_test_case +{ +	/** +	* Checks that on write access the correct error is thrown +	*/ +	public function test_write_triggers_error() +	{ +		$this->setExpectedTriggerError(E_USER_ERROR); +		$obj = new phpbb_request_deactivated_super_global($this->getMock('phpbb_request_interface'), 'obj', phpbb_request_interface::POST); +		$obj->offsetSet(0, 0); +	} +} diff --git a/tests/request/request_test.php b/tests/request/request_test.php new file mode 100644 index 0000000000..e492fa5cf1 --- /dev/null +++ b/tests/request/request_test.php @@ -0,0 +1,143 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2009 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_request_test extends phpbb_test_case +{ +	private $type_cast_helper; +	private $request; + +	protected function setUp() +	{ +		// populate super globals +		$_POST['test'] = 1; +		$_GET['test'] = 2; +		$_COOKIE['test'] = 3; +		$_REQUEST['test'] = 3; +		$_GET['unset'] = ''; + +		$_SERVER['HTTP_HOST'] = 'example.com'; +		$_SERVER['HTTP_ACCEPT'] = 'application/json'; +		$_SERVER['HTTP_SOMEVAR'] = '<value>'; + +		$this->type_cast_helper = $this->getMock('phpbb_request_type_cast_helper_interface'); +		$this->request = new phpbb_request($this->type_cast_helper); +	} + +	public function test_toggle_super_globals() +	{ +		$this->assertTrue($this->request->super_globals_disabled(), 'Superglobals were not disabled'); + +		$this->request->enable_super_globals(); + +		$this->assertFalse($this->request->super_globals_disabled(), 'Superglobals were not enabled'); + +		$this->assertEquals(1, $_POST['test'], 'Checking $_POST after enable_super_globals'); +		$this->assertEquals(2, $_GET['test'], 'Checking $_GET after enable_super_globals'); +		$this->assertEquals(3, $_COOKIE['test'], 'Checking $_COOKIE after enable_super_globals'); +		$this->assertEquals(3, $_REQUEST['test'], 'Checking $_REQUEST after enable_super_globals'); + +		$_POST['x'] = 2; +		$this->assertEquals($_POST, $GLOBALS['_POST'], 'Checking whether $_POST can still be accessed via $GLOBALS[\'_POST\']'); +	} + +	public function test_server() +	{ +		$this->assertEquals('example.com', $this->request->server('HTTP_HOST')); +	} + +	public function test_server_escaping() +	{ +		$this->type_cast_helper +			->expects($this->once()) +			->method('recursive_set_var') +			->with( +				$this->anything(), +				'', +				true +			); + +		$this->request->server('HTTP_SOMEVAR'); +	} + +	public function test_header() +	{ +		$this->assertEquals('application/json', $this->request->header('Accept')); +	} + +	public function test_header_escaping() +	{ +		$this->type_cast_helper +			->expects($this->once()) +			->method('recursive_set_var') +			->with( +				$this->anything(), +				'', +				true +			); + +		$this->request->header('SOMEVAR'); +	} + +	/** +	* Checks that directly accessing $_POST will trigger +	* an error. +	*/ +	public function test_disable_post_super_global() +	{ +		$this->setExpectedTriggerError(E_USER_ERROR); +		$_POST['test'] = 3; +	} + +	public function test_is_set_post() +	{ +		$this->assertTrue($this->request->is_set_post('test')); +		$this->assertFalse($this->request->is_set_post('unset')); +	} + +	public function test_is_ajax_without_ajax() +	{ +		$this->assertFalse($this->request->is_ajax()); +	} + +	public function test_is_ajax_with_ajax() +	{ +		$this->request->enable_super_globals(); +		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; +		$this->request = new phpbb_request($this->type_cast_helper); + +		$this->assertTrue($this->request->is_ajax()); +	} + +	public function test_is_secure() +	{ +		$this->assertFalse($this->request->is_secure()); + +		$this->request->enable_super_globals(); +		$_SERVER['HTTPS'] = 'on'; +		$this->request = new phpbb_request($this->type_cast_helper); + +		$this->assertTrue($this->request->is_secure()); +	} + +	public function test_variable_names() +	{ +		$expected = array('test', 'unset'); +		$result = $this->request->variable_names(); +		$this->assertEquals($expected, $result); +	} + +	/** +	* Makes sure super globals work properly after these tests +	*/ +	protected function tearDown() +	{ +		$this->request->enable_super_globals(); +	} +} diff --git a/tests/request/request_var_test.php b/tests/request/request_var_test.php index fa17b1909f..7a45ef2fee 100644 --- a/tests/request/request_var_test.php +++ b/tests/request/request_var_test.php @@ -10,9 +10,18 @@  require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';  require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php'; -class phpbb_request_request_var_test extends phpbb_test_case +class phpbb_request_var_test extends phpbb_test_case  {  	/** +	* Makes sure request_var has its standard behaviour. +	*/ +	protected function setUp() +	{ +		parent::setUp(); +		request_var(false, false, false, false, false); +	} + +	/**  	* @dataProvider request_variables  	*/  	public function test_post($variable_value, $default, $multibyte, $expected) @@ -73,6 +82,47 @@ class phpbb_request_request_var_test extends phpbb_test_case  		unset($_GET[$var], $_POST[$var], $_REQUEST[$var], $_COOKIE[$var]);  	} +	/** +	* @dataProvider deep_access +	* Only possible with 3.1.x (later) +	*/ +	public function test_deep_multi_dim_array_access($path, $default, $expected) +	{ +		$this->unset_variables('var'); + +		// cannot set $_REQUEST directly because in phpbb_request implementation +		// $_REQUEST = $_POST + $_GET +		$_POST['var'] = array( +			0 => array( +				'b' => array( +					true => array( +						5 => 'c', +						6 => 'd', +					), +				), +			), +			2 => array( +				3 => array( +					false => 5, +				), +			), +		); + +		$result = request_var($path, $default); +		$this->assertEquals($expected, $result, 'Testing deep access to multidimensional input arrays: ' . $path); +	} + +	public static function deep_access() +	{ +		return array( +			// array(path, default, expected result) +			array(array('var', 0, 'b', true, 5), '', 'c'), +			array(array('var', 0, 'b', true, 6), '', 'd'), +			array(array('var', 2, 3, false), 0, 5), +			array(array('var', 0, 'b', true), array(0 => ''), array(5 => 'c', 6 => 'd')), +		); +	} +  	public static function request_variables()  	{  		return array( @@ -173,6 +223,50 @@ class phpbb_request_request_var_test extends phpbb_test_case  					'abc' => array()  				)  			), +			array( +				// input: +				array( +					0 => array(0 => array(3, '4', 'ab'), 1 => array()), +					1 => array(array(3, 4)), +				), +				// default: +				array(0 => array(0 => array(0))), +				false, +				// expected: +				array( +					0 => array(0 => array(3, 4, 0), 1 => array()), +					1 => array(array(3, 4)) +				) +			), +			array( +				// input: +				array( +					'ü' => array(array('c' => 'd')), +					'ä' => array(4 => array('a' => 2, 'ö' => 3)), +				), +				// default: +				array('' => array(0 => array('' => 0))), +				false, +				// expected: +				array( +					'??' => array(4 => array('a' => 2, '??' => 3)), +				) +			), +			array( +				// input: +				array( +					'ü' => array(array('c' => 'd')), +					'ä' => array(4 => array('a' => 2, 'ö' => 3)), +				), +				// default: +				array('' => array(0 => array('' => 0))), +				true, +				// expected: +				array( +					'ü' => array(array('c' => 0)), +					'ä' => array(4 => array('a' => 2, 'ö' => 3)), +				) +			),  		);  	} diff --git a/tests/request/type_cast_helper_test.php b/tests/request/type_cast_helper_test.php new file mode 100644 index 0000000000..06cf2e1bf6 --- /dev/null +++ b/tests/request/type_cast_helper_test.php @@ -0,0 +1,51 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2009 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php'; + +class phpbb_type_cast_helper_test extends phpbb_test_case +{ +	private $type_cast_helper; + +	protected function setUp() +	{ +		$this->type_cast_helper = new phpbb_request_type_cast_helper(); +	} + +	public function test_addslashes_recursively() +	{ +		$data = array('some"string' => array('that"' => 'really"', 'needs"' => '"escaping')); +		$expected = array('some\\"string' => array('that\\"' => 'really\\"', 'needs\\"' => '\\"escaping')); + +		$this->type_cast_helper->addslashes_recursively($data); + +		$this->assertEquals($expected, $data); +	} + +	public function test_simple_recursive_set_var() +	{ +		$data = 'eviL<3'; +		$expected = 'eviL<3'; + +		$this->type_cast_helper->recursive_set_var($data, '', true); + +		$this->assertEquals($expected, $data); +	} + +	public function test_nested_recursive_set_var() +	{ +		$data = array('eviL<3'); +		$expected = array('eviL<3'); + +		$this->type_cast_helper->recursive_set_var($data, array(0 => ''), true); + +		$this->assertEquals($expected, $data); +	} +} diff --git a/tests/security/base.php b/tests/security/base.php index db9c884cf4..4b259a2aac 100644 --- a/tests/security/base.php +++ b/tests/security/base.php @@ -7,6 +7,8 @@  *  */ +require_once dirname(__FILE__) . '/../mock/request.php'; +  abstract class phpbb_security_test_base extends phpbb_test_case  {  	/** @@ -14,20 +16,20 @@ abstract class phpbb_security_test_base extends phpbb_test_case  	*/  	protected function setUp()  	{ -		global $user, $phpbb_root_path; +		global $user, $phpbb_root_path, $request;  		// Put this into a global function being run by every test to init a proper user session -		$_SERVER['HTTP_HOST']		= 'localhost'; -		$_SERVER['SERVER_NAME']		= 'localhost'; -		$_SERVER['SERVER_ADDR']		= '127.0.0.1'; -		$_SERVER['SERVER_PORT']		= 80; -		$_SERVER['REMOTE_ADDR']		= '127.0.0.1'; -		$_SERVER['QUERY_STRING']	= ''; -		$_SERVER['REQUEST_URI']		= '/tests/'; -		$_SERVER['SCRIPT_NAME']		= '/tests/index.php'; -		$_SERVER['PHP_SELF']		= '/tests/index.php'; -		$_SERVER['HTTP_USER_AGENT']	= 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'; -		$_SERVER['HTTP_ACCEPT_LANGUAGE']	= 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3'; +		$server['HTTP_HOST']		= 'localhost'; +		$server['SERVER_NAME']		= 'localhost'; +		$server['SERVER_ADDR']		= '127.0.0.1'; +		$server['SERVER_PORT']		= 80; +		$server['REMOTE_ADDR']		= '127.0.0.1'; +		$server['QUERY_STRING']	= ''; +		$server['REQUEST_URI']		= '/tests/'; +		$server['SCRIPT_NAME']		= '/tests/index.php'; +		$server['PHP_SELF']		= '/tests/index.php'; +		$server['HTTP_USER_AGENT']	= 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'; +		$server['HTTP_ACCEPT_LANGUAGE']	= 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';  /*  		[HTTP_ACCEPT_ENCODING] => gzip,deflate @@ -36,13 +38,15 @@ abstract class phpbb_security_test_base extends phpbb_test_case  		[SCRIPT_FILENAME] => /var/www/tests/index.php  */ +		$request = new phpbb_mock_request(array(), array(), array(), $server); +  		// Set no user and trick a bit to circumvent errors  		$user = new user();  		$user->lang = true; -		$user->browser				= (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : ''; -		$user->referer				= (!empty($_SERVER['HTTP_REFERER'])) ? htmlspecialchars((string) $_SERVER['HTTP_REFERER']) : ''; -		$user->forwarded_for		= (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? (string) $_SERVER['HTTP_X_FORWARDED_FOR'] : ''; -		$user->host					= (!empty($_SERVER['HTTP_HOST'])) ? (string) strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME')); +		$user->browser				= $server['HTTP_USER_AGENT']; +		$user->referer				= ''; +		$user->forwarded_for		= ''; +		$user->host					= $server['HTTP_HOST'];  		$user->page = session::extract_current_page($phpbb_root_path);  	} diff --git a/tests/security/extract_current_page_test.php b/tests/security/extract_current_page_test.php index 71c7a3a397..34c7b52f49 100644 --- a/tests/security/extract_current_page_test.php +++ b/tests/security/extract_current_page_test.php @@ -27,8 +27,12 @@ class phpbb_security_extract_current_page_test extends phpbb_security_test_base  	*/  	public function test_query_string_php_self($url, $query_string, $expected)  	{ -		$_SERVER['PHP_SELF'] = $url; -		$_SERVER['QUERY_STRING'] = $query_string; +		global $request; + +		$request->merge(phpbb_request_interface::SERVER, array( +			'PHP_SELF'	=> $url, +			'QUERY_STRING'	=> $query_string, +		));  		$result = session::extract_current_page('./'); @@ -41,8 +45,12 @@ class phpbb_security_extract_current_page_test extends phpbb_security_test_base  	*/  	public function test_query_string_request_uri($url, $query_string, $expected)  	{ -		$_SERVER['REQUEST_URI'] = $url . '?' . $query_string; -		$_SERVER['QUERY_STRING'] = $query_string; +		global $request; + +		$request->merge(phpbb_request_interface::SERVER, array( +			'PHP_SELF'	=> $url, +			'QUERY_STRING'	=> $query_string, +		));  		$result = session::extract_current_page('./'); diff --git a/tests/security/redirect_test.php b/tests/security/redirect_test.php index 70ba8527b1..76347d309f 100644 --- a/tests/security/redirect_test.php +++ b/tests/security/redirect_test.php @@ -30,7 +30,7 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  	protected function setUp()  	{  		parent::setUp(); -		 +  		$GLOBALS['config'] = array(  			'force_server_vars'	=> '0',  		); @@ -57,4 +57,3 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  		}  	}  } - diff --git a/tests/session/testable_factory.php b/tests/session/testable_factory.php index f3ef19a257..3d4fbcc7cb 100644 --- a/tests/session/testable_factory.php +++ b/tests/session/testable_factory.php @@ -7,6 +7,7 @@  *  */ +require_once dirname(__FILE__) . '/../mock/request.php';  require_once dirname(__FILE__) . '/../mock/session_testable.php';  /** @@ -24,6 +25,7 @@ class phpbb_session_testable_factory  	protected $config;  	protected $cache; +	protected $request;  	/**  	* Initialises the factory with a set of default config and cache values. @@ -66,17 +68,24 @@ class phpbb_session_testable_factory  	public function get_session(dbal $dbal)  	{  		// set up all the global variables used by session -		global $SID, $_SID, $db, $config, $cache; +		global $SID, $_SID, $db, $config, $cache, $request; + +		$request = $this->request = new phpbb_mock_request( +			array(), +			array(), +			$this->cookies, +			$this->server_data +		); +		request_var(null, null, null, null, $request); + +		$config = $this->config = new phpbb_config($this->get_config_data()); +		set_config(null, null, null, $config); -		$config = $this->config = $this->get_config_data();  		$db = $dbal;  		$cache = $this->cache = new phpbb_mock_cache($this->get_cache_data());  		$SID = $_SID = null; -		$_COOKIE = $this->cookies; -		$_SERVER = $this->server_data; -  		$session = new phpbb_mock_session_testable;  		return $session;  	} diff --git a/tests/template/includephp_test.php b/tests/template/includephp_test.php new file mode 100644 index 0000000000..aac9cccc8a --- /dev/null +++ b/tests/template/includephp_test.php @@ -0,0 +1,47 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/template_test_case.php'; + +class phpbb_template_includephp_test extends phpbb_template_template_test_case +{ +	public function test_includephp_relative() +	{ +		$this->setup_engine(array('tpl_allow_php' => true)); + +		$cache_file = $this->template->cachepath . 'includephp_relative.html.php'; + +		$this->run_template('includephp_relative.html', array(), array(), array(), "Path is relative to board root.\ntesting included php", $cache_file); + +		$this->template->set_filenames(array('test' => 'includephp_relative.html')); +		$this->assertEquals("Path is relative to board root.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP"); +	} + +	public function test_includephp_absolute() +	{ +		$path_to_php = dirname(__FILE__) . '/templates/_dummy_include.php.inc'; +		$this->assertTrue(phpbb_is_absolute($path_to_php)); +		$template_text = "Path is absolute.\n<!-- INCLUDEPHP $path_to_php -->"; + +		$cache_dir = dirname($this->template->cachepath) . '/'; +		$fp = fopen($cache_dir . 'includephp_absolute.html', 'w'); +		fputs($fp, $template_text); +		fclose($fp); + +		$this->setup_engine(array('tpl_allow_php' => true)); + +		$this->template->set_custom_template($cache_dir, 'tests'); +		$cache_file = $this->template->cachepath . 'includephp_absolute.html.php'; + +		$this->run_template('includephp_absolute.html', array(), array(), array(), "Path is absolute.\ntesting included php", $cache_file); + +		$this->template->set_filenames(array('test' => 'includephp_absolute.html')); +		$this->assertEquals("Path is absolute.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP"); +	} +} diff --git a/tests/template/parent_templates/parent_and_child.html b/tests/template/parent_templates/parent_and_child.html new file mode 100644 index 0000000000..71984b48ad --- /dev/null +++ b/tests/template/parent_templates/parent_and_child.html @@ -0,0 +1 @@ +Parent template. diff --git a/tests/template/parent_templates/parent_only.html b/tests/template/parent_templates/parent_only.html new file mode 100644 index 0000000000..8cfb90eca2 --- /dev/null +++ b/tests/template/parent_templates/parent_only.html @@ -0,0 +1 @@ +Only in parent. diff --git a/tests/template/renderer_eval_test.php b/tests/template/renderer_eval_test.php new file mode 100644 index 0000000000..c30516ba97 --- /dev/null +++ b/tests/template/renderer_eval_test.php @@ -0,0 +1,31 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_template_renderer_eval_test extends phpbb_test_case +{ +	public function test_eval() +	{ +		$compiled_code = '<a href="<?php echo \'Test\'; ?>">'; +		$valid_code = '<a href="Test">'; +		$context = new phpbb_template_context(); +		$template = new phpbb_template_renderer_eval($compiled_code, NULL); +		ob_start(); +		try +		{ +			$template->render($context, array()); +		} +		catch (Exception $exception) +		{ +			ob_end_clean(); +			throw $exception; +		} +		$output = ob_get_clean(); +		$this->assertEquals($valid_code, $output); +	} +} diff --git a/tests/template/subdir/includephp_from_subdir_test.php b/tests/template/subdir/includephp_from_subdir_test.php new file mode 100644 index 0000000000..3cc632485d --- /dev/null +++ b/tests/template/subdir/includephp_from_subdir_test.php @@ -0,0 +1,29 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../template_test_case.php'; + +class phpbb_template_subdir_includephp_from_subdir_test extends phpbb_template_template_test_case +{ +	// Exact copy of test_includephp_relatve from ../includephp_test.php. +	// Verifies that relative php inclusion works when including script +	// (and thus current working directory) is in a subdirectory of +	// board root. +	public function test_includephp_relative() +	{ +		$this->setup_engine(array('tpl_allow_php' => true)); + +		$cache_file = $this->template->cachepath . 'includephp_relative.html.php'; + +		$this->run_template('includephp_relative.html', array(), array(), array(), "Path is relative to board root.\ntesting included php", $cache_file); + +		$this->template->set_filenames(array('test' => 'includephp_relative.html')); +		$this->assertEquals("Path is relative to board root.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP"); +	} +} diff --git a/tests/template/template_compile_test.php b/tests/template/template_compile_test.php new file mode 100644 index 0000000000..8c136c9985 --- /dev/null +++ b/tests/template/template_compile_test.php @@ -0,0 +1,31 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_template_template_compile_test extends phpbb_test_case +{ +	private $template_compile; +	private $template_path; + +	protected function setUp() +	{ +		$this->template_compile = new phpbb_template_compile(false); +		$this->template_path = dirname(__FILE__) . '/templates'; +	} + +	public function test_in_phpbb() +	{ +		$output = $this->template_compile->compile_file($this->template_path . '/trivial.html'); +		$this->assertTrue(strlen($output) > 0); +		$statements = explode(';', $output); +		$first_statement = $statements[0]; +		$this->assertTrue(!!preg_match('#if.*defined.*IN_PHPBB.*exit#', $first_statement)); +	} +} diff --git a/tests/template/template_inheritance_test.php b/tests/template/template_inheritance_test.php new file mode 100644 index 0000000000..d62562ff0d --- /dev/null +++ b/tests/template/template_inheritance_test.php @@ -0,0 +1,75 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/template_test_case.php'; + +class phpbb_template_template_inheritance_test extends phpbb_template_template_test_case +{ +	/** +	 * @todo put test data into templates/xyz.test +	 */ +	public static function template_data() +	{ +		return array( +			// First element of the array is test name - keep them distinct +			array( +				'simple inheritance - only parent template exists', +				'parent_only.html', +				array(), +				array(), +				array(), +				"Only in parent.", +			), +			array( +				'simple inheritance - only child template exists', +				'child_only.html', +				array(), +				array(), +				array(), +				"Only in child.", +			), +			array( +				'simple inheritance - both parent and child templates exist', +				'parent_and_child.html', +				array(), +				array(), +				array(), +				"Child template.", +			), +		); +	} + +	/** +	* @dataProvider template_data +	*/ +	public function test_template($name, $file, array $vars, array $block_vars, array $destroy, $expected) +	{ +		$cache_file = $this->template->cachepath . str_replace('/', '.', $file) . '.php'; + +		$this->assertFileNotExists($cache_file); + +		$this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file); + +		// Reset the engine state +		$this->setup_engine(); + +		$this->run_template($file, $vars, $block_vars, $destroy, $expected, $cache_file); +	} + +	protected function setup_engine() +	{ +		global $phpbb_root_path, $phpEx, $config, $user; + +		$this->template_path = dirname(__FILE__) . '/templates'; +		$this->parent_template_path = dirname(__FILE__) . '/parent_templates'; +		$this->template_locator = new phpbb_template_locator(); +		$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->template_locator); +		$this->template->set_custom_template($this->template_path, 'tests', $this->parent_template_path); +	} +} diff --git a/tests/template/template_test.php b/tests/template/template_test.php index 5005710220..28eba05217 100644 --- a/tests/template/template_test.php +++ b/tests/template/template_test.php @@ -8,89 +8,10 @@  */  require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; -require_once dirname(__FILE__) . '/../../phpBB/includes/template.php'; +require_once dirname(__FILE__) . '/template_test_case.php'; -class phpbb_template_template_test extends phpbb_test_case +class phpbb_template_template_test extends phpbb_template_template_test_case  { -	private $template; -	private $template_path; - -	// Keep the contents of the cache for debugging? -	const PRESERVE_CACHE = true; - -	private function display($handle) -	{ -		// allow the templates to throw notices -		$error_level = error_reporting(); -		error_reporting($error_level & ~E_NOTICE); - -		ob_start(); - -		try -		{ -			$this->assertTrue($this->template->display($handle, false)); -		} -		catch (Exception $exception) -		{ -			// reset the error level even when an error occured -			// PHPUnit turns trigger_error into exceptions as well -			error_reporting($error_level); -			ob_end_clean(); -			throw $exception; -		} - -		$result = self::trim_template_result(ob_get_clean()); - -		// reset error level -		error_reporting($error_level); -		return $result; -	} - -	private static function trim_template_result($result) -	{ -		return str_replace("\n\n", "\n", implode("\n", array_map('trim', explode("\n", trim($result))))); -	} - -	private function setup_engine() -	{ -		$this->template_path = dirname(__FILE__) . '/templates'; -		$this->template = new template(); -		$this->template->set_custom_template($this->template_path, 'tests'); -	} - -	protected function setUp() -	{ -		// Test the engine can be used -		$this->setup_engine(); - -		$template_cache_dir = dirname($this->template->cachepath); -		if (!is_writable($template_cache_dir)) -		{ -			$this->markTestSkipped("Template cache directory ({$template_cache_dir}) is not writable."); -		} - -		foreach (glob($this->template->cachepath . '*') as $file) -		{ -			unlink($file); -		} - -		$GLOBALS['config'] = array( -			'load_tplcompile'	=> true, -			'tpl_allow_php'		=> false, -		); -	} - -	protected function tearDown() -	{ -		if (is_object($this->template)) -		{ -			foreach (glob($this->template->cachepath . '*') as $file) -			{ -				unlink($file); -			} -		} -	} -  	/**  	 * @todo put test data into templates/xyz.test  	 */ @@ -111,7 +32,7 @@ class phpbb_template_template_test extends phpbb_test_case  				array(),  				array(),  				array(), -				"pass\npass\n<!-- DUMMY var -->", +				"pass\npass\npass\n<!-- DUMMY var -->",  			),  			array(  				'variable.html', @@ -125,14 +46,14 @@ class phpbb_template_template_test extends phpbb_test_case  				array(),  				array(),  				array(), -				'0', +				'03',  			),  			array(  				'if.html',  				array('S_VALUE' => true),  				array(),  				array(), -				"1\n0", +				'1',  			),  			array(  				'if.html', @@ -181,22 +102,22 @@ class phpbb_template_template_test extends phpbb_test_case  				array(),  				array('loop' => array(array('VARIABLE' => 'x'))),  				array(), -				"first\n0\nx\nset\nlast", -			),/* no nested top level loops +				"first\n0 - a\nx - b\nset\nlast", +			),  			array(  				'loop_vars.html',  				array(),  				array('loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y'))),  				array(), -				"first\n0\n0\n2\nx\nset\n1\n1\n2\ny\nset\nlast", +				"first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast",  			),  			array(  				'loop_vars.html',  				array(),  				array('loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'loop.inner' => array(array(), array())),  				array(), -				"first\n0\n0\n2\nx\nset\n1\n1\n2\ny\nset\nlast\n0\n\n1\nlast inner\ninner loop", -			),*/ +				"first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast\n0 - c\n1 - c\nlast inner\ninner loop", +			),  			array(  				'loop_advanced.html',  				array(), @@ -209,14 +130,23 @@ class phpbb_template_template_test extends phpbb_test_case  				array(),  				array('loop' => array(array(), array(), array(), array(), array(), array(), array()), 'test' => array(array()), 'test.deep' => array(array()), 'test.deep.defines' => array(array())),  				array(), -				"xyz\nabc", +				"xyz\nabc\nabc\nbar\nbar\nabc",  			),  			array(  				'expressions.html',  				array(),  				array(),  				array(), -				trim(str_repeat("pass", 39)), +				trim(str_repeat("pass\n", 10) . "\n" +					. str_repeat("pass\n", 4) . "\n" +					. str_repeat("pass\n", 2) . "\n" +					. str_repeat("pass\n", 6) . "\n" +					. str_repeat("pass\n", 2) . "\n" +					. str_repeat("pass\n", 6) . "\n" +					. str_repeat("pass\n", 2) . "\n" +					. str_repeat("pass\n", 2) . "\n" +					. str_repeat("pass\n", 3) . "\n" +					. str_repeat("pass\n", 2) . "\n"),  			),  			array(  				'php.html', @@ -233,6 +163,27 @@ class phpbb_template_template_test extends phpbb_test_case  				'value',  			),  			array( +				'include_define.html', +				array('VARIABLE' => 'value'), +				array(), +				array(), +				'value', +			), +			array( +				'include_loop.html', +				array(), +				array('loop' => array(array('NESTED_FILE' => 'include_loop1.html')), 'loop.inner' => array(array('NESTED_FILE' => 'include_loop1.html'), array('NESTED_FILE' => 'include_loop2.html'), array('NESTED_FILE' => 'include_loop3.html'))), +				array(), +				"1\n_1\n_02\n_3", +			), +			array( +				'include_variable.html', +				array('FILE' => 'variable.html', 'VARIABLE' => 'value'), +				array(), +				array(), +				'value', +			), +			array(  				'loop_vars.html',  				array(),  				array('loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'loop.inner' => array(array(), array())), @@ -247,6 +198,15 @@ class phpbb_template_template_test extends phpbb_test_case  				"first\n0\n0\n2\nx\nset\n1\n1\n2\ny\nset\nlast",  			),*/  			array( +				// Just like a regular loop but the name begins +				// with an underscore +				'loop_underscore.html', +				array(), +				array(), +				array(), +				"noloop\nnoloop", +			), +			array(  				'lang.html',  				array(),  				array(), @@ -267,6 +227,46 @@ class phpbb_template_template_test extends phpbb_test_case  				array(),  				"{ VARIABLE }\nValue'",  			), +			array( +				'loop_nested_multilevel_ref.html', +				array(), +				array(), +				array(), +				"top-level content", +			), +			array( +				'loop_nested_multilevel_ref.html', +				array(), +				array('outer' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'outer.inner' => array(array('VARIABLE' => 'z'), array('VARIABLE' => 'zz'))), +				array(), +				// I don't completely understand this output, hopefully it's correct +				"top-level content\nouter x\nouter y\ninner z\nfirst row\n\ninner zz", +			), +			array( +				'loop_nested_deep_multilevel_ref.html', +				array(), +				array('outer' => array(array()), 'outer.middle' => array(array()), 'outer.middle.inner' => array(array('VARIABLE' => 'z'), array('VARIABLE' => 'zz'))), +				array(), +				// I don't completely understand this output, hopefully it's correct +				"top-level content\nouter\n\ninner z\nfirst row\n\ninner zz", +			), +			array( +				'loop_size.html', +				array(), +				array('loop' => array(array()), 'empty_loop' => array()), +				array(), +				"nonexistent = 0\n! nonexistent\n\nempty = 0\n! empty\nloop\n\nin loop", +			), +			/* Does not pass with the current implementation. +			array( +				'loop_reuse.html', +				array(), +				array('one' => array(array('VAR' => 'a'), array('VAR' => 'b')), 'one.one' => array(array('VAR' => 'c'), array('VAR' => 'd'))), +				array(), +				// Not entirely sure what should be outputted but the current output of "a" is most certainly wrong +				"a\nb\nc\nd", +			), +			*/  		);  	} @@ -277,7 +277,7 @@ class phpbb_template_template_test extends phpbb_test_case  		$this->template->set_filenames(array('test' => $filename));  		$this->assertFileNotExists($this->template_path . '/' . $filename, 'Testing missing file, file cannot exist'); -		$expecting = sprintf('template->_tpl_load_file(): File %s does not exist or is empty', realpath($this->template_path . '/../') . '/templates/' . $filename); +		$expecting = sprintf('template locator: File %s does not exist', realpath($this->template_path . '/../') . '/templates/' . $filename);  		$this->setExpectedTriggerError(E_USER_ERROR, $expecting);  		$this->display('test'); @@ -285,7 +285,7 @@ class phpbb_template_template_test extends phpbb_test_case  	public function test_empty_file()  	{ -		$expecting = 'template->set_filenames: Empty filename specified for test'; +		$expecting = 'template locator: set_filenames: Empty filename specified for test';  		$this->setExpectedTriggerError(E_USER_ERROR, $expecting);  		$this->template->set_filenames(array('test' => '')); @@ -293,52 +293,12 @@ class phpbb_template_template_test extends phpbb_test_case  	public function test_invalid_handle()  	{ -		$expecting = 'template->_tpl_load(): No file specified for handle test'; +		$expecting = 'No file specified for handle test';  		$this->setExpectedTriggerError(E_USER_ERROR, $expecting);  		$this->display('test');  	} -	private function run_template($file, array $vars, array $block_vars, array $destroy, $expected, $cache_file) -	{ -		$this->template->set_filenames(array('test' => $file)); -		$this->template->assign_vars($vars); - -		foreach ($block_vars as $block => $loops) -		{ -			foreach ($loops as $_vars) -			{ -				$this->template->assign_block_vars($block, $_vars); -			} -		} - -		foreach ($destroy as $block) -		{ -			$this->template->destroy_block_vars($block); -		} - -		try -		{ -			$this->assertEquals($expected, $this->display('test'), "Testing $file"); -			$this->assertFileExists($cache_file); -		} -		catch (ErrorException $e) -		{ -			if (file_exists($cache_file)) -			{ -				copy($cache_file, str_replace('ctpl_', 'tests_ctpl_', $cache_file)); -			} - -			throw $e; -		} - -		// For debugging -		if (self::PRESERVE_CACHE) -		{ -			copy($cache_file, str_replace('ctpl_', 'tests_ctpl_', $cache_file)); -		} -	} -  	/**  	* @dataProvider template_data  	*/ @@ -380,43 +340,22 @@ class phpbb_template_template_test extends phpbb_test_case  			$this->template->destroy_block_vars($block);  		} -		$error_level = error_reporting(); -		error_reporting($error_level & ~E_NOTICE); -  		$this->assertEquals($expected, self::trim_template_result($this->template->assign_display('test')), "Testing assign_display($file)");  		$this->template->assign_display('test', 'VARIABLE', false); -		error_reporting($error_level); -  		$this->assertEquals($expected, $this->display('container'), "Testing assign_display($file)");  	}  	public function test_php()  	{ -		$GLOBALS['config']['tpl_allow_php'] = true; +		$this->setup_engine(array('tpl_allow_php' => true));  		$cache_file = $this->template->cachepath . 'php.html.php';  		$this->assertFileNotExists($cache_file);  		$this->run_template('php.html', array(), array(), array(), 'test', $cache_file); - -		$GLOBALS['config']['tpl_allow_php'] = false; -	} - -	public function test_includephp() -	{ -		$GLOBALS['config']['tpl_allow_php'] = true; - -		$cache_file = $this->template->cachepath . 'includephp.html.php'; - -		$this->run_template('includephp.html', array(), array(), array(), 'testing included php', $cache_file); - -		$this->template->set_filenames(array('test' => 'includephp.html')); -		$this->assertEquals('testing included php', $this->display('test'), "Testing INCLUDEPHP"); - -		$GLOBALS['config']['tpl_allow_php'] = false;  	}  	public static function alter_block_array_data() @@ -527,5 +466,5 @@ EOT  		$this->template->alter_block_array($alter_block, $vararray, $key, $mode);  		$this->assertEquals($expect, $this->display('test'), $description);  	} -} +} diff --git a/tests/template/template_test_case.php b/tests/template/template_test_case.php new file mode 100644 index 0000000000..0e1f960f61 --- /dev/null +++ b/tests/template/template_test_case.php @@ -0,0 +1,133 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_template_template_test_case extends phpbb_test_case +{ +	protected $template; +	protected $template_path; +	protected $template_locator; + +	// Keep the contents of the cache for debugging? +	const PRESERVE_CACHE = true; + +	protected function display($handle) +	{ +		ob_start(); + +		try +		{ +			$this->assertTrue($this->template->display($handle, false)); +		} +		catch (Exception $exception) +		{ +			// reset output buffering even when an error occured +			// PHPUnit turns trigger_error into exceptions as well +			ob_end_clean(); +			throw $exception; +		} + +		$result = self::trim_template_result(ob_get_clean()); + +		return $result; +	} + +	protected static function trim_template_result($result) +	{ +		return str_replace("\n\n", "\n", implode("\n", array_map('trim', explode("\n", trim($result))))); +	} + +	protected function setup_engine(array $new_config = array()) +	{ +		global $phpbb_root_path, $phpEx, $user; + +		$defaults = array( +			'load_tplcompile'	=> true, +			'tpl_allow_php'		=> false, +		); + +		$config = new phpbb_config(array_merge($defaults, $new_config)); + +		$this->template_path = dirname(__FILE__) . '/templates'; +		$this->template_locator = new phpbb_template_locator(); +		$this->template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $this->template_locator); +		$this->template->set_custom_template($this->template_path, 'tests'); +	} + +	protected function setUp() +	{ +		// Test the engine can be used +		$this->setup_engine(); + +		$template_cache_dir = dirname($this->template->cachepath); +		if (!is_writable($template_cache_dir)) +		{ +			$this->markTestSkipped("Template cache directory ({$template_cache_dir}) is not writable."); +		} + +		foreach (glob($this->template->cachepath . '*') as $file) +		{ +			unlink($file); +		} + +		$this->setup_engine(); +	} + +	protected function tearDown() +	{ +		if (is_object($this->template)) +		{ +			foreach (glob($this->template->cachepath . '*') as $file) +			{ +				unlink($file); +			} +		} +	} + +	protected function run_template($file, array $vars, array $block_vars, array $destroy, $expected, $cache_file) +	{ +		$this->template->set_filenames(array('test' => $file)); +		$this->template->assign_vars($vars); + +		foreach ($block_vars as $block => $loops) +		{ +			foreach ($loops as $_vars) +			{ +				$this->template->assign_block_vars($block, $_vars); +			} +		} + +		foreach ($destroy as $block) +		{ +			$this->template->destroy_block_vars($block); +		} + +		try +		{ +			$this->assertEquals($expected, $this->display('test'), "Testing $file"); +			$this->assertFileExists($cache_file); +		} +		catch (ErrorException $e) +		{ +			if (file_exists($cache_file)) +			{ +				copy($cache_file, str_replace('ctpl_', 'tests_ctpl_', $cache_file)); +			} +			throw $e; +		} + +		// For debugging. +		// When testing eval path the cache file may not exist. +		if (self::PRESERVE_CACHE && file_exists($cache_file)) +		{ +			copy($cache_file, str_replace('ctpl_', 'tests_ctpl_', $cache_file)); +		} +	} +} diff --git a/tests/template/templates/basic.html b/tests/template/templates/basic.html index c1dd690260..e5c6f280fb 100644 --- a/tests/template/templates/basic.html +++ b/tests/template/templates/basic.html @@ -16,5 +16,8 @@ fail  <!-- BEGINELSE -->  pass  <!-- END empty --> +<!-- IF not S_EMPTY --> +pass +<!-- ENDIF -->  <!-- DUMMY var --> diff --git a/tests/template/templates/child_only.html b/tests/template/templates/child_only.html new file mode 100644 index 0000000000..6121fef5c5 --- /dev/null +++ b/tests/template/templates/child_only.html @@ -0,0 +1 @@ +Only in child. diff --git a/tests/template/templates/define.html b/tests/template/templates/define.html index 82237d21a3..4459fffbe0 100644 --- a/tests/template/templates/define.html +++ b/tests/template/templates/define.html @@ -2,6 +2,9 @@  {$VALUE}  <!-- DEFINE $VALUE = 'abc' -->  {$VALUE} +<!-- INCLUDE define_include.html --> +{$INCLUDED_VALUE} +{$VALUE}  <!-- UNDEFINE $VALUE -->  {$VALUE}  <!-- DEFINE $VALUE --> diff --git a/tests/template/templates/define_include.html b/tests/template/templates/define_include.html new file mode 100644 index 0000000000..9c470c296a --- /dev/null +++ b/tests/template/templates/define_include.html @@ -0,0 +1,3 @@ +{$VALUE} +<!-- DEFINE $INCLUDED_VALUE = 'bar' --> +{$INCLUDED_VALUE} diff --git a/tests/template/templates/expressions.html b/tests/template/templates/expressions.html index c40d967dab..e1283f165f 100644 --- a/tests/template/templates/expressions.html +++ b/tests/template/templates/expressions.html @@ -1,86 +1,57 @@  <!-- IF 10 is even -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 is even -->fail<!-- ELSE -->pass<!-- ENDIF --> -  <!-- IF not 390 is even -->fail<!-- ELSE -->pass<!-- ENDIF --> -  <!-- IF 9 is odd -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 32 is odd -->fail<!-- ELSE -->pass<!-- ENDIF --> -  <!-- IF 32 is div by 16 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 10 is not even -->fail<!-- ELSE -->pass<!-- ENDIF --> -  <!-- IF 24 == 24 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 24 eq 24 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF ((((((24 == 24)))))) -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 24 != 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 24 <> 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 24 ne 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 24 neq 20 -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 10 lt 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 10 < 20 -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 10 le 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 10 lte 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 10 <= 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 20 le 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 20 lte 20 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 20 <= 20 -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 9 gt 1 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 > 1 -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 9 >= 1 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 gte 1 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 ge 1 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 >= 9 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 gte 9 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 9 ge 9 -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF true && (10 > 4) -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF true and (10 > 4) -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF false || true -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF false or true -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF !false -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF not false -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF not not not false -->pass<!-- ELSE -->fail<!-- ENDIF -->  <!-- IF 6 % 4 == 2 -->pass<!-- ELSE -->fail<!-- ENDIF --> -  <!-- IF 24 mod 12 == 0 -->pass<!-- ELSE -->fail<!-- ENDIF --> diff --git a/tests/template/templates/if.html b/tests/template/templates/if.html index c502e52f51..eed431019e 100644 --- a/tests/template/templates/if.html +++ b/tests/template/templates/if.html @@ -3,9 +3,9 @@  <!-- ELSEIF S_OTHER_VALUE -->  2  <!-- ELSE --> -0 +03  <!-- ENDIF --> -<!-- IF (S_VALUE > S_OTHER_VALUE) --> -0 +<!-- IF S_VALUE and S_OTHER_VALUE and (S_VALUE > S_OTHER_VALUE) --> +04  <!-- ENDIF --> diff --git a/tests/template/templates/include_define.html b/tests/template/templates/include_define.html new file mode 100644 index 0000000000..2419c8cba1 --- /dev/null +++ b/tests/template/templates/include_define.html @@ -0,0 +1,2 @@ +<!-- DEFINE $DEF = 'variable.html' --> +<!-- INCLUDE {$DEF} --> diff --git a/tests/template/templates/include_loop.html b/tests/template/templates/include_loop.html new file mode 100644 index 0000000000..d5c3d9bc82 --- /dev/null +++ b/tests/template/templates/include_loop.html @@ -0,0 +1,4 @@ +<!-- BEGIN loop --> +<!-- INCLUDE {loop.NESTED_FILE} --> +<!-- BEGIN inner -->_<!-- INCLUDE {inner.NESTED_FILE} --><!-- END inner --> +<!-- END loop --> diff --git a/tests/template/templates/include_loop1.html b/tests/template/templates/include_loop1.html new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/template/templates/include_loop1.html @@ -0,0 +1 @@ +1 diff --git a/tests/template/templates/include_loop2.html b/tests/template/templates/include_loop2.html new file mode 100644 index 0000000000..9e22bcb8e3 --- /dev/null +++ b/tests/template/templates/include_loop2.html @@ -0,0 +1 @@ +02 diff --git a/tests/template/templates/include_loop3.html b/tests/template/templates/include_loop3.html new file mode 100644 index 0000000000..00750edc07 --- /dev/null +++ b/tests/template/templates/include_loop3.html @@ -0,0 +1 @@ +3 diff --git a/tests/template/templates/include_variable.html b/tests/template/templates/include_variable.html new file mode 100644 index 0000000000..b907e0b44f --- /dev/null +++ b/tests/template/templates/include_variable.html @@ -0,0 +1 @@ +<!-- INCLUDE {FILE} --> diff --git a/tests/template/templates/includephp.html b/tests/template/templates/includephp_relative.html index 70ebdac0d0..297c9efcb0 100644 --- a/tests/template/templates/includephp.html +++ b/tests/template/templates/includephp_relative.html @@ -1 +1,2 @@ +Path is relative to board root.  <!-- INCLUDEPHP ../tests/template/templates/_dummy_include.php.inc --> diff --git a/tests/template/templates/loop_expressions.html b/tests/template/templates/loop_expressions.html new file mode 100644 index 0000000000..6bff53f388 --- /dev/null +++ b/tests/template/templates/loop_expressions.html @@ -0,0 +1,11 @@ +<!-- BEGIN loop --> + +<!-- IF loop.S_ROW_NUM is even by 4 -->on<!-- ELSE -->off<!-- ENDIF --> + +<!-- END loop --> + +<!-- BEGIN loop --> + +<!-- IF loop.S_ROW_NUM is odd by 3 -->on<!-- ELSE -->off<!-- ENDIF --> + +<!-- END loop --> diff --git a/tests/template/templates/loop_nested.html b/tests/template/templates/loop_nested.html index 9b251cd453..45b1ef85d4 100644 --- a/tests/template/templates/loop_nested.html +++ b/tests/template/templates/loop_nested.html @@ -1,8 +1,6 @@  <!-- BEGIN outer -->  	outer - {outer.S_ROW_COUNT}<!-- IF outer.VARIABLE --> - {outer.VARIABLE}<!-- ENDIF --> -  	<!-- BEGIN middle -->  		middle - {middle.S_ROW_COUNT}<!-- IF middle.VARIABLE --> - {middle.VARIABLE}<!-- ENDIF --> -  	<!-- END middle -->  <!-- END outer --> diff --git a/tests/template/templates/loop_nested_deep_multilevel_ref.html b/tests/template/templates/loop_nested_deep_multilevel_ref.html new file mode 100644 index 0000000000..60fad7b4cd --- /dev/null +++ b/tests/template/templates/loop_nested_deep_multilevel_ref.html @@ -0,0 +1,12 @@ +top-level content +<!-- BEGIN outer --> +	outer +	<!-- BEGIN middle --> +		<!-- BEGIN inner --> +			inner {inner.VARIABLE} +			<!-- IF outer.middle.inner.S_FIRST_ROW --> +				first row +			<!-- ENDIF --> +		<!-- END inner --> +	<!-- END middle --> +<!-- END outer --> diff --git a/tests/template/templates/loop_nested_multilevel_ref.html b/tests/template/templates/loop_nested_multilevel_ref.html new file mode 100644 index 0000000000..f2f1c746ed --- /dev/null +++ b/tests/template/templates/loop_nested_multilevel_ref.html @@ -0,0 +1,10 @@ +top-level content +<!-- BEGIN outer --> +	outer {outer.VARIABLE} +	<!-- BEGIN inner --> +		inner {inner.VARIABLE} +		<!-- IF outer.inner.S_FIRST_ROW --> +			first row +		<!-- ENDIF --> +	<!-- END inner --> +<!-- END outer --> diff --git a/tests/template/templates/loop_reuse.html b/tests/template/templates/loop_reuse.html new file mode 100644 index 0000000000..bd0354ae6f --- /dev/null +++ b/tests/template/templates/loop_reuse.html @@ -0,0 +1,6 @@ +<!-- BEGIN one --> +	{one.VAR} +	<!-- BEGIN one --> +		{one.one.VAR} +	<!-- END one --> +<!-- END one --> diff --git a/tests/template/templates/loop_size.html b/tests/template/templates/loop_size.html new file mode 100644 index 0000000000..f1938441df --- /dev/null +++ b/tests/template/templates/loop_size.html @@ -0,0 +1,39 @@ +<!-- IF .nonexistent_loop --> +	nonexistent +<!-- ENDIF --> + +<!-- IF .nonexistent_loop == 0 --> +	nonexistent = 0 +<!-- ENDIF --> + +<!-- IF ! .nonexistent_loop --> +	! nonexistent +<!-- ENDIF --> + +<!-- IF .empty_loop --> +	empty +<!-- ENDIF --> + +<!-- IF .empty_loop == 0 --> +	empty = 0 +<!-- ENDIF --> + +<!-- IF ! .empty_loop --> +	! empty +<!-- ENDIF --> + +<!-- IF .loop --> +	loop +<!-- ENDIF --> + +<!-- IF .loop == 0 --> +	loop = 0 +<!-- ENDIF --> + +<!-- IF ! .loop --> +	! loop +<!-- ENDIF --> + +<!-- BEGIN loop --> +	in loop +<!-- END --> diff --git a/tests/template/templates/loop_underscore.html b/tests/template/templates/loop_underscore.html new file mode 100644 index 0000000000..dafce5dea6 --- /dev/null +++ b/tests/template/templates/loop_underscore.html @@ -0,0 +1,21 @@ +<!-- BEGIN _underscore_loop --> +loop +<!-- BEGINELSE --> +noloop +<!-- END loop --> + +<!-- IF ._underscore_loop --> +loop +<!-- ELSE --> +noloop +<!-- ENDIF --> + +<!-- IF ._underscore_loop == 2 --> +loop +<!-- ENDIF --> + +<!-- BEGIN _underscore_loop --> +<!-- BEGIN !block --> +loop#{loop.S_ROW_COUNT}-block#{block.S_ROW_COUNT} +<!-- END !block --> +<!-- END _underscore_loop --> diff --git a/tests/template/templates/loop_vars.html b/tests/template/templates/loop_vars.html index 4f02fd2e6c..d94a0ae0f7 100644 --- a/tests/template/templates/loop_vars.html +++ b/tests/template/templates/loop_vars.html @@ -1,21 +1,14 @@  <!-- BEGIN loop -->  <!-- IF loop.S_FIRST_ROW -->first<!-- ENDIF --> - -{loop.S_ROW_COUNT} - -{loop.VARIABLE} - +{loop.S_ROW_NUM} - a +{loop.VARIABLE} - b  <!-- IF loop.VARIABLE -->set<!-- ENDIF --> -  <!-- IF loop.S_LAST_ROW -->  last  <!-- ENDIF -->  <!-- BEGIN inner --> - -{inner.S_ROW_COUNT} - +{inner.S_ROW_NUM} - c  <!-- IF inner.S_LAST_ROW and inner.S_ROW_COUNT and inner.S_NUM_ROWS -->last inner<!-- ENDIF --> -  <!-- END inner -->  <!-- END loop -->  <!-- IF .loop.inner -->inner loop<!-- ENDIF --> diff --git a/tests/template/templates/parent_and_child.html b/tests/template/templates/parent_and_child.html new file mode 100644 index 0000000000..16223d91e7 --- /dev/null +++ b/tests/template/templates/parent_and_child.html @@ -0,0 +1 @@ +Child template. diff --git a/tests/template/templates/trivial.html b/tests/template/templates/trivial.html new file mode 100644 index 0000000000..3a1c1c5324 --- /dev/null +++ b/tests/template/templates/trivial.html @@ -0,0 +1 @@ +This is a trivial template. diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php index 0acdce32e0..697dc93501 100644 --- a/tests/test_framework/phpbb_test_case_helpers.php +++ b/tests/test_framework/phpbb_test_case_helpers.php @@ -41,4 +41,9 @@ class phpbb_test_case_helpers  		$this->expectedTriggerError = true;  		$this->test_case->setExpectedException($exceptionName, (string) $message, $errno);  	} + +	public function makedirs($path) +	{ +		mkdir($path, 0777, true); +	}  } | 
