]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - tests/phpunit/includes/poolcounter/PoolCounterTest.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / tests / phpunit / includes / poolcounter / PoolCounterTest.php
diff --git a/tests/phpunit/includes/poolcounter/PoolCounterTest.php b/tests/phpunit/includes/poolcounter/PoolCounterTest.php
new file mode 100644 (file)
index 0000000..d57ad04
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+// We will use this class with getMockForAbstractClass to create a concrete mock class.
+// That call will die if the contructor is not public, unless we use disableOriginalConstructor(),
+// in which case we could not test the constructor.
+abstract class PoolCounterAbstractMock extends PoolCounter {
+       public function __construct() {
+               call_user_func_array( 'parent::__construct', func_get_args() );
+       }
+}
+
+class PoolCounterTest extends MediaWikiTestCase {
+       public function testConstruct() {
+               $poolCounterConfig = [
+                       'class' => 'PoolCounterMock',
+                       'timeout' => 10,
+                       'workers' => 10,
+                       'maxqueue' => 100,
+               ];
+
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       ->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'someKey' ] )
+                       // don't mock anything - the proper syntax would be setMethods(null), but due
+                       // to a PHPUnit bug that does not work with getMockForAbstractClass()
+                       ->setMethods( [ 'idontexist' ] )
+                       ->getMockForAbstractClass();
+               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+       }
+
+       public function testConstructWithSlots() {
+               $poolCounterConfig = [
+                       'class' => 'PoolCounterMock',
+                       'timeout' => 10,
+                       'workers' => 10,
+                       'slots' => 2,
+                       'maxqueue' => 100,
+               ];
+
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       ->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'key' ] )
+                       ->setMethods( [ 'idontexist' ] ) // don't mock anything
+                       ->getMockForAbstractClass();
+               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+       }
+
+       public function testHashKeyIntoSlots() {
+               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+                       // don't mock anything - the proper syntax would be setMethods(null), but due
+                       // to a PHPUnit bug that does not work with getMockForAbstractClass()
+                       ->setMethods( [ 'idontexist' ] )
+                       ->disableOriginalConstructor()
+                       ->getMockForAbstractClass();
+
+               $hashKeyIntoSlots = new ReflectionMethod( $poolCounter, 'hashKeyIntoSlots' );
+               $hashKeyIntoSlots->setAccessible( true );
+
+               $keysWithTwoSlots = $keysWithFiveSlots = [];
+               foreach ( range( 1, 100 ) as $i ) {
+                       $keysWithTwoSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'key ' . $i, 2 );
+                       $keysWithFiveSlots[] = $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'key ' . $i, 5 );
+               }
+
+               $twoSlotKeys = [];
+               for ( $i = 0; $i <= 1; $i++ ) {
+                       $twoSlotKeys[] = "test:$i";
+               }
+               $fiveSlotKeys = [];
+               for ( $i = 0; $i <= 4; $i++ ) {
+                       $fiveSlotKeys[] = "test:$i";
+               }
+
+               $this->assertArrayEquals( $twoSlotKeys, array_unique( $keysWithTwoSlots ) );
+               $this->assertArrayEquals( $fiveSlotKeys, array_unique( $keysWithFiveSlots ) );
+
+               // make sure it is deterministic
+               $this->assertEquals(
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'asdfgh', 1000 ),
+                       $hashKeyIntoSlots->invoke( $poolCounter, 'test', 'asdfgh', 1000 )
+               );
+       }
+}