* @copyright © 2013 Wikimedia Foundation Inc.
*/
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
use Wikimedia\Rdbms\LBFactory;
use Wikimedia\Rdbms\LBFactorySimple;
use Wikimedia\Rdbms\LBFactoryMulti;
use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\Rdbms\ChronologyProtector;
-use Wikimedia\Rdbms\DatabaseMysqli;
use Wikimedia\Rdbms\MySQLMasterPos;
use Wikimedia\Rdbms\DatabaseDomain;
* @dataProvider getLBFactoryClassProvider
*/
public function testGetLBFactoryClass( $expected, $deprecated ) {
- $mockDB = $this->getMockBuilder( DatabaseMysqli::class )
+ $mockDB = $this->getMockBuilder( IDatabase::class )
->disableOriginalConstructor()
->getMock();
$m2Pos = new MySQLMasterPos( 'db1064-bin.002400/794074907', $now );
// Master DB 1
- $mockDB1 = $this->getMockBuilder( DatabaseMysqli::class )
+ $mockDB1 = $this->getMockBuilder( IDatabase::class )
->disableOriginalConstructor()
->getMock();
$mockDB1->method( 'writesOrCallbacksPending' )->willReturn( true );
$lb1->method( 'getMasterPos' )->willReturn( $m1Pos );
$lb1->method( 'getServerName' )->with( 0 )->willReturn( 'master1' );
// Master DB 2
- $mockDB2 = $this->getMockBuilder( DatabaseMysqli::class )
+ $mockDB2 = $this->getMockBuilder( IDatabase::class )
->disableOriginalConstructor()
->getMock();
$mockDB2->method( 'writesOrCallbacksPending' )->willReturn( true );
[
'ip' => '127.0.0.1',
'agent' => "Totally-Not-FireFox"
- ]
+ ],
+ null
);
$mockDB1->expects( $this->exactly( 1 ) )->method( 'writesOrCallbacksPending' );
$mockDB2->expects( $this->exactly( 1 ) )->method( 'lastDoneWrites' );
// Nothing to wait for on first HTTP request start
- $cp->initLB( $lb1 );
- $cp->initLB( $lb2 );
+ $cp->applySessionReplicationPosition( $lb1 );
+ $cp->applySessionReplicationPosition( $lb2 );
// Record positions in stash on first HTTP request end
- $cp->shutdownLB( $lb1 );
- $cp->shutdownLB( $lb2 );
+ $cp->storeSessionReplicationPosition( $lb1 );
+ $cp->storeSessionReplicationPosition( $lb2 );
$cpIndex = null;
$cp->shutdown( null, 'sync', $cpIndex );
);
// Wait for last positions to be reached on second HTTP request start
- $cp->initLB( $lb1 );
- $cp->initLB( $lb2 );
+ $cp->applySessionReplicationPosition( $lb1 );
+ $cp->applySessionReplicationPosition( $lb2 );
// Shutdown (nothing to record)
- $cp->shutdownLB( $lb1 );
- $cp->shutdownLB( $lb2 );
+ $cp->storeSessionReplicationPosition( $lb1 );
+ $cp->storeSessionReplicationPosition( $lb2 );
$cpIndex = null;
$cp->shutdown( null, 'sync', $cpIndex );
] );
}
+ /**
+ * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+ * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+ * @covers DatabaseOracle::selectDB
+ */
public function testNiceDomains() {
global $wgDBname;
);
unset( $db );
- /** @var Database $db */
+ /** @var IMaintainableDatabase $db */
$db = $lb->getConnection( DB_MASTER, [], '' );
$this->assertEquals(
$factory->destroy();
}
+ /**
+ * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+ * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+ * @covers DatabaseOracle::selectDB
+ */
public function testTrickyDomain() {
global $wgDBname;
$factory = $this->newLBFactoryMulti(
[ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
[
- 'dbName' => 'do_not_select_me' // explodes if DB is selected
+ 'dbname' => 'do_not_select_me' // explodes if DB is selected
]
);
$lb = $factory->getMainLB();
- /** @var Database $db */
+ /** @var IMaintainableDatabase $db */
$db = $lb->getConnection( DB_MASTER, [], '' );
$this->assertEquals( '', $db->getDomainID(), "Null domain used" );
$factory->destroy();
}
+ /**
+ * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+ * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+ * @covers DatabaseOracle::selectDB
+ */
public function testInvalidSelectDB() {
- // FIXME: fails under sqlite
- $this->markTestSkippedIfDbType( 'sqlite' );
+ if ( wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+ $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
+ }
+
$dbname = 'unittest-domain'; // explodes if DB is selected
$factory = $this->newLBFactoryMulti(
[ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
[
- 'dbName' => 'do_not_select_me' // explodes if DB is selected
+ 'dbname' => 'do_not_select_me' // explodes if DB is selected
]
);
$lb = $factory->getMainLB();
- /** @var Database $db */
+ /** @var IDatabase $db */
$db = $lb->getConnection( DB_MASTER, [], '' );
- if ( $db->getType() === 'sqlite' ) {
+ \Wikimedia\suppressWarnings();
+ try {
$this->assertFalse( $db->selectDB( 'garbage-db' ) );
- } elseif ( $db->databasesAreIndependent() ) {
- try {
- $e = null;
- $db->selectDB( 'garbage-db' );
- } catch ( \Wikimedia\Rdbms\DBConnectionError $e ) {
- // expected
- }
- $this->assertInstanceOf( \Wikimedia\Rdbms\DBConnectionError::class, $e );
- $this->assertFalse( $db->isOpen() );
- } else {
- \Wikimedia\suppressWarnings();
- try {
- $this->assertFalse( $db->selectDB( 'garbage-db' ) );
- $this->fail( "No error thrown." );
- } catch ( \Wikimedia\Rdbms\DBExpectedError $e ) {
- $this->assertEquals(
- "Could not select database 'garbage-db'.",
- $e->getMessage()
- );
- }
- \Wikimedia\restoreWarnings();
+ $this->fail( "No error thrown." );
+ } catch ( \Wikimedia\Rdbms\DBQueryError $e ) {
+ $this->assertRegExp( '/[\'"]garbage-db[\'"]/', $e->getMessage() );
}
+ \Wikimedia\restoreWarnings();
}
+ /**
+ * @covers \Wikimedia\Rdbms\DatabaseSqlite::selectDB
+ * @covers \Wikimedia\Rdbms\DatabasePostgres::selectDB
+ * @expectedException \Wikimedia\Rdbms\DBConnectionError
+ */
+ public function testInvalidSelectDBIndependant() {
+ $dbname = 'unittest-domain'; // explodes if DB is selected
+ $factory = $this->newLBFactoryMulti(
+ [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
+ [
+ 'dbname' => 'do_not_select_me' // explodes if DB is selected
+ ]
+ );
+ $lb = $factory->getMainLB();
+
+ if ( !wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+ $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
+ }
+
+ /** @var IDatabase $db */
+ $lb->getConnection( DB_MASTER, [], '' );
+ }
+
+ /**
+ * @covers \Wikimedia\Rdbms\DatabaseSqlite::selectDB
+ * @covers \Wikimedia\Rdbms\DatabasePostgres::selectDB
+ * @expectedException \Wikimedia\Rdbms\DBConnectionError
+ */
+ public function testInvalidSelectDBIndependant2() {
+ $dbname = 'unittest-domain'; // explodes if DB is selected
+ $factory = $this->newLBFactoryMulti(
+ [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
+ [
+ 'dbname' => 'do_not_select_me' // explodes if DB is selected
+ ]
+ );
+ $lb = $factory->getMainLB();
+
+ if ( !wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+ $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
+ }
+
+ $db = $lb->getConnection( DB_MASTER );
+ \Wikimedia\suppressWarnings();
+ $db->selectDB( 'garbage-db' );
+ \Wikimedia\restoreWarnings();
+ }
+
+ /**
+ * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+ * @covers \Wikimedia\Rdbms\LoadBalancer::redefineLocalDomain
+ * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+ * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+ * @covers DatabaseOracle::selectDB
+ */
public function testRedefineLocalDomain() {
global $wgDBname;
);
unset( $conn1 );
- $factory->redefineLocalDomain( 'somedb-prefix' );
- $this->assertEquals( 'somedb-prefix', $factory->getLocalDomainID() );
+ $factory->redefineLocalDomain( 'somedb-prefix_' );
+ $this->assertEquals( 'somedb-prefix_', $factory->getLocalDomainID() );
- $domain = new DatabaseDomain( $wgDBname, null, 'pref' );
+ $domain = new DatabaseDomain( $wgDBname, null, 'pref_' );
$factory->redefineLocalDomain( $domain );
$n = 0;
$factory->destroy();
}
- private function quoteTable( Database $db, $table ) {
+ private function quoteTable( IDatabase $db, $table ) {
if ( $db->getType() === 'sqlite' ) {
return $table;
} else {