TestUtil.php 5.79 KB
Newer Older
1
<?php
romanb's avatar
romanb committed
2

3
namespace Doctrine\Tests;
romanb's avatar
romanb committed
4

5
use Doctrine\DBAL\Connection;
6 7
use Doctrine\DBAL\DriverManager;

romanb's avatar
romanb committed
8 9
/**
 * TestUtil is a class with static utility methods used during tests.
10
 *
romanb's avatar
romanb committed
11 12
 * @author robo
 */
13
class TestUtil
14
{
15 16 17 18 19
    /**
     * @var boolean Whether the database schema is initialized.
     */
    private static $initialized = false;

romanb's avatar
romanb committed
20 21 22
    /**
     * Gets a <b>real</b> database connection using the following parameters
     * of the $GLOBALS array:
23
     *
romanb's avatar
romanb committed
24 25 26 27
     * 'db_type' : The name of the Doctrine DBAL database driver to use.
     * 'db_username' : The username to use for connecting.
     * 'db_password' : The password to use for connecting.
     * 'db_host' : The hostname of the database to connect to.
28 29
     * 'db_server' : The server name of the database to connect to
     *               (optional, some vendors allow multiple server instances with different names on the same host).
romanb's avatar
romanb committed
30 31
     * 'db_name' : The name of the database to connect to.
     * 'db_port' : The port of the database to connect to.
32
     *
romanb's avatar
romanb committed
33 34 35
     * Usually these variables of the $GLOBALS array are filled by PHPUnit based
     * on an XML configuration file. If no such parameters exist, an SQLite
     * in-memory database is used.
36
     *
37
     * IMPORTANT: Each invocation of this method returns a NEW database connection.
38
     *
39
     * @return Connection The database connection instance.
romanb's avatar
romanb committed
40
     */
romanb's avatar
romanb committed
41 42
    public static function getConnection()
    {
43
        $conn = DriverManager::getConnection(self::getConnectionParams());
44

45
        self::addDbEventSubscribers($conn);
46

47 48
        return $conn;
    }
49

50 51 52
    private static function getConnectionParams() {
        if (self::hasRequiredConnectionParams()) {
            return self::getSpecifiedConnectionParams();
53 54
        }

55
        return self::getFallbackConnectionParams();
romanb's avatar
romanb committed
56
    }
57

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    private static function hasRequiredConnectionParams()
    {
        return isset(
            $GLOBALS['db_type'],
            $GLOBALS['db_username'],
            $GLOBALS['db_password'],
            $GLOBALS['db_host'],
            $GLOBALS['db_name'],
            $GLOBALS['db_port']
        )
        && isset(
            $GLOBALS['tmpdb_type'],
            $GLOBALS['tmpdb_username'],
            $GLOBALS['tmpdb_password'],
            $GLOBALS['tmpdb_host'],
            $GLOBALS['tmpdb_port']
        );
    }

77 78 79 80 81 82 83 84 85 86 87
    private static function getSpecifiedConnectionParams() {
        $realDbParams = self::getParamsForMainConnection();
        $tmpDbParams = self::getParamsForTemporaryConnection();

        $realConn = DriverManager::getConnection($realDbParams);

        // Connect to tmpdb in order to drop and create the real test db.
        $tmpConn = DriverManager::getConnection($tmpDbParams);

        $platform  = $tmpConn->getDatabasePlatform();

88 89 90 91
        if (! self::$initialized) {
            if ($platform->supportsCreateDropDatabase()) {
                $dbname = $realConn->getDatabase();
                $realConn->close();
92

93
                $tmpConn->getSchemaManager()->dropAndCreateDatabase($dbname);
94

95 96 97
                $tmpConn->close();
            } else {
                $sm = $realConn->getSchemaManager();
98

99 100
                $schema = $sm->createSchema();
                $stmts = $schema->toDropSql($realConn->getDatabasePlatform());
101

102 103 104
                foreach ($stmts as $stmt) {
                    $realConn->exec($stmt);
                }
105
            }
106 107

            self::$initialized = true;
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
        }

        return $realDbParams;
    }

    private static function getFallbackConnectionParams() {
        $params = array(
            'driver' => 'pdo_sqlite',
            'memory' => true
        );

        if (isset($GLOBALS['db_path'])) {
            $params['path'] = $GLOBALS['db_path'];
            unlink($GLOBALS['db_path']);
        }

        return $params;
    }

    private static function addDbEventSubscribers(Connection $conn) {
        if (isset($GLOBALS['db_event_subscribers'])) {
            $evm = $conn->getEventManager();
            foreach (explode(",", $GLOBALS['db_event_subscribers']) as $subscriberClass) {
                $subscriberInstance = new $subscriberClass();
                $evm->addEventSubscriber($subscriberInstance);
            }
        }
    }

    private static function getParamsForTemporaryConnection()
138
    {
139
        $connectionParams = array(
140 141 142 143
            'driver' => $GLOBALS['tmpdb_type'],
            'user' => $GLOBALS['tmpdb_username'],
            'password' => $GLOBALS['tmpdb_password'],
            'host' => $GLOBALS['tmpdb_host'],
144
            'dbname' => null,
145 146 147
            'port' => $GLOBALS['tmpdb_port']
        );

148 149 150 151
        if (isset($GLOBALS['tmpdb_name'])) {
            $connectionParams['dbname'] = $GLOBALS['tmpdb_name'];
        }

152
        if (isset($GLOBALS['tmpdb_server'])) {
153 154 155 156 157 158 159 160 161 162
            $connectionParams['server'] = $GLOBALS['tmpdb_server'];
        }

        if (isset($GLOBALS['tmpdb_unix_socket'])) {
            $connectionParams['unix_socket'] = $GLOBALS['tmpdb_unix_socket'];
        }

        return $connectionParams;
    }

163
    private static function getParamsForMainConnection()
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
    {
        $connectionParams = array(
            'driver' => $GLOBALS['db_type'],
            'user' => $GLOBALS['db_username'],
            'password' => $GLOBALS['db_password'],
            'host' => $GLOBALS['db_host'],
            'dbname' => $GLOBALS['db_name'],
            'port' => $GLOBALS['db_port']
        );

        if (isset($GLOBALS['db_server'])) {
            $connectionParams['server'] = $GLOBALS['db_server'];
        }

        if (isset($GLOBALS['db_unix_socket'])) {
            $connectionParams['unix_socket'] = $GLOBALS['db_unix_socket'];
180 181
        }

182 183 184 185
        return $connectionParams;
    }

    /**
186
     * @return Connection
187 188 189
     */
    public static function getTempConnection()
    {
190
        return DriverManager::getConnection(self::getParamsForTemporaryConnection());
191
    }
192
}