Merge "rdbms: Add more return typehints"

This commit is contained in:
jenkins-bot 2021-09-14 20:51:25 +00:00 committed by Gerrit Code Review
commit d018c4f6ed
14 changed files with 80 additions and 83 deletions

View file

@ -301,7 +301,7 @@ class DBConnRef implements IDatabase {
return $this->__call( __FUNCTION__, func_get_args() );
}
public function newSelectQueryBuilder() {
public function newSelectQueryBuilder(): SelectQueryBuilder {
return $this->__call( __FUNCTION__, func_get_args() );
}

View file

@ -1832,7 +1832,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
/**
* @inheritDoc
*/
public function newSelectQueryBuilder() {
public function newSelectQueryBuilder(): SelectQueryBuilder {
return new SelectQueryBuilder( $this );
}

View file

@ -601,7 +601,7 @@ interface IDatabase {
*
* @return SelectQueryBuilder
*/
public function newSelectQueryBuilder();
public function newSelectQueryBuilder(): SelectQueryBuilder;
/**
* A SELECT wrapper which returns a single field from a single result row

View file

@ -74,7 +74,7 @@ class DatabaseDomain {
* @param DatabaseDomain|string $domain Result of DatabaseDomain::toString()
* @return DatabaseDomain
*/
public static function newFromId( $domain ) {
public static function newFromId( $domain ): self {
if ( $domain instanceof self ) {
return $domain;
}
@ -197,7 +197,7 @@ class DatabaseDomain {
/**
* @return string
*/
public function getId() {
public function getId(): string {
if ( $this->equivalentString === null ) {
$this->equivalentString = $this->convertToString();
}
@ -208,7 +208,7 @@ class DatabaseDomain {
/**
* @return string
*/
private function convertToString() {
private function convertToString(): string {
$parts = [ (string)$this->database ];
if ( $this->schema !== null ) {
$parts[] = $this->schema;

View file

@ -160,7 +160,7 @@ interface ILoadBalancer {
* @return string
* @since 1.36
*/
public function getClusterName();
public function getClusterName(): string;
/**
* Get the local (and default) database domain ID of connection handles
@ -169,14 +169,14 @@ interface ILoadBalancer {
* @return string Database domain ID; this specifies DB name, schema, and table prefix
* @since 1.31
*/
public function getLocalDomainID();
public function getLocalDomainID(): string;
/**
* @param DatabaseDomain|string|bool $domain Database domain
* @return string Value of $domain if it is foreign or the local domain otherwise
* @since 1.32
*/
public function resolveDomainID( $domain );
public function resolveDomainID( $domain ): string;
/**
* Close all connection and redefine the local domain for testing or schema creation
@ -383,7 +383,7 @@ interface ILoadBalancer {
* @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTOCOMMIT)
* @return DBConnRef
*/
public function getConnectionRef( $i, $groups = [], $domain = false, $flags = 0 );
public function getConnectionRef( $i, $groups = [], $domain = false, $flags = 0 ): IDatabase;
/**
* Get a lazy-connecting database handle reference for a server index
@ -483,7 +483,7 @@ interface ILoadBalancer {
* @param int $i Specific server index
* @return string Readable server name, falling back to the hostname or IP address
*/
public function getServerName( $i );
public function getServerName( $i ): string;
/**
* Return the server configuration map for the server with the specified index

View file

@ -281,7 +281,7 @@ class LoadBalancer implements ILoadBalancer {
];
}
public function getClusterName() {
public function getClusterName(): string {
if ( $this->clusterName !== null ) {
$name = $this->clusterName;
} else {
@ -292,11 +292,11 @@ class LoadBalancer implements ILoadBalancer {
return $name;
}
public function getLocalDomainID() {
public function getLocalDomainID(): string {
return $this->localDomain->getId();
}
public function resolveDomainID( $domain ) {
public function resolveDomainID( $domain ): string {
return $this->resolveDomainInstance( $domain )->getId();
}
@ -304,7 +304,7 @@ class LoadBalancer implements ILoadBalancer {
* @param DatabaseDomain|string|bool $domain
* @return DatabaseDomain
*/
final protected function resolveDomainInstance( $domain ) {
final protected function resolveDomainInstance( $domain ): DatabaseDomain {
if ( $domain instanceof DatabaseDomain ) {
return $domain; // already a domain instance
} elseif ( $domain === false || $domain === $this->localDomain->getId() ) {
@ -1084,7 +1084,7 @@ class LoadBalancer implements ILoadBalancer {
}
}
public function getConnectionRef( $i, $groups = [], $domain = false, $flags = 0 ) {
public function getConnectionRef( $i, $groups = [], $domain = false, $flags = 0 ): IDatabase {
if ( self::fieldHasBit( $flags, self::CONN_SILENCE_ERRORS ) ) {
throw new UnexpectedValueException(
__METHOD__ . ' CONN_SILENCE_ERRORS is not supported'
@ -1576,10 +1576,10 @@ class LoadBalancer implements ILoadBalancer {
return (bool)$this->getStreamingReplicaIndexes();
}
public function getServerName( $i ) {
public function getServerName( $i ): string {
$name = $this->servers[$i]['serverName'] ?? ( $this->servers[$i]['host'] ?? '' );
return ( $name != '' ) ? $name : 'localhost';
return ( $name !== '' ) ? $name : 'localhost';
}
public function getServerInfo( $i ) {

View file

@ -13,9 +13,8 @@ use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\NullLogger;
use RuntimeException;
use WANObjectCache;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\Rdbms\MaintainableDBConnRef;
use Wikimedia\TestingAccessWrapper;
/**
@ -47,17 +46,12 @@ class NameTableStoreTest extends MediaWikiIntegrationTestCase {
}
/**
* @param IDatabase $db
* @param DBConnRef $db
* @return LoadBalancer
*/
private function getMockLoadBalancer( $db ) {
$mock = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->getMock();
$mock->method( 'getConnectionRef' )
->willReturnCallback( static function ( $i ) use ( $mock, $db ) {
return new MaintainableDBConnRef( $mock, $db, $i );
} );
$mock = $this->createMock( LoadBalancer::class );
$mock->method( 'getConnectionRef' )->willReturn( $db );
return $mock;
}
@ -65,7 +59,7 @@ class NameTableStoreTest extends MediaWikiIntegrationTestCase {
* @param null $insertCalls
* @param null $selectCalls
*
* @return MockObject|IDatabase
* @return MockObject&DBConnRef
*/
private function getProxyDb( $insertCalls = null, $selectCalls = null ) {
$proxiedMethods = [
@ -82,9 +76,7 @@ class NameTableStoreTest extends MediaWikiIntegrationTestCase {
'rollback' => null,
'commit' => null,
];
$mock = $this->getMockBuilder( IDatabase::class )
->disableOriginalConstructor()
->getMock();
$mock = $this->createMock( DBConnRef::class );
foreach ( $proxiedMethods as $method => $count ) {
$mock->expects( is_int( $count ) ? $this->exactly( $count ) : $this->any() )
->method( $method )
@ -404,8 +396,6 @@ class NameTableStoreTest extends MediaWikiIntegrationTestCase {
->getMock();
$lb->method( 'getConnectionRef' )
->willReturn( $db );
$lb->method( 'resolveDomainID' )
->willReturnArgument( 0 );
// Two instances hitting the real database using separate caches.
$store1 = new NameTableStore(

View file

@ -2,7 +2,9 @@
use MediaWiki\Permissions\Authority;
use MediaWiki\Tests\Unit\Permissions\MockAuthorityTrait;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\DBQueryError;
use Wikimedia\Rdbms\ILoadBalancer;
use Wikimedia\TestingAccessWrapper;
use Wikimedia\Timestamp\ConvertibleTimestamp;
@ -335,12 +337,9 @@ class ApiMainTest extends ApiTestCase {
}
private function doTestCheckMaxLag( $lag ) {
$mockLB = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->onlyMethods( [ 'getMaxLag', 'getConnectionRef', '__destruct' ] )
->getMock();
$mockLB = $this->createMock( ILoadBalancer::class );
$mockLB->method( 'getMaxLag' )->willReturn( [ 'somehost', $lag ] );
$mockLB->method( 'getConnectionRef' )->willReturn( $this->db );
$mockLB->method( 'getConnectionRef' )->willReturn( $this->createMock( DBConnRef::class ) );
$this->setService( 'DBLoadBalancer', $mockLB );
$req = new FauxRequest();

View file

@ -7,6 +7,7 @@ use MediaWiki\User\UserIdentityValue;
use MediaWiki\User\UserOptionsLookup;
use MediaWiki\User\UserOptionsManager;
use Psr\Log\NullLogger;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\ILoadBalancer;
/**
@ -383,7 +384,7 @@ class UserOptionsManagerTest extends UserOptionsLookupTest {
}
public function testOptionsForUpdateNotRefetchedBeforeInsert() {
$mockDb = $this->createMock( \Wikimedia\Rdbms\IDatabase::class );
$mockDb = $this->createMock( DBConnRef::class );
$mockDb->expects( $this->once() ) // This is critical what we are testing
->method( 'select' )
->willReturn( new FakeResultWrapper( [

View file

@ -2,7 +2,7 @@
use MediaWiki\Http\HttpRequestFactory;
use Psr\Log\NullLogger;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\ILoadBalancer;
use Wikimedia\Timestamp\ConvertibleTimestamp;
@ -17,13 +17,13 @@ class PingbackTest extends MediaWikiUnitTestCase {
}
/**
* @param IDatabase $database
* @param DBConnRef $database
* @param HttpRequestFactory $httpRequestFactory
* @param bool $enablePingback
* @param BagOStuff|null $cache
*/
private function testRun(
$database,
DBConnRef $database,
$httpRequestFactory,
bool $enablePingback = true,
$cache = null
@ -48,7 +48,7 @@ class PingbackTest extends MediaWikiUnitTestCase {
// - no db calls (no select, lock, or upsert)
// - no HTTP request
$this->testRun(
$this->createNoOpMock( IDatabase::class ),
$this->createNoOpMock( DBConnRef::class ),
$this->createNoOpMock( HttpRequestFactory::class ),
false /* $enablePingback */
);
@ -63,7 +63,7 @@ class PingbackTest extends MediaWikiUnitTestCase {
// - no db lock
// - no HTTP request
// - no db upsert for timestamp
$database = $this->createNoOpMock( IDatabase::class, [ 'selectField' ] );
$database = $this->createNoOpMock( DBConnRef::class, [ 'selectField' ] );
$database->expects( $this->once() )->method( 'selectField' )->willReturn( false );
$cache = $this->createMock( BagOStuff::class );
$cache->method( 'add' )->willReturn( false );
@ -85,7 +85,7 @@ class PingbackTest extends MediaWikiUnitTestCase {
// Expect:
// - no HTTP request
// - no db upsert for timestamp
$database = $this->createNoOpMock( IDatabase::class, [ 'selectField', 'lock' ] );
$database = $this->createNoOpMock( DBConnRef::class, [ 'selectField', 'lock' ] );
$database->expects( $this->once() )->method( 'selectField' )->willReturn( false );
$database->expects( $this->once() )->method( 'lock' )->willReturn( false );
@ -109,7 +109,7 @@ class PingbackTest extends MediaWikiUnitTestCase {
// - db lock acquired
// - HTTP POST request
// - db upsert for timestamp
$database = $this->createNoOpMock( IDatabase::class, [ 'selectField', 'lock', 'upsert' ] );
$database = $this->createNoOpMock( DBConnRef::class, [ 'selectField', 'lock', 'upsert' ] );
$httpRequestFactory = $this->createNoOpMock( HttpRequestFactory::class, [ 'post' ] );
$database->expects( $this->once() )->method( 'selectField' )->willReturn( $priorPing );
@ -142,7 +142,7 @@ class PingbackTest extends MediaWikiUnitTestCase {
// - no db lock
// - no HTTP request
// - no db upsert for timestamp
$database = $this->createNoOpMock( IDatabase::class, [ 'selectField' ] );
$database = $this->createNoOpMock( DBConnRef::class, [ 'selectField' ] );
$database->expects( $this->once() )->method( 'selectField' )->willReturn(
ConvertibleTimestamp::convert( TS_UNIX, '20110401080000' )
);

View file

@ -11,21 +11,27 @@ use Wikimedia\Rdbms\ILoadBalancer;
use Wikimedia\Rdbms\LoadBalancer;
/**
* @covers Wikimedia\Rdbms\ConnectionManager
* @covers \Wikimedia\Rdbms\ConnectionManager
*
* @author Daniel Kinzler
*/
class ConnectionManagerTest extends TestCase {
/**
* @return IDatabase|MockObject
* @return IDatabase&MockObject
*/
private function getIDatabaseMock() {
return $this->getMockBuilder( IDatabase::class )
->getMock();
return $this->createMock( IDatabase::class );
}
/**
* @return LoadBalancer|MockObject
* @return DBConnRef&MockObject
*/
private function getDBConnRefMock() {
return $this->createMock( DBConnRef::class );
}
/**
* @return LoadBalancer&MockObject
*/
private function getLoadBalancerMock() {
return $this->createMock( LoadBalancer::class );
@ -105,7 +111,7 @@ class ConnectionManagerTest extends TestCase {
}
public function testGetReadConnectionRef_nullGroups() {
$database = $this->getIDatabaseMock();
$database = $this->getDBConnRefMock();
$lb = $this->getLoadBalancerMock();
$lb->expects( $this->once() )
@ -120,7 +126,7 @@ class ConnectionManagerTest extends TestCase {
}
public function testGetReadConnectionRef_withGroups() {
$database = $this->getIDatabaseMock();
$database = $this->getDBConnRefMock();
$lb = $this->getLoadBalancerMock();
$lb->expects( $this->once() )
@ -165,7 +171,7 @@ class ConnectionManagerTest extends TestCase {
}
public function testGetWriteConnectionRef() {
$database = $this->getIDatabaseMock();
$database = $this->getDBConnRefMock();
$lb = $this->getLoadBalancerMock();
$lb->expects( $this->once() )

View file

@ -9,11 +9,11 @@ use MediaWiki\User\UserNamePrefixSearch;
use MediaWiki\User\UserNameUtils;
use MediaWikiUnitTestCase;
use User;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\LoadBalancer;
/**
* @covers MediaWiki\User\UserNamePrefixSearch
* @covers \MediaWiki\User\UserNamePrefixSearch
* @author DannyS712
*/
class UserNamePrefixSearchTest extends MediaWikiUnitTestCase {
@ -51,7 +51,7 @@ class UserNamePrefixSearchTest extends MediaWikiUnitTestCase {
->willReturn( $hasHideuser );
}
$database = $this->createMock( Database::class );
$database = $this->createMock( DBConnRef::class );
$database->expects( $this->once() )
->method( 'anyString' )
->willReturn( 'anyStringGoesHere' );

View file

@ -3,6 +3,7 @@
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\User\UserIdentityValue;
use PHPUnit\Framework\MockObject\MockObject;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\TestingAccessWrapper;
@ -13,7 +14,7 @@ use Wikimedia\TestingAccessWrapper;
class WatchedItemQueryServiceUnitTest extends MediaWikiUnitTestCase {
/**
* @return MockObject|CommentStore
* @return MockObject&CommentStore
*/
private function getMockCommentStore() {
$mockStore = $this->createMock( CommentStore::class );
@ -29,10 +30,10 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiUnitTestCase {
}
/**
* @param IDatabase $mockDb
* @param DBConnRef $mockDb
* @return WatchedItemQueryService
*/
private function newService( $mockDb ) {
private function newService( DBConnRef $mockDb ) {
return new WatchedItemQueryService(
$this->getMockLoadBalancer( $mockDb ),
$this->getMockCommentStore(),
@ -43,17 +44,17 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiUnitTestCase {
}
/**
* @return MockObject|IDatabase
* @return MockObject&DBConnRef
*/
private function getMockDb() {
$mock = $this->createMock( IDatabase::class );
$mock = $this->createMock( DBConnRef::class );
$mock->method( 'makeList' )
->with(
$this->isType( 'array' ),
$this->isType( 'int' )
)
->will( $this->returnCallback( static function ( $a, $conj ) {
->willReturnCallback( static function ( $a, $conj ) {
$sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
$conds = [];
foreach ( $a as $k => $v ) {
@ -66,7 +67,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiUnitTestCase {
}
}
return implode( $sqlConj, $conds );
} ) );
} );
$mock->method( 'addQuotes' )
->will( $this->returnCallback( static function ( $value ) {
@ -85,10 +86,10 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiUnitTestCase {
}
/**
* @param IDatabase $mockDb
* @param DBConnRef $mockDb
* @return LoadBalancer
*/
private function getMockLoadBalancer( $mockDb ) {
private function getMockLoadBalancer( DBConnRef $mockDb ) {
$mock = $this->createMock( LoadBalancer::class );
$mock->method( 'getConnectionRef' )
->with( DB_REPLICA )

View file

@ -11,9 +11,9 @@ use MediaWiki\User\UserFactory;
use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityValue;
use PHPUnit\Framework\MockObject\MockObject;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\DBConnRef;
use Wikimedia\Rdbms\ILoadBalancer;
use Wikimedia\Rdbms\LBFactory;
use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\TestingAccessWrapper;
/**
@ -27,22 +27,22 @@ class WatchedItemStoreUnitTest extends MediaWikiUnitTestCase {
use MockTitleTrait;
/**
* @return MockObject|IDatabase
* @return MockObject&DBConnRef
*/
private function getMockDb() {
return $this->createMock( IDatabase::class );
return $this->createMock( DBConnRef::class );
}
/**
* @param IDatabase $mockDb
* @param DBConnRef $mockDb
* @param string|null $expectedConnectionType
* @return MockObject|LoadBalancer
* @return MockObject&ILoadBalancer
*/
private function getMockLoadBalancer(
$mockDb,
DBConnRef $mockDb,
$expectedConnectionType = null
) {
$mock = $this->createMock( LoadBalancer::class );
$mock = $this->createMock( ILoadBalancer::class );
if ( $expectedConnectionType !== null ) {
$mock->method( 'getConnectionRef' )
->with( $expectedConnectionType )
@ -55,12 +55,12 @@ class WatchedItemStoreUnitTest extends MediaWikiUnitTestCase {
}
/**
* @param IDatabase $mockDb
* @param DBConnRef $mockDb
* @param string|null $expectedConnectionType
* @return MockObject|LBFactory
* @return MockObject&LBFactory
*/
private function getMockLBFactory(
$mockDb,
DBConnRef $mockDb,
$expectedConnectionType = null
) {
$loadBalancer = $this->getMockLoadBalancer( $mockDb, $expectedConnectionType );
@ -136,10 +136,10 @@ class WatchedItemStoreUnitTest extends MediaWikiUnitTestCase {
}
/**
* @param IDatabase $mockDb
* @param DBConnRef $mockDb
* @return LinkBatchFactory
*/
private function getMockLinkBatchFactory( $mockDb ) {
private function getMockLinkBatchFactory( DBConnRef $mockDb ) {
return new LinkBatchFactory(
$this->createMock( LinkCache::class ),
$this->createMock( TitleFormatter::class ),
@ -2220,7 +2220,7 @@ class WatchedItemStoreUnitTest extends MediaWikiUnitTestCase {
new WatchedItem( $user, $targets[0], '20151212010101' ),
new WatchedItem( $user, $targets[1], null ),
];
$mockDb = $this->createNoOpMock( IDatabase::class );
$mockDb = $this->createNoOpMock( DBConnRef::class );
$mockCache = $this->getMockCache();
$mockCache->expects( $this->at( 1 ) )
@ -2254,7 +2254,7 @@ class WatchedItemStoreUnitTest extends MediaWikiUnitTestCase {
$testPageFactory( 101, 1, 'AnotherDbKey' ),
];
$mockDb = $this->createNoOpMock( IDatabase::class );
$mockDb = $this->createNoOpMock( DBConnRef::class );
$mockCache = $this->createNoOpMock( HashBagOStuff::class );