1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-25 11:01:48 +02:00

Merge branch 'develop' of github.com:EXreaction/phpbb3 into ticket/11103

Conflicts:
	phpBB/install/database_update.php
	phpBB/styles/prosilver/template/ucp_prefs_personal.html
	phpBB/styles/subsilver2/template/ucp_prefs_personal.html
This commit is contained in:
Nathan Guse
2012-12-07 21:14:39 -06:00
94 changed files with 1884 additions and 520 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,43 @@
<?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_connect_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/../fixtures/empty.xml');
}
public function test_failing_connect()
{
global $phpbb_root_path, $phpEx;
$config = $this->get_database_config();
require_once dirname(__FILE__) . '/../../phpBB/includes/db/' . $config['dbms'] . '.php';
$dbal = 'dbal_' . $config['dbms'];
$db = new $dbal();
// Failure to connect results in a trigger_error call in dbal.
// phpunit converts triggered errors to exceptions.
// In particular there should be no fatals here.
try
{
$db->sql_connect($config['dbhost'], 'phpbbogus', 'phpbbogus', 'phpbbogus', $config['dbport']);
$this->assertFalse(true);
}
catch (Exception $e)
{
// should have a legitimate message
$this->assertNotEmpty($e->getMessage());
}
}
}

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'));
}
}

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

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_sessions">
<column>session_id</column>
<column>session_user_id</column>
<column>session_ip</column>
<column>session_browser</column>
</table>
</dataset>

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());
}
}

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

@@ -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

@@ -426,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

@@ -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;
}