/** * Tests truncation of messages when max_allowed_packet exception occurs. */ function testMaxAllowedPacketQueryTruncating() { // This test only makes sense if we are running on a MySQL database. // Test if we are. $database = Database::getConnectionInfo('default'); if ($database['default']['driver'] == 'mysql') { // The max_allowed_packet value is configured per database instance. // Retrieve the max_allowed_packet value from the current instance and // check if PHP is configured with sufficient allowed memory to be able // to generate a query larger than max_allowed_packet. $max_allowed_packet = db_query('SELECT @@global.max_allowed_packet')->fetchField(); if (Environment::checkMemoryLimit($max_allowed_packet + 16 * 1024 * 1024)) { $long_name = str_repeat('a', $max_allowed_packet + 1); try { db_query('SELECT name FROM {test} WHERE name = :name', array(':name' => $long_name)); $this->fail("An exception should be thrown for queries larger than 'max_allowed_packet'"); } catch (DatabaseException $e) { // Close and re-open the connection. Otherwise we will run into error // 2006 "MySQL server had gone away" afterwards. Database::closeConnection(); Database::getConnection(); $this->assertEqual($e->getPrevious()->errorInfo[1], 1153, "Got a packet bigger than 'max_allowed_packet' bytes exception thrown."); // Use strlen() to count the bytes exactly, not the unicode chars. $this->assertTrue(strlen($e->getMessage()) <= $max_allowed_packet, "'max_allowed_packet' exception message truncated."); } } else { $this->verbose('The configured max_allowed_packet exceeds the php memory limit. Therefore the test is skipped.'); } } else { $this->verbose('The test requires MySQL. Therefore the test is skipped.'); } }
/** * Tests \Drupal\Component\Utility\Environment::checkMemoryLimit(). * * @dataProvider providerTestCheckMemoryLimit * @covers ::checkMemoryLimit * * @param string $required * The required memory argument for * \Drupal\Component\Utility\Environment::checkMemoryLimit(). * @param string $custom_memory_limit * The custom memory limit argument for * \Drupal\Component\Utility\Environment::checkMemoryLimit(). * @param bool $expected * The expected return value from * \Drupal\Component\Utility\Environment::checkMemoryLimit(). */ public function testCheckMemoryLimit($required, $custom_memory_limit, $expected) { $actual = Environment::checkMemoryLimit($required, $custom_memory_limit); $this->assertEquals($expected, $actual); }