From 0c078e5027cf33af72355720b68ee295eaa1f963 Mon Sep 17 00:00:00 2001 From: Serge Latyntcev Date: Tue, 8 Jan 2019 16:36:20 +1300 Subject: [PATCH] TestSessionState implementation refinement; Move increment/decrement methods to TestSessionState class, fix some documentation, fix some code style and readability issues --- src/TestSessionEnvironment.php | 14 +++++--- src/TestSessionHTTPMiddleware.php | 31 ++---------------- src/TestSessionState.php | 53 +++++++++++++++++++++++-------- 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/TestSessionEnvironment.php b/src/TestSessionEnvironment.php index 9ebd0cc..9ffbe16 100644 --- a/src/TestSessionEnvironment.php +++ b/src/TestSessionEnvironment.php @@ -571,19 +571,23 @@ class TestSessionEnvironment * * @return bool Whether there are no more pending requests */ - public function waitForPendingRequests($await=700, $timeout=10000) + public function waitForPendingRequests($await = 700, $timeout = 10000) { - $timeout = microtime(true) * 10000 + $timeout; - $interval = $await < 300 ? 300 : $await; + $now = static function () { + return microtime(true) * 10000; + }; + + $timeout = $now() + $timeout; + $interval = max(300, $await); do { $model = TestSessionState::get()->byID(1); $pendingRequests = $model->PendingRequests > 0; - $lastRequestAwait = $model->LastResponseTimestamp + $await > microtime(true) * 10000; + $lastRequestAwait = ($model->LastResponseTimestamp + $await) > $now(); $pending = $pendingRequests || $lastRequestAwait; - if ($timeout < microtime(true) * 10000) { + if ($timeout < $now()) { // timed out return false; } diff --git a/src/TestSessionHTTPMiddleware.php b/src/TestSessionHTTPMiddleware.php index 42e316b..ac8be5c 100644 --- a/src/TestSessionHTTPMiddleware.php +++ b/src/TestSessionHTTPMiddleware.php @@ -8,10 +8,8 @@ use SilverStripe\Control\Email\Mailer; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\Middleware\HTTPMiddleware; use SilverStripe\Core\Injector\Injector; -use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; use SilverStripe\ORM\FieldType\DBDatetime; -use SilverStripe\ORM\Queries\SQLUpdate; /** * Sets state previously initialized through {@link TestSessionController}. @@ -41,42 +39,17 @@ class TestSessionHTTPMiddleware implements HTTPMiddleware // Load test state $this->loadTestState($request); - $this->incrementModelState(); + TestSessionState::incrementState(); // Call with safe teardown try { return $delegate($request); } finally { $this->restoreTestState($request); - $this->decrementModelState(); + TestSessionState::decrementState(); } } - protected function incrementModelState() { - $schema = DataObject::getSchema(); - - $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(TestSessionState::class))) - ->addWhere(['ID' => 1]) - ->addAssignments([ - 'PendingRequests' => [ '"PendingRequests" + 1' => [] ] - ]); - - $update->execute(); - } - - protected function decrementModelState() { - $schema = DataObject::getSchema(); - - $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(TestSessionState::class))) - ->addWhere(['ID' => 1]) - ->addAssignments([ - '"PendingRequests"' => [ '"PendingRequests" - 1' => [] ], - '"LastResponseTimestamp"' => microtime(true) * 10000 - ]); - - $update->execute(); - } - /** * Load test state from environment into "real" environment * diff --git a/src/TestSessionState.php b/src/TestSessionState.php index 21c29ed..3755392 100644 --- a/src/TestSessionState.php +++ b/src/TestSessionState.php @@ -3,7 +3,7 @@ namespace SilverStripe\TestSession; use SilverStripe\ORM\DataObject; - +use SilverStripe\ORM\Queries\SQLUpdate; /** * The session state keeps some metadata about the current test session. @@ -12,22 +12,49 @@ use SilverStripe\ORM\DataObject; * * The client side (Behat) must not use this class straightforwardly, but rather * rely on the API of {@see TestSessionEnvironment} or {@see TestSessionController}. + * + * @property int PendingRequests keeps information about how many requests are in progress + * @property float LastResponseTimestamp microtime of the last response made by the server */ class TestSessionState extends DataObject { - private static $db = [ - /** - * Pending requests to keep information - * about how many requests are in progress - * on the server - */ - 'PendingRequests' => 'Int', + private static $table_name = 'TestSessionState'; - /** - * The microtime stamp of the last response - * made by the server. - * (well, actually that's rather TestSessionMiddleware) - */ + private static $db = [ + 'PendingRequests' => 'Int', 'LastResponseTimestamp' => 'Decimal(14, 0)' ]; + + /** + * Increments TestSessionState.PendingRequests number by 1 + * to indicate we have one more request in progress + */ + public static function incrementState() + { + $schema = DataObject::getSchema(); + + $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(self::class))) + ->addWhere(['ID' => 1]) + ->assignSQL('"PendingRequests"', '"PendingRequests" + 1'); + + $update->execute(); + } + + /** + * Decrements TestSessionState.PendingRequests number by 1 + * to indicate we have one more request in progress. + * Also updates TestSessionState.LastResponseTimestamp + * to the current timestamp. + */ + public static function decrementState() + { + $schema = DataObject::getSchema(); + + $update = SQLUpdate::create(sprintf('"%s"', $schema->tableName(self::class))) + ->addWhere(['ID' => 1]) + ->assignSQL('"PendingRequests"', '"PendingRequests" - 1') + ->assign('"LastResponseTimestamp"', microtime(true) * 10000); + + $update->execute(); + } }