47 ->disableOriginalConstructor()
51 'class' => $deprecated,
52 'connection' => $mockDB,
53 # Various other parameters required:
56 'serverTemplate' => [],
59 $this->
hideDeprecated(
'$wgLBFactoryConf must be updated. See RELEASE-NOTES for details' );
62 $this->assertEquals( $expected,
$result );
67 # Format: new class, old class
94 $lb = $factory->getMainLB();
97 $this->assertTrue( $dbw->getLBInfo(
'master' ),
'master shows as master' );
100 $this->assertTrue(
$dbr->getLBInfo(
'master' ),
'DB_REPLICA also gets the master' );
102 $factory->shutdown();
133 'servers' => $servers,
136 $lb = $factory->getMainLB();
139 $this->assertTrue( $dbw->getLBInfo(
'master' ),
'master shows as master' );
142 $dbw->getLBInfo(
'clusterMasterHost' ),
143 'cluster master set' );
146 $this->assertTrue(
$dbr->getLBInfo(
'replica' ),
'slave shows as slave' );
149 $dbr->getLBInfo(
'clusterMasterHost' ),
150 'cluster master set' );
152 $factory->shutdown();
160 'sectionsByDB' => [],
167 'serverTemplate' => [
181 $lb = $factory->getMainLB();
184 $this->assertTrue( $dbw->getLBInfo(
'master' ),
'master shows as master' );
187 $this->assertTrue(
$dbr->getLBInfo(
'replica' ),
'slave shows as slave' );
189 $factory->shutdown();
197 $now = microtime(
true );
200 $m1Pos =
new MySQLMasterPos(
'db1034-bin.000976/843431247', $now );
201 $m2Pos =
new MySQLMasterPos(
'db1064-bin.002400/794074907', $now );
205 ->disableOriginalConstructor()
207 $mockDB1->method(
'writesOrCallbacksPending' )->willReturn(
true );
208 $mockDB1->method(
'lastDoneWrites' )->willReturn( $now );
209 $mockDB1->method(
'getMasterPos' )->willReturn( $m1Pos );
212 ->disableOriginalConstructor()
214 $lb1->method(
'getConnection' )->willReturn( $mockDB1 );
215 $lb1->method(
'getServerCount' )->willReturn( 2 );
216 $lb1->method(
'getAnyOpenConnection' )->willReturn( $mockDB1 );
217 $lb1->method(
'hasOrMadeRecentMasterChanges' )->will( $this->returnCallback(
218 function ()
use ( $mockDB1 ) {
220 $p |= call_user_func( [ $mockDB1,
'writesOrCallbacksPending' ] );
221 $p |= call_user_func( [ $mockDB1,
'lastDoneWrites' ] );
226 $lb1->method(
'getMasterPos' )->willReturn( $m1Pos );
227 $lb1->method(
'getServerName' )->with( 0 )->willReturn(
'master1' );
230 ->disableOriginalConstructor()
232 $mockDB2->method(
'writesOrCallbacksPending' )->willReturn(
true );
233 $mockDB2->method(
'lastDoneWrites' )->willReturn( $now );
234 $mockDB2->method(
'getMasterPos' )->willReturn( $m2Pos );
237 ->disableOriginalConstructor()
239 $lb2->method(
'getConnection' )->willReturn( $mockDB2 );
240 $lb2->method(
'getServerCount' )->willReturn( 2 );
241 $lb2->method(
'getAnyOpenConnection' )->willReturn( $mockDB2 );
242 $lb2->method(
'hasOrMadeRecentMasterChanges' )->will( $this->returnCallback(
243 function ()
use ( $mockDB2 ) {
245 $p |= call_user_func( [ $mockDB2,
'writesOrCallbacksPending' ] );
246 $p |= call_user_func( [ $mockDB2,
'lastDoneWrites' ] );
251 $lb2->method(
'getMasterPos' )->willReturn( $m2Pos );
252 $lb2->method(
'getServerName' )->with( 0 )->willReturn(
'master2' );
259 'agent' =>
"Totally-Not-FireFox"
263 $mockDB1->expects( $this->exactly( 1 ) )->method(
'writesOrCallbacksPending' );
264 $mockDB1->expects( $this->exactly( 1 ) )->method(
'lastDoneWrites' );
265 $mockDB2->expects( $this->exactly( 1 ) )->method(
'writesOrCallbacksPending' );
266 $mockDB2->expects( $this->exactly( 1 ) )->method(
'lastDoneWrites' );
272 $cp->shutdownLB( $lb1 );
273 $cp->shutdownLB( $lb2 );
275 $cp->shutdown(
null,
'sync', $cpIndex );
277 $this->assertEquals( 1, $cpIndex,
"CP write index set" );
283 ->disableOriginalConstructor()
285 $lb1->method(
'getServerCount' )->willReturn( 2 );
286 $lb1->method(
'getServerName' )->with( 0 )->willReturn(
'master1' );
287 $lb1->expects( $this->once() )
288 ->method(
'waitFor' )->with( $this->equalTo( $m1Pos ) );
291 ->disableOriginalConstructor()
293 $lb2->method(
'getServerCount' )->willReturn( 2 );
294 $lb2->method(
'getServerName' )->with( 0 )->willReturn(
'master2' );
295 $lb2->expects( $this->once() )
296 ->method(
'waitFor' )->with( $this->equalTo( $m2Pos ) );
302 'agent' =>
"Totally-Not-FireFox"
311 $cp->shutdownLB( $lb1 );
312 $cp->shutdownLB( $lb2 );
314 $cp->shutdown(
null,
'sync', $cpIndex );
316 $this->assertEquals(
null, $cpIndex,
"CP write index retained" );
324 'sectionsByDB' => [],
330 'serverTemplate' => $serverOverride + [
351 self::markTestSkipped(
"Skipping tests about selecting DBs: not applicable" );
359 $lb = $factory->getMainLB();
374 'Null domain ID handle used'
379 'Null domain ID handle used'
384 'Main domain ID handle used; prefix is empty though'
388 $db->tableName(
'page' ),
389 "Correct full table name"
393 $db->tableName(
"$wgDBname.page" ),
394 "Correct full table name"
398 $db->tableName(
'nice_db.page' ),
399 "Correct full table name"
402 $lb->reuseConnection(
$db );
405 $factory->setDomainPrefix(
'my_' );
414 $db->tableName(
'page' ),
415 "Correct full table name"
419 $db->tableName(
'other_nice_db.page' ),
420 "Correct full table name"
423 $factory->closeAll();
431 self::markTestSkipped(
"Skipping tests about selecting DBs: not applicable" );
435 $dbname =
'unittest-domain';
437 [
'localDomain' => (
new DatabaseDomain( $dbname,
null,
'' ) )->getId() ],
439 'dbName' =>
'do_not_select_me'
442 $lb = $factory->getMainLB();
446 $this->assertEquals(
'',
$db->getDomainID(),
"Null domain used" );
450 $db->tableName(
'page' ),
451 "Correct full table name"
456 $db->tableName(
"$dbname.page" ),
457 "Correct full table name"
462 $db->tableName(
'nice_db.page' ),
463 "Correct full table name"
466 $lb->reuseConnection(
$db );
468 $factory->setDomainPrefix(
'my_' );
469 $db = $lb->getConnection(
DB_MASTER, [],
"$wgDBname-my_" );
473 $db->tableName(
'page' ),
474 "Correct full table name"
478 $db->tableName(
'other_nice_db.page' ),
479 "Correct full table name"
483 $db->tableName(
'garbage-db.page' ),
484 "Correct full table name"
487 $lb->reuseConnection(
$db );
489 $factory->closeAll();
494 $dbname =
'unittest-domain';
496 [
'localDomain' => (
new DatabaseDomain( $dbname,
null,
'' ) )->getId() ],
498 'dbName' =>
'do_not_select_me'
501 $lb = $factory->getMainLB();
505 if (
$db->getType() ===
'sqlite' ) {
506 $this->assertFalse(
$db->selectDB(
'garbage-db' ) );
507 } elseif (
$db->databasesAreIndependent() ) {
510 $db->selectDB(
'garbage-db' );
511 }
catch ( \
Wikimedia\Rdbms\DBConnectionError
$e ) {
515 $this->assertFalse(
$db->isOpen() );
517 \Wikimedia\suppressWarnings();
518 $this->assertFalse(
$db->selectDB(
'garbage-db' ) );
519 \Wikimedia\restoreWarnings();
524 if (
$db->getType() ===
'sqlite' ) {
527 return $db->addIdentifierQuotes( $table );