aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/RUNNING_TESTS.md151
-rw-r--r--tests/RUNNING_TESTS.txt76
-rw-r--r--tests/bbcode/url_bbcode_test.php2
-rw-r--r--tests/bootstrap.php15
-rw-r--r--tests/compress/archive/.gitkeep0
-rw-r--r--tests/compress/compress_test.php173
-rw-r--r--tests/compress/extract/.gitkeep0
-rw-r--r--tests/compress/fixtures/1.txt1
-rw-r--r--tests/compress/fixtures/archive.tarbin0 -> 10240 bytes
-rw-r--r--tests/compress/fixtures/archive.tar.bz2bin0 -> 224 bytes
-rw-r--r--tests/compress/fixtures/archive.tar.gzbin0 -> 239 bytes
-rw-r--r--tests/compress/fixtures/archive.zipbin0 -> 412 bytes
-rw-r--r--tests/compress/fixtures/dir/2.txt1
-rw-r--r--tests/compress/fixtures/dir/3.txt1
-rw-r--r--tests/compress/fixtures/dir/subdir/4.txt1
-rw-r--r--tests/dbal/connect_test.php43
-rw-r--r--tests/dbal/order_lower_test.php9
-rw-r--r--tests/dbal/select_test.php16
-rw-r--r--tests/dbal/write_sequence_test.php55
-rw-r--r--tests/dbal/write_test.php4
-rw-r--r--tests/fixtures/empty.xml9
-rw-r--r--tests/functional/acp_groups_test.php21
-rw-r--r--tests/functional/auth_test.php14
-rw-r--r--tests/functional/browse_test.php6
-rw-r--r--tests/functional/common_groups_test.php93
-rw-r--r--tests/functional/forum_style_test.php45
-rw-r--r--tests/functional/mcp_test.php67
-rw-r--r--tests/functional/posting_test.php35
-rw-r--r--tests/functional/report_post_captcha_test.php66
-rw-r--r--tests/functional/ucp_groups_test.php21
-rw-r--r--tests/functions/clean_path_test.php44
-rw-r--r--tests/functions/fixtures/language_select.xml21
-rw-r--r--tests/functions/fixtures/obtain_online.xml121
-rw-r--r--tests/functions/fixtures/style_select.xml23
-rw-r--r--tests/functions/fixtures/validate_email.xml23
-rw-r--r--tests/functions/fixtures/validate_username.xml38
-rw-r--r--tests/functions/get_formatted_filesize_test.php71
-rw-r--r--tests/functions/get_remote_file_test.php75
-rw-r--r--tests/functions/is_absolute_test.php56
-rw-r--r--tests/functions/language_select_test.php39
-rw-r--r--tests/functions/obtain_online_test.php238
-rw-r--r--tests/functions/style_select_test.php41
-rw-r--r--tests/functions/validate_data_helper.php36
-rw-r--r--tests/functions/validate_date_test.php82
-rw-r--r--tests/functions/validate_email_test.php108
-rw-r--r--tests/functions/validate_hex_colour_test.php121
-rw-r--r--tests/functions/validate_jabber_test.php79
-rw-r--r--tests/functions/validate_lang_iso_test.php60
-rw-r--r--tests/functions/validate_match_test.php49
-rw-r--r--tests/functions/validate_num_test.php59
-rw-r--r--tests/functions/validate_password_test.php96
-rw-r--r--tests/functions/validate_string_test.php70
-rw-r--r--tests/functions/validate_username_test.php190
-rw-r--r--tests/functions_database_helper/fixtures/bookmarks_duplicates.xml47
-rw-r--r--tests/functions_database_helper/fixtures/topics_watch_duplicates.xml80
-rw-r--r--tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php101
-rw-r--r--tests/functions_database_helper/update_rows_avoiding_duplicates_test.php71
-rw-r--r--tests/lint_test.php74
-rw-r--r--tests/mock/cache.php27
-rw-r--r--tests/mock/null_cache.php42
-rw-r--r--tests/mock/user.php (renamed from tests/mock_user.php)13
-rw-r--r--tests/privmsgs/delete_user_pms_test.php102
-rw-r--r--tests/privmsgs/fixtures/delete_user_pms.xml215
-rw-r--r--tests/request/request_var_test.php2
-rw-r--r--tests/security/extract_current_page_test.php2
-rw-r--r--tests/security/hash_test.php8
-rw-r--r--tests/security/redirect_test.php2
-rw-r--r--tests/session/append_sid_test.php101
-rw-r--r--tests/session/creation_test.php (renamed from tests/session/init_test.php)7
-rw-r--r--tests/template/template_test.php49
-rw-r--r--tests/template/templates/include_define.html2
-rw-r--r--tests/template/templates/include_define_variable.html2
-rw-r--r--tests/template/templates/include_loop_define.html4
-rw-r--r--tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php37
-rw-r--r--tests/test_framework/phpbb_database_test_case.php88
-rw-r--r--tests/test_framework/phpbb_database_test_connection_manager.php302
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php646
-rw-r--r--tests/test_framework/phpbb_test_case_helpers.php4
-rw-r--r--tests/text_processing/censor_text_test.php2
-rw-r--r--tests/text_processing/make_clickable_test.php2
-rw-r--r--tests/utf/utf8_clean_string_test.php2
81 files changed, 4444 insertions, 255 deletions
diff --git a/tests/RUNNING_TESTS.md b/tests/RUNNING_TESTS.md
new file mode 100644
index 0000000000..23c74f4411
--- /dev/null
+++ b/tests/RUNNING_TESTS.md
@@ -0,0 +1,151 @@
+Running Tests
+=============
+
+Prerequisites
+=============
+
+PHPUnit
+-------
+
+phpBB unit tests use the PHPUnit framework (see http://www.phpunit.de for more
+information). Version 3.5 or higher is required to run the tests. PHPUnit can
+be installed via Composer together with other development dependencies as
+follows.
+
+ $ cd phpBB
+ $ php ../composer.phar install --dev
+ $ cd ..
+
+PHP extensions
+--------------
+
+Unit tests use several PHP extensions that board code does not use. Currently
+the following PHP extensions must be installed and enabled to run unit tests:
+
+- ctype (also a PHPUnit dependency)
+- dom (PHPUnit dependency)
+
+Some of the functionality in phpBB and/or the test suite uses additional
+PHP extensions. If these extensions are not loaded, respective tests
+will be skipped:
+
+- apc (APC cache driver)
+- bz2 (compress tests)
+- interbase, pdo_firebird (Firebird database driver)
+- mysql, pdo_mysql (MySQL database driver)
+- mysqli, pdo_mysql (MySQLi database driver)
+- pdo (any database tests)
+- pgsql, pdo_pgsql (PostgreSQL database driver)
+- simplexml (any database tests)
+- sqlite, pdo_sqlite (SQLite database driver, requires SQLite 2.x support
+ in pdo_sqlite)
+- zlib (compress tests)
+
+Database Tests
+--------------
+
+By default all tests requiring a database connection will use sqlite. If you
+do not have sqlite installed the tests will be skipped. If you wish to run the
+tests on a different database you have to create a test_config.php file within
+your tests directory following the same format as phpBB's config.php. Testing
+makes use of a seperate database defined in this config file and before running
+the tests each time this database is deleted. An example for mysqli can be
+found below. More information on configuration options can be found on the
+wiki (see below).
+
+ <?php
+ $dbms = 'mysqli';
+ $dbhost = 'localhost';
+ $dbport = '';
+ $dbname = 'database';
+ $dbuser = 'user';
+ $dbpasswd = 'password';
+
+It is possible to have multiple test_config.php files, for example if you
+are testing on multiple databases. You can specify which test_config.php file
+to use in the environment as follows:
+
+ $ PHPBB_TEST_CONFIG=tests/test_config.php phpunit
+
+Alternatively you can specify parameters in the environment, so e.g. the
+following will run PHPUnit with the same parameters as in the shown
+test_config.php file:
+
+ $ PHPBB_TEST_DBMS='mysqli' PHPBB_TEST_DBHOST='localhost' \
+ PHPBB_TEST_DBNAME='database' PHPBB_TEST_DBUSER='user' \
+ PHPBB_TEST_DBPASSWD='password' phpunit
+
+Special Database Cases
+----------------------
+In order to run tests on some of the databases that we support, it will be
+necessary to provide a custom DSN string in test_config.php. This is only
+needed for MSSQL 2000+ (PHP module), MSSQL via ODBC, and Firebird when
+PDO_Firebird does not work on your system
+(https://bugs.php.net/bug.php?id=61183). The variable must be named `$custom_dsn`.
+
+Examples:
+Firebird using http://www.firebirdsql.org/en/odbc-driver/
+
+ $custom_dsn = "Driver={Firebird/InterBase(r) driver};dbname=$dbhost:$dbname";
+
+MSSQL
+
+ $custom_dsn = "Driver={SQL Server Native Client 10.0};Server=$dbhost;Database=$dbname";
+
+The other fields in test_config.php should be filled out as you would normally
+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.
+
+Running
+=======
+
+Once the prerequisites are installed, run the tests from the project root
+directory (above phpBB):
+
+ $ phpBB/vendor/bin/phpunit
+
+Slow tests
+--------------
+
+Certain tests, such as the UTF-8 normalizer or the DNS tests tend to be slow.
+Thus these tests are in the `slow` group, which is excluded by default. You can
+enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you
+only want the slow tests, run:
+
+ $ phpBB/vendor/bin/phpunit --group slow
+
+Functional tests
+-----------------
+
+Functional tests test software the way a user would. They simulate a user
+browsing the website, but they do these steps in an automated way.
+phpBB allows you to write such tests.
+
+Running
+=======
+
+Running the tests requires your phpBB3 repository to be accessible through a
+local web server. You will need to supply the URL to the webserver in
+the 'tests/test_config.php' file. This is as simple as defining the
+'$phpbb_functional_url' variable, which contains the URL for the directory containing
+the board. Make sure you include the trailing slash. Note that without extensive
+changes to the test framework, you cannot use a board outside of the repository
+on which to run tests.
+
+ $phpbb_functional_url = 'http://localhost/phpBB3/';
+
+To then run the tests, you run PHPUnit, but use the phpunit.xml.functional
+config file instead of the default one. Specify this through the "-c" option:
+
+ $ phpBB/vendor/bin/phpunit -c phpunit.xml.functional
+
+This will change your board's config.php file, but it makes a backup at
+config_dev.php, so you can restore it after the test run is complete.
+
+More Information
+================
+
+Further information is available on phpbb wiki:
+http://wiki.phpbb.com/Automated_Tests
diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt
deleted file mode 100644
index b976545c22..0000000000
--- a/tests/RUNNING_TESTS.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-Running Tests
-=============
-
-Prerequisites
-=============
-
-PHPUnit
--------
-
-phpBB unit tests use PHPUnit framework. Version 3.5 or better is required
-to run the tests. PHPUnit prefers to be installed via PEAR; refer to
-http://www.phpunit.de/ for more information.
-
-PHP extensions
---------------
-
-Unit tests use several PHP extensions that board code does not use. Currently
-the following PHP extensions must be installed and enabled to run unit tests:
-
-- ctype
-
-Database Tests
---------------
-
-By default all tests requiring a database connection will use sqlite. If you
-do not have sqlite installed the tests will be skipped. If you wish to run the
-tests on a different database you have to create a test_config.php file within
-your tests directory following the same format as phpBB's config.php. An
-example for mysqli can be found below. More information on configuration
-options can be found on the wiki (see below).
-
- <?php
- $dbms = 'mysqli';
- $dbhost = 'localhost';
- $dbport = '';
- $dbname = 'database';
- $dbuser = 'user';
- $dbpasswd = 'password';
-
-It is possible to have multiple test_config.php files, for example if you
-are testing on multiple databases. You can specify which test_config.php file
-to use in the environment as follows:
-
- $ PHPBB_TEST_CONFIG=tests/test_config.php phpunit
-
-Alternatively you can specify parameters in the environment, so e.g. the
-following will run phpunit with the same parameters as in the shown
-test_config.php file:
-
- $ PHPBB_TEST_DBMS='mysqli' PHPBB_TEST_DBHOST='localhost' \
- PHPBB_TEST_DBNAME='database' PHPBB_TEST_DBUSER='user' \
- PHPBB_TEST_DBPASSWD='password' phpunit
-
-Running
-=======
-
-Once the prerequisites are installed, run the tests from the project root
-directory (above phpBB):
-
- $ phpunit
-
-Slow tests
---------------
-
-Certain tests, such as the UTF-8 normalizer or the DNS tests tend to be slow.
-Thus these tests are in the `slow` group, which is excluded by default. You can
-enable slow tests by copying the phpunit.xml.all file to phpunit.xml. If you
-only want the slow tests, run:
-
- $ phpunit --group slow
-
-More Information
-================
-
-Further information is available on phpbb wiki:
-http://wiki.phpbb.com/Unit_Tests
diff --git a/tests/bbcode/url_bbcode_test.php b/tests/bbcode/url_bbcode_test.php
index 15bdfc434f..6b5afe5808 100644
--- a/tests/bbcode/url_bbcode_test.php
+++ b/tests/bbcode/url_bbcode_test.php
@@ -11,7 +11,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
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/user.php';
class phpbb_url_bbcode_test extends phpbb_test_case
{
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index d6c5d25bc8..d687db622a 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -22,5 +22,20 @@ require_once 'test_framework/phpbb_database_test_connection_manager.php';
if (version_compare(PHP_VERSION, '5.3.0-dev', '>='))
{
+ if (getenv('PHPBB_NO_COMPOSER_AUTOLOAD'))
+ {
+ if (getenv('PHPBB_AUTOLOAD'))
+ {
+ require(getenv('PHPBB_AUTOLOAD'));
+ }
+ }
+ else
+ {
+ if (!file_exists($phpbb_root_path . 'vendor/autoload.php'))
+ {
+ trigger_error('You have not set up composer dependencies. See http://getcomposer.org/.', E_USER_ERROR);
+ }
+ require($phpbb_root_path . 'vendor/autoload.php');
+ }
require_once 'test_framework/phpbb_functional_test_case.php';
}
diff --git a/tests/compress/archive/.gitkeep b/tests/compress/archive/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/compress/archive/.gitkeep
diff --git a/tests/compress/compress_test.php b/tests/compress/compress_test.php
new file mode 100644
index 0000000000..ce193cf3ba
--- /dev/null
+++ b/tests/compress/compress_test.php
@@ -0,0 +1,173 @@
+<?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';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_admin.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_compress.php';
+
+class phpbb_compress_test extends phpbb_test_case
+{
+ const EXTRACT_DIR = '/extract/';
+ const ARCHIVE_DIR = '/archive/';
+
+ private $path;
+
+ protected $filelist = array(
+ '1.txt',
+ 'dir/2.txt',
+ 'dir/3.txt',
+ 'dir/subdir/4.txt',
+ );
+
+ protected function setUp()
+ {
+ // Required for compress::add_file
+ global $phpbb_root_path;
+ $phpbb_root_path = '';
+
+ $this->path = dirname(__FILE__) . '/fixtures/';
+ }
+
+ protected function check_extensions($extensions)
+ {
+ foreach ($extensions as $extension)
+ {
+ if (!@extension_loaded($extension))
+ {
+ $this->markTestSkipped("$extension extension is not loaded");
+ }
+ }
+ }
+
+ protected function tearDown()
+ {
+ foreach (array(dirname(__FILE__) . self::EXTRACT_DIR, dirname(__FILE__) . self::ARCHIVE_DIR) as $dir)
+ {
+ $this->clear_dir($dir);
+ }
+ }
+
+ protected function clear_dir($dir)
+ {
+ $iterator = new DirectoryIterator($dir);
+ foreach ($iterator as $fileinfo)
+ {
+ $name = $fileinfo->getFilename();
+ $path = $fileinfo->getPathname();
+
+ if ($name[0] !== '.')
+ {
+ if ($fileinfo->isDir())
+ {
+ $this->clear_dir($path);
+ rmdir($path);
+ }
+ else
+ {
+ unlink($path);
+ }
+ }
+ }
+ }
+
+ protected function archive_files($compress)
+ {
+ $compress->add_file($this->path . '1.txt', $this->path);
+ $compress->add_file(
+ 'tests/compress/fixtures/dir/',
+ 'tests/compress/fixtures/',
+ '',
+ // The comma here is not an error, this is a comma-separated list
+ 'subdir/4.txt,3.txt'
+ );
+ $compress->add_custom_file($this->path . 'dir/3.txt', 'dir/3.txt');
+ $compress->add_data(file_get_contents($this->path . 'dir/subdir/4.txt'), 'dir/subdir/4.txt');
+ }
+
+ protected function valid_extraction($extra = array())
+ {
+ $filelist = array_merge($this->filelist, $extra);
+
+ foreach ($filelist as $filename)
+ {
+ $path = dirname(__FILE__) . self::EXTRACT_DIR . $filename;
+ $this->assertTrue(file_exists($path));
+
+ // Check the file's contents is correct
+ $contents = explode('_', basename($filename, '.txt'));
+ $contents = $contents[0];
+ $this->assertEquals($contents . "\n", file_get_contents($path));
+ }
+ }
+
+ public function tar_archive_list()
+ {
+ return array(
+ array('archive.tar', '.tar', array()),
+ array('archive.tar.gz', '.tar.gz', array('zlib')),
+ array('archive.tar.bz2', '.tar.bz2', array('bz2')),
+ );
+ }
+
+ /**
+ * @dataProvider tar_archive_list
+ */
+ public function test_extract_tar($filename, $type, $extensions)
+ {
+ $this->check_extensions($extensions);
+ $compress = new compress_tar('r', $this->path . $filename);
+ $compress->extract('tests/compress/' . self::EXTRACT_DIR);
+ $this->valid_extraction();
+ }
+
+ public function test_extract_zip()
+ {
+ $compress = new compress_zip('r', $this->path . 'archive.zip');
+ $compress->extract('tests/compress/' . self::EXTRACT_DIR);
+ $this->valid_extraction();
+ }
+
+ /**
+ * @depends test_extract_tar
+ * @dataProvider tar_archive_list
+ */
+ public function test_compress_tar($filename, $type, $extensions)
+ {
+ $this->check_extensions($extensions);
+
+ $tar = dirname(__FILE__) . self::ARCHIVE_DIR . $filename;
+ $compress = new compress_tar('w', $tar);
+ $this->archive_files($compress);
+ $compress->close();
+ $this->assertTrue(file_exists($tar));
+
+ $compress->mode = 'r';
+ $compress->open();
+ $compress->extract('tests/compress/' . self::EXTRACT_DIR);
+ $this->valid_extraction();
+ }
+
+ /**
+ * @depends test_extract_zip
+ */
+ public function test_compress_zip()
+ {
+ $this->check_extensions(array('zlib'));
+
+ $zip = dirname(__FILE__) . self::ARCHIVE_DIR . 'archive.zip';
+ $compress = new compress_zip('w', $zip);
+ $this->archive_files($compress);
+ $compress->close();
+ $this->assertTrue(file_exists($zip));
+
+ $compress = new compress_zip('r', $zip);
+ $compress->extract('tests/compress/' . self::EXTRACT_DIR);
+ $this->valid_extraction();
+ }
+}
diff --git a/tests/compress/extract/.gitkeep b/tests/compress/extract/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/compress/extract/.gitkeep
diff --git a/tests/compress/fixtures/1.txt b/tests/compress/fixtures/1.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/compress/fixtures/1.txt
@@ -0,0 +1 @@
+1
diff --git a/tests/compress/fixtures/archive.tar b/tests/compress/fixtures/archive.tar
new file mode 100644
index 0000000000..54ed56084e
--- /dev/null
+++ b/tests/compress/fixtures/archive.tar
Binary files differ
diff --git a/tests/compress/fixtures/archive.tar.bz2 b/tests/compress/fixtures/archive.tar.bz2
new file mode 100644
index 0000000000..04c0eccd74
--- /dev/null
+++ b/tests/compress/fixtures/archive.tar.bz2
Binary files differ
diff --git a/tests/compress/fixtures/archive.tar.gz b/tests/compress/fixtures/archive.tar.gz
new file mode 100644
index 0000000000..195e7a060a
--- /dev/null
+++ b/tests/compress/fixtures/archive.tar.gz
Binary files differ
diff --git a/tests/compress/fixtures/archive.zip b/tests/compress/fixtures/archive.zip
new file mode 100644
index 0000000000..bdb618fc26
--- /dev/null
+++ b/tests/compress/fixtures/archive.zip
Binary files differ
diff --git a/tests/compress/fixtures/dir/2.txt b/tests/compress/fixtures/dir/2.txt
new file mode 100644
index 0000000000..0cfbf08886
--- /dev/null
+++ b/tests/compress/fixtures/dir/2.txt
@@ -0,0 +1 @@
+2
diff --git a/tests/compress/fixtures/dir/3.txt b/tests/compress/fixtures/dir/3.txt
new file mode 100644
index 0000000000..00750edc07
--- /dev/null
+++ b/tests/compress/fixtures/dir/3.txt
@@ -0,0 +1 @@
+3
diff --git a/tests/compress/fixtures/dir/subdir/4.txt b/tests/compress/fixtures/dir/subdir/4.txt
new file mode 100644
index 0000000000..b8626c4cff
--- /dev/null
+++ b/tests/compress/fixtures/dir/subdir/4.txt
@@ -0,0 +1 @@
+4
diff --git a/tests/dbal/connect_test.php b/tests/dbal/connect_test.php
new file mode 100644
index 0000000000..505ce28fa1
--- /dev/null
+++ b/tests/dbal/connect_test.php
@@ -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());
+ }
+ }
+}
diff --git a/tests/dbal/order_lower_test.php b/tests/dbal/order_lower_test.php
index b50494d506..e17295a4ea 100644
--- a/tests/dbal/order_lower_test.php
+++ b/tests/dbal/order_lower_test.php
@@ -14,10 +14,15 @@ class phpbb_dbal_order_lower_test extends phpbb_database_test_case
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/styles.xml');
}
- public function test_cross_join()
+ public function test_order_lower()
{
$db = $this->new_dbal();
+ if (strpos($db->sql_layer, 'mysql') === 0 && version_compare($db->sql_server_info(true, false), '5.6', '>='))
+ {
+ $this->markTestSkipped('MySQL 5.6 fails to order things correctly. See also: http://tracker.phpbb.com/browse/PHPBB3-11571 http://bugs.mysql.com/bug.php?id=69005');
+ }
+
// http://tracker.phpbb.com/browse/PHPBB3-10507
// Test ORDER BY LOWER(style_name)
$db->sql_return_on_error(true);
@@ -55,7 +60,7 @@ class phpbb_dbal_order_lower_test extends phpbb_database_test_case
'theme_id' => 2,
'imageset_id' => 2
)
- ),
+ ),
$db->sql_fetchrowset($result)
);
}
diff --git a/tests/dbal/select_test.php b/tests/dbal/select_test.php
index 81cd13b006..6dbab05a41 100644
--- a/tests/dbal/select_test.php
+++ b/tests/dbal/select_test.php
@@ -17,7 +17,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/three_users.xml');
}
- public static function return_on_error_select_data()
+ static public function return_on_error_select_data()
{
return array(
array('phpbb_users', "username_clean = 'bertie'", array(array('username_clean' => 'bertie'))),
@@ -44,7 +44,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $db->sql_fetchrowset($result));
}
- public static function fetchrow_data()
+ static public function fetchrow_data()
{
return array(
array('', array(array('username_clean' => 'barfoo'),
@@ -95,7 +95,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$db->sql_freeresult($result);
}
- public static function fetchfield_data()
+ static public function fetchfield_data()
{
return array(
array('', array('barfoo', 'foobar', 'bertie')),
@@ -125,7 +125,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $ary);
}
- public static function fetchfield_seek_data()
+ static public function fetchfield_seek_data()
{
return array(
array(1, 'foobar'),
@@ -151,7 +151,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $field);
}
- public static function query_limit_data()
+ static public function query_limit_data()
{
return array(
array(0, 0, array(array('username_clean' => 'barfoo'),
@@ -192,7 +192,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $ary);
}
- public static function like_expression_data()
+ static public function like_expression_data()
{
// * = any_char; # = one_char
return array(
@@ -229,7 +229,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$db->sql_freeresult($result);
}
- public static function in_set_data()
+ static public function in_set_data()
{
return array(
array('user_id', 3, false, false, array(array('username_clean' => 'bertie'))),
@@ -303,7 +303,7 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$db->sql_freeresult($result);
}
- public static function build_array_data()
+ static public function build_array_data()
{
return array(
array(array('username_clean' => 'barfoo'), array(array('username_clean' => 'barfoo'))),
diff --git a/tests/dbal/write_sequence_test.php b/tests/dbal/write_sequence_test.php
new file mode 100644
index 0000000000..8975cfbfb1
--- /dev/null
+++ b/tests/dbal/write_sequence_test.php
@@ -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'));
+ }
+}
diff --git a/tests/dbal/write_test.php b/tests/dbal/write_test.php
index 596c50a220..ecfd774896 100644
--- a/tests/dbal/write_test.php
+++ b/tests/dbal/write_test.php
@@ -16,7 +16,7 @@ class phpbb_dbal_write_test extends phpbb_database_test_case
return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml');
}
- public static function build_array_insert_data()
+ static public function build_array_insert_data()
{
return array(
array(array(
@@ -104,7 +104,7 @@ class phpbb_dbal_write_test extends phpbb_database_test_case
$db->sql_freeresult($result);
}
- public static function update_data()
+ static public function update_data()
{
return array(
array(
diff --git a/tests/fixtures/empty.xml b/tests/fixtures/empty.xml
new file mode 100644
index 0000000000..195e30e38d
--- /dev/null
+++ b/tests/fixtures/empty.xml
@@ -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>
diff --git a/tests/functional/acp_groups_test.php b/tests/functional/acp_groups_test.php
new file mode 100644
index 0000000000..3d8cabb086
--- /dev/null
+++ b/tests/functional/acp_groups_test.php
@@ -0,0 +1,21 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/common_groups_test.php';
+
+/**
+* @group functional
+*/
+class phpbb_functional_acp_groups_test extends phpbb_functional_common_groups_test
+{
+ protected function get_url()
+ {
+ return 'adm/index.php?i=groups&mode=manage&action=edit';
+ }
+}
diff --git a/tests/functional/auth_test.php b/tests/functional/auth_test.php
index e955dcb4df..afb4f15fc2 100644
--- a/tests/functional/auth_test.php
+++ b/tests/functional/auth_test.php
@@ -17,10 +17,18 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
$this->login();
// check for logout link
- $crawler = $this->request('GET', 'index.php');
+ $crawler = self::request('GET', 'index.php');
$this->assertContains($this->lang('LOGOUT_USER', 'admin'), $crawler->filter('.navbar')->text());
}
+ public function test_login_other()
+ {
+ $this->create_user('anothertestuser');
+ $this->login('anothertestuser');
+ $crawler = self::request('GET', 'index.php');
+ $this->assertContains('anothertestuser', $crawler->filter('.icon-logout')->text());
+ }
+
/**
* @depends test_login
*/
@@ -30,11 +38,11 @@ class phpbb_functional_auth_test extends phpbb_functional_test_case
$this->add_lang('ucp');
// logout
- $crawler = $this->request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
+ $crawler = self::request('GET', 'ucp.php?sid=' . $this->sid . '&mode=logout');
$this->assertContains($this->lang('LOGOUT_REDIRECT'), $crawler->filter('#message')->text());
// look for a register link, which should be visible only when logged out
- $crawler = $this->request('GET', 'index.php');
+ $crawler = self::request('GET', 'index.php');
$this->assertContains($this->lang('REGISTER'), $crawler->filter('.navbar')->text());
}
}
diff --git a/tests/functional/browse_test.php b/tests/functional/browse_test.php
index 26c18c4c1f..18a2ad9464 100644
--- a/tests/functional/browse_test.php
+++ b/tests/functional/browse_test.php
@@ -14,19 +14,19 @@ class phpbb_functional_browse_test extends phpbb_functional_test_case
{
public function test_index()
{
- $crawler = $this->request('GET', 'index.php');
+ $crawler = self::request('GET', 'index.php');
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewforum()
{
- $crawler = $this->request('GET', 'viewforum.php?f=2');
+ $crawler = self::request('GET', 'viewforum.php?f=2');
$this->assertGreaterThan(0, $crawler->filter('.topiclist')->count());
}
public function test_viewtopic()
{
- $crawler = $this->request('GET', 'viewtopic.php?t=1');
+ $crawler = self::request('GET', 'viewtopic.php?t=1');
$this->assertGreaterThan(0, $crawler->filter('.postbody')->count());
}
}
diff --git a/tests/functional/common_groups_test.php b/tests/functional/common_groups_test.php
new file mode 100644
index 0000000000..427a930cb9
--- /dev/null
+++ b/tests/functional/common_groups_test.php
@@ -0,0 +1,93 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @group functional
+*/
+abstract class phpbb_functional_common_groups_test extends phpbb_functional_test_case
+{
+ abstract protected function get_url();
+
+ // Enable all avatars in the ACP
+ protected function enable_all_avatars()
+ {
+ $this->add_lang('acp/board');
+
+ $crawler = self::request('GET', 'adm/index.php?i=board&mode=avatar&sid=' . $this->sid);
+ // Check the default entries we should have
+ $this->assertContains($this->lang('ALLOW_REMOTE'), $crawler->text());
+ $this->assertContains($this->lang('ALLOW_AVATARS'), $crawler->text());
+ $this->assertContains($this->lang('ALLOW_LOCAL'), $crawler->text());
+
+ // Now start setting the needed settings
+ $form = $crawler->selectButton($this->lang('SUBMIT'))->form();
+ $form['config[allow_avatar_local]']->select(1);
+ $form['config[allow_avatar_remote]']->select(1);
+ $form['config[allow_avatar_remote_upload]']->select(1);
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('CONFIG_UPDATED'), $crawler->text());
+ }
+
+ public function groups_manage_test_data()
+ {
+ return array(
+ array('', 'GROUP_UPDATED'),
+ array('aa0000', 'GROUP_UPDATED'),
+
+ array('AAG000','WRONG_DATA_COLOUR'),
+ array('#AA0000', 'WRONG_DATA_COLOUR'),
+ );
+ }
+
+ /**
+ * @dataProvider groups_manage_test_data
+ */
+ public function test_groups_manage($input, $expected)
+ {
+ $this->login();
+ $this->admin_login();
+ $this->add_lang(array('ucp', 'acp/groups'));
+
+ // Manage Administrators group
+ $crawler = self::request('GET', $this->get_url() . '&g=5&sid=' . $this->sid);
+ $form = $crawler->selectButton($this->lang('SUBMIT'))->form();
+ $form['group_colour']->setValue($input);
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang($expected), $crawler->text());
+ }
+
+ public function group_avatar_min_max_data()
+ {
+ return array(
+ array('uploadurl', 'foo', 'TOO_SHORT'),
+ array('uploadurl', 'foobar', 'AVATAR_URL_INVALID'),
+ array('uploadurl', str_repeat('f', 256), 'TOO_LONG'),
+ array('remotelink', 'foo', 'TOO_SHORT'),
+ array('remotelink', 'foobar', 'AVATAR_URL_INVALID'),
+ array('remotelink', str_repeat('f', 256), 'TOO_LONG'),
+ );
+ }
+
+ /**
+ * @dataProvider group_avatar_min_max_data
+ */
+ public function test_group_avatar_min_max($form_name, $input, $expected)
+ {
+ $this->login();
+ $this->admin_login();
+ $this->add_lang(array('ucp', 'acp/groups'));
+ $this->enable_all_avatars();
+
+ $crawler = self::request('GET', $this->get_url() . '&g=5&sid=' . $this->sid);
+ $form = $crawler->selectButton($this->lang('SUBMIT'))->form();
+ $form[$form_name]->setValue($input);
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang($expected), $crawler->text());
+ }
+}
diff --git a/tests/functional/forum_style_test.php b/tests/functional/forum_style_test.php
new file mode 100644
index 0000000000..59f7341eb6
--- /dev/null
+++ b/tests/functional/forum_style_test.php
@@ -0,0 +1,45 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @group functional
+*/
+class phpbb_functional_forum_style_test extends phpbb_functional_test_case
+{
+ public function test_default_forum_style()
+ {
+ $crawler = self::request('GET', 'viewtopic.php?t=1&f=2');
+ $this->assertContains('styles/prosilver/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+
+ $crawler = self::request('GET', 'viewtopic.php?t=1');
+ $this->assertContains('styles/prosilver/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+
+ $crawler = self::request('GET', 'viewtopic.php?t=1&view=next');
+ $this->assertContains('styles/prosilver/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+ }
+
+ public function test_custom_forum_style()
+ {
+ $db = $this->get_db();
+ $this->add_style(2, 'test_style');
+ $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET forum_style = 2 WHERE forum_id = 2');
+
+ $crawler = self::request('GET', 'viewtopic.php?t=1&f=2');
+ $this->assertContains('styles/test_style/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+
+ $crawler = self::request('GET', 'viewtopic.php?t=1');
+ $this->assertContains('styles/test_style/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+
+ $crawler = self::request('GET', 'viewtopic.php?t=1&view=next');
+ $this->assertContains('styles/test_style/', $crawler->filter('head > link[rel=stylesheet]')->attr('href'));
+
+ $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET forum_style = 0 WHERE forum_id = 2');
+ $this->delete_style(2, 'test_style');
+ }
+}
diff --git a/tests/functional/mcp_test.php b/tests/functional/mcp_test.php
new file mode 100644
index 0000000000..f65a7d0784
--- /dev/null
+++ b/tests/functional/mcp_test.php
@@ -0,0 +1,67 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @group functional
+*/
+class phpbb_functional_mcp_test extends phpbb_functional_test_case
+{
+ public function test_post_new_topic()
+ {
+ $this->login();
+
+ // Test creating topic
+ $post = $this->create_topic(2, 'Test Topic 2', 'Testing move post with "Move posts" option from Quick-Moderator Tools.');
+
+ $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
+ $this->assertContains('Testing move post with "Move posts" option from Quick-Moderator Tools.', $crawler->filter('html')->text());
+
+ return $crawler;
+ }
+
+ /**
+ * @depends test_post_new_topic
+ */
+ public function test_handle_quickmod($crawler)
+ {
+ // Test moving a post
+ $form = $crawler->selectButton('Go')->eq(1)->form();
+ $form['action']->select('merge');
+ $crawler = self::submit($form);
+
+ return $crawler;
+ }
+
+ /**
+ * @depends test_handle_quickmod
+ */
+ public function test_move_post_to_topic($crawler)
+ {
+ // Select the post in MCP
+ $form = $crawler->selectButton($this->lang('SUBMIT'))->form(array(
+ 'to_topic_id' => 1,
+ ));
+ $form['post_id_list'][0]->tick();
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('MERGE_POSTS'), $crawler->filter('html')->text());
+
+ return $crawler;
+ }
+
+ /**
+ * @depends test_move_post_to_topic
+ */
+ public function test_confirm_result($crawler)
+ {
+ $this->add_lang('mcp');
+ $form = $crawler->selectButton('Yes')->form();
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('POSTS_MERGED_SUCCESS'), $crawler->text());
+ }
+}
diff --git a/tests/functional/posting_test.php b/tests/functional/posting_test.php
new file mode 100644
index 0000000000..7fd1e4fdcf
--- /dev/null
+++ b/tests/functional/posting_test.php
@@ -0,0 +1,35 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @group functional
+*/
+class phpbb_functional_posting_test extends phpbb_functional_test_case
+{
+ public function test_post_new_topic()
+ {
+ $this->login();
+
+ // Test creating topic
+ $post = $this->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
+
+ $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
+ $this->assertContains('This is a test topic posted by the testing framework.', $crawler->filter('html')->text());
+
+ // Test creating a reply
+ $post2 = $this->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test post posted by the testing framework.');
+
+ $crawler = self::request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
+ $this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
+
+ // Test quoting a message
+ $crawler = self::request('GET', "posting.php?mode=quote&f=2&t={$post2['topic_id']}&p={$post2['post_id']}&sid={$this->sid}");
+ $this->assertContains('This is a test post posted by the testing framework.', $crawler->filter('html')->text());
+ }
+}
diff --git a/tests/functional/report_post_captcha_test.php b/tests/functional/report_post_captcha_test.php
new file mode 100644
index 0000000000..8283465041
--- /dev/null
+++ b/tests/functional/report_post_captcha_test.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ *
+ * @package testing
+ * @copyright (c) 2013 phpBB Group
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+ *
+ */
+
+/**
+ * @group functional
+ */
+class phpbb_functional_report_post_captcha_test extends phpbb_functional_test_case
+{
+ public function test_guest_report_post()
+ {
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->add_lang('mcp');
+ $this->assertContains($this->lang('USER_CANNOT_REPORT'), $crawler->filter('html')->text());
+
+ $this->set_reporting_guest(1);
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->assertContains($this->lang('CONFIRM_CODE'), $crawler->filter('html')->text());
+ $this->set_reporting_guest(-1);
+ }
+
+ public function test_user_report_post()
+ {
+ $this->login();
+ $crawler = self::request('GET', 'report.php?f=2&p=1');
+ $this->assertNotContains($this->lang('CONFIRM_CODE'), $crawler->filter('html')->text());
+
+ $this->add_lang('mcp');
+ $form = $crawler->selectButton($this->lang('SUBMIT'))->form();
+ $crawler = self::submit($form);
+ $this->assertContains($this->lang('POST_REPORTED_SUCCESS'), $crawler->text());
+ }
+
+ protected function set_reporting_guest($report_post_allowed)
+ {
+ $this->login();
+ $this->admin_login();
+
+ $crawler = self::request('GET', 'adm/index.php?i=permissions&icat=12&mode=setting_group_local&sid=' . $this->sid);
+ $form = $crawler->selectButton('Submit')->form();
+ $values = $form->getValues();
+ $values["group_id[0]"] = 1;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $form = $crawler->selectButton('Submit')->form();
+ $values = $form->getValues();
+ $values["forum_id"] = 2;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $this->add_lang('acp/permissions');
+ $form = $crawler->selectButton($this->lang('APPLY_ALL_PERMISSIONS'))->form();
+ $values = $form->getValues();
+ $values["setting[1][2][f_report]"] = $report_post_allowed;
+ $form->setValues($values);
+ $crawler = self::submit($form);
+
+ $crawler = self::request('GET', 'ucp.php?mode=logout&sid=' . $this->sid);
+ }
+}
diff --git a/tests/functional/ucp_groups_test.php b/tests/functional/ucp_groups_test.php
new file mode 100644
index 0000000000..9c6b1edc5e
--- /dev/null
+++ b/tests/functional/ucp_groups_test.php
@@ -0,0 +1,21 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/common_groups_test.php';
+
+/**
+* @group functional
+*/
+class phpbb_functional_ucp_groups_test extends phpbb_functional_common_groups_test
+{
+ protected function get_url()
+ {
+ return 'ucp.php?i=groups&mode=manage&action=edit';
+ }
+}
diff --git a/tests/functions/clean_path_test.php b/tests/functions/clean_path_test.php
new file mode 100644
index 0000000000..bcbe9838d9
--- /dev/null
+++ b/tests/functions/clean_path_test.php
@@ -0,0 +1,44 @@
+<?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_clean_path_test extends phpbb_test_case
+{
+ public function clean_path_test_data()
+ {
+ return array(
+ array('foo', 'foo'),
+ array('foo/bar', 'foo/bar'),
+ array('foo/bar/', 'foo/bar/'),
+ array('foo/./bar', 'foo/bar'),
+ array('foo/./././bar', 'foo/bar'),
+ array('foo/bar/.', 'foo/bar'),
+ array('./foo/bar', './foo/bar'),
+ array('../foo/bar', '../foo/bar'),
+ array('one/two/three', 'one/two/three'),
+ array('one/two/../three', 'one/three'),
+ array('one/../two/three', 'two/three'),
+ array('one/two/..', 'one'),
+ array('one/two/../', 'one/'),
+ array('one/two/../three/../four', 'one/four'),
+ array('one/two/three/../../four', 'one/four'),
+ );
+ }
+
+ /**
+ * @dataProvider clean_path_test_data
+ */
+ public function test_clean_path($input, $expected)
+ {
+ $output = phpbb_clean_path($input);
+
+ $this->assertEquals($expected, $output);
+ }
+}
diff --git a/tests/functions/fixtures/language_select.xml b/tests/functions/fixtures/language_select.xml
new file mode 100644
index 0000000000..d7232a3d28
--- /dev/null
+++ b/tests/functions/fixtures/language_select.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_lang">
+ <column>lang_id</column>
+ <column>lang_iso</column>
+ <column>lang_local_name</column>
+ <column>lang_english_name</column>
+ <row>
+ <value>1</value>
+ <value>en</value>
+ <value>English</value>
+ <value>English</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>cs</value>
+ <value>Čeština</value>
+ <value>Czech</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions/fixtures/obtain_online.xml b/tests/functions/fixtures/obtain_online.xml
new file mode 100644
index 0000000000..05bbe6a05e
--- /dev/null
+++ b/tests/functions/fixtures/obtain_online.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_sessions">
+ <column>session_id</column>
+ <column>session_user_id</column>
+ <column>session_forum_id</column>
+ <column>session_time</column>
+ <column>session_ip</column>
+ <column>session_viewonline</column>
+ </table>
+ <table name="phpbb_users">
+ <column>user_id</column>
+ <column>username_clean</column>
+ <column>username</column>
+ <column>user_allow_viewonline</column>
+ <column>user_permissions</column>
+ <column>user_sig</column>
+ <column>user_occ</column>
+ <column>user_interests</column>
+ <row>
+ <value>1</value>
+ <value>anonymous</value>
+ <value>anonymous</value>
+ <value>1</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>2</value>
+ <value>2</value>
+ <value>1</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>3</value>
+ <value>3</value>
+ <value>1</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>4</value>
+ <value>4</value>
+ <value>4</value>
+ <value>1</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>5</value>
+ <value>5</value>
+ <value>1</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>6</value>
+ <value>6</value>
+ <value>6</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>7</value>
+ <value>7</value>
+ <value>7</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>8</value>
+ <value>8</value>
+ <value>8</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>9</value>
+ <value>9</value>
+ <value>9</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>10</value>
+ <value>10</value>
+ <value>10</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions/fixtures/style_select.xml b/tests/functions/fixtures/style_select.xml
new file mode 100644
index 0000000000..12d6392ab5
--- /dev/null
+++ b/tests/functions/fixtures/style_select.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_styles">
+ <column>style_id</column>
+ <column>style_name</column>
+ <column>style_active</column>
+ <row>
+ <value>1</value>
+ <value>prosilver</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>subsilver2</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>zoo</value>
+ <value>0</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions/fixtures/validate_email.xml b/tests/functions/fixtures/validate_email.xml
new file mode 100644
index 0000000000..de7fce8a08
--- /dev/null
+++ b/tests/functions/fixtures/validate_email.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_users">
+ <column>user_id</column>
+ <column>username</column>
+ <column>username_clean</column>
+ <column>user_permissions</column>
+ <column>user_sig</column>
+ <column>user_occ</column>
+ <column>user_interests</column>
+ <column>user_email_hash</column>
+ <row>
+ <value>1</value>
+ <value>admin</value>
+ <value>admin</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value>143317126117</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions/fixtures/validate_username.xml b/tests/functions/fixtures/validate_username.xml
new file mode 100644
index 0000000000..fbe398469c
--- /dev/null
+++ b/tests/functions/fixtures/validate_username.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_groups">
+ <column>group_name</column>
+ <column>group_desc</column>
+ <row>
+ <value>foobar_group</value>
+ <value>test123</value>
+ </row>
+ </table>
+ <table name="phpbb_users">
+ <column>user_id</column>
+ <column>username</column>
+ <column>username_clean</column>
+ <column>user_permissions</column>
+ <column>user_sig</column>
+ <column>user_occ</column>
+ <column>user_interests</column>
+ <row>
+ <value>1</value>
+ <value>admin</value>
+ <value>admin</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>moderator</value>
+ <value>moderator</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions/get_formatted_filesize_test.php b/tests/functions/get_formatted_filesize_test.php
new file mode 100644
index 0000000000..96ea2be132
--- /dev/null
+++ b/tests/functions/get_formatted_filesize_test.php
@@ -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);
+ }
+}
diff --git a/tests/functions/get_remote_file_test.php b/tests/functions/get_remote_file_test.php
new file mode 100644
index 0000000000..4032ca5b58
--- /dev/null
+++ b/tests/functions/get_remote_file_test.php
@@ -0,0 +1,75 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_admin.php';
+
+/**
+* @group slow
+*/
+class phpbb_functions_get_remote_file extends phpbb_test_case
+{
+ public function test_version_phpbb_com()
+ {
+ $hostname = 'version.phpbb.com';
+
+ if (!phpbb_checkdnsrr($hostname, 'A'))
+ {
+ $this->markTestSkipped(sprintf(
+ 'Could not find a DNS record for hostname %s. ' .
+ 'Assuming network is down.',
+ $hostname
+ ));
+ }
+
+ $errstr = $errno = null;
+ $file = get_remote_file($hostname, '/phpbb', '30x.txt', $errstr, $errno);
+
+ $this->assertNotEquals(
+ 0,
+ strlen($file),
+ 'Failed asserting that the response is not empty.'
+ );
+
+ $this->assertSame(
+ '',
+ $errstr,
+ 'Failed asserting that the error string is empty.'
+ );
+
+ $this->assertSame(
+ 0,
+ $errno,
+ 'Failed asserting that the error number is 0 (i.e. no error occurred).'
+ );
+
+ $lines = explode("\n", $file);
+
+ $this->assertGreaterThanOrEqual(
+ 2,
+ sizeof($lines),
+ 'Failed asserting that the version file has at least two lines.'
+ );
+
+ $this->assertStringStartsWith(
+ '3.',
+ $lines[0],
+ "Failed asserting that the first line of the version file starts with '3.'"
+ );
+
+ $this->assertNotSame(
+ false,
+ filter_var($lines[1], FILTER_VALIDATE_URL),
+ 'Failed asserting that the second line of the version file is a valid URL.'
+ );
+
+ $this->assertContains('http', $lines[1]);
+ $this->assertContains('phpbb.com', $lines[1], '', true);
+ }
+}
diff --git a/tests/functions/is_absolute_test.php b/tests/functions/is_absolute_test.php
new file mode 100644
index 0000000000..7630b7c58c
--- /dev/null
+++ b/tests/functions/is_absolute_test.php
@@ -0,0 +1,56 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 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_functions_is_absolute_test extends phpbb_test_case
+{
+ static public function is_absolute_data()
+ {
+ return array(
+ // Empty
+ array('', false),
+
+ // Absolute unix style
+ array('/etc/phpbb', true),
+ // Unix does not support \ so that is not an absolute path
+ array('\etc\phpbb', false),
+
+ // Absolute windows style
+ array('c:\windows', true),
+ array('C:\Windows', true),
+ array('c:/windows', true),
+ array('C:/Windows', true),
+
+ // Executable
+ array('etc/phpbb', false),
+ array('explorer.exe', false),
+
+ // Relative subdir
+ array('Windows\System32', false),
+ array('Windows\System32\explorer.exe', false),
+ array('Windows/System32', false),
+ array('Windows/System32/explorer.exe', false),
+
+ // Relative updir
+ array('..\Windows\System32', false),
+ array('..\Windows\System32\explorer.exe', false),
+ array('../Windows/System32', false),
+ array('../Windows/System32/explorer.exe', false),
+ );
+ }
+
+ /**
+ * @dataProvider is_absolute_data
+ */
+ public function test_is_absolute($path, $expected)
+ {
+ $this->assertEquals($expected, is_absolute($path));
+ }
+}
diff --git a/tests/functions/language_select_test.php b/tests/functions/language_select_test.php
new file mode 100644
index 0000000000..3341e2a256
--- /dev/null
+++ b/tests/functions/language_select_test.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 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_functions_language_select_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/language_select.xml');
+ }
+
+ static public function language_select_data()
+ {
+ return array(
+ array('', '<option value="cs">Čeština</option><option value="en">English</option>'),
+ array('en', '<option value="cs">Čeština</option><option value="en" selected="selected">English</option>'),
+ array('cs', '<option value="cs" selected="selected">Čeština</option><option value="en">English</option>'),
+ array('de', '<option value="cs">Čeština</option><option value="en">English</option>'),
+ );
+ }
+
+ /**
+ * @dataProvider language_select_data
+ */
+ public function test_language_select($default, $expected)
+ {
+ global $db;
+ $db = $this->new_dbal();
+
+ $this->assertEquals($expected, language_select($default));
+ }
+}
diff --git a/tests/functions/obtain_online_test.php b/tests/functions/obtain_online_test.php
new file mode 100644
index 0000000000..b3beb55a96
--- /dev/null
+++ b/tests/functions/obtain_online_test.php
@@ -0,0 +1,238 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/auth.php';
+
+class phpbb_functions_obtain_online_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/obtain_online.xml');
+ }
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ global $config, $db;
+
+ $db = $this->db = $this->new_dbal();
+ $config = array(
+ 'load_online_time' => 5,
+ );
+ }
+
+ static public function obtain_guest_count_data()
+ {
+ return array(
+ array(0, 2),
+ array(1, 1),
+ );
+ }
+
+ /**
+ * @dataProvider obtain_guest_count_data
+ */
+ public function test_obtain_guest_count($forum_id, $expected)
+ {
+ $this->db->sql_query('DELETE FROM phpbb_sessions');
+
+ $time = time();
+ $this->create_guest_sessions($time);
+ $this->assertEquals($expected, obtain_guest_count($forum_id));
+ }
+
+ static public function obtain_users_online_data()
+ {
+ return array(
+ array(0, false, array(
+ 'online_users' => array(2 => 2, 3 => 3, 6 => 6, 7 => 7, 10 => 10),
+ 'hidden_users' => array(6 => 6, 7 => 7, 10 => 10),
+ 'total_online' => 5,
+ 'visible_online' => 2,
+ 'hidden_online' => 3,
+ 'guests_online' => 0,
+ )),
+ array(0, true, array(
+ 'online_users' => array(2 => 2, 3 => 3, 6 => 6, 7 => 7, 10 => 10),
+ 'hidden_users' => array(6 => 6, 7 => 7, 10 => 10),
+ 'total_online' => 7,
+ 'visible_online' => 2,
+ 'hidden_online' => 3,
+ 'guests_online' => 2,
+ )),
+ array(1, false, array(
+ 'online_users' => array(3 => 3, 7 => 7),
+ 'hidden_users' => array(7 => 7),
+ 'total_online' => 2,
+ 'visible_online' => 1,
+ 'hidden_online' => 1,
+ 'guests_online' => 0,
+ )),
+ array(1, true, array(
+ 'online_users' => array(3 => 3, 7 => 7),
+ 'hidden_users' => array(7 => 7),
+ 'total_online' => 3,
+ 'visible_online' => 1,
+ 'hidden_online' => 1,
+ 'guests_online' => 1,
+ )),
+ array(2, false, array(
+ 'online_users' => array(),
+ 'hidden_users' => array(),
+ 'total_online' => 0,
+ 'visible_online' => 0,
+ 'hidden_online' => 0,
+ 'guests_online' => 0,
+ )),
+ array(2, true, array(
+ 'online_users' => array(),
+ 'hidden_users' => array(),
+ 'total_online' => 0,
+ 'visible_online' => 0,
+ 'hidden_online' => 0,
+ 'guests_online' => 0,
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider obtain_users_online_data
+ */
+ public function test_obtain_users_online($forum_id, $display_guests, $expected)
+ {
+ $this->db->sql_query('DELETE FROM phpbb_sessions');
+
+ global $config;
+ $config['load_online_guests'] = $display_guests;
+
+ $time = time();
+ $this->create_guest_sessions($time);
+ $this->create_user_sessions($time);
+ $this->assertEquals($expected, obtain_users_online($forum_id));
+ }
+
+ static public function obtain_users_online_string_data()
+ {
+ return array(
+ array(0, false, array(
+ 'online_userlist' => 'REGISTERED_USERS 2, 3',
+ 'l_online_users' => 'ONLINE_USERS_TOTAL 5REG_USERS_TOTAL_AND 2HIDDEN_USERS_TOTAL 3',
+ )),
+ array(0, true, array(
+ 'online_userlist' => 'REGISTERED_USERS 2, 3',
+ 'l_online_users' => 'ONLINE_USERS_TOTAL 7REG_USERS_TOTAL 2HIDDEN_USERS_TOTAL_AND 3GUEST_USERS_TOTAL 2',
+ )),
+ array(1, false, array(
+ 'online_userlist' => 'BROWSING_FORUM 3',
+ 'l_online_users' => 'ONLINE_USERS_TOTAL 2REG_USER_TOTAL_AND 1HIDDEN_USER_TOTAL 1',
+ )),
+ array(1, true, array(
+ 'online_userlist' => 'BROWSING_FORUM_GUEST 3 1',
+ 'l_online_users' => 'ONLINE_USERS_TOTAL 3REG_USER_TOTAL 1HIDDEN_USER_TOTAL_AND 1GUEST_USER_TOTAL 1',
+ )),
+ array(2, false, array(
+ 'online_userlist' => 'BROWSING_FORUM NO_ONLINE_USERS',
+ 'l_online_users' => 'ONLINE_USERS_ZERO_TOTAL 0REG_USERS_ZERO_TOTAL_AND 0HIDDEN_USERS_ZERO_TOTAL 0',
+ )),
+ array(2, true, array(
+ 'online_userlist' => 'BROWSING_FORUM_GUESTS NO_ONLINE_USERS 0',
+ 'l_online_users' => 'ONLINE_USERS_ZERO_TOTAL 0REG_USERS_ZERO_TOTAL 0HIDDEN_USERS_ZERO_TOTAL_AND 0GUEST_USERS_ZERO_TOTAL 0',
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider obtain_users_online_string_data
+ */
+ public function test_obtain_users_online_string($forum_id, $display_guests, $expected)
+ {
+ $this->db->sql_query('DELETE FROM phpbb_sessions');
+
+ global $config, $user, $auth;
+ $config['load_online_guests'] = $display_guests;
+ $user->lang = $this->load_language();
+ $auth = $this->getMock('auth');
+ $acl_get_map = array(
+ array('u_viewonline', true),
+ );
+ $auth->expects($this->any())
+ ->method('acl_get')
+ ->with($this->stringContains('_'),
+ $this->anything())
+ ->will($this->returnValueMap($acl_get_map));
+
+ $time = time();
+ $this->create_guest_sessions($time);
+ $this->create_user_sessions($time);
+
+ $online_users = obtain_users_online($forum_id);
+ $this->assertEquals($expected, obtain_users_online_string($online_users, $forum_id));
+ }
+
+ protected function create_guest_sessions($time)
+ {
+ $this->add_session(1, '0001', '192.168.0.1', 0, true, $time);
+ $this->add_session(1, '0002', '192.168.0.2', 1, true, $time);
+ $this->add_session(1, '0003', '192.168.0.3', 0, true, $time, 10);
+ $this->add_session(1, '0004', '192.168.0.4', 1, true, $time, 10);
+ }
+
+ protected function create_user_sessions($time)
+ {
+ $this->add_session(2, '0005', '192.168.0.5', 0, true, $time);
+ $this->add_session(3, '0006', '192.168.0.6', 1, true, $time);
+ $this->add_session(4, '0007', '192.168.0.7', 0, true, $time, 10);
+ $this->add_session(5, '0008', '192.168.0.8', 1, true, $time, 10);
+ $this->add_session(6, '0005', '192.168.0.9', 0, false, $time);
+ $this->add_session(7, '0006', '192.168.0.10', 1, false, $time);
+ $this->add_session(8, '0007', '192.168.0.11', 0, false, $time, 10);
+ $this->add_session(9, '0008', '192.168.0.12', 1, false, $time, 10);
+ $this->add_session(10, '009', '192.168.0.13', 0, false, $time);
+ }
+
+ protected function add_session($user_id, $session_id, $user_ip, $forum_id, $view_online, $time, $time_delta = 0)
+ {
+ $sql_ary = array(
+ 'session_id' => $user_id . '_' . $forum_id . '_session00000000000000000' . $session_id,
+ 'session_user_id' => $user_id,
+ 'session_ip' => $user_ip,
+ 'session_forum_id' => $forum_id,
+ 'session_time' => $time - $time_delta * 60,
+ 'session_viewonline' => $view_online,
+ );
+ $this->db->sql_query('INSERT INTO phpbb_sessions ' . $this->db->sql_build_array('INSERT', $sql_ary));
+ }
+
+ protected function load_language()
+ {
+ $lang = array(
+ 'NO_ONLINE_USERS' => 'NO_ONLINE_USERS',
+ 'REGISTERED_USERS' => 'REGISTERED_USERS',
+ 'BROWSING_FORUM' => 'BROWSING_FORUM %s',
+ 'BROWSING_FORUM_GUEST' => 'BROWSING_FORUM_GUEST %s %d',
+ 'BROWSING_FORUM_GUESTS' => 'BROWSING_FORUM_GUESTS %s %d',
+ );
+ $vars_online = array('ONLINE', 'REG', 'HIDDEN', 'GUEST');
+ foreach ($vars_online as $online)
+ {
+ $lang = array_merge($lang, array(
+ $online . '_USERS_ZERO_TOTAL' => $online . '_USERS_ZERO_TOTAL %d',
+ $online . '_USER_TOTAL' => $online . '_USER_TOTAL %d',
+ $online . '_USERS_TOTAL' => $online . '_USERS_TOTAL %d',
+ $online . '_USERS_ZERO_TOTAL_AND' => $online . '_USERS_ZERO_TOTAL_AND %d',
+ $online . '_USER_TOTAL_AND' => $online . '_USER_TOTAL_AND %d',
+ $online . '_USERS_TOTAL_AND' => $online . '_USERS_TOTAL_AND %d',
+ ));
+ }
+ return $lang;
+ }
+}
diff --git a/tests/functions/style_select_test.php b/tests/functions/style_select_test.php
new file mode 100644
index 0000000000..1e44f3c2cb
--- /dev/null
+++ b/tests/functions/style_select_test.php
@@ -0,0 +1,41 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 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_functions_style_select_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/style_select.xml');
+ }
+
+ static public function style_select_data()
+ {
+ return array(
+ array('', false, '<option value="1">prosilver</option><option value="2">subsilver2</option>'),
+ array('', true, '<option value="1">prosilver</option><option value="2">subsilver2</option><option value="3">zoo</option>'),
+ array('1', false, '<option value="1" selected="selected">prosilver</option><option value="2">subsilver2</option>'),
+ array('1', true, '<option value="1" selected="selected">prosilver</option><option value="2">subsilver2</option><option value="3">zoo</option>'),
+ array('3', false, '<option value="1">prosilver</option><option value="2">subsilver2</option>'),
+ array('3', true, '<option value="1">prosilver</option><option value="2">subsilver2</option><option value="3" selected="selected">zoo</option>'),
+ );
+ }
+
+ /**
+ * @dataProvider style_select_data
+ */
+ public function test_style_select($default, $all, $expected)
+ {
+ global $db;
+ $db = $this->new_dbal();
+
+ $this->assertEquals($expected, style_select($default, $all));
+ }
+}
diff --git a/tests/functions/validate_data_helper.php b/tests/functions/validate_data_helper.php
new file mode 100644
index 0000000000..b92a3aa5eb
--- /dev/null
+++ b/tests/functions/validate_data_helper.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_functions_validate_data_helper
+{
+ protected $test_case;
+
+ public function __construct($test_case)
+ {
+ $this->test_case = $test_case;
+ }
+
+ /**
+ * Test provided input data with supplied checks and compare to expected
+ * results
+ *
+ * @param array $data Array containing one or more subarrays with the
+ * test data. The first element of a subarray is the
+ * expected result, the second one is the input, and the
+ * third is the data that should be passed to the function
+ * validate_data().
+ */
+ public function assert_valid_data($data)
+ {
+ foreach ($data as $key => $test)
+ {
+ $this->test_case->assertEquals($test[0], validate_data(array($test[1]), array($test[2])));
+ }
+ }
+}
diff --git a/tests/functions/validate_date_test.php b/tests/functions/validate_date_test.php
new file mode 100644
index 0000000000..1dcd1361a2
--- /dev/null
+++ b/tests/functions/validate_date_test.php
@@ -0,0 +1,82 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_date_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_date()
+ {
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ array('INVALID'),
+ '',
+ array('date'),
+ ),
+ 'empty_opt' => array(
+ array(),
+ '',
+ array('date', true),
+ ),
+ 'double_single' => array(
+ array(),
+ '17-06-1990',
+ array('date'),
+ ),
+ 'single_single' => array(
+ array(),
+ '05-05-2009',
+ array('date'),
+ ),
+ 'double_double' => array(
+ array(),
+ '17-12-1990',
+ array('date'),
+ ),
+ 'month_high' => array(
+ array('INVALID'),
+ '17-17-1990',
+ array('date'),
+ ),
+ 'month_low' => array(
+ array('INVALID'),
+ '01-00-1990',
+ array('date'),
+ ),
+ 'day_high' => array(
+ array('INVALID'),
+ '64-01-1990',
+ array('date'),
+ ),
+ 'day_low' => array(
+ array('INVALID'),
+ '00-12-1990',
+ array('date'),
+ ),
+ // Currently fails
+ /*
+ 'zero_year' => array(
+ array(),
+ '01-01-0000',
+ array('date'),
+ ),
+ */
+ ));
+ }
+}
diff --git a/tests/functions/validate_email_test.php b/tests/functions/validate_email_test.php
new file mode 100644
index 0000000000..9a6ce39251
--- /dev/null
+++ b/tests/functions/validate_email_test.php
@@ -0,0 +1,108 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/../mock/user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_email_test extends phpbb_database_test_case
+{
+ protected $db;
+ protected $user;
+ protected $helper;
+
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/validate_email.xml');
+ }
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->db = $this->new_dbal();
+ $this->user = new phpbb_mock_user;
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ /**
+ * Get validation prerequesites
+ *
+ * @param bool $check_mx Whether mx records should be checked
+ */
+ protected function set_validation_prerequisites($check_mx)
+ {
+ global $config, $db, $user;
+
+ $config['email_check_mx'] = $check_mx;
+ $db = $this->db;
+ $user = $this->user;
+ $user->optionset('banned_users', array('banned@example.com'));
+ }
+
+ public function test_validate_email()
+ {
+ $this->set_validation_prerequisites(false);
+
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ array(),
+ '',
+ array('email'),
+ ),
+ 'allowed' => array(
+ array(),
+ 'foobar@example.com',
+ array('email', 'foobar@example.com'),
+ ),
+ 'invalid' => array(
+ array('EMAIL_INVALID'),
+ 'fööbar@example.com',
+ array('email'),
+ ),
+ 'valid_complex' => array(
+ array(),
+ "'%$~test@example.com",
+ array('email'),
+ ),
+ 'taken' => array(
+ array('EMAIL_TAKEN'),
+ 'admin@example.com',
+ array('email'),
+ ),
+ 'banned' => array(
+ array('EMAIL_BANNED'),
+ 'banned@example.com',
+ array('email'),
+ ),
+ ));
+ }
+
+ /**
+ * @group slow
+ */
+ public function test_validate_email_mx()
+ {
+ $this->set_validation_prerequisites(true);
+
+ $this->helper->assert_valid_data(array(
+ 'valid' => array(
+ array(),
+ 'foobar@phpbb.com',
+ array('email'),
+ ),
+ 'no_mx' => array(
+ array('DOMAIN_NO_MX_RECORD'),
+ 'test@does-not-exist.phpbb.com',
+ array('email'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_hex_colour_test.php b/tests/functions/validate_hex_colour_test.php
new file mode 100644
index 0000000000..812ebe5eeb
--- /dev/null
+++ b/tests/functions/validate_hex_colour_test.php
@@ -0,0 +1,121 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+
+class phpbb_functions_validate_hex_colour_test extends phpbb_test_case
+{
+ public function positive_match_data()
+ {
+ return array(
+ array('a00'),
+ array('AFF'),
+ array('AA0000'),
+ array('aa00FF'),
+ array('000'),
+ array('000000'),
+ );
+ }
+
+ public function negative_match_data()
+ {
+ return array(
+ // Invalid prefix
+ array('#aa0'),
+ array('#AA0000'),
+ array('vAA0000'),
+
+ // Invalid suffix
+ array('AA0000v'),
+
+ // Correct length, but out of hex range
+ array('ag0'),
+ array('AAG000'),
+
+ // Too long
+ array('AA00000'),
+ array('AA0000 '),
+ array('AA0000 abf'),
+ array('AA0000 AA0000'),
+
+ // empty()
+ array('0'),
+ );
+ }
+
+ public function optional_only_data()
+ {
+ return array(
+ // The empty colour, i.e. "no colour".
+ array(''),
+ );
+ }
+
+ public function strict_negative_match_data()
+ {
+ return array_merge(
+ $this->negative_match_data(),
+ $this->optional_only_data()
+ );
+ }
+
+ public function nonstrict_positive_match_data()
+ {
+ return array_merge(
+ $this->positive_match_data(),
+ $this->optional_only_data()
+ );
+ }
+
+ /**
+ * @dataProvider positive_match_data
+ */
+ public function test_strict_positive_match($input)
+ {
+ $this->assertFalse(
+ phpbb_validate_hex_colour($input, false),
+ "Failed asserting that $input passes as a valid hex colour."
+ );
+ }
+
+ /**
+ * @dataProvider strict_negative_match_data
+ */
+ public function test_strict_negative_match($input)
+ {
+ $this->assertSame(
+ 'WRONG_DATA',
+ phpbb_validate_hex_colour($input, false),
+ "Failed asserting that $input does not pass as a valid hex colour."
+ );
+ }
+
+ /**
+ * @dataProvider nonstrict_positive_match_data
+ */
+ public function test_nonstrict_positive_match($input)
+ {
+ $this->assertFalse(
+ phpbb_validate_hex_colour($input, true),
+ "Failed asserting that $input passes as a valid or optional hex colour."
+ );
+ }
+
+ /**
+ * @dataProvider negative_match_data
+ */
+ public function test_nonstrict_negative_match($input)
+ {
+ $this->assertSame(
+ 'WRONG_DATA',
+ phpbb_validate_hex_colour($input, true),
+ "Failed asserting that $input does not pass as a valid or optional hex colour."
+ );
+ }
+}
diff --git a/tests/functions/validate_jabber_test.php b/tests/functions/validate_jabber_test.php
new file mode 100644
index 0000000000..5a53c963bd
--- /dev/null
+++ b/tests/functions/validate_jabber_test.php
@@ -0,0 +1,79 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_jabber_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_jabber()
+ {
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ array(),
+ '',
+ array('jabber'),
+ ),
+ 'no_seperator' => array(
+ array('WRONG_DATA'),
+ 'testjabber.ccc',
+ array('jabber'),
+ ),
+ 'no_user' => array(
+ array('WRONG_DATA'),
+ '@jabber.ccc',
+ array('jabber'),
+ ),
+ 'no_realm' => array(
+ array('WRONG_DATA'),
+ 'user@',
+ array('jabber'),
+ ),
+ 'dot_realm' => array(
+ array('WRONG_DATA'),
+ 'user@.....',
+ array('jabber'),
+ ),
+ '-realm' => array(
+ array('WRONG_DATA'),
+ 'user@-jabber.ccc',
+ array('jabber'),
+ ),
+ 'realm-' => array(
+ array('WRONG_DATA'),
+ 'user@jabber.ccc-',
+ array('jabber'),
+ ),
+ 'correct' => array(
+ array(),
+ 'user@jabber.09A-z.org',
+ array('jabber'),
+ ),
+ 'prohibited' => array(
+ array('WRONG_DATA'),
+ 'u@ser@jabber.ccc.org',
+ array('jabber'),
+ ),
+ 'prohibited_char' => array(
+ array('WRONG_DATA'),
+ 'u<s>er@jabber.ccc.org',
+ array('jabber'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_lang_iso_test.php b/tests/functions/validate_lang_iso_test.php
new file mode 100644
index 0000000000..c8a5b71021
--- /dev/null
+++ b/tests/functions/validate_lang_iso_test.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_lang_iso_test extends phpbb_database_test_case
+{
+ protected $db;
+ protected $helper;
+
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/language_select.xml');
+ }
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->db = $this->new_dbal();
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_lang_iso()
+ {
+ global $db;
+
+ $db = $this->db;
+
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ array('WRONG_DATA'),
+ '',
+ array('language_iso_name'),
+ ),
+ 'en' => array(
+ array(),
+ 'en',
+ array('language_iso_name'),
+ ),
+ 'cs' => array(
+ array(),
+ 'cs',
+ array('language_iso_name'),
+ ),
+ 'de' => array(
+ array('WRONG_DATA'),
+ 'de',
+ array('language_iso_name'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_match_test.php b/tests/functions/validate_match_test.php
new file mode 100644
index 0000000000..73a363e003
--- /dev/null
+++ b/tests/functions/validate_match_test.php
@@ -0,0 +1,49 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_match_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_match()
+ {
+ $this->helper->assert_valid_data(array(
+ 'empty_opt' => array(
+ array(),
+ '',
+ array('match', true, '/[a-z]$/'),
+ ),
+ 'empty_empty_match' => array(
+ array(),
+ '',
+ array('match'),
+ ),
+ 'foobar' => array(
+ array(),
+ 'foobar',
+ array('match', false, '/[a-z]$/'),
+ ),
+ 'foobar_fail' => array(
+ array('WRONG_DATA'),
+ 'foobar123',
+ array('match', false, '/[a-z]$/'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_num_test.php b/tests/functions/validate_num_test.php
new file mode 100644
index 0000000000..4deac02ebc
--- /dev/null
+++ b/tests/functions/validate_num_test.php
@@ -0,0 +1,59 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_num_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_num()
+ {
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ array(),
+ '',
+ array('num'),
+ ),
+ 'zero' => array(
+ array(),
+ '0',
+ array('num'),
+ ),
+ 'five_minmax_correct' => array(
+ array(),
+ '5',
+ array('num', false, 2, 6),
+ ),
+ 'five_minmax_short' => array(
+ array('TOO_SMALL'),
+ '5',
+ array('num', false, 7, 10),
+ ),
+ 'five_minmax_long' => array(
+ array('TOO_LARGE'),
+ '5',
+ array('num', false, 2, 3),
+ ),
+ 'string' => array(
+ array(),
+ 'foobar',
+ array('num'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_password_test.php b/tests/functions/validate_password_test.php
new file mode 100644
index 0000000000..4639f6cc89
--- /dev/null
+++ b/tests/functions/validate_password_test.php
@@ -0,0 +1,96 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_password_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function validate_password_data()
+ {
+ return array(
+ array('PASS_TYPE_ANY', array(
+ 'empty' => array(),
+ 'foobar_any' => array(),
+ 'foobar_mixed' => array(),
+ 'foobar_alpha' => array(),
+ 'foobar_symbol' => array(),
+ )),
+ array('PASS_TYPE_CASE', array(
+ 'empty' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_mixed' => array(),
+ 'foobar_alpha' => array(),
+ 'foobar_symbol' => array(),
+ )),
+ array('PASS_TYPE_ALPHA', array(
+ 'empty' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_mixed' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array(),
+ 'foobar_symbol' => array(),
+ )),
+ array('PASS_TYPE_SYMBOL', array(
+ 'empty' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_mixed' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array('INVALID_CHARS'),
+ 'foobar_symbol' => array(),
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider validate_password_data
+ */
+ public function test_validate_password($pass_complexity, $expected)
+ {
+ global $config;
+
+ // Set complexity to mixed case letters, numbers and symbols
+ $config['pass_complex'] = $pass_complexity;
+
+ $this->helper->assert_valid_data(array(
+ 'empty' => array(
+ $expected['empty'],
+ '',
+ array('password'),
+ ),
+ 'foobar_any' => array(
+ $expected['foobar_any'],
+ 'foobar',
+ array('password'),
+ ),
+ 'foobar_mixed' => array(
+ $expected['foobar_mixed'],
+ 'FooBar',
+ array('password'),
+ ),
+ 'foobar_alpha' => array(
+ $expected['foobar_alpha'],
+ 'F00bar',
+ array('password'),
+ ),
+ 'foobar_symbol' => array(
+ $expected['foobar_symbol'],
+ 'fooBar123*',
+ array('password'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_string_test.php b/tests/functions/validate_string_test.php
new file mode 100644
index 0000000000..ab44c28541
--- /dev/null
+++ b/tests/functions/validate_string_test.php
@@ -0,0 +1,70 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_string_test extends phpbb_test_case
+{
+ protected $helper;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function test_validate_string()
+ {
+ $this->helper->assert_valid_data(array(
+ 'empty_opt' => array(
+ array(),
+ '',
+ array('string', true),
+ ),
+ 'empty' => array(
+ array(),
+ '',
+ array('string'),
+ ),
+ 'foo' => array(
+ array(),
+ 'foobar',
+ array('string'),
+ ),
+ 'foo_minmax_correct' => array(
+ array(),
+ 'foobar',
+ array('string', false, 2, 6),
+ ),
+ 'foo_minmax_short' => array(
+ array('TOO_SHORT'),
+ 'foobar',
+ array('string', false, 7, 9),
+ ),
+ 'foo_minmax_long' => array(
+ array('TOO_LONG'),
+ 'foobar',
+ array('string', false, 2, 5),
+ ),
+ 'empty_short' => array(
+ array('TOO_SHORT'),
+ '',
+ array('string', false, 1, 6),
+ ),
+ 'empty_length_opt' => array(
+ array(),
+ '',
+ array('string', true, 1, 6),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions/validate_username_test.php b/tests/functions/validate_username_test.php
new file mode 100644
index 0000000000..0819974e54
--- /dev/null
+++ b/tests/functions/validate_username_test.php
@@ -0,0 +1,190 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_user.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
+require_once dirname(__FILE__) . '/../mock/cache.php';
+require_once dirname(__FILE__) . '/validate_data_helper.php';
+
+class phpbb_functions_validate_data_test extends phpbb_database_test_case
+{
+ protected $db;
+ protected $cache;
+ protected $helper;
+
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/validate_username.xml');
+ }
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->db = $this->new_dbal();
+ $this->cache = new phpbb_mock_cache;
+ $this->helper = new phpbb_functions_validate_data_helper($this);
+ }
+
+ public function validate_username_data()
+ {
+ return array(
+ array('USERNAME_CHARS_ANY', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array(),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array(),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array(),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('USERNAME_TAKEN'),
+ )),
+ array('USERNAME_ALPHA_ONLY', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array('INVALID_CHARS'),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array('INVALID_CHARS'),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('INVALID_CHARS'),
+ )),
+ array('USERNAME_ALPHA_SPACERS', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array(),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array('INVALID_CHARS'),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('USERNAME_TAKEN'),
+ )),
+ array('USERNAME_LETTER_NUM', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array('INVALID_CHARS'),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array('INVALID_CHARS'),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('INVALID_CHARS'),
+ )),
+ array('USERNAME_LETTER_NUM_SPACERS', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array('INVALID_CHARS'),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array(),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array(),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('USERNAME_TAKEN'),
+ )),
+ array('USERNAME_ASCII', array(
+ 'foobar_allow' => array(),
+ 'foobar_ascii' => array(),
+ 'foobar_any' => array(),
+ 'foobar_alpha' => array(),
+ 'foobar_alpha_spacers' => array(),
+ 'foobar_letter_num' => array(),
+ 'foobar_letter_num_sp' => array('INVALID_CHARS'),
+ 'foobar_quot' => array('INVALID_CHARS'),
+ 'barfoo_disallow' => array('USERNAME_DISALLOWED'),
+ 'admin_taken' => array('USERNAME_TAKEN'),
+ 'group_taken' => array('USERNAME_TAKEN'),
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider validate_username_data
+ */
+ public function test_validate_username($allow_name_chars, $expected)
+ {
+ global $cache, $config, $db;
+
+ $db = $this->db;
+ $cache = $this->cache;
+ $cache->put('_disallowed_usernames', array('barfoo'));
+
+ $config['allow_name_chars'] = $allow_name_chars;
+
+ $this->helper->assert_valid_data(array(
+ 'foobar_allow' => array(
+ $expected['foobar_allow'],
+ 'foobar',
+ array('username', 'foobar'),
+ ),
+ 'foobar_ascii' => array(
+ $expected['foobar_ascii'],
+ 'foobar',
+ array('username'),
+ ),
+ 'foobar_any' => array(
+ $expected['foobar_any'],
+ 'f*~*^=oo_bar1',
+ array('username'),
+ ),
+ 'foobar_alpha' => array(
+ $expected['foobar_alpha'],
+ 'fo0Bar',
+ array('username'),
+ ),
+ 'foobar_alpha_spacers' => array(
+ $expected['foobar_alpha_spacers'],
+ 'Fo0-[B]_a+ R',
+ array('username'),
+ ),
+ 'foobar_letter_num' => array(
+ $expected['foobar_letter_num'],
+ 'fo0Bar0',
+ array('username'),
+ ),
+ 'foobar_letter_num_sp' => array(
+ $expected['foobar_letter_num_sp'],
+ 'Fö0-[B]_a+ R',
+ array('username'),
+ ),
+ 'foobar_quot' => array(
+ $expected['foobar_quot'],
+ '"foobar"',
+ array('username'),
+ ),
+ 'barfoo_disallow' => array(
+ $expected['barfoo_disallow'],
+ 'barfoo',
+ array('username'),
+ ),
+ 'admin_taken' => array(
+ $expected['admin_taken'],
+ 'admin',
+ array('username'),
+ ),
+ 'group_taken' => array(
+ $expected['group_taken'],
+ 'foobar_group',
+ array('username'),
+ ),
+ ));
+ }
+}
diff --git a/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml b/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml
new file mode 100644
index 0000000000..d49f76b073
--- /dev/null
+++ b/tests/functions_database_helper/fixtures/bookmarks_duplicates.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_bookmarks">
+ <column>user_id</column>
+ <column>topic_id</column>
+
+ <!-- one entry for this topic -->
+ <row>
+ <value>1</value>
+ <value>1</value>
+ </row>
+
+ <!-- non-conflicting entries -->
+ <row>
+ <value>2</value>
+ <value>2</value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>3</value>
+ </row>
+
+ <!-- conflicting entries -->
+ <row>
+ <value>1</value>
+ <value>4</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>5</value>
+ </row>
+
+ <!-- conflicting and non-conflicting entries -->
+ <row>
+ <value>1</value>
+ <value>6</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>7</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>6</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml b/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml
new file mode 100644
index 0000000000..c387bb737a
--- /dev/null
+++ b/tests/functions_database_helper/fixtures/topics_watch_duplicates.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_topics_watch">
+ <column>user_id</column>
+ <column>topic_id</column>
+ <column>notify_status</column>
+
+ <!-- one entry for this topic -->
+ <row>
+ <value>1</value>
+ <value>1</value>
+ <value>1</value>
+ </row>
+
+ <!-- non-conflicting entries -->
+ <row>
+ <value>1</value>
+ <value>2</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>3</value>
+ <value>0</value>
+ </row>
+
+ <!-- conflicting entries, same notify status -->
+ <row>
+ <value>1</value>
+ <value>4</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>5</value>
+ <value>1</value>
+ </row>
+
+ <!-- conflicting entries, notify status 0 into 1 -->
+ <row>
+ <value>1</value>
+ <value>6</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>7</value>
+ <value>1</value>
+ </row>
+
+ <!-- conflicting entries, notify status 1 into 0 -->
+ <row>
+ <value>1</value>
+ <value>8</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>9</value>
+ <value>0</value>
+ </row>
+
+ <!-- conflicting and non-conflicting entries -->
+ <row>
+ <value>1</value>
+ <value>10</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>11</value>
+ <value>1</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>10</value>
+ <value>1</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php b/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php
new file mode 100644
index 0000000000..d4881daf7e
--- /dev/null
+++ b/tests/functions_database_helper/update_rows_avoiding_duplicates_notify_status_test.php
@@ -0,0 +1,101 @@
+<?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_database_helper.php';
+
+class phpbb_update_rows_avoiding_duplicates_notify_status_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/topics_watch_duplicates.xml');
+ }
+
+ public static function fixture_data()
+ {
+ return array(
+ // description
+ // from array
+ // to value
+ // expected count with to value post update
+ // expected notify_status values
+ array(
+ 'trivial',
+ array(1),
+ 1000,
+ 1,
+ 1,
+ ),
+ array(
+ 'no conflict',
+ array(2),
+ 3,
+ 2,
+ 1,
+ ),
+ array(
+ 'conflict, same notify status',
+ array(4),
+ 5,
+ 1,
+ 1,
+ ),
+ array(
+ 'conflict, notify status 0 into 1',
+ array(6),
+ 7,
+ 1,
+ 0,
+ ),
+ array(
+ 'conflict, notify status 1 into 0',
+ array(8),
+ 9,
+ 1,
+ 0,
+ ),
+ array(
+ 'conflict and no conflict',
+ array(10),
+ 11,
+ 2,
+ 0,
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider fixture_data
+ */
+ public function test_update($description, $from, $to, $expected_result_count, $expected_notify_status)
+ {
+ $db = $this->new_dbal();
+
+ phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', $from, $to);
+
+ $sql = 'SELECT COUNT(*) AS remaining_rows
+ FROM ' . TOPICS_WATCH_TABLE . '
+ WHERE topic_id = ' . (int) $to;
+ $result = $db->sql_query($sql);
+ $result_count = $db->sql_fetchfield('remaining_rows');
+ $db->sql_freeresult($result);
+
+ $this->assertEquals($expected_result_count, $result_count);
+
+ // user id of 1 is the user being updated
+ $sql = 'SELECT notify_status
+ FROM ' . TOPICS_WATCH_TABLE . '
+ WHERE topic_id = ' . (int) $to . '
+ AND user_id = 1';
+ $result = $db->sql_query($sql);
+ $notify_status = $db->sql_fetchfield('notify_status');
+ $db->sql_freeresult($result);
+
+ $this->assertEquals($expected_notify_status, $notify_status);
+ }
+}
diff --git a/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php b/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php
new file mode 100644
index 0000000000..2f01d29d15
--- /dev/null
+++ b/tests/functions_database_helper/update_rows_avoiding_duplicates_test.php
@@ -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_database_helper.php';
+
+class phpbb_update_rows_avoiding_duplicates_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/bookmarks_duplicates.xml');
+ }
+
+ public static function fixture_data()
+ {
+ return array(
+ // description
+ // from array
+ // to value
+ // expected count with to value post update
+ array(
+ 'trivial',
+ array(1),
+ 10,
+ 1,
+ ),
+ array(
+ 'no conflict',
+ array(2),
+ 3,
+ 2,
+ ),
+ array(
+ 'conflict',
+ array(4),
+ 5,
+ 1,
+ ),
+ array(
+ 'conflict and no conflict',
+ array(6),
+ 7,
+ 2,
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider fixture_data
+ */
+ public function test_update($description, $from, $to, $expected_result_count)
+ {
+ $db = $this->new_dbal();
+
+ phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', $from, $to);
+
+ $sql = 'SELECT COUNT(*) AS remaining_rows
+ FROM ' . BOOKMARKS_TABLE . '
+ WHERE topic_id = ' . (int) $to;
+ $result = $db->sql_query($sql);
+ $result_count = $db->sql_fetchfield('remaining_rows');
+ $db->sql_freeresult($result);
+
+ $this->assertEquals($expected_result_count, $result_count);
+ }
+}
diff --git a/tests/lint_test.php b/tests/lint_test.php
new file mode 100644
index 0000000000..905067072d
--- /dev/null
+++ b/tests/lint_test.php
@@ -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");
+ }
+ }
+ }
+}
diff --git a/tests/mock/cache.php b/tests/mock/cache.php
index 650545c3d6..acf4288319 100644
--- a/tests/mock/cache.php
+++ b/tests/mock/cache.php
@@ -34,6 +34,16 @@ class phpbb_mock_cache
$this->data[$var_name] = $var;
}
+ public function destroy($var_name, $table = '')
+ {
+ if ($table)
+ {
+ throw new Exception('Destroying tables is not implemented yet');
+ }
+
+ unset($this->data[$var_name]);
+ }
+
/**
* Obtain active bots
*/
@@ -41,7 +51,7 @@ class phpbb_mock_cache
{
return $this->data['_bots'];
}
-
+
/**
* Obtain list of word censors. We don't need to parse them here,
* that is tested elsewhere.
@@ -64,6 +74,21 @@ class phpbb_mock_cache
);
}
+ /**
+ * Obtain disallowed usernames. Input data via standard put method.
+ */
+ public function obtain_disallowed_usernames()
+ {
+ if (($usernames = $this->get('_disallowed_usernames')) !== false)
+ {
+ return $usernames;
+ }
+ else
+ {
+ return array();
+ }
+ }
+
public function set_bots($bots)
{
$this->data['_bots'] = $bots;
diff --git a/tests/mock/null_cache.php b/tests/mock/null_cache.php
new file mode 100644
index 0000000000..aca20ca77b
--- /dev/null
+++ b/tests/mock/null_cache.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_mock_null_cache
+{
+ public function __construct()
+ {
+ }
+
+ public function get($var_name)
+ {
+ return false;
+ }
+
+ public function put($var_name, $var, $ttl = 0)
+ {
+ }
+
+ public function destroy($var_name, $table = '')
+ {
+ }
+
+ public function obtain_bots()
+ {
+ return array();
+ }
+
+ public function obtain_word_list()
+ {
+ return array();
+ }
+
+ public function set_bots($bots)
+ {
+ }
+}
diff --git a/tests/mock_user.php b/tests/mock/user.php
index ec14ce430e..bd547b3973 100644
--- a/tests/mock_user.php
+++ b/tests/mock/user.php
@@ -33,4 +33,17 @@ class phpbb_mock_user
{
$this->options[$item] = $value;
}
+
+ public function check_ban($user_id = false, $user_ips = false, $user_email = false, $return = false)
+ {
+ $banned_users = $this->optionget('banned_users');
+ foreach ($banned_users as $banned)
+ {
+ if ($banned == $user_id || $banned == $user_ips || $banned == $user_email)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/tests/privmsgs/delete_user_pms_test.php b/tests/privmsgs/delete_user_pms_test.php
new file mode 100644
index 0000000000..f705825262
--- /dev/null
+++ b/tests/privmsgs/delete_user_pms_test.php
@@ -0,0 +1,102 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2011 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_privmsgs.php';
+
+class phpbb_privmsgs_delete_user_pms_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/delete_user_pms.xml');
+ }
+
+ static public function delete_user_pms_data()
+ {
+ return array(
+ // array(
+ // (user we delete),
+ // array(remaining privmsgs ids),
+ // array(remaining privmsgs_to),
+ // ),
+ array(
+ 2,
+ array(
+ array('msg_id' => 1),
+ ),
+ array(
+ array('msg_id' => 1, 'user_id' => 3),
+ ),
+ ),
+ array(
+ 3,
+ array(
+ array('msg_id' => 1),
+ array('msg_id' => 2),
+ array('msg_id' => 3),
+ array('msg_id' => 5),
+ ),
+ array(
+ array('msg_id' => 1, 'user_id' => 2),
+ array('msg_id' => 1, 'user_id' => 4),
+ array('msg_id' => 2, 'user_id' => 2),
+ array('msg_id' => 2, 'user_id' => 4),
+ array('msg_id' => 3, 'user_id' => 2),
+ array('msg_id' => 5, 'user_id' => 2),
+ array('msg_id' => 5, 'user_id' => 4),
+ ),
+ ),
+ array(
+ 5,
+ array(
+ array('msg_id' => 1),
+ array('msg_id' => 2),
+ array('msg_id' => 3),
+ array('msg_id' => 4),
+ array('msg_id' => 5),
+ ),
+ array(
+ array('msg_id' => 1, 'user_id' => 2),
+ array('msg_id' => 1, 'user_id' => 3),
+ array('msg_id' => 1, 'user_id' => 4),
+ array('msg_id' => 2, 'user_id' => 2),
+ array('msg_id' => 2, 'user_id' => 4),
+ array('msg_id' => 3, 'user_id' => 2),
+ array('msg_id' => 4, 'user_id' => 3),
+ array('msg_id' => 5, 'user_id' => 2),
+ array('msg_id' => 5, 'user_id' => 3),
+ array('msg_id' => 5, 'user_id' => 4),
+ ),
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider delete_user_pms_data
+ */
+ public function test_delete_user_pms($delete_user, $remaining_privmsgs, $remaining_privmsgs_to)
+ {
+ global $db;
+
+ $db = $this->new_dbal();
+
+ phpbb_delete_user_pms($delete_user);
+
+ $sql = 'SELECT msg_id
+ FROM ' . PRIVMSGS_TABLE;
+ $result = $db->sql_query($sql);
+
+ $this->assertEquals($remaining_privmsgs, $db->sql_fetchrowset($result));
+
+ $sql = 'SELECT msg_id, user_id
+ FROM ' . PRIVMSGS_TO_TABLE;
+ $result = $db->sql_query($sql);
+
+ $this->assertEquals($remaining_privmsgs_to, $db->sql_fetchrowset($result));
+ }
+}
diff --git a/tests/privmsgs/fixtures/delete_user_pms.xml b/tests/privmsgs/fixtures/delete_user_pms.xml
new file mode 100644
index 0000000000..9a86501b7a
--- /dev/null
+++ b/tests/privmsgs/fixtures/delete_user_pms.xml
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_users">
+ <column>user_id</column>
+ <column>username</column>
+ <column>username_clean</column>
+ <column>user_new_privmsg</column>
+ <column>user_unread_privmsg</column>
+ <column>user_permissions</column>
+ <column>user_sig</column>
+ <column>user_occ</column>
+ <column>user_interests</column>
+ <row>
+ <value>2</value>
+ <value>sender</value>
+ <value>sender</value>
+ <value>0</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>pm in inbox</value>
+ <value>pm in inbox</value>
+ <value>0</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>4</value>
+ <value>pm in no box</value>
+ <value>pm in no box</value>
+ <value>2</value>
+ <value>2</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>no pms</value>
+ <value>no pms</value>
+ <value>0</value>
+ <value>0</value>
+ <value></value>
+ <value></value>
+ <value></value>
+ <value></value>
+ </row>
+ </table>
+ <table name="phpbb_privmsgs">
+ <column>msg_id</column>
+ <column>root_level</column>
+ <column>author_id</column>
+ <column>message_subject</column>
+ <column>message_text</column>
+ <column>to_address</column>
+ <column>bcc_address</column>
+ <row>
+ <value>1</value>
+ <value>0</value>
+ <value>2</value>
+ <value>#1</value>
+ <value>
+ 2 - outbox
+ 3 - inbox
+ 4 - nobox
+ </value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>0</value>
+ <value>2</value>
+ <value>#2</value>
+ <value>
+ 2 - outbox
+ 4 - nobox
+ </value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>0</value>
+ <value>2</value>
+ <value>#3</value>
+ <value>
+ 2 - outbox
+ </value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>4</value>
+ <value>0</value>
+ <value>2</value>
+ <value>#4</value>
+ <value>
+ 3 - nobox
+ </value>
+ <value></value>
+ <value></value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>0</value>
+ <value>2</value>
+ <value>#5</value>
+ <value>
+ 2 - outbox
+ 3 - nobox
+ 4 - nobox
+ </value>
+ <value></value>
+ <value></value>
+ </row>
+ </table>
+ <table name="phpbb_privmsgs_to">
+ <column>msg_id</column>
+ <column>user_id</column>
+ <column>author_id</column>
+ <column>pm_new</column>
+ <column>pm_unread</column>
+ <column>folder_id</column>
+ <row>
+ <value>1</value>
+ <value>2</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-2</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>3</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>1</value>
+ <value>4</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-3</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>2</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-2</value>
+ </row>
+ <row>
+ <value>2</value>
+ <value>4</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-3</value>
+ </row>
+ <row>
+ <value>3</value>
+ <value>2</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-2</value>
+ </row>
+ <row>
+ <value>4</value>
+ <value>3</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-3</value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>2</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-2</value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>3</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-3</value>
+ </row>
+ <row>
+ <value>5</value>
+ <value>4</value>
+ <value>2</value>
+ <value>0</value>
+ <value>0</value>
+ <value>-3</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/request/request_var_test.php b/tests/request/request_var_test.php
index 8e609c00af..0c07fe11a3 100644
--- a/tests/request/request_var_test.php
+++ b/tests/request/request_var_test.php
@@ -73,7 +73,7 @@ class phpbb_request_request_var_test extends phpbb_test_case
unset($_GET[$var], $_POST[$var], $_REQUEST[$var], $_COOKIE[$var]);
}
- public static function request_variables()
+ static public function request_variables()
{
return array(
// strings
diff --git a/tests/security/extract_current_page_test.php b/tests/security/extract_current_page_test.php
index 4911f7b452..0f5128884b 100644
--- a/tests/security/extract_current_page_test.php
+++ b/tests/security/extract_current_page_test.php
@@ -14,7 +14,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/session.php';
class phpbb_security_extract_current_page_test extends phpbb_security_test_base
{
- public static function security_variables()
+ static public function security_variables()
{
return array(
array('http://localhost/phpBB/index.php', 'mark=forums&x="><script>alert(/XSS/);</script>', 'mark=forums&x=%22%3E%3Cscript%3Ealert(/XSS/);%3C/script%3E'),
diff --git a/tests/security/hash_test.php b/tests/security/hash_test.php
index 0c2580c19b..e226365ef3 100644
--- a/tests/security/hash_test.php
+++ b/tests/security/hash_test.php
@@ -17,5 +17,13 @@ class phpbb_security_hash_test extends phpbb_test_case
$this->assertTrue(phpbb_check_hash('test', '$P$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
$this->assertFalse(phpbb_check_hash('foo', '$H$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
}
+
+ public function test_check_hash_with_large_input()
+ {
+ // 16 MB password, should be rejected quite fast
+ $start_time = time();
+ $this->assertFalse(phpbb_check_hash(str_repeat('a', 1024 * 1024 * 16), '$H$9isfrtKXWqrz8PvztXlL3.daw4U0zI1'));
+ $this->assertLessThanOrEqual(5, time() - $start_time);
+ }
}
diff --git a/tests/security/redirect_test.php b/tests/security/redirect_test.php
index 4848a938c6..872a331dc7 100644
--- a/tests/security/redirect_test.php
+++ b/tests/security/redirect_test.php
@@ -14,7 +14,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/session.php';
class phpbb_security_redirect_test extends phpbb_security_test_base
{
- public static function provider()
+ static public function provider()
{
// array(Input -> redirect(), expected triggered error (else false), expected returned result url (else false))
return array(
diff --git a/tests/session/append_sid_test.php b/tests/session/append_sid_test.php
index 88f6f0718e..ce7bf71215 100644
--- a/tests/session/append_sid_test.php
+++ b/tests/session/append_sid_test.php
@@ -1,51 +1,50 @@
-<?php
-/**
-*
-* @package testing
-* @copyright (c) 2011 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_session_append_sid_test extends phpbb_test_case
-{
-
- public function append_sid_data()
- {
- return array(
- array('viewtopic.php?t=1&amp;f=2', false, true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in url-argument'),
- array('viewtopic.php', 't=1&amp;f=2', true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in params-argument using amp'),
- array('viewtopic.php', 't=1&f=2', false, false, 'viewtopic.php?t=1&f=2', 'parameters in params-argument using &'),
- array('viewtopic.php', array('t' => 1, 'f' => 2), true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in params-argument as array'),
-
- // Custom sid parameter
- array('viewtopic.php', 't=1&amp;f=2', true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid', 'using session_id'),
-
- // Testing anchors
- array('viewtopic.php?t=1&amp;f=2#anchor', false, true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in url-argument'),
- array('viewtopic.php', 't=1&amp;f=2#anchor', true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in params-argument'),
- array('viewtopic.php', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in params-argument (array)'),
-
- // Anchors and custom sid
- array('viewtopic.php?t=1&amp;f=2#anchor', false, true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in url-argument using session_id'),
- array('viewtopic.php', 't=1&amp;f=2#anchor', true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument using session_id'),
- array('viewtopic.php', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'),
-
- // Empty parameters should not append the ?
- array('viewtopic.php', false, true, false, 'viewtopic.php', 'no params using bool false'),
- array('viewtopic.php', '', true, false, 'viewtopic.php', 'no params using empty string'),
- array('viewtopic.php', array(), true, false, 'viewtopic.php', 'no params using empty array'),
- );
- }
-
- /**
- * @dataProvider append_sid_data
- */
- public function test_append_sid($url, $params, $is_amp, $session_id, $expected, $description)
- {
- $this->assertEquals($expected, append_sid($url, $params, $is_amp, $session_id));
- }
-}
-
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2011 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_session_append_sid_test extends phpbb_test_case
+{
+
+ public function append_sid_data()
+ {
+ return array(
+ array('viewtopic.php?t=1&amp;f=2', false, true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in url-argument'),
+ array('viewtopic.php', 't=1&amp;f=2', true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in params-argument using amp'),
+ array('viewtopic.php', 't=1&f=2', false, false, 'viewtopic.php?t=1&f=2', 'parameters in params-argument using &'),
+ array('viewtopic.php', array('t' => 1, 'f' => 2), true, false, 'viewtopic.php?t=1&amp;f=2', 'parameters in params-argument as array'),
+
+ // Custom sid parameter
+ array('viewtopic.php', 't=1&amp;f=2', true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid', 'using session_id'),
+
+ // Testing anchors
+ array('viewtopic.php?t=1&amp;f=2#anchor', false, true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in url-argument'),
+ array('viewtopic.php', 't=1&amp;f=2#anchor', true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in params-argument'),
+ array('viewtopic.php', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'viewtopic.php?t=1&amp;f=2#anchor', 'anchor in params-argument (array)'),
+
+ // Anchors and custom sid
+ array('viewtopic.php?t=1&amp;f=2#anchor', false, true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in url-argument using session_id'),
+ array('viewtopic.php', 't=1&amp;f=2#anchor', true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument using session_id'),
+ array('viewtopic.php', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'viewtopic.php?t=1&amp;f=2&amp;sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'),
+
+ // Empty parameters should not append the ?
+ array('viewtopic.php', false, true, false, 'viewtopic.php', 'no params using bool false'),
+ array('viewtopic.php', '', true, false, 'viewtopic.php', 'no params using empty string'),
+ array('viewtopic.php', array(), true, false, 'viewtopic.php', 'no params using empty array'),
+ );
+ }
+
+ /**
+ * @dataProvider append_sid_data
+ */
+ public function test_append_sid($url, $params, $is_amp, $session_id, $expected, $description)
+ {
+ $this->assertEquals($expected, append_sid($url, $params, $is_amp, $session_id));
+ }
+}
diff --git a/tests/session/init_test.php b/tests/session/creation_test.php
index 2ce6c4a4ac..bef52c6554 100644
--- a/tests/session/init_test.php
+++ b/tests/session/creation_test.php
@@ -10,7 +10,7 @@
require_once dirname(__FILE__) . '/../mock/cache.php';
require_once dirname(__FILE__) . '/testable_factory.php';
-class phpbb_session_init_test extends phpbb_database_test_case
+class phpbb_session_creation_test extends phpbb_database_test_case
{
public function getDataSet()
{
@@ -35,10 +35,11 @@ class phpbb_session_init_test extends phpbb_database_test_case
$this->assertSqlResultEquals(
array(array('session_user_id' => 3)),
$sql,
- 'Check if exacly one session for user id 3 was created'
+ 'Check if exactly one session for user id 3 was created'
);
- $cookie_expire = $session->time_now + 31536000; // default is one year
+ $one_year_in_seconds = 365 * 24 * 60 * 60;
+ $cookie_expire = $session->time_now + $one_year_in_seconds;
$session->check_cookies($this, array(
'u' => array(null, $cookie_expire),
diff --git a/tests/template/template_test.php b/tests/template/template_test.php
index aaee7bb4a0..94ec2ab8a7 100644
--- a/tests/template/template_test.php
+++ b/tests/template/template_test.php
@@ -32,7 +32,7 @@ class phpbb_template_template_test extends phpbb_test_case
}
catch (Exception $exception)
{
- // reset the error level even when an error occured
+ // reset the error level even when an error occurred
// PHPUnit turns trigger_error into exceptions as well
error_reporting($error_level);
ob_end_clean();
@@ -69,9 +69,14 @@ class phpbb_template_template_test extends phpbb_test_case
$this->markTestSkipped("Template cache directory ({$template_cache_dir}) is not writable.");
}
- foreach (glob($this->template->cachepath . '*') as $file)
+ $file_array = scandir($template_cache_dir);
+ $file_prefix = basename($this->template->cachepath);
+ foreach ($file_array as $file)
{
- unlink($file);
+ if (strpos($file, $file_prefix) === 0)
+ {
+ unlink($template_cache_dir . '/' . $file);
+ }
}
$GLOBALS['config'] = array(
@@ -84,9 +89,15 @@ class phpbb_template_template_test extends phpbb_test_case
{
if (is_object($this->template))
{
- foreach (glob($this->template->cachepath . '*') as $file)
+ $template_cache_dir = dirname($this->template->cachepath);
+ $file_array = scandir($template_cache_dir);
+ $file_prefix = basename($this->template->cachepath);
+ foreach ($file_array as $file)
{
- unlink($file);
+ if (strpos($file, $file_prefix) === 0)
+ {
+ unlink($template_cache_dir . '/' . $file);
+ }
}
}
}
@@ -94,7 +105,7 @@ class phpbb_template_template_test extends phpbb_test_case
/**
* @todo put test data into templates/xyz.test
*/
- public static function template_data()
+ static public function template_data()
{
return array(
/*
@@ -233,12 +244,34 @@ class phpbb_template_template_test extends phpbb_test_case
'value',
),
array(
+ 'include_define.html',
+ array('VARIABLE' => 'value'),
+ array(),
+ array(),
+ 'value',
+ ),
+ array(
'loop_vars.html',
array(),
array('loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'loop.inner' => array(array(), array())),
array('loop'),
'',
- ),/* no top level nested loops
+ ),
+ array(
+ 'include_define_variable.html',
+ array('VARIABLE' => 'variable.html'),
+ array(),
+ array(),
+ 'variable.html',
+ ),
+ array(
+ 'include_loop_define.html',
+ array('VARIABLE' => 'value'),
+ array('loop' => array(array('NESTED_FILE' => 'variable.html'))),
+ array(),
+ 'value',
+ ),
+ /* no top level nested loops
array(
'loop_vars.html',
array(),
@@ -419,7 +452,7 @@ class phpbb_template_template_test extends phpbb_test_case
$GLOBALS['config']['tpl_allow_php'] = false;
}
- public static function alter_block_array_data()
+ static public function alter_block_array_data()
{
return array(
array(
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_define_variable.html b/tests/template/templates/include_define_variable.html
new file mode 100644
index 0000000000..aff9b574c2
--- /dev/null
+++ b/tests/template/templates/include_define_variable.html
@@ -0,0 +1,2 @@
+<!-- DEFINE $DEF = '{VARIABLE}' -->
+<!-- INCLUDE {$DEF} -->
diff --git a/tests/template/templates/include_loop_define.html b/tests/template/templates/include_loop_define.html
new file mode 100644
index 0000000000..f539b21396
--- /dev/null
+++ b/tests/template/templates/include_loop_define.html
@@ -0,0 +1,4 @@
+<!-- BEGIN loop -->
+<!-- DEFINE $DEF = '{loop.NESTED_FILE}' -->
+<!-- INCLUDE {$DEF} -->
+<!-- END loop -->
diff --git a/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php b/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php
new file mode 100644
index 0000000000..ec59fa3886
--- /dev/null
+++ b/tests/test_framework/phpbb_database_connection_odbc_pdo_wrapper.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2011 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+if (!class_exists('PDO'))
+{
+ return;
+}
+
+/**
+* Used for passing in information about the PDO driver
+* since the PDO class reveals nothing about the DSN that
+* the user provided.
+*
+* This is used in the custom PHPUnit ODBC driver
+*/
+class phpbb_database_connection_odbc_pdo_wrapper extends PDO
+{
+ // Name of the driver being used (i.e. mssql, firebird)
+ public $driver = '';
+
+ // Version number of driver since PDO::getAttribute(PDO::ATTR_CLIENT_VERSION) is pretty useless for this
+ public $version = 0;
+
+ function __construct($dbms, $version, $dsn, $user, $pass)
+ {
+ $this->driver = $dbms;
+ $this->version = (double) $version;
+
+ parent::__construct($dsn, $user, $pass);
+ }
+}
diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php
index e742b543b0..28d3a716f0 100644
--- a/tests/test_framework/phpbb_database_test_case.php
+++ b/tests/test_framework/phpbb_database_test_case.php
@@ -11,8 +11,12 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
{
static private $already_connected;
+ private $db_connections;
+
protected $test_case_helpers;
+ protected $fixture_xml_data;
+
public function __construct($name = NULL, array $data = array(), $dataName = '')
{
parent::__construct($name, $data, $dataName);
@@ -26,6 +30,75 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
'phpbb_database_test_case' => array('already_connected'),
);
+
+ $this->db_connections = array();
+ }
+
+ protected function tearDown()
+ {
+ parent::tearDown();
+
+ // Close all database connections from this test
+ if (!empty($this->db_connections))
+ {
+ foreach ($this->db_connections as $db)
+ {
+ $db->sql_close();
+ }
+ }
+ }
+
+ 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);
+ }
+ }
+
+ /**
+ * Performs synchronisations for a given table/column set on the database
+ *
+ * @param array $table_column_map Information about the tables/columns to synchronise
+ *
+ * @return null
+ */
+ protected function database_synchronisation($table_column_map)
+ {
+ $config = $this->get_database_config();
+ $manager = $this->create_connection_manager($config);
+ $manager->connect();
+ $manager->database_synchronisation($table_column_map);
+ }
+
+ public function createXMLDataSet($path)
+ {
+ $db_config = $this->get_database_config();
+
+ // Firebird requires table and column names to be uppercase
+ if ($db_config['dbms'] == 'firebird')
+ {
+ $xml_data = file_get_contents($path);
+ $xml_data = preg_replace_callback('/(?:(<table name="))([a-z_]+)(?:(">))/', 'phpbb_database_test_case::to_upper', $xml_data);
+ $xml_data = preg_replace_callback('/(?:(<column>))([a-z_]+)(?:(<\/column>))/', 'phpbb_database_test_case::to_upper', $xml_data);
+
+ $new_fixture = tmpfile();
+ fwrite($new_fixture, $xml_data);
+ fseek($new_fixture, 0);
+
+ $meta_data = stream_get_meta_data($new_fixture);
+ $path = $meta_data['uri'];
+ }
+
+ $this->fixture_xml_data = parent::createXMLDataSet($path);
+
+ return $this->fixture_xml_data;
}
public function get_test_case_helpers()
@@ -83,6 +156,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$db = new $dbal();
$db->sql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd'], $config['dbname'], $config['dbport']);
+ $this->db_connections[] = $db;
+
return $db;
}
@@ -106,4 +181,17 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
{
return new phpbb_database_test_connection_manager($config);
}
+
+ /**
+ * Converts a match in the middle of a string to uppercase.
+ * This is necessary for transforming the fixture information for Firebird tests
+ *
+ * @param $matches The array of matches from a regular expression
+ *
+ * @return string The string with the specified match converted to uppercase
+ */
+ static public function to_upper($matches)
+ {
+ return $matches[1] . strtoupper($matches[2]) . $matches[3];
+ }
}
diff --git a/tests/test_framework/phpbb_database_test_connection_manager.php b/tests/test_framework/phpbb_database_test_connection_manager.php
index c734c90a1a..30f1fa6589 100644
--- a/tests/test_framework/phpbb_database_test_connection_manager.php
+++ b/tests/test_framework/phpbb_database_test_connection_manager.php
@@ -8,6 +8,7 @@
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_install.php';
+require_once dirname(__FILE__) . '/phpbb_database_connection_odbc_pdo_wrapper.php';
class phpbb_database_test_connection_manager
{
@@ -62,6 +63,13 @@ class phpbb_database_test_connection_manager
// e.g. Driver={SQL Server Native Client 10.0};Server=(local)\SQLExpress;
$dsn .= $this->config['dbhost'];
+ // Primarily for MSSQL Native/Azure as ODBC needs it in $dbhost, attached to the Server param
+ if ($this->config['dbport'])
+ {
+ $port_delimiter = (defined('PHP_OS') && substr(PHP_OS, 0, 3) === 'WIN') ? ',' : ':';
+ $dsn .= $port_delimiter . $this->config['dbport'];
+ }
+
if ($use_db)
{
$dsn .= ';Database=' . $this->config['dbname'];
@@ -80,12 +88,52 @@ class phpbb_database_test_connection_manager
{
$dsn .= ';dbname=' . $this->config['dbname'];
}
+ else if ($this->dbms['PDO'] == 'pgsql')
+ {
+ // Postgres always connects to a
+ // database. If the database is not
+ // specified here, but the username
+ // is specified, then connection
+ // will be to the database named
+ // as the username.
+ //
+ // For greater compatibility, connect
+ // instead to postgres database which
+ // should always exist:
+ // http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html
+ $dsn .= ';dbname=postgres';
+ }
break;
}
+ // These require different connection strings on the phpBB side than they do in PDO
+ // so you must provide a DSN string for ODBC separately
+ if (!empty($this->config['custom_dsn']) && ($this->config['dbms'] == 'mssql' || $this->config['dbms'] == 'firebird'))
+ {
+ $dsn = 'odbc:' . $this->config['custom_dsn'];
+ }
+
try
{
- $this->pdo = new PDO($dsn, $this->config['dbuser'], $this->config['dbpasswd']);
+ switch ($this->config['dbms'])
+ {
+ case 'mssql':
+ case 'mssql_odbc':
+ $this->pdo = new phpbb_database_connection_odbc_pdo_wrapper('mssql', 0, $dsn, $this->config['dbuser'], $this->config['dbpasswd']);
+ break;
+
+ case 'firebird':
+ if (!empty($this->config['custom_dsn']))
+ {
+ $this->pdo = new phpbb_database_connection_odbc_pdo_wrapper('firebird', 0, $dsn, $this->config['dbuser'], $this->config['dbpasswd']);
+ break;
+ }
+ // Fall through if they're using the firebird PDO driver and not the generic ODBC driver
+
+ default:
+ $this->pdo = new PDO($dsn, $this->config['dbuser'], $this->config['dbpasswd']);
+ break;
+ }
}
catch (PDOException $e)
{
@@ -93,8 +141,29 @@ class phpbb_database_test_connection_manager
throw new Exception("Unable do connect to $cleaned_dsn using PDO with error: {$e->getMessage()}");
}
- // good for debug
- // $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ switch ($this->config['dbms'])
+ {
+ case 'mysql':
+ case 'mysqli':
+ $this->pdo->exec('SET NAMES utf8');
+
+ /*
+ * The phpBB MySQL drivers set the STRICT_ALL_TABLES and
+ * STRICT_TRANS_TABLES flags/modes, so as a minimum requirement
+ * we want to make sure those are set for the PDO side of the
+ * test suite.
+ *
+ * The TRADITIONAL flag implies STRICT_ALL_TABLES and
+ * STRICT_TRANS_TABLES as well as other useful strictness flags
+ * the phpBB MySQL driver does not set.
+ */
+ $this->pdo->exec("SET SESSION sql_mode='TRADITIONAL'");
+ break;
+
+ default:
+ }
}
/**
@@ -119,10 +188,34 @@ class phpbb_database_test_connection_manager
switch ($this->config['dbms'])
{
case 'sqlite':
- if (file_exists($this->config['dbhost']))
+ case 'firebird':
+ $this->connect();
+ // Drop all of the tables
+ foreach ($this->get_tables() as $table)
+ {
+ $this->pdo->exec('DROP TABLE ' . $table);
+ }
+ $this->purge_extras();
+ break;
+
+ case 'oracle':
+ $this->connect();
+ // Drop all of the tables
+ foreach ($this->get_tables() as $table)
+ {
+ $this->pdo->exec('DROP TABLE ' . $table . ' CASCADE CONSTRAINTS');
+ }
+ $this->purge_extras();
+ break;
+
+ case 'postgres':
+ $this->connect();
+ // Drop all of the tables
+ foreach ($this->get_tables() as $table)
{
- unlink($this->config['dbhost']);
+ $this->pdo->exec('DROP TABLE ' . $table . ' CASCADE');
}
+ $this->purge_extras();
break;
default:
@@ -131,6 +224,15 @@ class phpbb_database_test_connection_manager
try
{
$this->pdo->exec('DROP DATABASE ' . $this->config['dbname']);
+
+ try
+ {
+ $this->pdo->exec('CREATE DATABASE ' . $this->config['dbname']);
+ }
+ catch (PDOException $e)
+ {
+ throw new Exception("Unable to re-create database: {$e->getMessage()}");
+ }
}
catch (PDOException $e)
{
@@ -139,9 +241,8 @@ class phpbb_database_test_connection_manager
{
$this->pdo->exec('DROP TABLE ' . $table);
}
+ $this->purge_extras();
}
-
- $this->pdo->exec('CREATE DATABASE ' . $this->config['dbname']);
break;
}
}
@@ -224,7 +325,7 @@ class phpbb_database_test_connection_manager
protected function load_schema_from_file($directory)
{
$schema = $this->dbms['SCHEMA'];
-
+
if ($this->config['dbms'] == 'mysql')
{
$sth = $this->pdo->query('SELECT VERSION() AS version');
@@ -243,8 +344,8 @@ class phpbb_database_test_connection_manager
$filename = $directory . $schema . '_schema.sql';
$queries = file_get_contents($filename);
- $sql = remove_comments($queries);
-
+ $sql = phpbb_remove_comments($queries);
+
$sql = split_sql_file($sql, $this->dbms['DELIM']);
foreach ($sql as $query)
@@ -317,4 +418,185 @@ class phpbb_database_test_connection_manager
throw new Exception($message);
}
}
+
+ /**
+ * Removes extra objects from a database. This is for cases where dropping the database fails.
+ */
+ public function purge_extras()
+ {
+ $this->ensure_connected(__METHOD__);
+ $queries = array();
+
+ switch ($this->config['dbms'])
+ {
+ case 'firebird':
+ $sql = 'SELECT RDB$GENERATOR_NAME
+ FROM RDB$GENERATORS
+ WHERE RDB$SYSTEM_FLAG = 0';
+ $result = $this->pdo->query($sql);
+
+ while ($row = $result->fetch(PDO::FETCH_NUM))
+ {
+ $queries[] = 'DROP GENERATOR ' . current($row);
+ }
+ break;
+
+ case 'oracle':
+ $sql = 'SELECT sequence_name
+ FROM USER_SEQUENCES';
+ $result = $this->pdo->query($sql);
+
+ while ($row = $result->fetch(PDO::FETCH_NUM))
+ {
+ $queries[] = 'DROP SEQUENCE ' . current($row);
+ }
+ break;
+
+ case 'postgres':
+ $sql = 'SELECT sequence_name
+ FROM information_schema.sequences';
+ $result = $this->pdo->query($sql);
+
+ while ($row = $result->fetch(PDO::FETCH_NUM))
+ {
+ $queries[] = 'DROP SEQUENCE ' . current($row);
+ }
+
+ $queries[] = 'DROP TYPE IF EXISTS varchar_ci CASCADE';
+ break;
+ }
+
+ foreach ($queries as $query)
+ {
+ $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)
+ {
+ $table_names = $xml_data_set->getTableNames();
+
+ $tables = array();
+ foreach ($table_names as $table)
+ {
+ $tables[$table] = $xml_data_set->getTableMetaData($table)->getColumns();
+ }
+
+ $this->database_synchronisation($tables);
+ }
+
+ /**
+ * Performs synchronisations on the database after a fixture has been loaded
+ *
+ * @param array $table_column_map Array of tables/columns to synchronise
+ * array(table1 => array(column1, column2))
+ *
+ * @return null
+ */
+ public function database_synchronisation($table_column_map)
+ {
+ $this->ensure_connected(__METHOD__);
+ $queries = array();
+
+ // Get escaped versions of the table names to synchronise
+ $table_names = array_map(array($this->pdo, 'PDO::quote'), array_keys($table_column_map));
+
+ 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 = $table_column_map[$row['table_name']];
+
+ // 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);
+ }
+ }
}
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index 76fed76fae..7d8b4a3144 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -9,11 +9,17 @@
use Symfony\Component\BrowserKit\CookieJar;
require_once __DIR__ . '/../../phpBB/includes/functions_install.php';
+require_once __DIR__ . '/../../phpBB/includes/acm/acm_file.php';
+require_once __DIR__ . '/../../phpBB/includes/cache.php';
class phpbb_functional_test_case extends phpbb_test_case
{
- protected $client;
- protected $root_url;
+ static protected $client;
+ static protected $cookieJar;
+ static protected $root_url;
+
+ protected $cache = null;
+ protected $db = null;
/**
* Session ID for current test's session (each test makes its own)
@@ -32,33 +38,91 @@ class phpbb_functional_test_case extends phpbb_test_case
static public function setUpBeforeClass()
{
- if (!extension_loaded('phar'))
+ parent::setUpBeforeClass();
+
+ self::$config = phpbb_test_case_helpers::get_test_config();
+ self::$root_url = self::$config['phpbb_functional_url'];
+
+ if (!isset(self::$config['phpbb_functional_url']))
{
- self::markTestSkipped('phar extension is not loaded');
+ self::markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.');
}
- require_once 'phar://' . __DIR__ . '/../../vendor/goutte.phar';
+ if (!self::$already_installed)
+ {
+ self::install_board();
+ self::$already_installed = true;
+ }
}
public function setUp()
{
- if (!isset(self::$config['phpbb_functional_url']))
- {
- $this->markTestSkipped('phpbb_functional_url was not set in test_config and wasn\'t set as PHPBB_FUNCTIONAL_URL environment variable either.');
- }
+ parent::setUp();
+
+ $this->bootstrap();
+
+ self::$cookieJar = new CookieJar;
+ self::$client = new Goutte\Client(array(), null, self::$cookieJar);
+ // Reset the curl handle because it is 0 at this point and not a valid
+ // resource
+ self::$client->getClient()->getCurlMulti()->reset(true);
- $this->cookieJar = new CookieJar;
- $this->client = new Goutte\Client(array(), array(), null, $this->cookieJar);
- $this->root_url = self::$config['phpbb_functional_url'];
// Clear the language array so that things
// that were added in other tests are gone
$this->lang = array();
$this->add_lang('common');
+ $this->purge_cache();
}
- public function request($method, $path)
+ /**
+ * Perform a request to page
+ *
+ * @param string $method HTTP Method
+ * @param string $path Page path, relative from phpBB root path
+ * @param array $form_data An array of form field values
+ * @param bool $assert_response_html Should we perform standard assertions for a normal html page
+ * @return Symfony\Component\DomCrawler\Crawler
+ */
+ static public function request($method, $path, $form_data = array(), $assert_response_html = true)
{
- return $this->client->request($method, $this->root_url . $path);
+ $crawler = self::$client->request($method, self::$root_url . $path, $form_data);
+
+ if ($assert_response_html)
+ {
+ self::assert_response_html();
+ }
+
+ return $crawler;
+ }
+
+ /**
+ * Submits a form
+ *
+ * @param Symfony\Component\DomCrawler\Form $form A Form instance
+ * @param array $values An array of form field values
+ * @param bool $assert_response_html Should we perform standard assertions for a normal html page
+ * @return Symfony\Component\DomCrawler\Crawler
+ */
+ static public function submit(Symfony\Component\DomCrawler\Form $form, array $values = array(), $assert_response_html = true)
+ {
+ $crawler = self::$client->submit($form, $values);
+
+ if ($assert_response_html)
+ {
+ self::assert_response_html();
+ }
+
+ return $crawler;
+ }
+
+ /**
+ * Get Client Content
+ *
+ * @return string HTML page
+ */
+ static public function get_content()
+ {
+ return self::$client->getResponse()->getContent();
}
// bootstrap, called after board is set up
@@ -68,6 +132,42 @@ class phpbb_functional_test_case extends phpbb_test_case
{
}
+ protected function get_db()
+ {
+ global $phpbb_root_path, $phpEx;
+ // so we don't reopen an open connection
+ if (!($this->db instanceof dbal))
+ {
+ if (!class_exists('dbal_' . self::$config['dbms']))
+ {
+ include($phpbb_root_path . 'includes/db/' . self::$config['dbms'] . ".$phpEx");
+ }
+ $sql_db = 'dbal_' . self::$config['dbms'];
+ $this->db = new $sql_db();
+ $this->db->sql_connect(self::$config['dbhost'], self::$config['dbuser'], self::$config['dbpasswd'], self::$config['dbname'], self::$config['dbport']);
+ }
+ return $this->db;
+ }
+
+ protected function get_cache_driver()
+ {
+ if (!$this->cache)
+ {
+ $this->cache = new cache();
+ }
+
+ return $this->cache;
+ }
+
+ protected function purge_cache()
+ {
+ $cache = $this->get_cache_driver();
+
+ $cache->purge();
+ $cache->unload();
+ $cache->load();
+ }
+
public function __construct($name = NULL, array $data = array(), $dataName = '')
{
parent::__construct($name, $data, $dataName);
@@ -75,63 +175,127 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->backupStaticAttributesBlacklist += array(
'phpbb_functional_test_case' => array('config', 'already_installed'),
);
-
- if (!static::$already_installed)
- {
- $this->install_board();
- $this->bootstrap();
- static::$already_installed = true;
- }
}
- protected function install_board()
+ static protected function install_board()
{
global $phpbb_root_path, $phpEx;
- self::$config = phpbb_test_case_helpers::get_test_config();
-
- if (!isset(self::$config['phpbb_functional_url']))
- {
- return;
- }
-
self::$config['table_prefix'] = 'phpbb_';
- $this->recreate_database(self::$config);
+ self::recreate_database(self::$config);
+
+ $config_file = $phpbb_root_path . "config.$phpEx";
+ $config_file_dev = $phpbb_root_path . "config_dev.$phpEx";
+ $config_file_test = $phpbb_root_path . "config_test.$phpEx";
- if (file_exists($phpbb_root_path . "config.$phpEx"))
+ if (file_exists($config_file))
{
- if (!file_exists($phpbb_root_path . "config_dev.$phpEx"))
+ if (!file_exists($config_file_dev))
{
- rename($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_dev.$phpEx");
+ rename($config_file, $config_file_dev);
}
else
{
- unlink($phpbb_root_path . "config.$phpEx");
+ unlink($config_file);
}
}
- // begin data
- $data = array();
+ self::$cookieJar = new CookieJar;
+ self::$client = new Goutte\Client(array(), null, self::$cookieJar);
+ // Set client manually so we can increase the cURL timeout
+ self::$client->setClient(new Guzzle\Http\Client('', array(
+ Guzzle\Http\Client::DISABLE_REDIRECTS => true,
+ 'curl.options' => array(
+ CURLOPT_TIMEOUT => 120,
+ ),
+ )));
+
+ // Reset the curl handle because it is 0 at this point and not a valid
+ // resource
+ self::$client->getClient()->getCurlMulti()->reset(true);
+
+ $parseURL = parse_url(self::$config['phpbb_functional_url']);
+
+ $crawler = self::request('GET', 'install/index.php?mode=install');
+ self::assertContains('Welcome to Installation', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form();
+
+ // install/index.php?mode=install&sub=requirements
+ $crawler = self::submit($form);
+ self::assertContains('Installation compatibility', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form();
+
+ // install/index.php?mode=install&sub=database
+ $crawler = self::submit($form);
+ self::assertContains('Database configuration', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form(array(
+ // Installer uses 3.0-style dbms name
+ 'dbms' => str_replace('phpbb_db_driver_', '', self::$config['dbms']),
+ 'dbhost' => self::$config['dbhost'],
+ 'dbport' => self::$config['dbport'],
+ 'dbname' => self::$config['dbname'],
+ 'dbuser' => self::$config['dbuser'],
+ 'dbpasswd' => self::$config['dbpasswd'],
+ 'table_prefix' => self::$config['table_prefix'],
+ ));
- $data = array_merge($data, self::$config);
+ // install/index.php?mode=install&sub=database
+ $crawler = self::submit($form);
+ self::assertContains('Successful connection', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form();
- $data = array_merge($data, array(
+ // install/index.php?mode=install&sub=administrator
+ $crawler = self::submit($form);
+ self::assertContains('Administrator configuration', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form(array(
'default_lang' => 'en',
'admin_name' => 'admin',
- 'admin_pass1' => 'admin',
- 'admin_pass2' => 'admin',
- 'board_email' => 'nobody@example.com',
+ 'admin_pass1' => 'adminadmin',
+ 'admin_pass2' => 'adminadmin',
+ 'board_email1' => 'nobody@example.com',
+ 'board_email2' => 'nobody@example.com',
));
- $parseURL = parse_url(self::$config['phpbb_functional_url']);
+ // install/index.php?mode=install&sub=administrator
+ $crawler = self::submit($form);
+ self::assertContains('Tests passed', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form();
+
+ // We have to skip install/index.php?mode=install&sub=config_file
+ // because that step will create a config.php file if phpBB has the
+ // permission to do so. We have to create the config file on our own
+ // in order to get the DEBUG constants defined.
+ $config_php_data = phpbb_create_config_file_data(self::$config, self::$config['dbms'], array(), true, true);
+ $config_created = file_put_contents($config_file, $config_php_data) !== false;
+ if (!$config_created)
+ {
+ self::markTestSkipped("Could not write $config_file file.");
+ }
- $data = array_merge($data, array(
- 'email_enable' => false,
- 'smtp_delivery' => false,
- 'smtp_host' => '',
- 'smtp_auth' => '',
- 'smtp_user' => '',
- 'smtp_pass' => '',
+ // We also have to create a install lock that is normally created by
+ // the installer. The file will be removed by the final step of the
+ // installer.
+ $install_lock_file = $phpbb_root_path . 'cache/install_lock';
+ $lock_created = file_put_contents($install_lock_file, '') !== false;
+ if (!$lock_created)
+ {
+ self::markTestSkipped("Could not create $lock_created file.");
+ }
+ @chmod($install_lock_file, 0666);
+
+ // install/index.php?mode=install&sub=advanced
+ $form_data = $form->getValues();
+ unset($form_data['submit']);
+
+ $crawler = self::request('POST', 'install/index.php?mode=install&sub=advanced', $form_data);
+ self::assertContains('The settings on this page are only necessary to set if you know that you require something different from the default.', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form(array(
+ 'email_enable' => true,
+ 'smtp_delivery' => true,
+ 'smtp_host' => 'nxdomain.phpbb.com',
+ 'smtp_auth' => 'PLAIN',
+ 'smtp_user' => 'nxuser',
+ 'smtp_pass' => 'nxpass',
'cookie_secure' => false,
'force_server_vars' => false,
'server_protocol' => $parseURL['scheme'] . '://',
@@ -139,69 +303,226 @@ class phpbb_functional_test_case extends phpbb_test_case
'server_port' => isset($parseURL['port']) ? (int) $parseURL['port'] : 80,
'script_path' => $parseURL['path'],
));
- // end data
- $content = $this->do_request('install');
- $this->assertContains('Welcome to Installation', $content);
+ // install/index.php?mode=install&sub=create_table
+ $crawler = self::submit($form);
+ self::assertContains('The database tables used by phpBB', $crawler->filter('#main')->text());
+ self::assertContains('have been created and populated with some initial data.', $crawler->filter('#main')->text());
+ $form = $crawler->selectButton('submit')->form();
- $this->do_request('create_table', $data);
+ // install/index.php?mode=install&sub=final
+ $crawler = self::submit($form);
+ self::assertContains('You have successfully installed', $crawler->text());
- file_put_contents($phpbb_root_path . "config.$phpEx", phpbb_create_config_file_data($data, self::$config['dbms'], array(), true));
+ copy($config_file, $config_file_test);
+ }
- $this->do_request('config_file', $data);
+ static private function recreate_database($config)
+ {
+ $db_conn_mgr = new phpbb_database_test_connection_manager($config);
+ $db_conn_mgr->recreate_db();
+ }
- copy($phpbb_root_path . "config.$phpEx", $phpbb_root_path . "config_test.$phpEx");
+ /**
+ * Creates a new style
+ *
+ * @param string $style_id Style ID
+ * @param string $style_path Style directory
+ * @param string $parent_style_id Parent style id. Default = 1
+ * @param string $parent_style_path Parent style directory. Default = 'prosilver'
+ */
+ protected function add_style($style_id, $style_path, $parent_style_id = 1, $parent_style_path = 'prosilver')
+ {
+ global $phpbb_root_path;
+
+ $db = $this->get_db();
+ $sql = 'INSERT INTO ' . STYLES_TABLE . ' ' . $db->sql_build_array('INSERT', array(
+ 'style_id' => $style_id,
+ 'style_name' => $style_path,
+ 'style_copyright' => '',
+ 'style_active' => 1,
+ 'template_id' => $style_id,
+ 'theme_id' => $style_id,
+ 'imageset_id' => $style_id,
+ ));
+ $db->sql_query($sql);
- $this->do_request('final', $data);
+ $sql = 'INSERT INTO ' . STYLES_IMAGESET_TABLE . ' ' . $db->sql_build_array('INSERT', array(
+ 'imageset_id' => $style_id,
+ 'imageset_name' => $style_path,
+ 'imageset_copyright' => '',
+ 'imageset_path' => $style_path,
+ ));
+ $db->sql_query($sql);
+
+ $sql = 'INSERT INTO ' . STYLES_TEMPLATE_TABLE . ' ' . $db->sql_build_array('INSERT', array(
+ 'template_id' => $style_id,
+ 'template_name' => $style_path,
+ 'template_copyright' => '',
+ 'template_path' => $style_path,
+ 'bbcode_bitfield' => 'kNg=',
+ 'template_inherits_id' => $parent_style_id,
+ 'template_inherit_path' => $parent_style_path,
+ ));
+ $db->sql_query($sql);
+
+ $sql = 'INSERT INTO ' . STYLES_THEME_TABLE . ' ' . $db->sql_build_array('INSERT', array(
+ 'theme_id' => $style_id,
+ 'theme_name' => $style_path,
+ 'theme_copyright' => '',
+ 'theme_path' => $style_path,
+ 'theme_storedb' => 0,
+ 'theme_mtime' => 0,
+ 'theme_data' => '',
+ ));
+ $db->sql_query($sql);
+
+ if ($style_path != 'prosilver' && $style_path != 'subsilver2')
+ {
+ @mkdir($phpbb_root_path . 'styles/' . $style_path, 0777);
+ @mkdir($phpbb_root_path . 'styles/' . $style_path . '/template', 0777);
+ }
}
- private function do_request($sub, $post_data = null)
+ /**
+ * Remove temporary style created by add_style()
+ *
+ * @param string $style_id Style ID
+ * @param string $style_path Style directory
+ */
+ protected function delete_style($style_id, $style_path)
{
- $context = null;
+ global $phpbb_root_path;
+
+ $db = $this->get_db();
+ $db->sql_query('DELETE FROM ' . STYLES_TABLE . ' WHERE style_id = ' . $style_id);
+ $db->sql_query('DELETE FROM ' . STYLES_IMAGESET_TABLE . ' WHERE imageset_id = ' . $style_id);
+ $db->sql_query('DELETE FROM ' . STYLES_TEMPLATE_TABLE . ' WHERE template_id = ' . $style_id);
+ $db->sql_query('DELETE FROM ' . STYLES_THEME_TABLE . ' WHERE theme_id = ' . $style_id);
- if ($post_data)
+ if ($style_path != 'prosilver' && $style_path != 'subsilver2')
{
- $context = stream_context_create(array(
- 'http' => array(
- 'method' => 'POST',
- 'header' => 'Content-Type: application/x-www-form-urlencoded',
- 'content' => http_build_query($post_data),
- 'ignore_errors' => true,
- ),
- ));
+ @rmdir($phpbb_root_path . 'styles/' . $style_path . '/template');
+ @rmdir($phpbb_root_path . 'styles/' . $style_path);
}
-
- return file_get_contents(self::$config['phpbb_functional_url'] . 'install/index.php?mode=install&sub=' . $sub, false, $context);
}
- private function recreate_database($config)
+ /**
+ * Creates a new user with limited permissions
+ *
+ * @param string $username Also doubles up as the user's password
+ * @return int ID of created user
+ */
+ protected function create_user($username)
{
- $db_conn_mgr = new phpbb_database_test_connection_manager($config);
- $db_conn_mgr->recreate_db();
+ // Required by unique_id
+ global $config;
+
+ if (!is_array($config))
+ {
+ $config = array();
+ }
+
+ $config['rand_seed'] = '';
+ $config['rand_seed_last_update'] = time() + 600;
+
+ // Required by user_add
+ global $db, $cache;
+ $db = $this->get_db();
+ if (!function_exists('phpbb_mock_null_cache'))
+ {
+ require_once(__DIR__ . '/../mock/null_cache.php');
+ }
+ $cache = new phpbb_mock_null_cache;
+
+ if (!function_exists('utf_clean_string'))
+ {
+ require_once(__DIR__ . '/../../phpBB/includes/utf/utf_tools.php');
+ }
+ if (!function_exists('user_add'))
+ {
+ require_once(__DIR__ . '/../../phpBB/includes/functions_user.php');
+ }
+
+ $user_row = array(
+ 'username' => $username,
+ 'group_id' => 2,
+ 'user_email' => 'nobody@example.com',
+ 'user_type' => 0,
+ 'user_lang' => 'en',
+ 'user_timezone' => 0,
+ 'user_dateformat' => '',
+ 'user_password' => phpbb_hash($username . $username),
+ );
+ return user_add($user_row);
}
- protected function login()
+ protected function login($username = 'admin')
{
$this->add_lang('ucp');
- $crawler = $this->request('GET', 'ucp.php');
+ $crawler = self::request('GET', 'ucp.php');
$this->assertContains($this->lang('LOGIN_EXPLAIN_UCP'), $crawler->filter('html')->text());
$form = $crawler->selectButton($this->lang('LOGIN'))->form();
- $login = $this->client->submit($form, array('username' => 'admin', 'password' => 'admin'));
+ $crawler = self::submit($form, array('username' => $username, 'password' => $username . $username));
+ $this->assertContains($this->lang('LOGIN_REDIRECT'), $crawler->filter('html')->text());
+
+ $cookies = self::$cookieJar->all();
- $cookies = $this->cookieJar->all();
-
// The session id is stored in a cookie that ends with _sid - we assume there is only one such cookie
- foreach ($cookies as $key => $cookie);
+ foreach ($cookies as $cookie);
{
- if (substr($key, -4) == '_sid')
+ if (substr($cookie->getName(), -4) == '_sid')
{
$this->sid = $cookie->getValue();
}
}
}
+ /**
+ * Login to the ACP
+ * You must run login() before calling this.
+ */
+ protected function admin_login($username = 'admin')
+ {
+ $this->add_lang('acp/common');
+
+ // Requires login first!
+ if (empty($this->sid))
+ {
+ $this->fail('$this->sid is empty. Make sure you call login() before admin_login()');
+ return;
+ }
+
+ $crawler = self::request('GET', 'adm/index.php?sid=' . $this->sid);
+ $this->assertContains($this->lang('LOGIN_ADMIN_CONFIRM'), $crawler->filter('html')->text());
+
+ $form = $crawler->selectButton($this->lang('LOGIN'))->form();
+
+ foreach ($form->getValues() as $field => $value)
+ {
+ if (strpos($field, 'password_') === 0)
+ {
+ $crawler = self::submit($form, array('username' => $username, $field => $username . $username));
+ $this->assertContains($this->lang('LOGIN_ADMIN_SUCCESS'), $crawler->filter('html')->text());
+
+ $cookies = self::$cookieJar->all();
+
+ // The session id is stored in a cookie that ends with _sid - we assume there is only one such cookie
+ foreach ($cookies as $cookie);
+ {
+ if (substr($cookie->getName(), -4) == '_sid')
+ {
+ $this->sid = $cookie->getValue();
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
protected function add_lang($lang_file)
{
if (is_array($lang_file))
@@ -238,4 +559,169 @@ class phpbb_functional_test_case extends phpbb_test_case
return call_user_func_array('sprintf', $args);
}
+
+ /**
+ * Perform some basic assertions for the page
+ *
+ * Checks for debug/error output before the actual page content and the status code
+ *
+ * @param mixed $status_code Expected status code, false to disable check
+ * @return null
+ */
+ static public function assert_response_html($status_code = 200)
+ {
+ if ($status_code !== false)
+ {
+ self::assert_response_status_code($status_code);
+ }
+
+ // Any output before the doc type means there was an error
+ $content = self::$client->getResponse()->getContent();
+ self::assertStringStartsWith('<!DOCTYPE', trim($content), 'Output found before DOCTYPE specification.');
+ }
+
+ /**
+ * 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.
+ *
+ * @param int $status_code Expected status code
+ * @return null
+ */
+ static public function assert_response_status_code($status_code = 200)
+ {
+ self::assertEquals($status_code, self::$client->getResponse()->getStatus());
+ }
+
+ /**
+ * Creates a topic
+ *
+ * Be sure to login before creating
+ *
+ * @param int $forum_id
+ * @param string $subject
+ * @param string $message
+ * @param array $additional_form_data Any additional form data to be sent in the request
+ * @return array post_id, topic_id
+ */
+ public function create_topic($forum_id, $subject, $message, $additional_form_data = array())
+ {
+ $posting_url = "posting.php?mode=post&f={$forum_id}&sid={$this->sid}";
+
+ $form_data = array_merge(array(
+ 'subject' => $subject,
+ 'message' => $message,
+ 'post' => true,
+ ), $additional_form_data);
+
+ return self::submit_post($posting_url, 'POST_TOPIC', $form_data);
+ }
+
+ /**
+ * Creates a post
+ *
+ * Be sure to login before creating
+ *
+ * @param int $forum_id
+ * @param int $topic_id
+ * @param string $subject
+ * @param string $message
+ * @param array $additional_form_data Any additional form data to be sent in the request
+ * @return array post_id, topic_id
+ */
+ public function create_post($forum_id, $topic_id, $subject, $message, $additional_form_data = array())
+ {
+ $posting_url = "posting.php?mode=reply&f={$forum_id}&t={$topic_id}&sid={$this->sid}";
+
+ $form_data = array_merge(array(
+ 'subject' => $subject,
+ 'message' => $message,
+ 'post' => true,
+ ), $additional_form_data);
+
+ return self::submit_post($posting_url, 'POST_REPLY', $form_data);
+ }
+
+ /**
+ * Helper for submitting posts
+ *
+ * @param string $posting_url
+ * @param string $posting_contains
+ * @param array $form_data
+ * @return array post_id, topic_id
+ */
+ protected function submit_post($posting_url, $posting_contains, $form_data)
+ {
+ $this->add_lang('posting');
+
+ $crawler = self::request('GET', $posting_url);
+ $this->assertContains($this->lang($posting_contains), $crawler->filter('html')->text());
+
+ $hidden_fields = array(
+ $crawler->filter('[type="hidden"]')->each(function ($node, $i) {
+ return array('name' => $node->getAttribute('name'), 'value' => $node->getAttribute('value'));
+ }),
+ );
+
+ foreach ($hidden_fields as $fields)
+ {
+ foreach($fields as $field)
+ {
+ $form_data[$field['name']] = $field['value'];
+ }
+ }
+
+ // Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened)
+ // is not at least 2 seconds before submission, cancel the form
+ $form_data['lastclick'] = 0;
+
+ // I use a request because the form submission method does not allow you to send data that is not
+ // contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)
+ // Instead, I send it as a request with the submit button "post" set to true.
+ $crawler = self::request('POST', $posting_url, $form_data);
+ $this->assertContains($this->lang('POST_STORED'), $crawler->filter('html')->text());
+ $url = $crawler->selectLink($this->lang('VIEW_MESSAGE', '', ''))->link()->getUri();
+
+ return array(
+ 'topic_id' => $this->get_parameter_from_link($url, 't'),
+ 'post_id' => $this->get_parameter_from_link($url, 'p'),
+ );
+ }
+
+ /**
+ * Returns the requested parameter from a URL
+ *
+ * @param string $url
+ * @param string $parameter
+ * @return string Value of the parameter in the URL, null if not set
+ */
+ public function get_parameter_from_link($url, $parameter)
+ {
+ if (strpos($url, '?') === false)
+ {
+ return null;
+ }
+
+ $url_parts = explode('?', $url);
+ if (isset($url_parts[1]))
+ {
+ $url_parameters = $url_parts[1];
+ if (strpos($url_parameters, '#') !== false)
+ {
+ $url_parameters = explode('#', $url_parameters);
+ $url_parameters = $url_parameters[0];
+ }
+
+ foreach (explode('&', $url_parameters) as $url_param)
+ {
+ list($param, $value) = explode('=', $url_param);
+ if ($param == $parameter)
+ {
+ return $value;
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php
index 2a3c27f9f9..29adfc6817 100644
--- a/tests/test_framework/phpbb_test_case_helpers.php
+++ b/tests/test_framework/phpbb_test_case_helpers.php
@@ -79,6 +79,7 @@ class phpbb_test_case_helpers
'dbname' => $dbname,
'dbuser' => $dbuser,
'dbpasswd' => $dbpasswd,
+ 'custom_dsn' => isset($custom_dsn) ? $custom_dsn : '',
));
if (isset($phpbb_functional_url))
@@ -95,7 +96,8 @@ class phpbb_test_case_helpers
'dbport' => isset($_SERVER['PHPBB_TEST_DBPORT']) ? $_SERVER['PHPBB_TEST_DBPORT'] : '',
'dbname' => isset($_SERVER['PHPBB_TEST_DBNAME']) ? $_SERVER['PHPBB_TEST_DBNAME'] : '',
'dbuser' => isset($_SERVER['PHPBB_TEST_DBUSER']) ? $_SERVER['PHPBB_TEST_DBUSER'] : '',
- 'dbpasswd' => isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : ''
+ 'dbpasswd' => isset($_SERVER['PHPBB_TEST_DBPASSWD']) ? $_SERVER['PHPBB_TEST_DBPASSWD'] : '',
+ 'custom_dsn' => isset($_SERVER['PHPBB_TEST_CUSTOM_DSN']) ? $_SERVER['PHPBB_TEST_CUSTOM_DSN'] : '',
));
}
diff --git a/tests/text_processing/censor_text_test.php b/tests/text_processing/censor_text_test.php
index 8fcdb7ef85..f0e13638a5 100644
--- a/tests/text_processing/censor_text_test.php
+++ b/tests/text_processing/censor_text_test.php
@@ -9,7 +9,7 @@
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
-require_once dirname(__FILE__) . '/../mock_user.php';
+require_once dirname(__FILE__) . '/../mock/user.php';
require_once dirname(__FILE__) . '/../mock/cache.php';
class phpbb_text_processing_censor_text_test extends phpbb_test_case
diff --git a/tests/text_processing/make_clickable_test.php b/tests/text_processing/make_clickable_test.php
index 8697907311..db0812319d 100644
--- a/tests/text_processing/make_clickable_test.php
+++ b/tests/text_processing/make_clickable_test.php
@@ -12,7 +12,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
class phpbb_text_processing_make_clickable_test extends phpbb_test_case
{
- public static function make_clickable_data()
+ static public function make_clickable_data()
{
// value => whether it should work
$prefix_texts = array(
diff --git a/tests/utf/utf8_clean_string_test.php b/tests/utf/utf8_clean_string_test.php
index 70bd549d5b..5ebf6409af 100644
--- a/tests/utf/utf8_clean_string_test.php
+++ b/tests/utf/utf8_clean_string_test.php
@@ -11,7 +11,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
class phpbb_utf_utf8_clean_string_test extends phpbb_test_case
{
- public static function cleanable_strings()
+ static public function cleanable_strings()
{
return array(
array('MiXed CaSe', 'mixed case', 'Checking case folding'),