From: Timo Tijhof Date: Tue, 17 Jul 2018 03:23:30 +0000 (-0700) Subject: WebRequest: Fix flaky testGetElapsedTime test case X-Git-Tag: 1.34.0-rc.0~4747^2 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=36f84edc111b3efc420e9c5f98ce3881cbad947e;p=lhc%2Fweb%2Fwiklou.git WebRequest: Fix flaky testGetElapsedTime test case * Increase tolerance from 0.2s to 60s. * Update mock to only set 'requestTime' when needed. * Inject the mock timestamp. * Increase test coverage by not just ensuring 0.0 is returned when invoked right after (which would be satisfied if it always returned 0.0), but use a timestamp that started slightly in the past to confirm it does (likely) do computation. Bug: T199764 Change-Id: Iad9499391eecb4a9d1923d231a1a5f1afe173ecc --- diff --git a/tests/phpunit/includes/WebRequestTest.php b/tests/phpunit/includes/WebRequestTest.php index 9583921d51..07c307e64e 100644 --- a/tests/phpunit/includes/WebRequestTest.php +++ b/tests/phpunit/includes/WebRequestTest.php @@ -123,7 +123,13 @@ class WebRequestTest extends MediaWikiTestCase { ]; } - protected function mockWebRequest( $data = [] ) { + /** + * @param array $data Request data + * @param array $config + * - float 'requestTime': Mock value for `$_SERVER['REQUEST_TIME_FLOAT']`. + * @return WebRequest + */ + protected function mockWebRequest( array $data = [], array $config = [] ) { // Cannot use PHPUnit getMockBuilder() as it does not support // overriding protected properties afterwards $reflection = new ReflectionClass( WebRequest::class ); @@ -133,9 +139,11 @@ class WebRequestTest extends MediaWikiTestCase { $prop->setAccessible( true ); $prop->setValue( $req, $data ); - $prop = $reflection->getProperty( 'requestTime' ); - $prop->setAccessible( true ); - $prop->setValue( $req, microtime( true ) ); + if ( isset( $config['requestTime'] ) ) { + $prop = $reflection->getProperty( 'requestTime' ); + $prop->setAccessible( true ); + $prop->setValue( $req, $config['requestTime'] ); + } return $req; } @@ -144,9 +152,11 @@ class WebRequestTest extends MediaWikiTestCase { * @covers WebRequest::getElapsedTime */ public function testGetElapsedTime() { - $req = $this->mockWebRequest(); - $this->assertGreaterThanOrEqual( 0.0, $req->getElapsedTime() ); - $this->assertEquals( 0.0, $req->getElapsedTime(), '', /*delta*/ 0.2 ); + $now = microtime( true ) - 10.0; + $req = $this->mockWebRequest( [], [ 'requestTime' => $now ] ); + $this->assertGreaterThanOrEqual( 10.0, $req->getElapsedTime() ); + // Catch common errors, but don't fail on slow hardware or VMs (T199764). + $this->assertEquals( 10.0, $req->getElapsedTime(), '', 60.0 ); } /**