Loading core/tests/Drupal/KernelTests/Core/Database/ConnectionUnitTest.php +73 −58 Changes for core/tests/Drupal/KernelTests/Core/Database/ConnectionUnitTest.php: 73 added lines, 58 removed lines. Original line number Diff line number Diff line Loading @@ -13,34 +13,36 @@ */ class ConnectionUnitTest extends KernelTestBase { protected $key; protected $target; /** * A target connection identifier to be used for testing. */ const TEST_TARGET_CONNECTION = 'DatabaseConnectionUnitTest'; /** * The default database connection used for testing. * * @var \Drupal\Core\Database\Connection */ protected $connection; /** * A database connection used for monitoring processes. * * @var \Drupal\Core\Database\Connection */ protected $monitor; protected $originalCount; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); $this->key = 'default'; $this->originalTarget = 'default'; $this->target = 'DatabaseConnectionUnitTest'; // Determine whether the database driver is MySQL. If it is not, the test // methods will not be executed. // @todo Make this test driver-agnostic, or find a proper way to skip it. // See https://www.drupal.org/node/1273478. $connection_info = Database::getConnectionInfo('default'); $this->skipTest = (bool) ($connection_info['default']['driver'] != 'mysql'); if ($this->skipTest) { // Insert an assertion to prevent Simpletest from interpreting the test // as failure. $this->pass('This test is only compatible with MySQL.'); } $this->connection = Database::getConnection(); // Create an additional connection to monitor the connections being opened // and closed in this test. // @see TestBase::changeDatabasePrefix() $connection_info = Database::getConnectionInfo(); Database::addConnectionInfo('default', 'monitor', $connection_info['default']); $this->monitor = Database::getConnection('monitor'); } Loading @@ -50,13 +52,13 @@ protected function setUp() { */ protected function addConnection() { // Add a new target to the connection, by cloning the current connection. $connection_info = Database::getConnectionInfo($this->key); Database::addConnectionInfo($this->key, $this->target, $connection_info[$this->originalTarget]); $connection_info = Database::getConnectionInfo(); Database::addConnectionInfo('default', static::TEST_TARGET_CONNECTION, $connection_info['default']); // Verify that the new target exists. $info = Database::getConnectionInfo($this->key); // Note: Custom assertion message to not expose database credentials. $this->assertIdentical($info[$this->target], $connection_info[$this->key], 'New connection info found.'); $info = Database::getConnectionInfo(); // New connection info found. $this->assertSame($connection_info['default'], $info[static::TEST_TARGET_CONNECTION]); } /** Loading @@ -65,7 +67,7 @@ protected function addConnection() { * @return int */ protected function getConnectionId() { return (int) Database::getConnection($this->target, $this->key)->query('SELECT CONNECTION_ID()')->fetchField(); return (int) Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SELECT CONNECTION_ID()')->fetchField(); } /** Loading Loading @@ -96,19 +98,22 @@ protected function assertNoConnection($id) { * @todo getConnectionId() executes a query. */ public function testOpenClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -120,22 +125,25 @@ public function testOpenClose() { * Tests Database::closeConnection() with a query. */ public function testOpenQueryClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Execute a query. Database::getConnection($this->target, $this->key)->query('SHOW TABLES'); Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SHOW TABLES'); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -147,22 +155,25 @@ public function testOpenQueryClose() { * Tests Database::closeConnection() with a query and custom prefetch method. */ public function testOpenQueryPrefetchClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Execute a query. Database::getConnection($this->target, $this->key)->query('SHOW TABLES')->fetchCol(); Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SHOW TABLES')->fetchCol(); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -174,20 +185,23 @@ public function testOpenQueryPrefetchClose() { * Tests Database::closeConnection() with a select query. */ public function testOpenSelectQueryClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Create a table. $name = 'foo'; Database::getConnection($this->target, $this->key)->schema()->createTable($name, [ Database::getConnection(static::TEST_TARGET_CONNECTION)->schema()->createTable($name, [ 'fields' => [ 'name' => [ 'type' => 'varchar', Loading @@ -197,16 +211,16 @@ public function testOpenSelectQueryClose() { ]); // Execute a query. Database::getConnection($this->target, $this->key)->select('foo', 'f') Database::getConnection(static::TEST_TARGET_CONNECTION)->select('foo', 'f') ->fields('f', ['name']) ->execute() ->fetchAll(); // Drop the table. Database::getConnection($this->target, $this->key)->schema()->dropTable($name); Database::getConnection(static::TEST_TARGET_CONNECTION)->schema()->dropTable($name); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -218,31 +232,32 @@ public function testOpenSelectQueryClose() { * Tests pdo options override. */ public function testConnectionOpen() { $connection = Database::getConnection('default'); $reflection = new \ReflectionObject($connection); $reflection = new \ReflectionObject($this->connection); $connection_property = $reflection->getProperty('connection'); $connection_property->setAccessible(TRUE); // Skip this test when a database driver does not implement PDO. // An alternative database driver that does not implement PDO // should implement its own connection test. if (get_class($connection_property->getValue($connection)) !== 'PDO') { if (get_class($connection_property->getValue($this->connection)) !== 'PDO') { $this->markTestSkipped('Ignored PDO connection unit test for this driver because it does not implement PDO.'); } $error_mode = $connection_property->getValue($connection) $error_mode = $connection_property->getValue($this->connection) ->getAttribute(\PDO::ATTR_ERRMODE); $this->assertEqual($error_mode, \PDO::ERRMODE_EXCEPTION, 'Ensure the default error mode is set to exception.'); // Ensure the default error mode is set to exception. $this->assertSame(\PDO::ERRMODE_EXCEPTION, $error_mode); $connection = Database::getConnectionInfo('default'); $connection['default']['pdo'][\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_SILENT; Database::addConnectionInfo('test', 'default', $connection['default']); $connection = Database::getConnection('default', 'test'); $connection_info = Database::getConnectionInfo(); $connection_info['default']['pdo'][\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_SILENT; Database::addConnectionInfo('test', 'default', $connection_info['default']); $test_connection = Database::getConnection('default', 'test'); $reflection = new \ReflectionObject($connection); $reflection = new \ReflectionObject($test_connection); $connection_property = $reflection->getProperty('connection'); $connection_property->setAccessible(TRUE); $error_mode = $connection_property->getValue($connection) $error_mode = $connection_property->getValue($test_connection) ->getAttribute(\PDO::ATTR_ERRMODE); $this->assertEqual($error_mode, \PDO::ERRMODE_SILENT, 'Ensure PDO connection options can be overridden.'); // Ensure PDO connection options can be overridden. $this->assertSame(\PDO::ERRMODE_SILENT, $error_mode); Database::removeConnection('test'); } Loading Loading
core/tests/Drupal/KernelTests/Core/Database/ConnectionUnitTest.php +73 −58 Changes for core/tests/Drupal/KernelTests/Core/Database/ConnectionUnitTest.php: 73 added lines, 58 removed lines. Original line number Diff line number Diff line Loading @@ -13,34 +13,36 @@ */ class ConnectionUnitTest extends KernelTestBase { protected $key; protected $target; /** * A target connection identifier to be used for testing. */ const TEST_TARGET_CONNECTION = 'DatabaseConnectionUnitTest'; /** * The default database connection used for testing. * * @var \Drupal\Core\Database\Connection */ protected $connection; /** * A database connection used for monitoring processes. * * @var \Drupal\Core\Database\Connection */ protected $monitor; protected $originalCount; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); $this->key = 'default'; $this->originalTarget = 'default'; $this->target = 'DatabaseConnectionUnitTest'; // Determine whether the database driver is MySQL. If it is not, the test // methods will not be executed. // @todo Make this test driver-agnostic, or find a proper way to skip it. // See https://www.drupal.org/node/1273478. $connection_info = Database::getConnectionInfo('default'); $this->skipTest = (bool) ($connection_info['default']['driver'] != 'mysql'); if ($this->skipTest) { // Insert an assertion to prevent Simpletest from interpreting the test // as failure. $this->pass('This test is only compatible with MySQL.'); } $this->connection = Database::getConnection(); // Create an additional connection to monitor the connections being opened // and closed in this test. // @see TestBase::changeDatabasePrefix() $connection_info = Database::getConnectionInfo(); Database::addConnectionInfo('default', 'monitor', $connection_info['default']); $this->monitor = Database::getConnection('monitor'); } Loading @@ -50,13 +52,13 @@ protected function setUp() { */ protected function addConnection() { // Add a new target to the connection, by cloning the current connection. $connection_info = Database::getConnectionInfo($this->key); Database::addConnectionInfo($this->key, $this->target, $connection_info[$this->originalTarget]); $connection_info = Database::getConnectionInfo(); Database::addConnectionInfo('default', static::TEST_TARGET_CONNECTION, $connection_info['default']); // Verify that the new target exists. $info = Database::getConnectionInfo($this->key); // Note: Custom assertion message to not expose database credentials. $this->assertIdentical($info[$this->target], $connection_info[$this->key], 'New connection info found.'); $info = Database::getConnectionInfo(); // New connection info found. $this->assertSame($connection_info['default'], $info[static::TEST_TARGET_CONNECTION]); } /** Loading @@ -65,7 +67,7 @@ protected function addConnection() { * @return int */ protected function getConnectionId() { return (int) Database::getConnection($this->target, $this->key)->query('SELECT CONNECTION_ID()')->fetchField(); return (int) Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SELECT CONNECTION_ID()')->fetchField(); } /** Loading Loading @@ -96,19 +98,22 @@ protected function assertNoConnection($id) { * @todo getConnectionId() executes a query. */ public function testOpenClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -120,22 +125,25 @@ public function testOpenClose() { * Tests Database::closeConnection() with a query. */ public function testOpenQueryClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Execute a query. Database::getConnection($this->target, $this->key)->query('SHOW TABLES'); Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SHOW TABLES'); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -147,22 +155,25 @@ public function testOpenQueryClose() { * Tests Database::closeConnection() with a query and custom prefetch method. */ public function testOpenQueryPrefetchClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Execute a query. Database::getConnection($this->target, $this->key)->query('SHOW TABLES')->fetchCol(); Database::getConnection(static::TEST_TARGET_CONNECTION)->query('SHOW TABLES')->fetchCol(); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -174,20 +185,23 @@ public function testOpenQueryPrefetchClose() { * Tests Database::closeConnection() with a select query. */ public function testOpenSelectQueryClose() { if ($this->skipTest) { return; // Only run this test for the 'mysql' driver. $driver = $this->connection->driver(); if ($driver !== 'mysql') { $this->markTestSkipped("MySql tests can not run for driver '$driver'."); } // Add and open a new connection. $this->addConnection(); $id = $this->getConnectionId(); Database::getConnection($this->target, $this->key); Database::getConnection(static::TEST_TARGET_CONNECTION); // Verify that there is a new connection. $this->assertConnection($id); // Create a table. $name = 'foo'; Database::getConnection($this->target, $this->key)->schema()->createTable($name, [ Database::getConnection(static::TEST_TARGET_CONNECTION)->schema()->createTable($name, [ 'fields' => [ 'name' => [ 'type' => 'varchar', Loading @@ -197,16 +211,16 @@ public function testOpenSelectQueryClose() { ]); // Execute a query. Database::getConnection($this->target, $this->key)->select('foo', 'f') Database::getConnection(static::TEST_TARGET_CONNECTION)->select('foo', 'f') ->fields('f', ['name']) ->execute() ->fetchAll(); // Drop the table. Database::getConnection($this->target, $this->key)->schema()->dropTable($name); Database::getConnection(static::TEST_TARGET_CONNECTION)->schema()->dropTable($name); // Close the connection. Database::closeConnection($this->target, $this->key); Database::closeConnection(static::TEST_TARGET_CONNECTION); // Wait 20ms to give the database engine sufficient time to react. usleep(20000); Loading @@ -218,31 +232,32 @@ public function testOpenSelectQueryClose() { * Tests pdo options override. */ public function testConnectionOpen() { $connection = Database::getConnection('default'); $reflection = new \ReflectionObject($connection); $reflection = new \ReflectionObject($this->connection); $connection_property = $reflection->getProperty('connection'); $connection_property->setAccessible(TRUE); // Skip this test when a database driver does not implement PDO. // An alternative database driver that does not implement PDO // should implement its own connection test. if (get_class($connection_property->getValue($connection)) !== 'PDO') { if (get_class($connection_property->getValue($this->connection)) !== 'PDO') { $this->markTestSkipped('Ignored PDO connection unit test for this driver because it does not implement PDO.'); } $error_mode = $connection_property->getValue($connection) $error_mode = $connection_property->getValue($this->connection) ->getAttribute(\PDO::ATTR_ERRMODE); $this->assertEqual($error_mode, \PDO::ERRMODE_EXCEPTION, 'Ensure the default error mode is set to exception.'); // Ensure the default error mode is set to exception. $this->assertSame(\PDO::ERRMODE_EXCEPTION, $error_mode); $connection = Database::getConnectionInfo('default'); $connection['default']['pdo'][\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_SILENT; Database::addConnectionInfo('test', 'default', $connection['default']); $connection = Database::getConnection('default', 'test'); $connection_info = Database::getConnectionInfo(); $connection_info['default']['pdo'][\PDO::ATTR_ERRMODE] = \PDO::ERRMODE_SILENT; Database::addConnectionInfo('test', 'default', $connection_info['default']); $test_connection = Database::getConnection('default', 'test'); $reflection = new \ReflectionObject($connection); $reflection = new \ReflectionObject($test_connection); $connection_property = $reflection->getProperty('connection'); $connection_property->setAccessible(TRUE); $error_mode = $connection_property->getValue($connection) $error_mode = $connection_property->getValue($test_connection) ->getAttribute(\PDO::ATTR_ERRMODE); $this->assertEqual($error_mode, \PDO::ERRMODE_SILENT, 'Ensure PDO connection options can be overridden.'); // Ensure PDO connection options can be overridden. $this->assertSame(\PDO::ERRMODE_SILENT, $error_mode); Database::removeConnection('test'); } Loading