1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-31 14:00:31 +02:00

Merge branch 'develop' of https://github.com/phpbb/phpbb3 into ticket/10411-2

* 'develop' of https://github.com/phpbb/phpbb3: (204 commits)
  [ticket/11219] Coding guidelines and naming consistency changes
  [ticket/10841] Revert more whitespace changes.
  [ticket/10841] Revert whitespace changes.
  [ticket/10841] adding space after if
  [ticket/10841] removing unnecessary spacing
  [ticket/10841] changing affectedrows check to COUNT in sql
  [ticket/10841] Modifying style and language selectors in UCP
  [ticket/11247] Fix wrong property reference in flock class.
  [ticket/10602] Avoid a race condition.
  [ticket/10602] Use last_queue_run for its intended purpose.
  [ticket/10716] Collect standard error from executed php process.
  [ticket/10716] Skip test if php is not in PATH.
  [ticket/10716] Exclude our dependencies from linting.
  [ticket/10103] New and improved wording.
  [ticket/10716] Only lint on php 5.3+.
  [ticket/10103] Assert with messages.
  [ticket/10103] assertLessThan/assertGreaterThan.
  [ticket/10103] Inline assignment is bad?
  [ticket/10103] $rv had too few characters.
  [ticket/10103] Correct flock class documentation.
  ...

Conflicts:
	phpBB/config/services.yml
	phpBB/includes/groupposition/legend.php
This commit is contained in:
Joas Schilling
2012-12-06 14:26:14 +01:00
132 changed files with 3089 additions and 749 deletions

View File

@@ -72,6 +72,21 @@ to connect to that database in phpBB.
Additionally, you will need to be running the DbUnit fork from
https://github.com/phpbb/dbunit/tree/phpbb.
Redis
-----
In order to run tests for the Redis cache driver, at least one of Redis host
or port must be specified in test configuration. This can be done via
test_config.php as follows:
<?php
$phpbb_redis_host = 'localhost';
$phpbb_redis_port = 6379;
Or via environment variables as follows:
$ PHPBB_TEST_REDIS_HOST=localhost PHPBB_TEST_REDIS_PORT=6379 phpunit
Running
=======

53
tests/cache/apc_driver_test.php vendored Normal file
View File

@@ -0,0 +1,53 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
// Important: apc.enable_cli=1 must be in php.ini.
// http://forums.devshed.com/php-development-5/apc-problem-561290.html
// http://php.net/manual/en/apc.configuration.php
require_once dirname(__FILE__) . '/common_test_case.php';
class phpbb_cache_apc_driver_test extends phpbb_cache_common_test_case
{
protected static $config;
protected $driver;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
static public function setUpBeforeClass()
{
if (!extension_loaded('apc'))
{
self::markTestSkipped('APC extension is not loaded');
}
$php_ini = new phpbb_php_ini;
if (!$php_ini->get_bool('apc.enabled'))
{
self::markTestSkipped('APC is not enabled. Make sure apc.enabled=1 in php.ini');
}
if (PHP_SAPI == 'cli' && !$php_ini->get_bool('apc.enable_cli'))
{
self::markTestSkipped('APC is not enabled for CLI. Set apc.enable_cli=1 in php.ini');
}
}
protected function setUp()
{
parent::setUp();
$this->driver = new phpbb_cache_driver_apc;
$this->driver->purge();
}
}

View File

@@ -1,109 +0,0 @@
<?php
/**
*
* @package testing
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_cache_test extends phpbb_database_test_case
{
private $cache_dir;
public function __construct()
{
$this->cache_dir = dirname(__FILE__) . '/../tmp/cache/';
}
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
protected function setUp()
{
parent::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();
}
parent::tearDown();
}
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'
);
}
public function test_cache_sql()
{
$driver = new phpbb_cache_driver_file($this->cache_dir);
global $db, $cache;
$db = $this->new_dbal();
$cache = new phpbb_cache_service($driver);
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$first_result = $db->sql_fetchrow($result);
$this->assertFileExists($this->cache_dir . 'sql_' . md5(preg_replace('/[\n\r\s\t]+/', ' ', $sql)) . '.php');
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$this->assertEquals($first_result, $db->sql_fetchrow($result));
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'bar'";
$result = $db->sql_query($sql, 300);
$this->assertNotEquals($first_result, $db->sql_fetchrow($result));
$db->sql_close();
}
}

97
tests/cache/common_test_case.php vendored Normal file
View File

@@ -0,0 +1,97 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
abstract class phpbb_cache_common_test_case extends phpbb_database_test_case
{
public function test_get_put_exists()
{
$this->assertFalse($this->driver->_exists('test_key'));
$this->assertSame(false, $this->driver->get('test_key'));
$this->driver->put('test_key', 'test_value');
$this->assertTrue($this->driver->_exists('test_key'));
$this->assertEquals(
'test_value',
$this->driver->get('test_key'),
'File ACM put and get'
);
}
public function test_purge()
{
$this->driver->put('test_key', 'test_value');
$this->assertEquals(
'test_value',
$this->driver->get('test_key'),
'File ACM put and get'
);
$this->driver->purge();
$this->assertSame(false, $this->driver->get('test_key'));
}
public function test_destroy()
{
$this->driver->put('first_key', 'first_value');
$this->driver->put('second_key', 'second_value');
$this->assertEquals(
'first_value',
$this->driver->get('first_key')
);
$this->assertEquals(
'second_value',
$this->driver->get('second_key')
);
$this->driver->destroy('first_key');
$this->assertFalse($this->driver->_exists('first_key'));
$this->assertEquals(
'second_value',
$this->driver->get('second_key')
);
}
public function test_cache_sql()
{
global $db, $cache;
$db = $this->new_dbal();
$cache = new phpbb_cache_service($this->driver);
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$first_result = $db->sql_fetchrow($result);
$expected = array('config_name' => 'foo', 'config_value' => '23', 'is_dynamic' => 0);
$this->assertEquals($expected, $first_result);
$sql = 'DELETE FROM phpbb_config';
$result = $db->sql_query($sql);
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$this->assertEquals($expected, $db->sql_fetchrow($result));
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql);
$no_cache_result = $db->sql_fetchrow($result);
$this->assertSame(false, $no_cache_result);
$db->sql_close();
}
}

69
tests/cache/file_driver_test.php vendored Normal file
View File

@@ -0,0 +1,69 @@
<?php
/**
*
* @package testing
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_test_case.php';
class phpbb_cache_file_driver_test extends phpbb_cache_common_test_case
{
private $cache_dir;
protected $driver;
public function __construct()
{
$this->cache_dir = dirname(__FILE__) . '/../tmp/cache/';
}
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
protected function setUp()
{
parent::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();
$this->driver = new phpbb_cache_driver_file($this->cache_dir);
}
protected function tearDown()
{
if (file_exists($this->cache_dir))
{
$this->remove_cache_dir();
}
parent::tearDown();
}
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);
}
}

74
tests/cache/null_driver_test.php vendored Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_cache_null_driver_test extends phpbb_database_test_case
{
protected $driver;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
protected function setUp()
{
parent::setUp();
$this->driver = new phpbb_cache_driver_null;
}
public function test_get_put()
{
$this->assertSame(false, $this->driver->get('key'));
$this->driver->put('key', 'value');
// null driver does not cache
$this->assertSame(false, $this->driver->get('key'));
}
public function test_purge()
{
// does nothing
$this->driver->purge();
}
public function test_destroy()
{
// does nothing
$this->driver->destroy('foo');
}
public function test_cache_sql()
{
global $db, $cache;
$db = $this->new_dbal();
$cache = new phpbb_cache_service($this->driver);
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$first_result = $db->sql_fetchrow($result);
$expected = array('config_name' => 'foo', 'config_value' => '23', 'is_dynamic' => 0);
$this->assertEquals($expected, $first_result);
$sql = 'DELETE FROM phpbb_config';
$result = $db->sql_query($sql);
// As null cache driver does not actually cache,
// this should return no results
$sql = "SELECT * FROM phpbb_config
WHERE config_name = 'foo'";
$result = $db->sql_query($sql, 300);
$this->assertSame(false, $db->sql_fetchrow($result));
$db->sql_close();
}
}

49
tests/cache/redis_driver_test.php vendored Normal file
View File

@@ -0,0 +1,49 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_test_case.php';
class phpbb_cache_redis_driver_test extends phpbb_cache_common_test_case
{
protected static $config;
protected $driver;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml');
}
static public function setUpBeforeClass()
{
if (!extension_loaded('redis'))
{
self::markTestSkipped('redis extension is not loaded');
}
$config = phpbb_test_case_helpers::get_test_config();
if (isset($config['redis_host']) || isset($config['redis_port']))
{
$host = isset($config['redis_host']) ? $config['redis_host'] : 'localhost';
$port = isset($config['redis_port']) ? $config['redis_port'] : 6379;
self::$config = array('host' => $host, 'port' => $port);
}
else
{
self::markTestSkipped('Test redis host/port is not specified');
}
}
protected function setUp()
{
parent::setUp();
$this->driver = new phpbb_cache_driver_redis(self::$config['host'], self::$config['port']);
$this->driver->purge();
}
}

View File

@@ -0,0 +1,3 @@
core_controller:
pattern: /core_foo
defaults: { _controller: core_foo.controller:bar }

View File

@@ -0,0 +1,3 @@
services:
core_foo.controller:
class: phpbb_controller_foo

View File

@@ -0,0 +1,76 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class phpbb_controller_test extends phpbb_test_case
{
public function setUp()
{
$this->extension_manager = new phpbb_mock_extension_manager(
dirname(__FILE__) . '/',
array(
'foo' => array(
'ext_name' => 'foo',
'ext_active' => '1',
'ext_path' => 'ext/foo/',
),
));
}
public function test_provider()
{
$provider = new phpbb_controller_provider;
$routes = $provider
->import_paths_from_finder($this->extension_manager->get_finder())
->find('./tests/controller/');
// This will need to be updated if any new routes are defined
$this->assertEquals(2, sizeof($routes));
}
public function test_controller_resolver()
{
$container = new ContainerBuilder();
// YamlFileLoader only uses one path at a time, so we need to loop
// through all of the ones we are using.
foreach (array(__DIR__.'/config', __DIR__.'/ext/foo/config') as $path)
{
$loader = new YamlFileLoader($container, new FileLocator($path));
$loader->load('services.yml');
}
// Autoloading classes within the tests folder does not work
// so I'll include them manually.
if (!class_exists('phpbb_ext_foo_controller'))
{
include(__DIR__.'/ext/foo/controller.php');
}
if (!class_exists('phpbb_controller_foo'))
{
include(__DIR__.'/includes/controller/foo.php');
}
$resolver = new phpbb_controller_resolver(new phpbb_user, $container);
$symfony_request = new Request();
$symfony_request->attributes->set('_controller', 'foo.controller:handle');
$this->assertEquals($resolver->getController($symfony_request), array(new phpbb_ext_foo_controller, 'handle'));
$symfony_request = new Request();
$symfony_request->attributes->set('_controller', 'core_foo.controller:bar');
$this->assertEquals($resolver->getController($symfony_request), array(new phpbb_controller_foo, 'bar'));
}
}

View File

@@ -0,0 +1,3 @@
controller1:
pattern: /foo
defaults: { _controller: foo.controller:handle }

View File

@@ -0,0 +1,3 @@
services:
foo.controller:
class: phpbb_ext_foo_controller

View File

@@ -0,0 +1,16 @@
<?php
use Symfony\Component\HttpFoundation\Response;
class phpbb_ext_foo_controller
{
/**
* Handle method
*
* @return null
*/
public function handle()
{
return new Response('Test', 200);
}
}

View File

@@ -0,0 +1,16 @@
<?php
use Symfony\Component\HttpFoundation\Response;
class phpbb_controller_foo
{
/**
* Bar method
*
* @return null
*/
public function bar()
{
return new Response('bar()', 200);
}
}

View File

@@ -0,0 +1,55 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_dbal_write_sequence_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/three_users.xml');
}
static public function write_sequence_data()
{
return array(
array(
'ticket/11219',
4,
),
);
}
/**
* @dataProvider write_sequence_data
*/
public function test_write_sequence($username, $expected)
{
$db = $this->new_dbal();
$sql = 'INSERT INTO phpbb_users ' . $db->sql_build_array('INSERT', array(
'username' => $username,
'username_clean' => $username,
'user_permissions' => '',
'user_sig' => '',
'user_occ' => '',
'user_interests' => '',
));
$db->sql_query($sql);
$this->assertEquals($expected, $db->sql_nextid());
$sql = "SELECT user_id
FROM phpbb_users
WHERE username_clean = '" . $db->sql_escape($username) . "'";
$result = $db->sql_query_limit($sql, 1);
$this->assertEquals($expected, $db->sql_fetchfield('user_id'));
}
}

5
tests/fixtures/empty.xml vendored Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_posts">
</table>
</dataset>

View File

@@ -15,18 +15,21 @@ class phpbb_functional_browse_test extends phpbb_functional_test_case
public function test_index()
{
$crawler = $this->request('GET', 'index.php');
$this->assert_response_success();
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewforum()
{
$crawler = $this->request('GET', 'viewforum.php?f=2');
$this->assert_response_success();
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewtopic()
{
$crawler = $this->request('GET', 'viewtopic.php?t=1');
$this->assert_response_success();
$this->assertGreaterThan(0, $crawler->filter('.postbody')->count());
}
}

View File

@@ -13,6 +13,14 @@
class phpbb_functional_extension_controller_test extends phpbb_functional_test_case
{
protected $phpbb_extension_manager;
static protected $fixtures = array(
'foo/bar/config/routing.yml',
'foo/bar/config/services.yml',
'foo/bar/controller/controller.php',
'foo/bar/styles/prosilver/template/foo_bar_body.html',
);
/**
* This should only be called once before the tests are run.
* This is used to copy the fixtures to the phpBB install
@@ -22,15 +30,11 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
global $phpbb_root_path;
parent::setUpBeforeClass();
// these directories need to be created before the files can be copied
$directories = array(
$phpbb_root_path . 'ext/error/class/',
$phpbb_root_path . 'ext/error/classtype/',
$phpbb_root_path . 'ext/error/disabled/',
$phpbb_root_path . 'ext/foo/bar/',
$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template/',
$phpbb_root_path . 'ext/foobar/',
$phpbb_root_path . 'ext/foobar/styles/prosilver/template/',
$phpbb_root_path . 'ext/foo/bar/config/',
$phpbb_root_path . 'ext/foo/bar/controller/',
$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template',
);
foreach ($directories as $dir)
@@ -41,30 +45,36 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
}
}
$fixtures = array(
'error/class/controller.php',
'error/class/ext.php',
'error/classtype/controller.php',
'error/classtype/ext.php',
'error/disabled/controller.php',
'error/disabled/ext.php',
'foo/bar/controller.php',
'foo/bar/ext.php',
'foo/bar/styles/prosilver/template/foobar_body.html',
'foobar/controller.php',
'foobar/ext.php',
'foobar/styles/prosilver/template/foobar_body.html',
);
foreach ($fixtures as $fixture)
foreach (self::$fixtures as $fixture)
{
if (!copy("tests/functional/fixtures/ext/$fixture", "{$phpbb_root_path}ext/$fixture"))
{
echo 'Could not copy file ' . $fixture;
}
copy(
"tests/functional/fixtures/ext/$fixture",
"{$phpbb_root_path}ext/$fixture");
}
}
/**
* This should only be called once after the tests are run.
* This is used to remove the fixtures from the phpBB install
*/
static public function tearDownAfterClass()
{
global $phpbb_root_path;
foreach (self::$fixtures as $fixture)
{
unlink("{$phpbb_root_path}ext/$fixture");
}
rmdir("{$phpbb_root_path}ext/foo/bar/config");
rmdir("{$phpbb_root_path}ext/foo/bar/controller");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver/template");
rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver");
rmdir("{$phpbb_root_path}ext/foo/bar/styles");
rmdir("{$phpbb_root_path}ext/foo/bar");
rmdir("{$phpbb_root_path}ext/foo");
}
public function setUp()
{
parent::setUp();
@@ -75,70 +85,67 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
}
/**
* Check an extension at ./ext/foobar/ which should have the class
* phpbb_ext_foobar_controller
*/
public function test_foobar()
{
$this->phpbb_extension_manager->enable('foobar');
$crawler = $this->request('GET', 'index.php?ext=foobar');
$this->assertContains("This is for testing purposes.", $crawler->filter('#page-body')->text());
$this->phpbb_extension_manager->purge('foobar');
}
/**
* Check an extension at ./ext/foo/bar/ which should have the class
* phpbb_ext_foo_bar_controller
* Check a controller for extension foo/bar.
*/
public function test_foo_bar()
{
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'index.php?ext=foo/bar');
$this->assertContains("This is for testing purposes.", $crawler->filter('#page-body')->text());
$crawler = $this->request('GET', 'app.php?controller=foo/bar');
$this->assert_response_success();
$this->assertContains("foo/bar controller handle() method", $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
/**
* Check the error produced by extension at ./ext/error/class which has class
* phpbb_ext_foobar_controller
* Check the output of a controller using the template system
*/
public function test_error_class_name()
public function test_controller_with_template()
{
$this->phpbb_extension_manager->enable('error/class');
$crawler = $this->request('GET', 'index.php?ext=error/class');
$this->assertContains("The extension error/class is missing a controller class and cannot be accessed through the front-end.", $crawler->filter('#message')->text());
$this->phpbb_extension_manager->purge('error/class');
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/template');
$this->assert_response_success();
$this->assertContains("I am a variable", $crawler->filter('#content')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
/**
* Check the error produced by extension at ./ext/error/classtype which has class
* phpbb_ext_error_classtype_controller but does not implement phpbb_extension_controller_interface
* Check the error produced by calling a controller without a required
* argument.
*/
public function test_error_class_type()
public function test_missing_argument()
{
$this->phpbb_extension_manager->enable('error/classtype');
$crawler = $this->request('GET', 'index.php?ext=error/classtype');
$this->assertContains("The extension controller class phpbb_ext_error_classtype_controller is not an instance of the phpbb_extension_controller_interface.", $crawler->filter('#message')->text());
$this->phpbb_extension_manager->purge('error/classtype');
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/baz');
$this->assertEquals(500, $this->client->getResponse()->getStatus());
$this->assertContains('Missing value for argument #1: test in class phpbb_ext_foo_bar_controller:baz', $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
/**
* Check the error produced by extension at ./ext/error/disabled that is (obviously)
* a disabled extension
* Check the status code resulting from an exception thrown by a controller
*/
public function test_error_ext_disabled()
public function test_exception_should_result_in_500_status_code()
{
$crawler = $this->request('GET', 'index.php?ext=error/disabled');
$this->assertContains("The extension error/disabled is not enabled", $crawler->filter('#message')->text());
$this->phpbb_extension_manager->enable('foo/bar');
$crawler = $this->request('GET', 'app.php?controller=foo/exception');
$this->assertEquals(500, $this->client->getResponse()->getStatus());
$this->assertContains('Exception thrown from foo/exception route', $crawler->filter('body')->text());
$this->phpbb_extension_manager->purge('foo/bar');
}
/**
* Check the error produced by extension at ./ext/error/404 that is (obviously)
* not existant
* Check the error produced by extension at ./ext/does/not/exist.
*
* If an extension is disabled, its routes are not loaded. Because we
* are not looking for a controller based on a specified extension,
* we don't know the difference between a route in a disabled
* extension and a route that is not defined anyway; it is the same
* error message.
*/
public function test_error_ext_missing()
public function test_error_ext_disabled_or_404()
{
$crawler = $this->request('GET', 'index.php?ext=error/404');
$this->assertContains("The extension error/404 does not exist.", $crawler->filter('#message')->text());
$crawler = $this->request('GET', 'app.php?controller=does/not/exist');
$this->assertEquals(404, $this->client->getResponse()->getStatus());
$this->assertContains('No route found for "GET /does/not/exist"', $crawler->filter('body')->text());
}
}

View File

@@ -64,6 +64,9 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
public function test_valid_file()
{
$crawler = $this->upload_file('valid.jpg', 'image/jpeg');
$this->assert_response_success();
// ensure there was no error message rendered
$this->assertNotContains('<h2>' . $this->lang('INFORMATION') . '</h2>', $this->client->getResponse()->getContent());
$this->assertContains($this->lang('POSTED_ATTACHMENTS'), $crawler->filter('#postform h3')->eq(1)->text());
}
}

View File

@@ -1,14 +0,0 @@
<?php
class phpbb_ext_foobar_controller extends phpbb_extension_controller
{
public function handle()
{
$this->template->set_filenames(array(
'body' => 'index_body.html'
));
page_header('Test extension');
page_footer();
}
}

View File

@@ -1,6 +0,0 @@
<?php
class phpbb_ext_error_class_ext extends phpbb_extension_base
{
}

View File

@@ -1,15 +0,0 @@
<?php
class phpbb_ext_error_classtype_controller
{
public function handle()
{
global $template;
$template->set_filenames(array(
'body' => 'index_body.html'
));
page_header('Test extension');
page_footer();
}
}

View File

@@ -1,6 +0,0 @@
<?php
class phpbb_ext_error_classtype_ext extends phpbb_extension_base
{
}

View File

@@ -1,14 +0,0 @@
<?php
class phpbb_ext_error_disabled_controller extends phpbb_extension_controller
{
public function handle()
{
$this->template->set_filenames(array(
'body' => 'index_body.html'
));
page_header('Test extension');
page_footer();
}
}

View File

@@ -1,6 +0,0 @@
<?php
class phpbb_ext_error_disabled_ext extends phpbb_extension_base
{
}

View File

@@ -0,0 +1,15 @@
foo_bar_controller:
pattern: /foo/bar
defaults: { _controller: foo_bar.controller:handle }
foo_baz_controller:
pattern: /foo/baz
defaults: { _controller: foo_bar.controller:baz }
foo_template_controller:
pattern: /foo/template
defaults: { _controller: foo_bar.controller:template }
foo_exception_controller:
pattern: /foo/exception
defaults: { _controller: foo_bar.controller:exception }

View File

@@ -0,0 +1,6 @@
services:
foo_bar.controller:
class: phpbb_ext_foo_bar_controller
arguments:
- @controller.helper
- @template

View File

@@ -1,14 +0,0 @@
<?php
class phpbb_ext_foo_bar_controller extends phpbb_extension_controller
{
public function handle()
{
$this->template->set_filenames(array(
'body' => 'foobar_body.html'
));
page_header('Test extension');
page_footer();
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Symfony\Component\HttpFoundation\Response;
class phpbb_ext_foo_bar_controller
{
protected $template;
public function __construct(phpbb_controller_helper $helper, phpbb_template $template)
{
$this->template = $template;
$this->helper = $helper;
}
public function handle()
{
return new Response('foo/bar controller handle() method', 200);
}
public function baz($test)
{
return new Response('Value of "test" URL argument is: ' . $test);
}
public function template()
{
$this->template->assign_var('A_VARIABLE', 'I am a variable');
return $this->helper->render('foo_bar_body.html');
}
public function exception()
{
throw new phpbb_controller_exception('Exception thrown from foo/exception route');
}
}

View File

@@ -2,5 +2,5 @@
class phpbb_ext_foo_bar_ext extends phpbb_extension_base
{
}

View File

@@ -1,5 +1,3 @@
<!-- INCLUDE overall_header.html -->
<div id="welcome">This is for testing purposes.</div>
<div id="content">{A_VARIABLE}</div>
<!-- INCLUDE overall_footer.html -->

View File

@@ -1,14 +0,0 @@
<?php
class phpbb_ext_foobar_controller extends phpbb_extension_controller
{
public function handle()
{
$this->template->set_filenames(array(
'body' => 'foobar_body.html'
));
page_header('Test extension');
page_footer();
}
}

View File

@@ -1,6 +0,0 @@
<?php
class phpbb_ext_foobar_ext extends phpbb_extension_base
{
}

View File

@@ -1,5 +0,0 @@
<!-- INCLUDE overall_header.html -->
<div id="welcome">This is for testing purposes.</div>
<!-- INCLUDE overall_footer.html -->

View File

@@ -0,0 +1,71 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_get_formatted_filesize_test extends phpbb_test_case
{
public function get_formatted_filesize_test_data()
{
return array(
// exact powers of 2
array(1, '1 BYTES'),
array(1024, '1 KIB'),
array(1048576, '1 MIB'),
array(1073741824, '1 GIB'),
array(1099511627776, '1 TIB'),
// exact powers of 10
array(1000, '1000 BYTES'),
array(1000000, '976.56 KIB'),
array(1000000000, '953.67 MIB'),
array(1000000000000, '931.32 GIB'),
array(100000000000000, '90.95 TIB'),
array(0, '0 BYTES'),
array(2, '2 BYTES'),
array(1023, '1023 BYTES'),
array(1025, '1 KIB'),
array(1048575, '1024 KIB'),
// String values
// exact powers of 2
array('1', '1 BYTES'),
array('1024', '1 KIB'),
array('1048576', '1 MIB'),
array('1073741824', '1 GIB'),
array('1099511627776', '1 TIB'),
// exact powers of 10
array('1000', '1000 BYTES'),
array('1000000', '976.56 KIB'),
array('1000000000', '953.67 MIB'),
array('1000000000000', '931.32 GIB'),
array('100000000000000', '90.95 TIB'),
array('0', '0 BYTES'),
array('2', '2 BYTES'),
array('1023', '1023 BYTES'),
array('1025', '1 KIB'),
array('1048575', '1024 KIB'),
);
}
/**
* @dataProvider get_formatted_filesize_test_data
*/
public function test_get_formatted_filesize($input, $expected)
{
$output = get_formatted_filesize($input);
$this->assertEquals($expected, $output);
}
}

74
tests/lint_test.php Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_lint_test extends phpbb_test_case
{
static protected $exclude;
static public function setUpBeforeClass()
{
$output = array();
$status = 1;
exec('(php -v) 2>&1', $output, $status);
if ($status)
{
$output = implode("\n", $output);
self::markTestSkipped("php is not in PATH or broken: $output");
}
self::$exclude = array(
// PHP Fatal error: Cannot declare class Container because the name is already in use in /var/www/projects/phpbb3/tests/../phpBB/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php on line 20
// https://gist.github.com/e003913ffd493da63cbc
dirname(__FILE__) . '/../phpBB/vendor',
);
}
public function test_lint()
{
if (version_compare(PHP_VERSION, '5.3.0', '<'))
{
$this->markTestSkipped('phpBB uses PHP 5.3 syntax in some files, linting on PHP < 5.3 will fail');
}
$root = dirname(__FILE__) . '/..';
$this->check($root);
}
protected function check($root)
{
$dh = opendir($root);
while (($filename = readdir($dh)) !== false)
{
if ($filename == '.' || $filename == '..' || $filename == 'git')
{
continue;
}
$path = $root . '/' . $filename;
// skip symlinks to avoid infinite loops
if (is_link($path))
{
continue;
}
if (is_dir($path) && !in_array($path, self::$exclude))
{
$this->check($path);
}
else if (substr($filename, strlen($filename)-4) == '.php')
{
// assume php binary is called php and it is in PATH
$cmd = '(php -l ' . escapeshellarg($path) . ') 2>&1';
$output = array();
$status = 1;
exec($cmd, $output, $status);
$output = implode("\n", $output);
$this->assertEquals(0, $status, "php -l failed for $path:\n$output");
}
}
}
}

109
tests/lock/flock_test.php Normal file
View File

@@ -0,0 +1,109 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
class phpbb_lock_flock_test extends phpbb_test_case
{
public function test_lock()
{
$path = __DIR__ . '/../tmp/precious';
$lock = new phpbb_lock_flock($path);
$ok = $lock->acquire();
$this->assertTrue($ok);
$lock->release();
}
public function test_consecutive_locking()
{
$path = __DIR__ . '/../tmp/precious';
$lock = new phpbb_lock_flock($path);
$ok = $lock->acquire();
$this->assertTrue($ok);
$lock->release();
$ok = $lock->acquire();
$this->assertTrue($ok);
$lock->release();
$ok = $lock->acquire();
$this->assertTrue($ok);
$lock->release();
}
/* This hangs the process.
public function test_concurrent_locking_fail()
{
$path = __DIR__ . '/../tmp/precious';
$lock1 = new phpbb_lock_flock($path);
$ok = $lock1->acquire();
$this->assertTrue($ok);
$lock2 = new phpbb_lock_flock($path);
$ok = $lock2->acquire();
$this->assertFalse($ok);
$lock->release();
$ok = $lock2->acquire();
$this->assertTrue($ok);
}
*/
public function test_concurrent_locking()
{
if (!function_exists('pcntl_fork'))
{
$this->markTestSkipped('pcntl extension and pcntl_fork are required for this test');
}
$path = __DIR__ . '/../tmp/precious';
$pid = pcntl_fork();
if ($pid)
{
// parent
// wait 0.5 s, acquire the lock, note how long it took
sleep(1);
$lock = new phpbb_lock_flock($path);
$start = time();
$ok = $lock->acquire();
$delta = time() - $start;
$this->assertTrue($ok);
$this->assertGreaterThan(0.5, $delta, 'First lock acquired too soon');
$lock->release();
// acquire again, this should be instantaneous
$start = time();
$ok = $lock->acquire();
$delta = time() - $start;
$this->assertTrue($ok);
$this->assertLessThan(0.1, $delta, 'Second lock not acquired instantaneously');
// reap the child
$status = null;
pcntl_waitpid($pid, $status);
}
else
{
// child
// immediately acquire the lock and sleep for 2 s
$lock = new phpbb_lock_flock($path);
$ok = $lock->acquire();
$this->assertTrue($ok);
sleep(2);
$lock->release();
// and go away silently
pcntl_exec('/usr/bin/env', array('true'));
}
}
}

View File

@@ -123,6 +123,7 @@ class phpbb_mock_cache implements phpbb_cache_driver_interface
}
public function sql_save($query, $query_result, $ttl)
{
return $query_result;
}
public function sql_exists($query_id)
{

View File

@@ -0,0 +1,106 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/../test_framework/phpbb_search_test_case.php';
abstract class phpbb_search_common_test_case extends phpbb_search_test_case
{
public function keywords()
{
return array(
// keywords
// terms
// ok
// split words
// common words
array(
'fooo',
'all',
true,
array('fooo'),
array(),
),
array(
'fooo baar',
'all',
true,
array('fooo', 'baar'),
array(),
),
// leading, trailing and multiple spaces
array(
' fooo baar ',
'all',
true,
array('fooo', 'baar'),
array(),
),
// words too short
array(
'f',
'all',
false,
null,
// short words count as "common" words
array('f'),
),
array(
'f o o',
'all',
false,
null,
array('f', 'o', 'o'),
),
array(
'f -o -o',
'all',
false,
null,
array('f', '-o', '-o'),
),
array(
'fooo -baar',
'all',
true,
array('-baar', 'fooo'),
array(),
),
// all negative
array(
'-fooo',
'all',
true,
array('-fooo'),
array(),
),
array(
'-fooo -baar',
'all',
true,
array('-fooo', '-baar'),
array(),
),
);
}
/**
* @dataProvider keywords
*/
public function test_split_keywords($keywords, $terms, $ok, $split_words, $common)
{
$rv = $this->search->split_keywords($keywords, $terms);
$this->assertEquals($ok, $rv);
if ($ok)
{
// only check criteria if the search is going to be performed
$this->assert_array_content_equals($split_words, $this->search->get_split_words());
}
$this->assert_array_content_equals($common, $this->search->get_common_words());
}
}

View File

@@ -0,0 +1,40 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_test_case.php';
class phpbb_search_mysql_test extends phpbb_search_common_test_case
{
protected $db;
protected $search;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
}
protected function setUp()
{
global $phpbb_root_path, $phpEx, $config, $user, $cache;
parent::setUp();
// dbal uses cache
$cache = new phpbb_cache_service(new phpbb_cache_driver_null);
// set config values
$config['fulltext_mysql_min_word_len'] = 4;
$config['fulltext_mysql_max_word_len'] = 254;
$this->db = $this->new_dbal();
$error = null;
$class = self::get_search_wrapper('phpbb_search_fulltext_mysql');
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
}
}

View File

@@ -7,24 +7,9 @@
*
*/
function phpbb_search_wrapper($class)
{
$wrapped = $class . '_wrapper';
if (!class_exists($wrapped))
{
$code = "
class $wrapped extends $class
{
public function get_must_contain_ids() { return \$this->must_contain_ids; }
public function get_must_not_contain_ids() { return \$this->must_not_contain_ids; }
}
";
eval($code);
}
return $wrapped;
}
require_once dirname(__FILE__) . '/../test_framework/phpbb_search_test_case.php';
class phpbb_search_native_test extends phpbb_database_test_case
class phpbb_search_native_test extends phpbb_search_test_case
{
protected $db;
protected $search;
@@ -41,19 +26,14 @@ class phpbb_search_native_test extends phpbb_database_test_case
parent::setUp();
// dbal uses cache
$cache = new phpbb_cache_driver_null;
$cache = new phpbb_cache_service(new phpbb_cache_driver_null);
$this->db = $this->new_dbal();
$error = null;
$class = phpbb_search_wrapper('phpbb_search_fulltext_native');
$class = self::get_search_wrapper('phpbb_search_fulltext_native');
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
}
protected function tearDown()
{
parent::tearDown();
}
public function keywords()
{
return array(
@@ -106,6 +86,14 @@ class phpbb_search_native_test extends phpbb_database_test_case
null,
array('f', 'o', 'o'),
),
array(
'f -o -o',
'all',
false,
null,
null,
array('f', 'o', 'o'),
),
array(
'foo -bar',
'all',
@@ -167,20 +155,4 @@ class phpbb_search_native_test extends phpbb_database_test_case
}
$this->assert_array_content_equals($common, $this->search->get_common_words());
}
public function assert_array_content_equals($one, $two)
{
// http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
// but one array_diff is not enough!
if (sizeof(array_diff($one, $two)) || sizeof(array_diff($two, $one)))
{
// get a nice error message
$this->assertEquals($one, $two);
}
else
{
// increase assertion count
$this->assertTrue(true);
}
}
}

View File

@@ -0,0 +1,40 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
require_once dirname(__FILE__) . '/common_test_case.php';
class phpbb_search_postgres_test extends phpbb_search_common_test_case
{
protected $db;
protected $search;
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
}
protected function setUp()
{
global $phpbb_root_path, $phpEx, $config, $user, $cache;
parent::setUp();
// dbal uses cache
$cache = new phpbb_cache_service(new phpbb_cache_driver_null);
// set config values
$config['fulltext_postgres_min_word_len'] = 4;
$config['fulltext_postgres_max_word_len'] = 254;
$this->db = $this->new_dbal();
$error = null;
$class = self::get_search_wrapper('phpbb_search_fulltext_postgres');
$this->search = new $class($error, $phpbb_root_path, $phpEx, null, $config, $this->db, $user);
}
}

View File

@@ -62,7 +62,7 @@ class phpbb_template_template_locate_test extends phpbb_template_template_test_c
$this->setup_engine();
// Locate template
$result = $this->template->locate($files, $return_default, $return_full_path);
$result = $this->style_resource_locator->get_first_template_location($files, $return_default, $return_full_path);
$this->assertSame($expected, $result);
}
}

View File

@@ -13,6 +13,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
protected $test_case_helpers;
protected $fixture_xml_data;
public function __construct($name = NULL, array $data = array(), $dataName = '')
{
parent::__construct($name, $data, $dataName);
@@ -28,6 +30,20 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
);
}
protected function setUp()
{
parent::setUp();
// Resynchronise tables if a fixture was loaded
if (isset($this->fixture_xml_data))
{
$config = $this->get_database_config();
$manager = $this->create_connection_manager($config);
$manager->connect();
$manager->post_setup_synchronisation($this->fixture_xml_data);
}
}
public function createXMLDataSet($path)
{
$db_config = $this->get_database_config();
@@ -47,7 +63,9 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$path = $meta_data['uri'];
}
return parent::createXMLDataSet($path);
$this->fixture_xml_data = parent::createXMLDataSet($path);
return $this->fixture_xml_data;
}
public function get_test_case_helpers()
@@ -141,4 +159,20 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
{
return $matches[1] . strtoupper($matches[2]) . $matches[3];
}
public function assert_array_content_equals($one, $two)
{
// http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
// but one array_diff is not enough!
if (sizeof(array_diff($one, $two)) || sizeof(array_diff($two, $one)))
{
// get a nice error message
$this->assertEquals($one, $two);
}
else
{
// increase assertion count
$this->assertTrue(true);
}
}
}

View File

@@ -166,12 +166,6 @@ class phpbb_database_test_connection_manager
switch ($this->config['dbms'])
{
case 'sqlite':
if (file_exists($this->config['dbhost']))
{
unlink($this->config['dbhost']);
}
break;
case 'firebird':
$this->connect();
// Drop all of the tables
@@ -432,4 +426,111 @@ class phpbb_database_test_connection_manager
$this->pdo->exec($query);
}
}
/**
* Performs synchronisations on the database after a fixture has been loaded
*
* @param PHPUnit_Extensions_Database_DataSet_XmlDataSet $xml_data_set Information about the tables contained within the loaded fixture
*
* @return null
*/
public function post_setup_synchronisation($xml_data_set)
{
$this->ensure_connected(__METHOD__);
$queries = array();
// Get escaped versions of the table names used in the fixture
$table_names = array_map(array($this->pdo, 'PDO::quote'), $xml_data_set->getTableNames());
switch ($this->config['dbms'])
{
case 'oracle':
// Get all of the information about the sequences
$sql = "SELECT t.table_name, tc.column_name, d.referenced_name as sequence_name, s.increment_by, s.min_value
FROM USER_TRIGGERS t
JOIN USER_DEPENDENCIES d ON (d.name = t.trigger_name)
JOIN USER_TRIGGER_COLS tc ON (tc.trigger_name = t.trigger_name)
JOIN USER_SEQUENCES s ON (s.sequence_name = d.referenced_name)
WHERE d.referenced_type = 'SEQUENCE'
AND d.type = 'TRIGGER'
AND t.table_name IN (" . implode(', ', array_map('strtoupper', $table_names)) . ')';
$result = $this->pdo->query($sql);
while ($row = $result->fetch(PDO::FETCH_ASSOC))
{
// Get the current max value of the table
$sql = "SELECT MAX({$row['COLUMN_NAME']}) AS max FROM {$row['TABLE_NAME']}";
$max_result = $this->pdo->query($sql);
$max_row = $max_result->fetch(PDO::FETCH_ASSOC);
if (!$max_row)
{
continue;
}
$max_val = (int) $max_row['MAX'];
$max_val++;
/**
* This is not the "proper" way, but the proper way does not allow you to completely reset
* tables with no rows since you have to select the next value to make the change go into effect.
* You would have to go past the minimum value to set it correctly, but that's illegal.
* Since we have no objects attached to our sequencers (triggers aren't attached), this works fine.
*/
$queries[] = 'DROP SEQUENCE ' . $row['SEQUENCE_NAME'];
$queries[] = "CREATE SEQUENCE {$row['SEQUENCE_NAME']}
MINVALUE {$row['MIN_VALUE']}
INCREMENT BY {$row['INCREMENT_BY']}
START WITH $max_val";
}
break;
case 'postgres':
// Get the sequences attached to the tables
$sql = 'SELECT column_name, table_name FROM information_schema.columns
WHERE table_name IN (' . implode(', ', $table_names) . ")
AND strpos(column_default, '_seq''::regclass') > 0";
$result = $this->pdo->query($sql);
$setval_queries = array();
while ($row = $result->fetch(PDO::FETCH_ASSOC))
{
// Get the columns used in the fixture for this table
$column_names = $xml_data_set->getTableMetaData($row['table_name'])->getColumns();
// Skip sequences that weren't specified in the fixture
if (!in_array($row['column_name'], $column_names))
{
continue;
}
// Get the old value if it exists, or use 1 if it doesn't
$sql = "SELECT COALESCE((SELECT MAX({$row['column_name']}) + 1 FROM {$row['table_name']}), 1) AS val";
$result_max = $this->pdo->query($sql);
$row_max = $result_max->fetch(PDO::FETCH_ASSOC);
if ($row_max)
{
$seq_name = $this->pdo->quote($row['table_name'] . '_seq');
$max_val = (int) $row_max['val'];
// The last parameter is false so that the system doesn't increment it again
$setval_queries[] = "SETVAL($seq_name, $max_val, false)";
}
}
// Combine all of the SETVALs into one query
if (sizeof($setval_queries))
{
$queries[] = 'SELECT ' . implode(', ', $setval_queries);
}
break;
}
foreach ($queries as $query)
{
$this->pdo->exec($query);
}
}
}

View File

@@ -332,15 +332,30 @@ class phpbb_functional_test_case extends phpbb_test_case
return call_user_func_array('sprintf', $args);
}
/**
* assertContains for language strings
*
* @param string $needle Search string
* @param string $haystack Search this
* @param string $message Optional failure message
*/
public function assertContainsLang($needle, $haystack, $message = null)
{
$this->assertContains(html_entity_decode($this->lang($needle), ENT_QUOTES), $haystack, $message);
}
/**
* assertContains for language strings
*
* @param string $needle Search string
* @param string $haystack Search this
* @param string $message Optional failure message
*/
public function assertContainsLang($needle, $haystack, $message = null)
{
$this->assertContains(html_entity_decode($this->lang($needle), ENT_QUOTES), $haystack, $message);
}
/**
* Heuristic function to check that the response is success.
*
* When php decides to die with a fatal error, it still sends 200 OK
* status code. This assertion tries to catch that.
*
* @return null
*/
public function assert_response_success()
{
$this->assertEquals(200, $this->client->getResponse()->getStatus());
$content = $this->client->getResponse()->getContent();
$this->assertNotContains('Fatal error:', $content);
}
}

View File

@@ -0,0 +1,29 @@
<?php
/**
*
* @package testing
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
abstract class phpbb_search_test_case extends phpbb_database_test_case
{
static protected function get_search_wrapper($class)
{
$wrapped = $class . '_wrapper';
if (!class_exists($wrapped))
{
$code = "
class $wrapped extends $class
{
public function get_must_contain_ids() { return \$this->must_contain_ids; }
public function get_must_not_contain_ids() { return \$this->must_not_contain_ids; }
public function get_split_words() { return \$this->split_words; }
}
";
eval($code);
}
return $wrapped;
}
}

View File

@@ -91,6 +91,15 @@ class phpbb_test_case_helpers
{
$config['phpbb_functional_url'] = $phpbb_functional_url;
}
if (isset($phpbb_redis_host))
{
$config['redis_host'] = $phpbb_redis_host;
}
if (isset($phpbb_redis_port))
{
$config['redis_port'] = $phpbb_redis_port;
}
}
if (isset($_SERVER['PHPBB_TEST_DBMS']))
@@ -113,6 +122,16 @@ class phpbb_test_case_helpers
));
}
if (isset($_SERVER['PHPBB_TEST_REDIS_HOST']))
{
$config['redis_host'] = $_SERVER['PHPBB_TEST_REDIS_HOST'];
}
if (isset($_SERVER['PHPBB_TEST_REDIS_PORT']))
{
$config['redis_port'] = $_SERVER['PHPBB_TEST_REDIS_PORT'];
}
return $config;
}