2019-08-15 18:07:36 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
use Wikimedia\Rdbms\LBFactory;
|
|
|
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Since this is a unit test, we don't test the singleton() or destroySingletons() methods. We also
|
|
|
|
|
* can't test get() with a valid argument, because that winds up calling static methods of
|
|
|
|
|
* ObjectCache and LoggerFactory that aren't yet compatible with proper unit tests. Those will be
|
|
|
|
|
* tested in the integration test for now.
|
|
|
|
|
*
|
|
|
|
|
* @covers LockManagerGroup
|
|
|
|
|
*/
|
|
|
|
|
class LockManagerGroupTest extends MediaWikiUnitTestCase {
|
|
|
|
|
private function getMockLBFactory() {
|
|
|
|
|
$mock = $this->createMock( LBFactory::class );
|
|
|
|
|
$mock->expects( $this->never() )->method( $this->anythingBut( '__destruct' ) );
|
|
|
|
|
return $mock;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testConstructorNoConfigs() {
|
|
|
|
|
new LockManagerGroup( 'domain', [], $this->getMockLBFactory() );
|
|
|
|
|
$this->assertTrue( true, 'No exception thrown' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testConstructorConfigWithNoName() {
|
2019-10-05 04:47:46 +00:00
|
|
|
$this->expectException( Exception::class );
|
|
|
|
|
$this->expectExceptionMessage( 'Cannot register a lock manager with no name.' );
|
2019-08-15 18:07:36 +00:00
|
|
|
|
|
|
|
|
new LockManagerGroup( 'domain',
|
|
|
|
|
[ [ 'name' => 'a', 'class' => 'b' ], [ 'class' => 'c' ] ], $this->getMockLBFactory() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testConstructorConfigWithNoClass() {
|
2019-10-05 04:47:46 +00:00
|
|
|
$this->expectException( Exception::class );
|
|
|
|
|
$this->expectExceptionMessage( 'Cannot register lock manager `c` with no class.' );
|
2019-08-15 18:07:36 +00:00
|
|
|
|
|
|
|
|
new LockManagerGroup( 'domain',
|
|
|
|
|
[ [ 'name' => 'a', 'class' => 'b' ], [ 'name' => 'c' ] ], $this->getMockLBFactory() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetUndefined() {
|
2019-10-05 04:47:46 +00:00
|
|
|
$this->expectException( Exception::class );
|
|
|
|
|
$this->expectExceptionMessage( 'No lock manager defined with the name `c`.' );
|
2019-08-15 18:07:36 +00:00
|
|
|
|
|
|
|
|
$lmg = new LockManagerGroup( 'domain', [ [ 'name' => 'a', 'class' => 'b' ] ],
|
|
|
|
|
$this->getMockLBFactory() );
|
|
|
|
|
$lmg->get( 'c' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testConfigUndefined() {
|
2019-10-05 04:47:46 +00:00
|
|
|
$this->expectException( Exception::class );
|
|
|
|
|
$this->expectExceptionMessage( 'No lock manager defined with the name `c`.' );
|
2019-08-15 18:07:36 +00:00
|
|
|
|
|
|
|
|
$lmg = new LockManagerGroup( 'domain', [ [ 'name' => 'a', 'class' => 'b' ] ],
|
|
|
|
|
$this->getMockLBFactory() );
|
|
|
|
|
$lmg->config( 'c' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testConfig() {
|
|
|
|
|
$lmg = new LockManagerGroup( 'domain', [ [ 'name' => 'a', 'class' => 'b', 'foo' => 'c' ] ],
|
|
|
|
|
$this->getMockLBFactory() );
|
|
|
|
|
$this->assertSame(
|
|
|
|
|
[ 'class' => 'b', 'name' => 'a', 'foo' => 'c', 'domain' => 'domain' ],
|
|
|
|
|
$lmg->config( 'a' )
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetDefaultNull() {
|
2019-10-24 09:17:21 +00:00
|
|
|
$this->hideDeprecated( 'LockManagerGroup::getDefault' );
|
|
|
|
|
|
2019-08-15 18:07:36 +00:00
|
|
|
$lmg = new LockManagerGroup( 'domain', [], $this->getMockLBFactory() );
|
|
|
|
|
$expected = new NullLockManager( [] );
|
|
|
|
|
$actual = $lmg->getDefault();
|
|
|
|
|
// Have to get rid of the $sessions for equality check to work
|
|
|
|
|
TestingAccessWrapper::newFromObject( $actual )->session = null;
|
|
|
|
|
TestingAccessWrapper::newFromObject( $expected )->session = null;
|
|
|
|
|
$this->assertEquals( $expected, $actual );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetAnyException() {
|
2019-10-24 09:17:21 +00:00
|
|
|
$this->hideDeprecated( 'LockManagerGroup::getAny' );
|
|
|
|
|
|
2019-08-15 18:07:36 +00:00
|
|
|
// XXX Isn't the name 'getAny' misleading if we don't get whatever's available?
|
2019-10-05 04:47:46 +00:00
|
|
|
$this->expectException( Exception::class );
|
|
|
|
|
$this->expectExceptionMessage( 'No lock manager defined with the name `fsLockManager`.' );
|
2019-08-15 18:07:36 +00:00
|
|
|
|
|
|
|
|
$lmg = new LockManagerGroup( 'domain', [ [ 'name' => 'a', 'class' => 'b' ] ],
|
|
|
|
|
$this->getMockLBFactory() );
|
|
|
|
|
$lmg->getAny();
|
|
|
|
|
}
|
|
|
|
|
}
|