aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/db/mssqlnative.php26
-rw-r--r--tests/RUNNING_TESTS.txt38
-rw-r--r--tests/dbal/all_tests.php6
-rw-r--r--tests/dbal/fixtures/config.xml18
-rw-r--r--tests/dbal/select.php (renamed from tests/dbal/dbal.php)172
-rw-r--r--tests/dbal/write.php172
-rw-r--r--tests/test_framework/phpbb_database_test_case.php283
-rw-r--r--tests/test_framework/phpbb_test_case.php7
-rw-r--r--tests/test_framework/phpbb_test_case_helpers.php68
9 files changed, 479 insertions, 311 deletions
diff --git a/phpBB/includes/db/mssqlnative.php b/phpBB/includes/db/mssqlnative.php
index d6ac3b3acc..7ed4146f27 100644
--- a/phpBB/includes/db/mssqlnative.php
+++ b/phpBB/includes/db/mssqlnative.php
@@ -349,7 +349,8 @@ class dbal_mssqlnative extends dbal
{
$this->query_result = false;
- if ($offset === false || $offset == 0)
+ // total == 0 means all results - not zero results
+ if ($offset == 0 && $total !== 0)
{
if (strpos($query, "SELECT") === false)
{
@@ -360,13 +361,21 @@ class dbal_mssqlnative extends dbal
$query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query);
}
}
- else
+ else if ($offset > 0)
{
$query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query);
$query = 'SELECT *
FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3
- FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3
- WHERE line3 BETWEEN ' . ($offset+1) . ' AND ' . ($offset + $total);
+ FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3';
+
+ if ($total > 0)
+ {
+ $query .= ' WHERE line3 BETWEEN ' . ($offset+1) . ' AND ' . ($offset + $total);
+ }
+ else
+ {
+ $query .= ' WHERE line3 > ' . $offset;
+ }
}
$result = $this->sql_query($query, $cache_ttl);
@@ -406,13 +415,18 @@ class dbal_mssqlnative extends dbal
$row = @sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
- // I hope i am able to remove this later... hopefully only a PHP or MSSQL bug
if ($row)
{
foreach ($row as $key => $value)
{
$row[$key] = ($value === ' ' || $value === NULL) ? '' : $value;
}
+
+ // remove helper values from LIMIT queries
+ if (isset($row['line2']))
+ {
+ unset($row['line2'], $row['line3']);
+ }
}
return $row;
}
@@ -624,4 +638,4 @@ class dbal_mssqlnative extends dbal
}
}
-?> \ No newline at end of file
+?>
diff --git a/tests/RUNNING_TESTS.txt b/tests/RUNNING_TESTS.txt
index f1b40f71ad..74a0635c1a 100644
--- a/tests/RUNNING_TESTS.txt
+++ b/tests/RUNNING_TESTS.txt
@@ -1,33 +1,57 @@
Running Tests
--------------
+=============
Prerequisites
--------------
+=============
PHPUnit
-=======
+-------
phpBB unit tests use PHPUnit framework. Version 3.3 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';
+
+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 all_tests.php
+
Running
--------
+=======
Once the prerequisites are installed, run the tests from tests directory:
-$ phpunit all_tests.php
+ $ phpunit all_tests.php
More Information
-----------------
+================
Further information is available on phpbb wiki:
http://wiki.phpbb.com/display/DEV/Unit+Tests
diff --git a/tests/dbal/all_tests.php b/tests/dbal/all_tests.php
index 7aee0f6b16..cfa8176246 100644
--- a/tests/dbal/all_tests.php
+++ b/tests/dbal/all_tests.php
@@ -15,7 +15,8 @@ if (!defined('PHPUnit_MAIN_METHOD'))
require_once 'test_framework/framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';
-require_once 'dbal/dbal.php';
+require_once 'dbal/select.php';
+require_once 'dbal/write.php';
class phpbb_dbal_all_tests
{
@@ -28,7 +29,8 @@ class phpbb_dbal_all_tests
{
$suite = new PHPUnit_Framework_TestSuite('phpBB Database Abstraction Layer');
- $suite->addTestSuite('phpbb_dbal_test');
+ $suite->addTestSuite('phpbb_dbal_select_test');
+ $suite->addTestSuite('phpbb_dbal_write_test');
return $suite;
}
diff --git a/tests/dbal/fixtures/config.xml b/tests/dbal/fixtures/config.xml
new file mode 100644
index 0000000000..019f582a91
--- /dev/null
+++ b/tests/dbal/fixtures/config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_config">
+ <column>config_name</column>
+ <column>config_value</column>
+ <column>is_dynamic</column>
+ <row>
+ <value>config1</value>
+ <value>foo</value>
+ <value>0</value>
+ </row>
+ <row>
+ <value>config2</value>
+ <value>bar</value>
+ <value>1</value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/dbal/dbal.php b/tests/dbal/select.php
index 663323ad61..70f27549d2 100644
--- a/tests/dbal/dbal.php
+++ b/tests/dbal/select.php
@@ -10,7 +10,7 @@
require_once 'test_framework/framework.php';
require_once '../phpBB/includes/functions.php';
-class phpbb_dbal_test extends phpbb_database_test_case
+class phpbb_dbal_select_test extends phpbb_database_test_case
{
public function getDataSet()
{
@@ -318,174 +318,4 @@ class phpbb_dbal_test extends phpbb_database_test_case
$db->sql_freeresult($result);
}
-
- public static function build_array_insert_data()
- {
- return array(
- array(array(
- 'config_name' => 'test_version',
- 'config_value' => '0.0.0',
- 'is_dynamic' => 1,
- )),
- array(array(
- 'config_name' => 'second config',
- 'config_value' => '10',
- 'is_dynamic' => 0,
- )),
- );
- }
-
- /**
- * @dataProvider build_array_insert_data
- */
- public function test_build_array_insert($sql_ary)
- {
- $db = $this->new_dbal();
-
- $sql = 'INSERT INTO phpbb_config ' . $db->sql_build_array('INSERT', $sql_ary);
- $result = $db->sql_query($sql);
-
- $sql = "SELECT *
- FROM phpbb_config
- WHERE config_name = '" . $sql_ary['config_name'] . "'";
- $result = $db->sql_query_limit($sql, 1);
-
- $this->assertEquals($sql_ary, $db->sql_fetchrow($result));
-
- $db->sql_freeresult($result);
- }
-
- public static function delete_data()
- {
- return array(
- array(
- "WHERE config_name = 'test_version'",
- array(
- array(
- 'config_name' => 'second config',
- 'config_value' => '10',
- 'is_dynamic' => 0,
- ),
- ),
- ),
- array(
- '',
- array(),
- ),
- );
- }
-
- /**
- * @dataProvider delete_data
- */
- public function test_delete($where, $expected)
- {
- $db = $this->new_dbal();
-
- $sql = 'DELETE FROM phpbb_config
- ' . $where;
- $result = $db->sql_query($sql);
-
- $sql = 'SELECT *
- FROM phpbb_config';
- $result = $db->sql_query($sql);
-
- $this->assertEquals($expected, $db->sql_fetchrowset($result));
-
- $db->sql_freeresult($result);
- }
-
- public function test_multiple_insert()
- {
- $db = $this->new_dbal();
-
- $batch_ary = array(
- array(
- 'config_name' => 'batch one',
- 'config_value' => 'b1',
- 'is_dynamic' => 0,
- ),
- array(
- 'config_name' => 'batch two',
- 'config_value' => 'b2',
- 'is_dynamic' => 1,
- ),
- );
-
- $result = $db->sql_multi_insert('phpbb_config', $batch_ary);
-
- $sql = 'SELECT *
- FROM phpbb_config
- ORDER BY config_name ASC';
- $result = $db->sql_query($sql);
-
- $this->assertEquals($batch_ary, $db->sql_fetchrowset($result));
-
- $db->sql_freeresult($result);
- }
-
- public static function update_data()
- {
- return array(
- array(
- array(
- 'config_value' => '20',
- 'is_dynamic' => 0,
- ),
- " WHERE config_name = 'batch one'",
- array(
- array(
- 'config_name' => 'batch one',
- 'config_value' => '20',
- 'is_dynamic' => 0,
- ),
- array(
- 'config_name' => 'batch two',
- 'config_value' => 'b2',
- 'is_dynamic' => 1,
- ),
- ),
- ),
- array(
- array(
- 'config_value' => '0',
- 'is_dynamic' => 1,
- ),
- '',
- array(
- array(
- 'config_name' => 'batch one',
- 'config_value' => '0',
- 'is_dynamic' => 1,
- ),
- array(
- 'config_name' => 'batch two',
- 'config_value' => '0',
- 'is_dynamic' => 1,
- ),
- ),
- ),
- );
- }
-
- /**
- * @dataProvider update_data
- */
- public function test_update($sql_ary, $where, $expected)
- {
- $db = $this->new_dbal();
-
- $sql = 'UPDATE phpbb_config
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . $where;
- $result = $db->sql_query($sql);
-
- $sql = 'SELECT *
- FROM phpbb_config
- ORDER BY config_name ASC';
- $result = $db->sql_query($sql);
-
- $this->assertEquals($expected, $db->sql_fetchrowset($result));
-
- $db->sql_freeresult($result);
- }
}
diff --git a/tests/dbal/write.php b/tests/dbal/write.php
new file mode 100644
index 0000000000..01deacda69
--- /dev/null
+++ b/tests/dbal/write.php
@@ -0,0 +1,172 @@
+<?php
+/**
+*
+* @package testing
+* @copyright (c) 2008 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+require_once 'test_framework/framework.php';
+require_once '../phpBB/includes/functions.php';
+
+class phpbb_dbal_write_test extends phpbb_database_test_case
+{
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/fixtures/config.xml');
+ }
+
+ public static function build_array_insert_data()
+ {
+ return array(
+ array(array(
+ 'config_name' => 'test_version',
+ 'config_value' => '0.0.0',
+ 'is_dynamic' => 1,
+ )),
+ array(array(
+ 'config_name' => 'second config',
+ 'config_value' => '10',
+ 'is_dynamic' => 0,
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider build_array_insert_data
+ */
+ public function test_build_array_insert($sql_ary)
+ {
+ $db = $this->new_dbal();
+
+ $sql = 'INSERT INTO phpbb_config ' . $db->sql_build_array('INSERT', $sql_ary);
+ $result = $db->sql_query($sql);
+
+ $sql = "SELECT *
+ FROM phpbb_config
+ WHERE config_name = '" . $sql_ary['config_name'] . "'";
+ $result = $db->sql_query_limit($sql, 1);
+
+ $this->assertEquals($sql_ary, $db->sql_fetchrow($result));
+
+ $db->sql_freeresult($result);
+ }
+
+ public function test_delete()
+ {
+ $db = $this->new_dbal();
+
+ $sql = "DELETE FROM phpbb_config
+ WHERE config_name = 'config1'";
+ $result = $db->sql_query($sql);
+
+ $sql = 'SELECT *
+ FROM phpbb_config';
+ $result = $db->sql_query($sql);
+ $rows = $db->sql_fetchrowset($result);
+
+ $this->assertEquals(1, sizeof($rows));
+ $this->assertEquals('config2', $rows[0]['config_name']);
+
+ $db->sql_freeresult($result);
+ }
+
+ public function test_multiple_insert()
+ {
+ $db = $this->new_dbal();
+
+ // empty the table
+ $sql = 'DELETE FROM phpbb_config';
+ $db->sql_query($sql);
+
+ $batch_ary = array(
+ array(
+ 'config_name' => 'batch one',
+ 'config_value' => 'b1',
+ 'is_dynamic' => 0,
+ ),
+ array(
+ 'config_name' => 'batch two',
+ 'config_value' => 'b2',
+ 'is_dynamic' => 1,
+ ),
+ );
+
+ $result = $db->sql_multi_insert('phpbb_config', $batch_ary);
+
+ $sql = 'SELECT *
+ FROM phpbb_config
+ ORDER BY config_name ASC';
+ $result = $db->sql_query($sql);
+
+ $this->assertEquals($batch_ary, $db->sql_fetchrowset($result));
+
+ $db->sql_freeresult($result);
+ }
+
+ public static function update_data()
+ {
+ return array(
+ array(
+ array(
+ 'config_value' => '23',
+ 'is_dynamic' => 0,
+ ),
+ " WHERE config_name = 'config1'",
+ array(
+ array(
+ 'config_name' => 'config1',
+ 'config_value' => '23',
+ 'is_dynamic' => 0,
+ ),
+ array(
+ 'config_name' => 'config2',
+ 'config_value' => 'bar',
+ 'is_dynamic' => 1,
+ ),
+ ),
+ ),
+ array(
+ array(
+ 'config_value' => '0',
+ 'is_dynamic' => 1,
+ ),
+ '',
+ array(
+ array(
+ 'config_name' => 'config1',
+ 'config_value' => '0',
+ 'is_dynamic' => 1,
+ ),
+ array(
+ 'config_name' => 'config2',
+ 'config_value' => '0',
+ 'is_dynamic' => 1,
+ ),
+ ),
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider update_data
+ */
+ public function test_update($sql_ary, $where, $expected)
+ {
+ $db = $this->new_dbal();
+
+ $sql = 'UPDATE phpbb_config
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . $where;
+ $result = $db->sql_query($sql);
+
+ $sql = 'SELECT *
+ FROM phpbb_config
+ ORDER BY config_name ASC';
+ $result = $db->sql_query($sql);
+
+ $this->assertEquals($expected, $db->sql_fetchrowset($result));
+
+ $db->sql_freeresult($result);
+ }
+}
diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php
index f6bf420ebc..a64bae8c57 100644
--- a/tests/test_framework/phpbb_database_test_case.php
+++ b/tests/test_framework/phpbb_database_test_case.php
@@ -9,14 +9,18 @@
abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_TestCase
{
+ private static $already_connected;
+
protected $test_case_helpers;
- public function init_test_case_helpers()
+ public function get_test_case_helpers()
{
if (!$this->test_case_helpers)
{
$this->test_case_helpers = new phpbb_test_case_helpers($this);
}
+
+ return $this->test_case_helpers;
}
public function get_dbms_data($dbms)
@@ -50,7 +54,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
'mssqlnative' => array(
'SCHEMA' => 'mssql',
'DELIM' => 'GO',
- 'PDO' => 'odbc',
+ 'PDO' => 'sqlsrv',
),
'oracle' => array(
'SCHEMA' => 'oracle',
@@ -79,6 +83,50 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
}
}
+ public function get_database_config()
+ {
+ if (isset($_SERVER['PHPBB_TEST_DBMS']))
+ {
+ return array(
+ 'dbms' => isset($_SERVER['PHPBB_TEST_DBMS']) ? $_SERVER['PHPBB_TEST_DBMS'] : '',
+ 'dbhost' => isset($_SERVER['PHPBB_TEST_DBHOST']) ? $_SERVER['PHPBB_TEST_DBHOST'] : '',
+ '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'] : '',
+ );
+ }
+ else if (file_exists('test_config.php'))
+ {
+ include('test_config.php');
+
+ return array(
+ 'dbms' => $dbms,
+ 'dbhost' => $dbhost,
+ 'dbport' => $dbport,
+ 'dbname' => $dbname,
+ 'dbuser' => $dbuser,
+ 'dbpasswd' => $dbpasswd,
+ );
+ }
+ else if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>='))
+ {
+ // Silently use sqlite
+ return array(
+ 'dbms' => 'sqlite',
+ 'dbhost' => 'phpbb_unit_tests.sqlite2', // filename
+ 'dbport' => '',
+ 'dbname' => '',
+ 'dbuser' => '',
+ 'dbpasswd' => '',
+ );
+ }
+ else
+ {
+ $this->markTestSkipped('Missing test_config.php: See first error.');
+ }
+ }
+
// NOTE: This function is not the same as split_sql_file from functions_install
public function split_sql_file($sql, $dbms)
{
@@ -99,7 +147,8 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
if ($dbms == 'sqlite')
{
- // trim # off query to satisfy sqlite
+ // remove comment lines starting with # - they are not proper sqlite
+ // syntax and break sqlite2
foreach ($data as $i => $query)
{
$data[$i] = preg_replace('/^#.*$/m', "\n", $query);
@@ -109,79 +158,198 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
return $data;
}
- public function getConnection()
+ /**
+ * Retrieves a list of all tables from the database.
+ *
+ * @param PDO $pdo
+ * @param string $dbms
+ * @return array(string)
+ */
+ function get_tables($pdo, $dbms)
{
- static $already_connected;
+ switch ($pdo)
+ {
+ case 'mysql':
+ case 'mysql4':
+ case 'mysqli':
+ $sql = 'SHOW TABLES';
+ break;
+
+ case 'sqlite':
+ $sql = 'SELECT name
+ FROM sqlite_master
+ WHERE type = "table"';
+ break;
- $this->init_test_case_helpers();
- $database_config = $this->test_case_helpers->get_database_config();
+ case 'mssql':
+ case 'mssql_odbc':
+ case 'mssqlnative':
+ $sql = "SELECT name
+ FROM sysobjects
+ WHERE type='U'";
+ break;
- $dbms_data = $this->get_dbms_data($database_config['dbms']);
+ case 'postgres':
+ $sql = 'SELECT relname
+ FROM pg_stat_user_tables';
+ break;
- if ($already_connected)
+ case 'firebird':
+ $sql = 'SELECT rdb$relation_name
+ FROM rdb$relations
+ WHERE rdb$view_source is null
+ AND rdb$system_flag = 0';
+ break;
+
+ case 'oracle':
+ $sql = 'SELECT table_name
+ FROM USER_TABLES';
+ break;
+ }
+
+ $result = $pdo->query($sql);
+
+ $tables = array();
+ while ($row = $result->fetch(PDO::FETCH_NUM))
{
- if ($database_config['dbms'] == 'sqlite')
- {
- $pdo = new PDO($dbms_data['PDO'] . ':' . $database_config['dbhost']);
- }
- else
- {
- $pdo = new PDO($dbms_data['PDO'] . ':host=' . $database_config['dbhost'] . ';dbname=' . $database_config['dbname'], $database_config['dbuser'], $database_config['dbpasswd']);
- }
+ $tables[] = current($row);
}
- else
+
+ return $tables;
+ }
+
+ /**
+ * Returns a PDO connection for the configured database.
+ *
+ * @param array $config The database configuration
+ * @param array $dbms Information on the used DBMS.
+ * @param bool $use_db Whether the DSN should be tied to a
+ * particular database making it impossible
+ * to delete that database.
+ * @return PDO The PDO database connection.
+ */
+ public function new_pdo($config, $dbms, $use_db)
+ {
+ $dsn = $dbms['PDO'] . ':';
+
+ switch ($dbms['PDO'])
{
- if ($database_config['dbms'] == 'sqlite')
- {
- // delete existing database
- if (file_exists($database_config['dbhost']))
+ case 'sqlite2':
+ $dsn .= $config['dbhost'];
+ break;
+
+ case 'sqlsrv':
+ // prefix the hostname (or DSN) with Server= so using just (local)\SQLExpress
+ // works for example, further parameters can still be appended using ;x=y
+ $dsn .= 'Server=';
+ // no break -> rest like ODBC
+ case 'odbc':
+ // for ODBC assume dbhost is a suitable DSN
+ // e.g. Driver={SQL Server Native Client 10.0};Server=(local)\SQLExpress;
+ $dsn .= $config['dbhost'];
+
+ if ($use_db)
{
- unlink($database_config['dbhost']);
+ $dsn .= ';Database=' . $config['dbname'];
}
+ break;
- $pdo = new PDO($dbms_data['PDO'] . ':' . $database_config['dbhost']);
- }
- else
- {
- $pdo = new PDO($dbms_data['PDO'] . ':host=' . $database_config['dbhost'] . ';', $database_config['dbuser'], $database_config['dbpasswd']);try
+ default:
+ $dsn .= 'host=' . $config['dbhost'];
+
+ if ($use_db)
{
- $pdo->exec('DROP DATABASE ' . $database_config['dbname']);
+ $dsn .= ';dbname=' . $config['dbname'];
}
- catch (PDOException $e){} // ignore non existent db
-
- $pdo->exec('CREATE DATABASE ' . $database_config['dbname']);
+ break;
+ }
- $pdo = new PDO($dbms_data['PDO'] . ':host=' . $database_config['dbhost'] . ';dbname=' . $database_config['dbname'], $database_config['dbuser'], $database_config['dbpasswd']);
- }
+ $pdo = new PDO($dsn, $config['dbuser'], $config['dbpasswd']);;
- // good for debug
- // $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ // good for debug
+ // $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- if ($database_config['dbms'] == 'mysql')
- {
- $sth = $pdo->query('SELECT VERSION() AS version');
- $row = $sth->fetch(PDO::FETCH_ASSOC);
+ return $pdo;
+ }
- if (version_compare($row['version'], '4.1.3', '>='))
+ private function recreate_db($config, $dbms)
+ {
+ switch ($config['dbms'])
+ {
+ case 'sqlite':
+ if (file_exists($config['dbhost']))
{
- $dbms_data['SCHEMA'] .= '_41';
+ unlink($config['dbhost']);
}
- else
+ break;
+
+ default:
+ $pdo = $this->new_pdo($config, $dbms, false);
+
+ try
{
- $dbms_data['SCHEMA'] .= '_40';
+ $pdo->exec('DROP DATABASE ' . $config['dbname']);
}
+ catch (PDOException $e)
+ {
+ // try to delete all tables if dropping the database was not possible.
+ foreach ($this->get_tables() as $table)
+ {
+ try
+ {
+ $pdo->exec('DROP TABLE ' . $table);
+ }
+ catch (PDOException $e){} // ignore non-existent tables
+ }
+ }
- unset($row, $sth);
- }
+ $pdo->exec('CREATE DATABASE ' . $config['dbname']);
+ break;
+ }
+ }
- $sql_query = $this->split_sql_file(file_get_contents("../phpBB/install/schemas/{$dbms_data['SCHEMA']}_schema.sql"), $database_config['dbms']);
+ private function load_schema($pdo, $config, $dbms)
+ {
+ if ($config['dbms'] == 'mysql')
+ {
+ $sth = $pdo->query('SELECT VERSION() AS version');
+ $row = $sth->fetch(PDO::FETCH_ASSOC);
- foreach ($sql_query as $sql)
+ if (version_compare($row['version'], '4.1.3', '>='))
+ {
+ $dbms['SCHEMA'] .= '_41';
+ }
+ else
{
- $pdo->exec($sql);
+ $dbms['SCHEMA'] .= '_40';
}
+ }
+
+ $sql = $this->split_sql_file(file_get_contents("../phpBB/install/schemas/{$dbms['SCHEMA']}_schema.sql"), $config['dbms']);
- $already_connected = true;
+ foreach ($sql as $query)
+ {
+ $pdo->exec($query);
+ }
+ }
+
+ public function getConnection()
+ {
+ $config = $this->get_database_config();
+ $dbms = $this->get_dbms_data($config['dbms']);
+
+ if (!self::$already_connected)
+ {
+ $this->recreate_db($config, $dbms);
+ }
+
+ $pdo = $this->new_pdo($config, $dbms, true);
+
+ if (!self::$already_connected)
+ {
+ $this->load_schema($pdo, $config, $dbms);
+
+ self::$already_connected = true;
}
return $this->createDefaultDBConnection($pdo, 'testdb');
@@ -189,13 +357,20 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
public function new_dbal()
{
- $this->init_test_case_helpers();
- return $this->test_case_helpers->new_dbal();
+ global $phpbb_root_path, $phpEx;
+
+ $config = $this->get_database_config();
+
+ require_once '../phpBB/includes/db/' . $config['dbms'] . '.php';
+ $dbal = 'dbal_' . $config['dbms'];
+ $db = new $dbal();
+ $db->sql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd'], $config['dbname'], $config['dbport']);
+
+ return $db;
}
public function setExpectedTriggerError($errno, $message = '')
{
- $this->init_test_case_helpers();
- $this->test_case_helpers->setExpectedTriggerError($errno, $message);
+ $this->get_test_case_helpers()->setExpectedTriggerError($errno, $message);
}
}
diff --git a/tests/test_framework/phpbb_test_case.php b/tests/test_framework/phpbb_test_case.php
index af867b29ff..fe90d321dc 100644
--- a/tests/test_framework/phpbb_test_case.php
+++ b/tests/test_framework/phpbb_test_case.php
@@ -11,17 +11,18 @@ class phpbb_test_case extends PHPUnit_Framework_TestCase
{
protected $test_case_helpers;
- public function init_test_case_helpers()
+ public function get_test_case_helpers()
{
if (!$this->test_case_helpers)
{
$this->test_case_helpers = new phpbb_test_case_helpers($this);
}
+
+ return $this->test_case_helpers;
}
public function setExpectedTriggerError($errno, $message = '')
{
- $this->init_test_case_helpers();
- $this->test_case_helpers->setExpectedTriggerError($errno, $message);
+ $this->get_test_case_helpers()->setExpectedTriggerError($errno, $message);
}
}
diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php
index 7c026e496e..0acdce32e0 100644
--- a/tests/test_framework/phpbb_test_case_helpers.php
+++ b/tests/test_framework/phpbb_test_case_helpers.php
@@ -18,74 +18,6 @@ class phpbb_test_case_helpers
$this->test_case = $test_case;
}
- public function get_database_config()
- {
- static $show_error = true;
-
- if (file_exists('test_config.php'))
- {
- include('test_config.php');
-
- return array(
- 'dbms' => $dbms,
- 'dbhost' => $dbhost,
- 'dbport' => $dbport,
- 'dbname' => $dbname,
- 'dbuser' => $dbuser,
- 'dbpasswd' => $dbpasswd,
- );
- }
- else if (extension_loaded('sqlite') && version_compare(PHPUnit_Runner_Version::id(), '3.4.15', '>='))
- {
- // Silently use sqlite
- return array(
- 'dbms' => 'sqlite',
- 'dbhost' => 'phpbb_unit_tests.sqlite2', // filename
- 'dbport' => '',
- 'dbname' => '',
- 'dbuser' => '',
- 'dbpasswd' => '',
- );
- }
- else
- {
- if ($show_error)
- {
- $show_error = false;
- }
- else
- {
- $this->test_case->markTestSkipped('Missing test_config.php: See first error.');
- return;
- }
-
- trigger_error("You have to create a test_config.php like this:
-\"<?php
-\$dbms = 'mysqli';
-\$dbhost = 'localhost';
-\$dbport = '';
-\$dbname = 'database';
-\$dbuser = 'user';
-\$dbpasswd = 'password';
-\"
-
-NOTE: The database is dropped and recreated with the phpbb-db-schema! Do NOT specify a database with important data.", E_USER_ERROR);
- }
- }
-
- public function new_dbal()
- {
- global $phpbb_root_path, $phpEx;
- $config = $this->get_database_config();
-
- require_once '../phpBB/includes/db/' . $config['dbms'] . '.php';
- $dbal = 'dbal_' . $config['dbms'];
- $db = new $dbal();
- $db->sql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd'], $config['dbname'], $config['dbport']);
-
- return $db;
- }
-
public function setExpectedTriggerError($errno, $message = '')
{
$exceptionName = '';