diff --git a/_config.php b/_config.php index a372c88..ec27655 100644 --- a/_config.php +++ b/_config.php @@ -12,7 +12,7 @@ */ if (class_exists('Resque_Event') && class_exists('SSResqueRun')) { Resque_Event::listen('beforeFork', function ($data) { - $databaseConfig = DB::getConfig(); + $databaseConfig = DB::getConfig(DB::CONN_PRIMARY); // Reconnect to the database - this may connect to the old DB first, but is required because these processes // are long-lived, and MySQL connections often get closed in between worker runs. We need to connect before diff --git a/src/TestSessionController.php b/src/TestSessionController.php index f5d9947..c1d464e 100644 --- a/src/TestSessionController.php +++ b/src/TestSessionController.php @@ -326,7 +326,7 @@ public function clear() } /** - * As with {@link self::start()}, if you want to extend the functionality of this, then look at + * As with {@link TestSessionController::start()}, if you want to extend the functionality of this, then look at * {@link TestSessionEnvironent::endTestSession()} as the extension points have moved to there now that the logic * is there. */ diff --git a/src/TestSessionEnvironment.php b/src/TestSessionEnvironment.php index 4dc08f1..c5fdedd 100644 --- a/src/TestSessionEnvironment.php +++ b/src/TestSessionEnvironment.php @@ -63,7 +63,7 @@ class TestSessionEnvironment /** * @var string The original database name, before we overrode it with our tmpdb. * - * Used in {@link self::resetDatabaseName()} when we want to restore the normal DB connection. + * Used in {@link TestSessionEnvironment::resetDatabaseName()} when we want to restore the normal DB connection. */ private $oldDatabaseName; @@ -137,14 +137,16 @@ public function getId() /** * Creates a temp database, sets up any extra requirements, and writes the state file. The database will be - * connected to as part of {@link self::applyState()}, so if you're continuing script execution after calling this + * connected to as part of {@link TestSessionEnvironment::applyState()}, so if you're continuing script + * execution after calling this * method, be aware that the database will be different - so various things may break (e.g. administrator logins * using the SS_DEFAULT_USERNAME / SS_DEFAULT_PASSWORD constants). * * If something isn't explicitly handled here, and needs special handling, then it should be taken care of by an * extension to TestSessionEnvironment. You can either extend onBeforeStartTestSession() or * onAfterStartTestSession(). Alternatively, for more fine-grained control, you can also extend - * onBeforeApplyState() and onAfterApplyState(). See the {@link self::applyState()} method for more. + * onBeforeApplyState() and onAfterApplyState(). See the {@link TestSessionEnvironment::applyState()} + * method for more. * * @param array $state An array of test state options to write. * @param mixed $id @@ -270,7 +272,7 @@ public function applyState($state) $this->extend('onBeforeApplyState', $state); // back up source - $databaseConfig = DB::getConfig(); + $databaseConfig = DB::getConfig(DB::CONN_PRIMARY); $this->oldDatabaseName = $databaseConfig['database']; // Load existing state from $this->state into $state, if there is any @@ -445,7 +447,8 @@ private function removeStateFile() /** * Cleans up the test session state by restoring the normal database connect (for the rest of this request, if any) - * and removes the {@link self::$test_state_file} so that future requests don't use this test state. + * and removes the {@link TestSessionEnvironment::$test_state_file} so that future requests don't use this + * test state. * * Can be extended by implementing either onBeforeEndTestSession() or onAfterEndTestSession(). * @@ -514,14 +517,15 @@ public function loadFixtureIntoDb($fixtureFile) } /** - * Reset the database connection to use the original database. Called by {@link self::endTestSession()}. + * Reset the database connection to use the original database. + * Called by {@link TestSessionEnvironment::endTestSession()}. */ public function resetDatabaseName() { if ($this->oldDatabaseName) { - $databaseConfig = DB::getConfig(); + $databaseConfig = DB::getConfig(DB::CONN_PRIMARY); $databaseConfig['database'] = $this->oldDatabaseName; - DB::setConfig($databaseConfig); + DB::setConfig($databaseConfig, DB::CONN_PRIMARY); $conn = DB::get_conn(); @@ -532,7 +536,7 @@ public function resetDatabaseName() } /** - * @return stdClass Data as taken from the JSON object in {@link self::loadFromFile()} + * @return stdClass Data as taken from the JSON object in {@link TestSessionEnvironment::loadFromFile()} */ public function getState() { @@ -564,7 +568,7 @@ public function connectToDatabase($state = null) $state = $this->getState(); } - $databaseConfig = DB::getConfig(); + $databaseConfig = DB::getConfig(DB::CONN_PRIMARY); if (isset($state->database) && $state->database) { if (!DB::get_conn()) { @@ -575,14 +579,14 @@ public function connectToDatabase($state = null) } // Connect to database - DB::connect($databaseConfig); + $this->connectToDB($databaseConfig); } else { // We've already connected to the database, do a fast check to see what database we're currently using $db = DB::get_conn()->getSelectedDatabase(); if (isset($state->database) && $db != $state->database) { $this->oldDatabaseName = $databaseConfig['database']; $databaseConfig['database'] = $state->database; - DB::connect($databaseConfig); + $this->connectToDB($databaseConfig); } } } @@ -618,4 +622,12 @@ public function waitForPendingRequests($await = 700, $timeout = 10000) return true; } + + private function connectToDB(array $databaseConfig): void + { + // Ensure we connect the primary connection and not a replica + // which can happen if we use the default value of DB::CONN_DYNAMIC + // and there is a replica database configured + DB::connect($databaseConfig, DB::CONN_PRIMARY); + } } diff --git a/src/TestSessionState.php b/src/TestSessionState.php index 7cc3835..8efa5ac 100644 --- a/src/TestSessionState.php +++ b/src/TestSessionState.php @@ -33,7 +33,7 @@ public static function incrementState() { $schema = DataObject::getSchema(); - $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(self::class))) + $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(TestSessionState::class))) ->addWhere(['ID' => 1]) ->assignSQL('"PendingRequests"', '"PendingRequests" + 1'); @@ -50,10 +50,10 @@ public static function decrementState() { $schema = DataObject::getSchema(); - $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(self::class))) + $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(TestSessionState::class))) ->addWhere(['ID' => 1]) ->assignSQL('"PendingRequests"', '"PendingRequests" - 1') - ->assign('"LastResponseTimestamp"', self::millitime()); + ->assign('"LastResponseTimestamp"', TestSessionState::millitime()); $update->execute(); }