Merge "deferred: Improve DeferredUpdates test coverage"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 12 Oct 2017 21:23:19 +0000 (21:23 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 12 Oct 2017 21:23:19 +0000 (21:23 +0000)
includes/deferred/MergeableUpdate.php
tests/phpunit/includes/deferred/CdnCacheUpdateTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/deferred/MWCallableUpdateTest.php [new file with mode: 0644]

index 70760ce..8eeef13 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @since 1.27
  */
-interface MergeableUpdate {
+interface MergeableUpdate extends DeferrableUpdate {
        /**
         * Merge this update with $update
         *
index 11b869a..f3c949d 100644 (file)
@@ -3,6 +3,10 @@
 use Wikimedia\TestingAccessWrapper;
 
 class CdnCacheUpdateTest extends MediaWikiTestCase {
+
+       /**
+        * @covers CdnCacheUpdate::merge
+        */
        public function testPurgeMergeWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
index 3b42356..999ad03 100644 (file)
@@ -2,11 +2,65 @@
 
 class DeferredUpdatesTest extends MediaWikiTestCase {
 
+       /**
+        * @covers DeferredUpdates::addUpdate
+        * @covers DeferredUpdates::push
+        * @covers DeferredUpdates::doUpdates
+        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::runUpdate
+        */
+       public function testAddAndRun() {
+               $update = $this->getMockBuilder( DeferrableUpdate::class )
+                       ->setMethods( [ 'doUpdate' ] )->getMock();
+               $update->expects( $this->once() )->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update );
+               DeferredUpdates::doUpdates();
+       }
+
+       /**
+        * @covers DeferredUpdates::addUpdate
+        * @covers DeferredUpdates::push
+        */
+       public function testAddMergeable() {
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $update1 = $this->getMockBuilder( MergeableUpdate::class )
+                       ->setMethods( [ 'merge', 'doUpdate' ] )->getMock();
+               $update1->expects( $this->once() )->method( 'merge' );
+               $update1->expects( $this->never() )->method( 'doUpdate' );
+
+               $update2 = $this->getMockBuilder( MergeableUpdate::class )
+                       ->setMethods( [ 'merge', 'doUpdate' ] )->getMock();
+               $update2->expects( $this->never() )->method( 'merge' );
+               $update2->expects( $this->never() )->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update1 );
+               DeferredUpdates::addUpdate( $update2 );
+       }
+
+       /**
+        * @covers DeferredUpdates::addCallableUpdate
+        * @covers MWCallableUpdate::getOrigin
+        */
+       public function testAddCallableUpdate() {
+               $this->setMwGlobals( 'wgCommandLineMode', true );
+
+               $ran = 0;
+               DeferredUpdates::addCallableUpdate( function () use ( &$ran ) {
+                       $ran++;
+               } );
+               DeferredUpdates::doUpdates();
+
+               $this->assertSame( 1, $ran, 'Update ran' );
+       }
+
        /**
         * @covers DeferredUpdates::getPendingUpdates
+        * @covers DeferredUpdates::clearPendingUpdates
         */
        public function testGetPendingUpdates() {
-               # Prevent updates from running
+               // Prevent updates from running
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
                $pre = DeferredUpdates::PRESEND;
@@ -34,6 +88,11 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
        }
 
+       /**
+        * @covers DeferredUpdates::doUpdates
+        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::addUpdate
+        */
        public function testDoUpdatesWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
@@ -126,6 +185,11 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                $this->assertEquals( "Marychu", $y, "POSTSEND update ran" );
        }
 
+       /**
+        * @covers DeferredUpdates::doUpdates
+        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::addUpdate
+        */
        public function testDoUpdatesCLI() {
                $this->setMwGlobals( 'wgCommandLineMode', true );
                $updates = [
@@ -140,7 +204,8 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                        '3-2-1' => "deferred update 1 within deferred update 2 with deferred update 3;\n",
                ];
 
-               wfGetLBFactory()->commitMasterChanges( __METHOD__ ); // clear anything
+               // clear anything
+               wfGetLBFactory()->commitMasterChanges( __METHOD__ );
 
                DeferredUpdates::addCallableUpdate(
                        function () use ( $updates ) {
@@ -193,12 +258,18 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                DeferredUpdates::doUpdates();
        }
 
+       /**
+        * @covers DeferredUpdates::doUpdates
+        * @covers DeferredUpdates::execute
+        * @covers DeferredUpdates::addUpdate
+        */
        public function testPresendAddOnPostsendRun() {
                $this->setMwGlobals( 'wgCommandLineMode', true );
 
                $x = false;
                $y = false;
-               wfGetLBFactory()->commitMasterChanges( __METHOD__ ); // clear anything
+               // clear anything
+               wfGetLBFactory()->commitMasterChanges( __METHOD__ );
 
                DeferredUpdates::addCallableUpdate(
                        function () use ( &$x, &$y ) {
diff --git a/tests/phpunit/includes/deferred/MWCallableUpdateTest.php b/tests/phpunit/includes/deferred/MWCallableUpdateTest.php
new file mode 100644 (file)
index 0000000..6995bf8
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @covers MWCallableUpdate
+ */
+class MWCallableUpdateTest extends PHPUnit_Framework_TestCase {
+
+       public function testDoUpdate() {
+               $ran = 0;
+               $update = new MWCallableUpdate( function () use ( &$ran ) {
+                       $ran++;
+               } );
+               $this->assertSame( 0, $ran );
+               $update->doUpdate();
+               $this->assertSame( 1, $ran );
+       }
+
+       public function testCancel() {
+               // Prepare update and DB
+               $db = new DatabaseTestHelper( __METHOD__ );
+               $db->begin( __METHOD__ );
+               $ran = 0;
+               $update = new MWCallableUpdate( function () use ( &$ran ) {
+                       $ran++;
+               }, __METHOD__, $db );
+
+               // Emulate rollback
+               $db->rollback( __METHOD__ );
+
+               // Ensure it was cancelled
+               $update->doUpdate();
+               $this->assertSame( 0, $ran );
+       }
+}