761 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			761 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * A test script for the OpenIDStore classes.
 | |
|  *
 | |
|  * PHP versions 4 and 5
 | |
|  *
 | |
|  * LICENSE: See the COPYING file included in this distribution.
 | |
|  *
 | |
|  * @package OpenID
 | |
|  * @author JanRain, Inc. <openid@janrain.com>
 | |
|  * @copyright 2005-2008 Janrain, Inc.
 | |
|  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Require classes and functions to run the Store tests.
 | |
|  */
 | |
| require_once 'Auth/OpenID/Association.php';
 | |
| require_once 'Auth/OpenID/CryptUtil.php';
 | |
| require_once 'Auth/OpenID/Nonce.php';
 | |
| require_once 'Auth/OpenID.php';
 | |
| 
 | |
| function _Auth_OpenID_mkdtemp()
 | |
| {
 | |
|     if (function_exists('sys_get_temp_dir')) {
 | |
|         $dir = sys_get_temp_dir();
 | |
|     }
 | |
|     else {
 | |
|         if (strpos(PHP_OS, 'WIN') === 0) {
 | |
|             $dir = $_ENV['TMP'];
 | |
|             if (!isset($dir)) {
 | |
|                 $dir = 'C:\Windows\Temp';
 | |
|             }
 | |
|         } else {
 | |
|             $dir = @$_ENV['TMPDIR'];
 | |
|             if (!isset($dir)) {
 | |
|                 $dir = '/tmp';
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return Auth_OpenID_FileStore::_mkdtemp($dir);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This is the host where the SQL stores' databases should be created
 | |
|  * and destroyed.
 | |
|  */
 | |
| global $_Auth_OpenID_db_test_host;
 | |
| $_Auth_OpenID_db_test_host = 'dbtest';
 | |
| 
 | |
| /**
 | |
|  * Generate a sufficently unique database name so many hosts can run
 | |
|  * SQL store tests on the server at the same time and not step on each
 | |
|  * other.
 | |
|  */
 | |
| function _Auth_OpenID_getTmpDbName()
 | |
| {
 | |
|     $hostname = php_uname('n');
 | |
|     $hostname = str_replace('.', '_', $hostname);
 | |
|     $hostname = str_replace('-', '_', $hostname);
 | |
|     $hostname = strtolower($hostname);
 | |
| 
 | |
|     return sprintf("%s_%d_%s_openid_test",
 | |
|                    $hostname,
 | |
|                    getmypid(),
 | |
|                    strval(rand(1, time())));
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Superclass that has methods for testing OpenID stores. Subclass this to
 | |
|  * test your own store implementation.
 | |
|  *
 | |
|  * @package OpenID
 | |
|  */
 | |
| class Tests_Auth_OpenID_Store extends PHPUnit_Framework_TestCase {
 | |
| 
 | |
|   function pass() {}
 | |
| 
 | |
|     /**
 | |
|      * Prepares for the SQL store tests.
 | |
|      */
 | |
|     function setUp()
 | |
|     {
 | |
|         $this->letters = Auth_OpenID_letters;
 | |
|         $this->digits = Auth_OpenID_digits;
 | |
|         $this->punct = Auth_OpenID_punct;
 | |
|         $this->allowed_nonce = $this->letters . $this->digits;
 | |
|         $this->allowed_handle = $this->letters . $this->digits . $this->punct;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Generates an association with the specified parameters.
 | |
|      */
 | |
|     function genAssoc($now, $issued = 0, $lifetime = 600)
 | |
|     {
 | |
|         $sec = Auth_OpenID_CryptUtil::randomString(20);
 | |
|         $hdl = Auth_OpenID_CryptUtil::randomString(128, $this->allowed_handle);
 | |
|         return new Auth_OpenID_Association($hdl, $sec, $now + $issued,
 | |
|                                           $lifetime, 'HMAC-SHA1');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @access private
 | |
|      */
 | |
|     function _checkRetrieve($store, $url, $handle, $expected, $name = null)
 | |
|     {
 | |
|         $retrieved_assoc = $store->getAssociation($url, $handle);
 | |
|         if ($expected === null) {
 | |
|             $this->assertTrue($retrieved_assoc === null);
 | |
|         } else {
 | |
|             $this->assertTrue($expected->equal($retrieved_assoc), $name);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _checkRemove($store, $url, $handle, $expected, $name = null)
 | |
|     {
 | |
|         $present = $store->removeAssociation($url, $handle);
 | |
|         $this->assertTrue((!$expected && !$present) ||
 | |
|                           ($expected && $present),
 | |
|                           $name);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Make sure a given store has a minimum of API compliance. Call
 | |
|      * this function with an empty store.
 | |
|      *
 | |
|      * Raises AssertionError if the store does not work as expected.
 | |
|      *
 | |
|      * OpenIDStore -> NoneType
 | |
|      */
 | |
|     function _testStore($store)
 | |
|     {
 | |
|         // Association functions
 | |
|         $now = time();
 | |
| 
 | |
|         $server_url = 'http://www.myopenid.com/openid';
 | |
| 
 | |
|         $assoc = $this->genAssoc($now);
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, null,
 | |
|             'Make sure that a missing association returns no result');
 | |
| 
 | |
|         $store->storeAssociation($server_url, $assoc);
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc,
 | |
|             'Check that after storage, getting returns the same result');
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc,
 | |
|             'more than once');
 | |
| 
 | |
|         $store->storeAssociation($server_url, $assoc);
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc,
 | |
|             'Storing more than once has no ill effect');
 | |
| 
 | |
|         // Removing an association that does not exist returns not present
 | |
|         $this->_checkRemove($store, $server_url, $assoc->handle . 'x', false,
 | |
|                             "Remove nonexistent association (1)");
 | |
| 
 | |
|         // Removing an association that does not exist returns not present
 | |
|         $this->_checkRemove($store, $server_url . 'x', $assoc->handle, false,
 | |
|                             "Remove nonexistent association (2)");
 | |
| 
 | |
|         // Removing an association that is present returns present
 | |
|         $this->_checkRemove($store, $server_url, $assoc->handle, true,
 | |
|                             "Remove existent association");
 | |
| 
 | |
|         // but not present on subsequent calls
 | |
|         $this->_checkRemove($store, $server_url, $assoc->handle, false,
 | |
|                             "Remove nonexistent association after removal");
 | |
| 
 | |
|         // Put assoc back in the store
 | |
|         $store->storeAssociation($server_url, $assoc);
 | |
| 
 | |
|         // More recent and expires after assoc
 | |
|         $assoc2 = $this->genAssoc($now, $issued = 1);
 | |
|         $store->storeAssociation($server_url, $assoc2);
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc2,
 | |
|             'After storing an association with a different handle, but the
 | |
| same $server_url, the handle with the later expiration is
 | |
| returned.');
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc->handle, $assoc,
 | |
|             'We can still retrieve the older association');
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc2->handle, $assoc2,
 | |
|             'Plus we can retrieve the association with the later expiration
 | |
| explicitly');
 | |
| 
 | |
|         $assoc3 = $this->genAssoc($now, $issued = 2, $lifetime = 100);
 | |
|         $store->storeAssociation($server_url, $assoc3);
 | |
| 
 | |
|         // More recent issued time, so assoc3 is expected.
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc3, "(1)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc->handle,
 | |
|                               $assoc, "(2)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc2->handle,
 | |
|                               $assoc2, "(3)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc3->handle,
 | |
|                               $assoc3, "(4)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc2->handle, true, "(5)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc3, "(6)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc->handle,
 | |
|                               $assoc, "(7)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc2->handle,
 | |
|                               null, "(8)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc3->handle,
 | |
|                               $assoc3, "(9)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc2->handle,
 | |
|                             false, "(10)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc3->handle,
 | |
|                             true, "(11)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, $assoc, "(12)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc->handle,
 | |
|                               $assoc, "(13)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc2->handle,
 | |
|                               null, "(14)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc3->handle,
 | |
|                               null, "(15)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc2->handle,
 | |
|                             false, "(16)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc->handle,
 | |
|                             true, "(17)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc3->handle,
 | |
|                             false, "(18)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, null, null, "(19)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc->handle,
 | |
|                               null, "(20)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url, $assoc2->handle,
 | |
|                               null, "(21)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url,$assoc3->handle,
 | |
|                               null, "(22)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc2->handle,
 | |
|                             false, "(23)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc->handle,
 | |
|                             false, "(24)");
 | |
| 
 | |
|         $this->_checkRemove($store, $server_url, $assoc3->handle,
 | |
|                             false, "(25)");
 | |
| 
 | |
|         // Put associations into store, for two different server URLs
 | |
|         $assoc1 = $this->genAssoc($now);
 | |
|         $assoc2 = $this->genAssoc($now + 2);
 | |
|         $server_url1 = "http://one.example.com/one";
 | |
|         $server_url2 = "http://two.localhost.localdomain/two";
 | |
| 
 | |
|         $store->storeAssociation($server_url1, $assoc1);
 | |
|         $store->storeAssociation($server_url2, $assoc2);
 | |
| 
 | |
|         // Ask for each one, make sure we get it
 | |
|         $this->_checkRetrieve($store, $server_url1, $assoc1->handle,
 | |
|                               $assoc1, "(26)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url2, $assoc2->handle,
 | |
|                               $assoc2, "(27)");
 | |
| 
 | |
|         $store->storeAssociation($server_url1, $assoc1);
 | |
|         $store->storeAssociation($server_url2, $assoc2);
 | |
| 
 | |
|         // Ask for each one, make sure we get it
 | |
|         $this->_checkRetrieve($store, $server_url1, null,
 | |
|                               $assoc1, "(28)");
 | |
| 
 | |
|         $this->_checkRetrieve($store, $server_url2, null,
 | |
|                               $assoc2, "(29)");
 | |
| 
 | |
|         // test expired associations
 | |
|         // assoc 1: server 1, valid
 | |
|         // assoc 2: server 1, expired
 | |
|         // assoc 3: server 2, expired
 | |
|         // assoc 4: server 3, valid
 | |
|         $assocValid1 = $this->genAssoc($now, -3600, 7200);
 | |
|         $assocValid2 = $this->genAssoc($now, -5);
 | |
|         $assocExpired1 = $this->genAssoc($now, -7200, 3600);
 | |
|         $assocExpired2 = $this->genAssoc($now, -7200, 3600);
 | |
| 
 | |
|         if (!$store->supportsCleanup()) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $store->cleanupAssociations();
 | |
|         $store->storeAssociation($server_url . '1', $assocValid1);
 | |
|         $store->storeAssociation($server_url . '1', $assocExpired1);
 | |
|         $store->storeAssociation($server_url . '2', $assocExpired2);
 | |
|         $store->storeAssociation($server_url . '3', $assocValid2);
 | |
| 
 | |
|         $cleaned = $store->cleanupAssociations();
 | |
|         $this->assertEquals(2, $cleaned);
 | |
|     }
 | |
| 
 | |
|     function _checkUseNonce($store, $nonce, $expected, $server_url, $msg=null)
 | |
|     {
 | |
|         list($stamp, $salt) = Auth_OpenID_splitNonce($nonce);
 | |
|         $actual = $store->useNonce($server_url, $stamp, $salt);
 | |
|         $this->assertEquals(intval($expected), intval($actual), "_checkUseNonce failed: $server_url, $msg");
 | |
|     }
 | |
| 
 | |
|     function _testNonce($store)
 | |
|     {
 | |
|         // Nonce functions
 | |
| 
 | |
|         $server_url = 'http://www.myopenid.com/openid';
 | |
| 
 | |
|         foreach (array($server_url, '') as $url) {
 | |
|             // Random nonce (not in store)
 | |
|             $nonce1 = Auth_OpenID_mkNonce();
 | |
| 
 | |
|             // A nonce is not by default
 | |
|             $this->_checkUseNonce($store, $nonce1, true, $url, "blergx");
 | |
| 
 | |
|             // Once stored, cannot be stored again
 | |
|             $this->_checkUseNonce($store, $nonce1, false, $url, 2);
 | |
| 
 | |
|             // And using again has the same effect
 | |
|             $this->_checkUseNonce($store, $nonce1, false, $url, 3);
 | |
| 
 | |
|             // Nonces from when the universe was an hour old should
 | |
|             // not pass these days.
 | |
|             $old_nonce = Auth_OpenID_mkNonce(3600);
 | |
|             $this->_checkUseNonce($store, $old_nonce, false, $url,
 | |
|                                   "Old nonce ($old_nonce) passed.");
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _testNonceCleanup($store) {
 | |
|         if (!$store->supportsCleanup()) {
 | |
|         	return;
 | |
|         }
 | |
| 
 | |
|         $server_url = 'http://www.myopenid.com/openid';
 | |
| 
 | |
|         $now = time();
 | |
| 
 | |
|         $old_nonce1 = Auth_OpenID_mkNonce($now - 20000);
 | |
|         $old_nonce2 = Auth_OpenID_mkNonce($now - 10000);
 | |
|         $recent_nonce = Auth_OpenID_mkNonce($now - 600);
 | |
| 
 | |
|         global $Auth_OpenID_SKEW;
 | |
|         $orig_skew = $Auth_OpenID_SKEW;
 | |
| 
 | |
|         $Auth_OpenID_SKEW = 0;
 | |
|         $store->cleanupNonces();
 | |
|         // Set SKEW high so stores will keep our nonces.
 | |
|         $Auth_OpenID_SKEW = 100000;
 | |
| 
 | |
|         $params = Auth_OpenID_splitNonce($old_nonce1);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertTrue(call_user_func_array(array($store, 'useNonce'), $params));
 | |
| 
 | |
|         $params = Auth_OpenID_splitNonce($old_nonce2);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertTrue(call_user_func_array(array($store, 'useNonce'), $params));
 | |
| 
 | |
|         $params = Auth_OpenID_splitNonce($recent_nonce);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertTrue(call_user_func_array(array($store, 'useNonce'), $params));
 | |
| 
 | |
|         $Auth_OpenID_SKEW = 3600;
 | |
|         $cleaned = $store->cleanupNonces();
 | |
|         $this->assertEquals(2, $cleaned); // , "Cleaned %r nonces." % (cleaned,)
 | |
| 
 | |
|         $Auth_OpenID_SKEW = 100000;
 | |
|         // A roundabout method of checking that the old nonces were
 | |
|         // cleaned is to see if we're allowed to add them again.
 | |
| 
 | |
|         $params = Auth_OpenID_splitNonce($old_nonce1);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertTrue(call_user_func_array(array($store, 'useNonce'), $params));
 | |
|         $params = Auth_OpenID_splitNonce($old_nonce2);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertTrue(call_user_func_array(array($store, 'useNonce'), $params));
 | |
| 
 | |
|         // The recent nonce wasn't cleaned, so it should still fail.
 | |
|         $params = Auth_OpenID_splitNonce($recent_nonce);
 | |
|         array_unshift($params, $server_url);
 | |
|         $this->assertFalse(call_user_func_array(array($store, 'useNonce'), $params));
 | |
| 
 | |
|         $Auth_OpenID_SKEW = $orig_skew;
 | |
|     }
 | |
| 
 | |
| }
 | |
| /**
 | |
|  * Class that tests all of the stores included with the OpenID library
 | |
|  *
 | |
|  * @package OpenID
 | |
|  */
 | |
| class Tests_Auth_OpenID_Included_StoreTest extends Tests_Auth_OpenID_Store {
 | |
|     function test_memstore()
 | |
|     {
 | |
|         require_once 'Tests/Auth/OpenID/MemStore.php';
 | |
|         $store = new Tests_Auth_OpenID_MemStore();
 | |
|         $this->_testStore($store);
 | |
|         $this->_testNonce($store);
 | |
|         $this->_testNonceCleanup($store);
 | |
|     }
 | |
| 
 | |
|     function test_filestore()
 | |
|     {
 | |
|         require_once 'Auth/OpenID/FileStore.php';
 | |
| 
 | |
|         $temp_dir = _Auth_OpenID_mkdtemp();
 | |
| 
 | |
|         if (!$temp_dir) {
 | |
|             trigger_error('Could not create temporary directory ' .
 | |
|                           'with Auth_OpenID_FileStore::_mkdtemp',
 | |
|                           E_USER_WARNING);
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         $store = new Auth_OpenID_FileStore($temp_dir);
 | |
|         $this->_testStore($store);
 | |
|         $this->_testNonce($store);
 | |
|         $this->_testNonceCleanup($store);
 | |
|         $store->destroy();
 | |
|     }
 | |
| 
 | |
|     function test_postgresqlstore()
 | |
|     {
 | |
|         // If the postgres extension isn't loaded or loadable, succeed
 | |
|         // because we can't run the test.
 | |
|         if (!(extension_loaded('pgsql')) ||
 | |
|             !(@include_once 'DB.php')) {
 | |
|             print "(not testing PostGreSQL store)";
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         require_once 'Auth/OpenID/PostgreSQLStore.php';
 | |
| 
 | |
|         global $_Auth_OpenID_db_test_host;
 | |
| 
 | |
|         $temp_db_name = _Auth_OpenID_getTmpDbName();
 | |
| 
 | |
|         $connect_db_name = 'test_master';
 | |
| 
 | |
|         $dsn = array(
 | |
|                      'phptype'  => 'pgsql',
 | |
|                      'username' => 'openid_test',
 | |
|                      'password' => '',
 | |
|                      'hostspec' => $_Auth_OpenID_db_test_host,
 | |
|                      'database' => $connect_db_name
 | |
|                      );
 | |
| 
 | |
|         $allowed_failures = 5;
 | |
|         $result = null;
 | |
|         $sleep_time = 1.0;
 | |
|         $sql = sprintf("CREATE DATABASE %s", $temp_db_name);
 | |
| 
 | |
|         for ($failures = 0; $failures < $allowed_failures; $failures++) {
 | |
|             $template_db =& DB::connect($dsn);
 | |
| 
 | |
|             if (PEAR::isError($template_db)) {
 | |
|                 $result =& $template_db;
 | |
|             } else {
 | |
|                 // Try to create the test database.
 | |
|                 $result = $template_db->query($sql);
 | |
| 
 | |
|                 $template_db->disconnect();
 | |
|                 unset($template_db);
 | |
| 
 | |
|                 if (!PEAR::isError($result)) {
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $sleep_time *= ((mt_rand(1, 100) / 100.0) + 1.5);
 | |
|             print "Failed to create database $temp_db_name.\n".
 | |
|                 "Waiting $sleep_time before trying again\n";
 | |
| 
 | |
|             $int_sleep = floor($sleep_time);
 | |
|             $frac_sleep = $sleep_time - $int_sleep;
 | |
|             sleep($int_sleep);
 | |
|             usleep($frac_sleep * 1000000.0);
 | |
|         }
 | |
| 
 | |
|         if ($failures == $allowed_failures) {
 | |
|             $this->pass("Temporary database creation failed after $failures ".
 | |
|                         " tries ('$temp_db_name'): " . $result->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         // Disconnect from template1 and reconnect to the temporary
 | |
|         // testing database.
 | |
|         $dsn['database'] = $temp_db_name;
 | |
|         $db =& DB::connect($dsn);
 | |
| 
 | |
|         if (PEAR::isError($db)) {
 | |
|             $this->fail("Temporary database connection failed " .
 | |
|                         " ('$temp_db_name'): " . $db->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $store = new Auth_OpenID_PostgreSQLStore($db);
 | |
| 
 | |
|         $this->assertFalse($store->tableExists($store->nonces_table_name));
 | |
|         $this->assertFalse($store->tableExists($store->associations_table_name));
 | |
| 
 | |
|         $store->createTables();
 | |
| 
 | |
|         $this->assertTrue($store->tableExists($store->nonces_table_name));
 | |
|         $this->assertTrue($store->tableExists($store->associations_table_name));
 | |
| 
 | |
|         $this->_testStore($store);
 | |
|         $this->_testNonce($store);
 | |
|         $this->_testNonceCleanup($store);
 | |
| 
 | |
|         $db->disconnect();
 | |
|         unset($db);
 | |
| 
 | |
|         // Connect to template1 again so we can drop the temporary
 | |
|         // database.
 | |
|         $dsn['database'] = $connect_db_name;
 | |
|         $template_db =& DB::connect($dsn);
 | |
| 
 | |
|         if (PEAR::isError($template_db)) {
 | |
|             $this->fail("Template database connection (to drop " .
 | |
|                         "temporary database) failed: " .
 | |
|                         $template_db->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $result = $template_db->query(sprintf("DROP DATABASE %s",
 | |
|                                               $temp_db_name));
 | |
| 
 | |
|         if (PEAR::isError($result)) {
 | |
|             $this->fail("Dropping temporary database failed: " .
 | |
|                         $result->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $template_db->disconnect();
 | |
|         unset($template_db);
 | |
|     }
 | |
| 
 | |
|     function test_sqlitestore()
 | |
|     {
 | |
|         // If the sqlite extension isn't loaded or loadable, succeed
 | |
|         // because we can't run the test.
 | |
|         if (!(extension_loaded('sqlite')) ||
 | |
|             !(@include_once 'DB.php')) {
 | |
|             print "(not testing SQLite store)";
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         require_once 'Auth/OpenID/SQLiteStore.php';
 | |
| 
 | |
|         $temp_dir = _Auth_OpenID_mkdtemp();
 | |
| 
 | |
|         if (!$temp_dir) {
 | |
|             trigger_error('Could not create temporary directory ' .
 | |
|                           'with Auth_OpenID_FileStore::_mkdtemp',
 | |
|                           E_USER_WARNING);
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         $dsn = 'sqlite:///' . urlencode($temp_dir) . '/php_openid_storetest.db';
 | |
|         $db =& DB::connect($dsn);
 | |
| 
 | |
|         if (PEAR::isError($db)) {
 | |
|             $this->pass("SQLite database connection failed: " .
 | |
|                         $db->getMessage());
 | |
|         } else {
 | |
|             $store = new Auth_OpenID_SQLiteStore($db);
 | |
|             $this->assertTrue($store->createTables(), "Table creation failed");
 | |
|             $this->_testStore($store);
 | |
|             $this->_testNonce($store);
 | |
|             $this->_testNonceCleanup($store);
 | |
|         }
 | |
| 
 | |
|         $db->disconnect();
 | |
|         unset($db);
 | |
|         unset($store);
 | |
|         unlink($temp_dir . '/php_openid_storetest.db');
 | |
|         rmdir($temp_dir);
 | |
|     }
 | |
| 
 | |
|     function test_mysqlstore()
 | |
|     {
 | |
|         // If the mysql extension isn't loaded or loadable, succeed
 | |
|         // because we can't run the test.
 | |
|         if (!(extension_loaded('mysql')) ||
 | |
|             !(@include_once 'DB.php')) {
 | |
|             print "(not testing MySQL store)";
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         require_once 'Auth/OpenID/MySQLStore.php';
 | |
| 
 | |
|         global $_Auth_OpenID_db_test_host;
 | |
| 
 | |
|         $dsn = array(
 | |
|                      'phptype'  => 'mysql',
 | |
|                      'username' => 'openid_test',
 | |
|                      'password' => '',
 | |
|                      'hostspec' => $_Auth_OpenID_db_test_host
 | |
|                      );
 | |
| 
 | |
|         $db =& DB::connect($dsn);
 | |
| 
 | |
|         if (PEAR::isError($db)) {
 | |
|             print "MySQL database connection failed: " .
 | |
|                 $db->getMessage();
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $temp_db_name = _Auth_OpenID_getTmpDbName();
 | |
| 
 | |
|         $result = $db->query("CREATE DATABASE $temp_db_name");
 | |
| 
 | |
|         if (PEAR::isError($result)) {
 | |
|             $this->pass("Error creating MySQL temporary database: " .
 | |
|                         $result->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $db->query("USE $temp_db_name");
 | |
| 
 | |
|         $store = new Auth_OpenID_MySQLStore($db);
 | |
|         $store->createTables();
 | |
|         $this->_testStore($store);
 | |
|         $this->_testNonce($store);
 | |
|         $this->_testNonceCleanup($store);
 | |
| 
 | |
|         $db->query("DROP DATABASE $temp_db_name");
 | |
|     }
 | |
| 
 | |
|     function test_mdb2store()
 | |
|     {
 | |
|         // The MDB2 test can use any database engine. MySQL is chosen
 | |
|         // arbitrarily.
 | |
|         if (!(extension_loaded('mysql') ||
 | |
|             (function_exists('dl') && @dl('mysql.' . PHP_SHLIB_SUFFIX))) ||
 | |
|             !(@include_once 'MDB2.php')) {
 | |
|             print "(not testing MDB2 store)";
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         require_once 'Auth/OpenID/MDB2Store.php';
 | |
| 
 | |
|         global $_Auth_OpenID_db_test_host;
 | |
| 
 | |
|         $dsn = array(
 | |
|                      'phptype'  => 'mysql',
 | |
|                      'username' => 'openid_test',
 | |
|                      'password' => '',
 | |
|                      'hostspec' => $_Auth_OpenID_db_test_host
 | |
|                      );
 | |
| 
 | |
|         $db =& MDB2::connect($dsn);
 | |
| 
 | |
|         if (PEAR::isError($db)) {
 | |
|             print "MySQL database connection failed: " .
 | |
|                 $db->getMessage();
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $temp_db_name = _Auth_OpenID_getTmpDbName();
 | |
| 
 | |
|         $result = $db->query("CREATE DATABASE $temp_db_name");
 | |
| 
 | |
|         if (PEAR::isError($result)) {
 | |
|             $this->pass("Error creating MySQL temporary database: " .
 | |
|                         $result->getMessage());
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         $db->query("USE $temp_db_name");
 | |
| 
 | |
|         $store =& new Auth_OpenID_MDB2Store($db);
 | |
|         if (!$store->createTables()) {
 | |
|             $this->fail("Failed to create tables");
 | |
|             return;
 | |
|         }
 | |
|         $this->_testStore($store);
 | |
|         $this->_testNonce($store);
 | |
|         $this->_testNonceCleanup($store);
 | |
| 
 | |
|         $db->query("DROP DATABASE $temp_db_name");
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This is the host that the store test will use
 | |
|  */
 | |
| global $_Auth_OpenID_memcache_test_host;
 | |
| $_Auth_OpenID_memcache_test_host = 'localhost';
 | |
| 
 | |
| class Tests_Auth_OpenID_MemcachedStore_Test extends Tests_Auth_OpenID_Store {
 | |
|     function test_memcache()
 | |
|     {
 | |
|         // If the memcache extension isn't loaded or loadable, succeed
 | |
|         // because we can't run the test.
 | |
|         if (!extension_loaded('memcache')) {
 | |
|             print "(skipping memcache store tests)";
 | |
|             $this->pass();
 | |
|             return;
 | |
|         }
 | |
|         require_once 'Auth/OpenID/MemcachedStore.php';
 | |
| 
 | |
|         global $_Auth_OpenID_memcache_test_host;
 | |
| 
 | |
|         $memcached = new Memcache();
 | |
|         if (!$memcached->connect($_Auth_OpenID_memcache_test_host)) {
 | |
|             print "(skipping memcache store tests - couldn't connect)";
 | |
|             $this->pass();
 | |
|         } else {
 | |
|             $store = new Auth_OpenID_MemcachedStore($memcached);
 | |
| 
 | |
|             $this->_testStore($store);
 | |
|             $this->_testNonce($store);
 | |
|             $this->_testNonceCleanup($store);
 | |
| 
 | |
|             $memcached->close();
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| class Tests_Auth_OpenID_StoreTest extends PHPUnit_Framework_TestSuite {
 | |
|     function getName()
 | |
|     {
 | |
|         return "Tests_Auth_OpenID_StoreTest";
 | |
|     }
 | |
| 
 | |
|       function Tests_Auth_OpenID_StoreTest()
 | |
|     {
 | |
|         $this->addTestSuite('Tests_Auth_OpenID_Included_StoreTest');
 | |
|         $this->addTestSuite('Tests_Auth_OpenID_MemcachedStore_Test');
 | |
|     }
 | |
| }
 | |
| 
 |