summaryrefslogtreecommitdiff
path: root/modules/simpletest/tests/database_test.test
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2008-10-16 14:58:48 +0000
committerDries Buytaert <dries@buytaert.net>2008-10-16 14:58:48 +0000
commitcbec05812d3f72978882b57c51d4ab306784b563 (patch)
treededc6407d9cb691f8fb6801db4d08a636d302485 /modules/simpletest/tests/database_test.test
parent025c43c68fdae63bb88509369974b44be1999d6d (diff)
downloadbrdo-cbec05812d3f72978882b57c51d4ab306784b563.tar.gz
brdo-cbec05812d3f72978882b57c51d4ab306784b563.tar.bz2
- Patch #298669 by Crell, moshe et al: add query logging per connection.
Diffstat (limited to 'modules/simpletest/tests/database_test.test')
-rw-r--r--modules/simpletest/tests/database_test.test161
1 files changed, 155 insertions, 6 deletions
diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test
index ec6e6a9e3..6cd5920ae 100644
--- a/modules/simpletest/tests/database_test.test
+++ b/modules/simpletest/tests/database_test.test
@@ -123,7 +123,6 @@ class DatabaseConnectionTestCase extends DatabaseTestCase {
* Test that connections return appropriate connection objects.
*/
function testConnectionRouting() {
-
// Clone the master credentials to a slave connection.
// Note this will result in two independent connection objects that happen
// to point to the same place.
@@ -156,7 +155,6 @@ class DatabaseConnectionTestCase extends DatabaseTestCase {
$this->assertIdentical($db1, $db2, t('Both targets refer to the same connection.'));
}
-
}
/**
@@ -351,7 +349,7 @@ class DatabaseInsertTestCase extends DatabaseTestCase {
* Test that we can insert multiple records in one query object.
*/
function testMultiInsert() {
- try {
+ try {
$num_records_before = (int) db_query("SELECT COUNT(*) FROM {test}")->fetchField();
$query = db_insert('test');
@@ -379,7 +377,7 @@ class DatabaseInsertTestCase extends DatabaseTestCase {
$this->assertIdentical($saved_age, '31', t('Can retrieve by name.'));
$saved_age = db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Moe'))->fetchField();
$this->assertIdentical($saved_age, '32', t('Can retrieve by name.'));
- }
+ }
catch (Exception $e) {
$this->assertTrue(FALSE, $e->getMessage());
}
@@ -419,7 +417,7 @@ class DatabaseInsertTestCase extends DatabaseTestCase {
$this->assertIdentical($saved_age, '31', t('Can retrieve by name.'));
$saved_age = db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Moe'))->fetchField();
$this->assertIdentical($saved_age, '32', t('Can retrieve by name.'));
- }
+ }
catch (Exception $e) {
$this->assertTrue(FALSE, $e->getMessage());
}
@@ -453,7 +451,7 @@ class DatabaseInsertTestCase extends DatabaseTestCase {
->execute();
$this->assertIdentical($id, '5', t('Auto-increment ID returned successfully.'));
- }
+ }
catch (Exception $e) {
$this->assertTrue(FALSE, $e->getMessage());
}
@@ -1655,3 +1653,154 @@ class DatabaseRegressionTestCase extends DatabaseTestCase {
$this->assertIdentical($name, $from_database, t("The database handles UTF-8 characters cleanly."));
}
}
+
+/**
+ * Query logging tests.
+ */
+class DatabaseLoggingTestCase extends DatabaseTestCase {
+
+ function getInfo() {
+ return array(
+ 'name' => t('Query logging'),
+ 'description' => t('Test the query logging facility.'),
+ 'group' => t('Database'),
+ );
+ }
+
+ /**
+ * Test that we can log the existence of a query.
+ */
+ function testEnableLogging() {
+ try {
+ Database::startLog('testing');
+
+ db_query("SELECT name FROM {test} WHERE age > :age", array(':age' => 25))->fetchCol();
+ db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Ringo'))->fetchCol();
+
+ $queries = Database::getLog('testing', 'default');
+
+ $this->assertEqual(count($queries), 2, t('Correct number of queries recorded.'));
+
+ foreach ($queries as $query) {
+ $this->assertEqual($query['caller']['function'], __FUNCTION__, t('Correct function in query log.'));
+ }
+ }
+ catch(Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+
+ /**
+ * Test that we can run two logs in parallel.
+ */
+ function testEnableMultiLogging() {
+ try {
+ Database::startLog('testing1');
+
+ db_query("SELECT name FROM {test} WHERE age > :age", array(':age' => 25))->fetchCol();
+
+ Database::startLog('testing2');
+
+ db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Ringo'))->fetchCol();
+
+ $queries1 = Database::getLog('testing1');
+ $queries2 = Database::getLog('testing2');
+
+ $this->assertEqual(count($queries1), 2, t('Correct number of queries recorded for log 1.'));
+ $this->assertEqual(count($queries2), 1, t('Correct number of queries recorded for log 2.'));
+ }
+ catch(Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+
+ /**
+ * Test that we can log queries against multiple targets on the same connection.
+ */
+ function testEnableTargetLogging() {
+ try {
+ // Clone the master credentials to a slave connection and to another fake
+ // connection.
+ $connection_info = Database::getConnectionInfo('default');
+ Database::addConnectionInfo('default', 'slave', $connection_info['default']);
+
+ Database::startLog('testing1');
+
+ db_query("SELECT name FROM {test} WHERE age > :age", array(':age' => 25))->fetchCol();
+
+ db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Ringo'), array('target' => 'slave'));//->fetchCol();
+
+ $queries1 = Database::getLog('testing1');
+
+ $this->assertEqual(count($queries1), 2, t('Recorded queries from all targets.'));
+ $this->assertEqual($queries1[0]['target'], 'default', t('First query used default target.'));
+ $this->assertEqual($queries1[1]['target'], 'slave', t('Second query used slave target.'));
+ }
+ catch(Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+
+ /**
+ * Test that logs to separate targets collapse to the same connection properly.
+ *
+ * This test is identical to the one above, except that it doesn't create
+ * a fake target so the query should fall back to running on the default
+ * target.
+ */
+ function testEnableTargetLoggingNoTarget() {
+ try {
+ Database::startLog('testing1');
+
+ db_query("SELECT name FROM {test} WHERE age > :age", array(':age' => 25))->fetchCol();
+
+ // We use "fake" here as a target because any non-existent target will do.
+ // However, because all of the tests in this class share a single page
+ // request there is likely to be a target of "slave" from one of the other
+ // unit tests, so we use a target here that we know with absolute certainty
+ // does not exist.
+ db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Ringo'), array('target' => 'fake'))->fetchCol();
+
+ $queries1 = Database::getLog('testing1');
+
+ $this->assertEqual(count($queries1), 2, t('Recorded queries from all targets.'));
+ $this->assertEqual($queries1[0]['target'], 'default', t('First query used default target.'));
+ $this->assertEqual($queries1[1]['target'], 'default', t('Second query used default target as fallback.'));
+ }
+ catch(Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+
+ /**
+ * Test that we can log queries separately on different connections.
+ */
+ function testEnableMultiConnectionLogging() {
+ try {
+ // Clone the master credentials to a fake connection.
+ // That both connections point to the same physical database is irrelevant.
+ $connection_info = Database::getConnectionInfo('default');
+ Database::addConnectionInfo('test2', 'default', $connection_info['default']);
+
+ Database::startLog('testing1');
+ Database::startLog('testing1', 'test2');
+
+ db_query("SELECT name FROM {test} WHERE age > :age", array(':age' => 25))->fetchCol();
+
+ $old_key = db_set_active('test2');
+
+ db_query("SELECT age FROM {test} WHERE name = :name", array(':name' => 'Ringo'), array('target' => 'slave'))->fetchCol();
+
+ db_set_active($old_key);
+
+ $queries1 = Database::getLog('testing1');
+ $queries2 = Database::getLog('testing1', 'test2');
+
+ $this->assertEqual(count($queries1), 1, t('Correct number of queries recorded for first connection.'));
+ $this->assertEqual(count($queries2), 1, t('Correct number of queries recorded for second connection.'));
+ }
+ catch(Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+}