diff --git a/tests/SimpleSAML/DatabaseTest.php b/tests/SimpleSAML/DatabaseTest.php deleted file mode 100644 index 6a69e3fd8d70d94d5d285f328de0ba3f6ed20f96..0000000000000000000000000000000000000000 --- a/tests/SimpleSAML/DatabaseTest.php +++ /dev/null @@ -1,246 +0,0 @@ -<?php -/** - * This test ensures that the SimpleSAML_Database class can properly - * query a database. - * - * It currently uses sqlite to test, but an alternate config.php file - * should be created for test cases to ensure that it will work - * in an environment. - * - * @author Tyler Antonio, University of Alberta. <tantonio@ualberta.ca> - * @package simpleSAMLphp - */ - -class SimpleSAML_DatabaseTest extends PHPUnit_Framework_TestCase -{ - protected $config; - protected $db; - - /** - * Make protected functions available for testing - * @requires PHP 5.3.2 - */ - protected static function getMethod($getMethod) - { - $class = new ReflectionClass('SimpleSAML\Database'); - $method = $class->getMethod($getMethod); - $method->setAccessible(true); - return $method; - } - - /** - * @covers SimpleSAML\Database::getInstance - * @covers SimpleSAML\Database::generateInstanceId - * @covers SimpleSAML\Database::__construct - * @covers SimpleSAML\Database::connect - */ - public function setUp() - { - $config = array( - 'database.dsn' => 'sqlite::memory:', - 'database.username' => null, - 'database.password' => null, - 'database.prefix' => 'phpunit_', - 'database.persistent' => true, - 'database.slaves' => array(), - ); - - $this->config = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); - - // Ensure that we have a functional configuration class. - $this->assertInstanceOf('SimpleSAML_Configuration', $this->config); - $this->assertEquals($config['database.dsn'], $this->config->getValue('database.dsn')); - - $this->db = SimpleSAML\Database::getInstance($this->config); - - // Ensure that we have a functional database class. - $this->assertInstanceOf('SimpleSAML\Database', $this->db); - } - - /** - * @covers SimpleSAML\Database::getInstance - * @covers SimpleSAML\Database::generateInstanceId - * @covers SimpleSAML\Database::__construct - * @covers SimpleSAML\Database::connect - * @expectedException Exception - * @test - */ - public function ConnectionFailure() - { - $config = array( - 'database.dsn' => 'mysql:host=localhost;dbname=saml', - 'database.username' => 'notauser', - 'database.password' => 'notausersinvalidpassword', - 'database.prefix' => 'phpunit_', - 'database.persistent' => true, - 'database.slaves' => array(), - ); - - $this->config = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); - $db = SimpleSAML\Database::getInstance($this->config); - } - - /** - * @covers SimpleSAML\Database::getInstance - * @covers SimpleSAML\Database::generateInstanceId - * @covers SimpleSAML\Database::__construct - * @covers SimpleSAML\Database::connect - * @test - */ - public function Instances() - { - $config = array( - 'database.dsn' => 'sqlite::memory:', - 'database.username' => null, - 'database.password' => null, - 'database.prefix' => 'phpunit_', - 'database.persistent' => true, - 'database.slaves' => array(), - ); - $config2 = array( - 'database.dsn' => 'sqlite::memory:', - 'database.username' => null, - 'database.password' => null, - 'database.prefix' => 'phpunit2_', - 'database.persistent' => true, - 'database.slaves' => array(), - ); - - $config1 = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); - $config2 = new SimpleSAML_Configuration($config2, "test/SimpleSAML/DatabaseTest.php"); - $config3 = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); - - $db1 = SimpleSAML\Database::getInstance($config1); - $db2 = SimpleSAML\Database::getInstance($config2); - $db3 = SimpleSAML\Database::getInstance($config3); - - $generateInstanceId = self::getMethod('generateInstanceId'); - - $instance1 = $generateInstanceId->invokeArgs($db1, array($config1)); - $instance2 = $generateInstanceId->invokeArgs($db2, array($config2)); - $instance3 = $generateInstanceId->invokeArgs($db3, array($config3)); - - // Assert that $instance1 and $instance2 have different instance ids - $this->assertNotEquals($instance1, $instance2, "Database instances should be different, but returned the same id"); - // Assert that $instance1 and $instance3 have identical instance ids - $this->assertEquals($instance1, $instance3, "Database instances should have the same id, but returned different id"); - - // Assert that $db1 and $db2 are different instances - $this->assertNotEquals(spl_object_hash($db1), spl_object_hash($db2), "Database instances should be different, but returned the same spl_object_hash"); - // Assert that $db1 and $db3 are identical instances - $this->assertEquals(spl_object_hash($db1), spl_object_hash($db3), "Database instances should be the same, but returned different spl_object_hash"); - } - - /** - * @covers SimpleSAML\Database::getInstance - * @covers SimpleSAML\Database::generateInstanceId - * @covers SimpleSAML\Database::__construct - * @covers SimpleSAML\Database::connect - * @covers SimpleSAML\Database::getSlave - * @test - */ - public function Slaves(){ - $getSlave = self::getMethod('getSlave'); - - $master = spl_object_hash(PHPUnit_Framework_Assert::readAttribute($this->db, 'dbMaster')); - $slave = spl_object_hash($getSlave->invokeArgs($this->db, array())); - - $this->assertTrue(($master == $slave), "getSlave should have returned the master database object"); - - $config = array( - 'database.dsn' => 'sqlite::memory:', - 'database.username' => null, - 'database.password' => null, - 'database.prefix' => 'phpunit_', - 'database.persistent' => true, - 'database.slaves' => array( - array( - 'dsn' => 'sqlite::memory:', - 'username' => null, - 'password' => null, - ), - ), - ); - - $sspConfiguration = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); - $msdb = SimpleSAML\Database::getInstance($sspConfiguration); - - $slaves = PHPUnit_Framework_Assert::readAttribute($msdb, 'dbSlaves'); - $gotSlave = spl_object_hash($getSlave->invokeArgs($msdb, array())); - - $this->assertEquals(spl_object_hash($slaves[0]), $gotSlave, "getSlave should have returned a slave database object"); - } - - /** - * @covers SimpleSAML\Database::applyPrefix - * @test - */ - public function prefix(){ - $prefix = $this->config->getValue('database.prefix'); - $table = "saml20_idp_hosted"; - $pftable = $this->db->applyPrefix($table); - - $this->assertEquals($prefix . $table, $pftable, "Did not properly apply the table prefix"); - } - - /** - * @covers SimpleSAML\Database::write - * @covers SimpleSAML\Database::read - * @covers SimpleSAML\Database::exec - * @covers SimpleSAML\Database::query - * @test - */ - public function Querying() - { - $table = $this->db->applyPrefix("sspdbt"); - $this->assertEquals($this->config->getValue('database.prefix') . "sspdbt", $table); - - $this->db->write("CREATE TABLE IF NOT EXISTS $table (ssp_key INT(16) NOT NULL, ssp_value TEXT NOT NULL)", false); - - $query1 = $this->db->read("SELECT * FROM $table"); - $this->assertEquals(0, $query1->fetch(), "Table $table is not empty when it should be."); - - $ssp_key = time(); - $ssp_value = md5(rand(0,10000)); - $stmt = $this->db->write("INSERT INTO $table (ssp_key, ssp_value) VALUES (:ssp_key, :ssp_value)", array('ssp_key' => array($ssp_key, PDO::PARAM_INT), 'ssp_value' => $ssp_value)); - $this->assertEquals(1, $stmt->rowCount(), "Could not insert data into $table."); - - $query2 = $this->db->read("SELECT * FROM $table WHERE ssp_key = :ssp_key", array('ssp_key' => $ssp_key)); - $data = $query2->fetch(); - $this->assertEquals($data['ssp_value'], $ssp_value, "Inserted data doesn't match what is in the database"); - } - - /** - * @covers SimpleSAML\Database::read - * @covers SimpleSAML\Database::query - * @expectedException Exception - * @test - */ - public function ReadFailure() - { - $table = $this->db->applyPrefix("sspdbt"); - $this->assertEquals($this->config->getValue('database.prefix') . "sspdbt", $table); - - $query = $this->db->read("SELECT * FROM $table"); - } - - /** - * @covers SimpleSAML\Database::write - * @covers SimpleSAML\Database::exec - * @expectedException Exception - * @test - */ - public function NoSuchTable() - { - $this->db->write("DROP TABLE phpunit_nonexistent", false); - } - - public function tearDown() - { - $table = $this->db->applyPrefix("sspdbt"); - $this->db->write("DROP TABLE IF EXISTS $table", false); - - unset($this->config); - unset($this->db); - } -} diff --git a/tests/lib/SimpleSAML/DatabaseTest.php b/tests/lib/SimpleSAML/DatabaseTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8f09b91397597b9dd37c91e5e9db5fb627822fcc --- /dev/null +++ b/tests/lib/SimpleSAML/DatabaseTest.php @@ -0,0 +1,297 @@ +<?php + + +/** + * This test ensures that the SimpleSAML_Database class can properly + * query a database. + * + * It currently uses sqlite to test, but an alternate config.php file + * should be created for test cases to ensure that it will work + * in an environment. + * + * @author Tyler Antonio, University of Alberta. <tantonio@ualberta.ca> + * @package simpleSAMLphp + */ +class SimpleSAML_DatabaseTest extends PHPUnit_Framework_TestCase +{ + + /** + * @var SimpleSAML_Configuration + */ + protected $config; + + /** + * @var SimpleSAML\Database + */ + protected $db; + + + /** + * Make protected functions available for testing + * + * @param string $getMethod The method to get. + * @requires PHP 5.3.2 + * + * @return mixed The method itself. + */ + protected static function getMethod($getMethod) + { + $class = new ReflectionClass('SimpleSAML\Database'); + $method = $class->getMethod($getMethod); + $method->setAccessible(true); + return $method; + } + + + /** + * @covers SimpleSAML\Database::getInstance + * @covers SimpleSAML\Database::generateInstanceId + * @covers SimpleSAML\Database::__construct + * @covers SimpleSAML\Database::connect + */ + public function setUp() + { + $config = array( + 'database.dsn' => 'sqlite::memory:', + 'database.username' => null, + 'database.password' => null, + 'database.prefix' => 'phpunit_', + 'database.persistent' => true, + 'database.slaves' => array(), + ); + + $this->config = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); + + // Ensure that we have a functional configuration class. + $this->assertInstanceOf('SimpleSAML_Configuration', $this->config); + $this->assertEquals($config['database.dsn'], $this->config->getString('database.dsn')); + + $this->db = SimpleSAML\Database::getInstance($this->config); + + // Ensure that we have a functional database class. + $this->assertInstanceOf('SimpleSAML\Database', $this->db); + } + + + /** + * @covers SimpleSAML\Database::getInstance + * @covers SimpleSAML\Database::generateInstanceId + * @covers SimpleSAML\Database::__construct + * @covers SimpleSAML\Database::connect + * @expectedException Exception + * @test + */ + public function connectionFailure() + { + $config = array( + 'database.dsn' => 'mysql:host=localhost;dbname=saml', + 'database.username' => 'notauser', + 'database.password' => 'notausersinvalidpassword', + 'database.prefix' => 'phpunit_', + 'database.persistent' => true, + 'database.slaves' => array(), + ); + + $this->config = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); + $db = SimpleSAML\Database::getInstance($this->config); + } + + + /** + * @covers SimpleSAML\Database::getInstance + * @covers SimpleSAML\Database::generateInstanceId + * @covers SimpleSAML\Database::__construct + * @covers SimpleSAML\Database::connect + * @test + */ + public function instances() + { + $config = array( + 'database.dsn' => 'sqlite::memory:', + 'database.username' => null, + 'database.password' => null, + 'database.prefix' => 'phpunit_', + 'database.persistent' => true, + 'database.slaves' => array(), + ); + $config2 = array( + 'database.dsn' => 'sqlite::memory:', + 'database.username' => null, + 'database.password' => null, + 'database.prefix' => 'phpunit2_', + 'database.persistent' => true, + 'database.slaves' => array(), + ); + + $config1 = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); + $config2 = new SimpleSAML_Configuration($config2, "test/SimpleSAML/DatabaseTest.php"); + $config3 = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); + + $db1 = SimpleSAML\Database::getInstance($config1); + $db2 = SimpleSAML\Database::getInstance($config2); + $db3 = SimpleSAML\Database::getInstance($config3); + + $generateInstanceId = self::getMethod('generateInstanceId'); + + $instance1 = $generateInstanceId->invokeArgs($db1, array($config1)); + $instance2 = $generateInstanceId->invokeArgs($db2, array($config2)); + $instance3 = $generateInstanceId->invokeArgs($db3, array($config3)); + + // Assert that $instance1 and $instance2 have different instance ids + $this->assertNotEquals( + $instance1, + $instance2, + "Database instances should be different, but returned the same id" + ); + // Assert that $instance1 and $instance3 have identical instance ids + $this->assertEquals( + $instance1, + $instance3, + "Database instances should have the same id, but returned different id" + ); + + // Assert that $db1 and $db2 are different instances + $this->assertNotEquals( + spl_object_hash($db1), + spl_object_hash($db2), + "Database instances should be different, but returned the same spl_object_hash" + ); + // Assert that $db1 and $db3 are identical instances + $this->assertEquals( + spl_object_hash($db1), + spl_object_hash($db3), + "Database instances should be the same, but returned different spl_object_hash" + ); + } + + + /** + * @covers SimpleSAML\Database::getInstance + * @covers SimpleSAML\Database::generateInstanceId + * @covers SimpleSAML\Database::__construct + * @covers SimpleSAML\Database::connect + * @covers SimpleSAML\Database::getSlave + * @test + */ + public function slaves() + { + $getSlave = self::getMethod('getSlave'); + + $master = spl_object_hash(PHPUnit_Framework_Assert::readAttribute($this->db, 'dbMaster')); + $slave = spl_object_hash($getSlave->invokeArgs($this->db, array())); + + $this->assertTrue(($master == $slave), "getSlave should have returned the master database object"); + + $config = array( + 'database.dsn' => 'sqlite::memory:', + 'database.username' => null, + 'database.password' => null, + 'database.prefix' => 'phpunit_', + 'database.persistent' => true, + 'database.slaves' => array( + array( + 'dsn' => 'sqlite::memory:', + 'username' => null, + 'password' => null, + ), + ), + ); + + $sspConfiguration = new SimpleSAML_Configuration($config, "test/SimpleSAML/DatabaseTest.php"); + $msdb = SimpleSAML\Database::getInstance($sspConfiguration); + + $slaves = PHPUnit_Framework_Assert::readAttribute($msdb, 'dbSlaves'); + $gotSlave = spl_object_hash($getSlave->invokeArgs($msdb, array())); + + $this->assertEquals( + spl_object_hash($slaves[0]), + $gotSlave, + "getSlave should have returned a slave database object" + ); + } + + + /** + * @covers SimpleSAML\Database::applyPrefix + * @test + */ + public function prefix() + { + $prefix = $this->config->getString('database.prefix'); + $table = "saml20_idp_hosted"; + $pftable = $this->db->applyPrefix($table); + + $this->assertEquals($prefix.$table, $pftable, "Did not properly apply the table prefix"); + } + + + /** + * @covers SimpleSAML\Database::write + * @covers SimpleSAML\Database::read + * @covers SimpleSAML\Database::exec + * @covers SimpleSAML\Database::query + * @test + */ + public function querying() + { + $table = $this->db->applyPrefix("sspdbt"); + $this->assertEquals($this->config->getString('database.prefix')."sspdbt", $table); + + $this->db->write( + "CREATE TABLE IF NOT EXISTS $table (ssp_key INT(16) NOT NULL, ssp_value TEXT NOT NULL)", + false + ); + + $query1 = $this->db->read("SELECT * FROM $table"); + $this->assertEquals(0, $query1->fetch(), "Table $table is not empty when it should be."); + + $ssp_key = time(); + $ssp_value = md5(rand(0, 10000)); + $stmt = $this->db->write( + "INSERT INTO $table (ssp_key, ssp_value) VALUES (:ssp_key, :ssp_value)", + array('ssp_key' => array($ssp_key, PDO::PARAM_INT), 'ssp_value' => $ssp_value) + ); + $this->assertEquals(1, $stmt->rowCount(), "Could not insert data into $table."); + + $query2 = $this->db->read("SELECT * FROM $table WHERE ssp_key = :ssp_key", array('ssp_key' => $ssp_key)); + $data = $query2->fetch(); + $this->assertEquals($data['ssp_value'], $ssp_value, "Inserted data doesn't match what is in the database"); + } + + + /** + * @covers SimpleSAML\Database::read + * @covers SimpleSAML\Database::query + * @expectedException Exception + * @test + */ + public function readFailure() + { + $table = $this->db->applyPrefix("sspdbt"); + $this->assertEquals($this->config->getString('database.prefix')."sspdbt", $table); + + $this->db->read("SELECT * FROM $table"); + } + + + /** + * @covers SimpleSAML\Database::write + * @covers SimpleSAML\Database::exec + * @expectedException Exception + * @test + */ + public function noSuchTable() + { + $this->db->write("DROP TABLE phpunit_nonexistent", false); + } + + + public function tearDown() + { + $table = $this->db->applyPrefix("sspdbt"); + $this->db->write("DROP TABLE IF EXISTS $table", false); + + unset($this->config); + unset($this->db); + } +}