Fixed bug #16824: [Caching framework] Update to latest FLOW3 version
authorChristian Kuhn <lolli@schwarzbu.ch>
Sat, 25 Dec 2010 14:12:38 +0000 (14:12 +0000)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 25 Dec 2010 14:12:38 +0000 (14:12 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@9893 709f56b5-9817-0410-a4d7-c38de5d9e867

19 files changed:
ChangeLog
t3lib/cache/backend/class.t3lib_cache_backend_abstractbackend.php
t3lib/cache/backend/class.t3lib_cache_backend_apcbackend.php
t3lib/cache/backend/class.t3lib_cache_backend_dbbackend.php
t3lib/cache/backend/class.t3lib_cache_backend_filebackend.php
t3lib/cache/backend/class.t3lib_cache_backend_memcachedbackend.php
t3lib/cache/backend/class.t3lib_cache_backend_pdobackend.php
t3lib/cache/backend/class.t3lib_cache_backend_redisbackend.php
t3lib/cache/frontend/class.t3lib_cache_frontend_phpfrontend.php
t3lib/cache/frontend/class.t3lib_cache_frontend_variablefrontend.php
t3lib/cache/last_synched_revision
t3lib/class.t3lib_pdohelper.php
tests/t3lib/cache/backend/t3lib_cache_backend_apcbackendTest.php
tests/t3lib/cache/backend/t3lib_cache_backend_memcachedbackendTest.php
tests/t3lib/cache/backend/t3lib_cache_backend_pdobackendTest.php
tests/t3lib/cache/backend/t3lib_cache_backend_redisbackendTest.php
tests/t3lib/cache/frontend/t3lib_cache_frontend_phpfrontendTest.php
tests/t3lib/cache/frontend/t3lib_cache_frontend_variablefrontendTest.php
tests/t3lib/cache/last_synched_revision [new file with mode: 0644]

index a578a8b..450f6e6 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-12-25  Christian Kuhn  <lolli@schwarzbu.ch>
+
+       * Fixed bug #16824: [Caching framework] Update to latest FLOW3 version
+
 2010-12-24  Steffen Kamper  <steffen@typo3.org>
 
        * Fixed bug #16836: Remove useless alertbox (Thanks to Rens Admiraal)
index 824a771..b876493 100644 (file)
@@ -60,7 +60,7 @@ abstract class t3lib_cache_backend_AbstractBackend implements t3lib_cache_backen
        /**
         * Constructs this backend
         *
-        * @param mixed Configuration options - depends on the actual backend
+        * @param array $options Configuration options - depends on the actual backend
         * @author Robert Lemke <robert@typo3.org>
         */
        public function __construct(array $options = array()) {
index 75650cd..d0f75a7 100644 (file)
@@ -62,11 +62,11 @@ class t3lib_cache_backend_ApcBackend extends t3lib_cache_backend_AbstractBackend
        /**
         * Constructs this backend
         *
-        * @param mixed $options Configuration options - unused here
+        * @param array $options Configuration options - unused here
         * @author Robert Lemke <robert@typo3.org>
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
-       public function __construct($options = array()) {
+       public function __construct(array $options = array()) {
                if (!extension_loaded('apc')) {
                        throw new t3lib_cache_Exception(
                                'The PHP extension "apc" must be installed and loaded in order to use the APC backend.',
index 358cde0..d381d35 100644 (file)
@@ -56,7 +56,7 @@ class t3lib_cache_backend_DbBackend extends t3lib_cache_backend_AbstractBackend
        /**
         * Constructs this backend
         *
-        * @param mixed Configuration options - depends on the actual backend
+        * @param array $options Configuration options - depends on the actual backend
         */
        public function __construct(array $options = array()) {
                parent::__construct($options);
index e6a1dff..2359505 100644 (file)
@@ -62,7 +62,7 @@ class t3lib_cache_backend_FileBackend extends t3lib_cache_backend_AbstractBacken
        /**
         * Constructs this backend
         *
-        * @param mixed Configuration options - depends on the actual backend
+        * @param array $options Configuration options - depends on the actual backend
         */
        public function __construct(array $options = array()) {
                parent::__construct($options);
index 7575168..e1bb806 100644 (file)
@@ -103,10 +103,10 @@ class t3lib_cache_backend_MemcachedBackend extends t3lib_cache_backend_AbstractB
        /**
         * Constructs this backend
         *
-        * @param mixed $options Configuration options - depends on the actual backend
+        * @param array $options Configuration options - depends on the actual backend
         * @author Robert Lemke <robert@typo3.org>
         */
-       public function __construct($options = array()) {
+       public function __construct(array $options = array()) {
                if (!extension_loaded('memcache')) {
                        throw new t3lib_cache_Exception(
                                'The PHP extension "memcached" must be installed and loaded in ' .
index 5796c6f..1d5a365 100644 (file)
@@ -33,6 +33,7 @@
  * @version $Id$
  */
 class t3lib_cache_backend_PdoBackend extends t3lib_cache_backend_AbstractBackend {
+
        /**
         * @var string
         */
@@ -67,7 +68,7 @@ class t3lib_cache_backend_PdoBackend extends t3lib_cache_backend_AbstractBackend
        /**
         * Constructs this backend
         *
-        * @param mixed $options Configuration options - depends on the actual backend
+        * @param array $options Configuration options - depends on the actual backend
         * @author Christian Kuhn <lolli@schwarzbu.ch>
         */
        public function __construct(array $options = array()) {
@@ -411,17 +412,18 @@ class t3lib_cache_backend_PdoBackend extends t3lib_cache_backend_AbstractBackend
                        $this->pdoDriver = $splitdsn[0];
 
                        if ($this->pdoDriver === 'sqlite' && !file_exists($splitdsn[1])) {
+                               $this->databaseHandle = t3lib_div::makeInstance('PDO', $this->dataSourceName, $this->username, $this->password);
                                $this->createCacheTables();
+                       } else {
+                               $this->databaseHandle = t3lib_div::makeInstance('PDO', $this->dataSourceName, $this->username, $this->password);
                        }
 
-                       $this->databaseHandle = t3lib_div::makeInstance('PDO', $this->dataSourceName, $this->username, $this->password);
                        $this->databaseHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
                        if ($this->pdoDriver === 'mysql') {
                                $this->databaseHandle->exec('SET SESSION sql_mode=\'ANSI\';');
                        }
                } catch (PDOException $e) {
-                       #                       $this->createCacheTables();
                }
        }
 
@@ -434,8 +436,7 @@ class t3lib_cache_backend_PdoBackend extends t3lib_cache_backend_AbstractBackend
         */
        protected function createCacheTables() {
                try {
-                       $pdoHelper = t3lib_div::makeInstance('t3lib_PdoHelper', $this->dataSourceName, $this->username, $this->password);
-                       $pdoHelper->importSql(PATH_t3lib . 'cache/backend/resources/ddl.sql');
+                       t3lib_PdoHelper::importSql($this->databaseHandle, $this->pdoDriver, PATH_t3lib . 'cache/backend/resources/ddl.sql');
                } catch (PDOException $e) {
                        throw new RuntimeException(
                                'Could not create cache tables with DSN "' . $this->dataSourceName . '". PDO error: ' . $e->getMessage(),
index 5a77aeb..f34d3d0 100644 (file)
@@ -144,7 +144,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Construct this backend
         *
-        * @param array Configuration options
+        * @param array $options Configuration options
         * @throws t3lib_cache_Exception if php redis module is not loaded
         * @author Christopher Hlubek <hlubek@networkteam.com>
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -165,7 +165,6 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Initializes the redis backend
         *
-        * @param array Configuration options
         * @return void
         * @throws t3lib_cache_Exception if access to redis with password is denied or if database selection fails
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -205,7 +204,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Setter for server hostname
         *
-        * @param string Hostname
+        * @param string $hostname Hostname
         * @return void
         * @author Christopher Hlubek <hlubek@networkteam.com>
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -218,7 +217,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Setter for server port
         *
-        * @param integer Port
+        * @param integer $port Port
         * @return void
         * @author Christopher Hlubek <hlubek@networkteam.com>
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -231,7 +230,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Setter for database number
         *
-        * @param integer Database
+        * @param integer $database Database
         * @return void
         * @throws InvalidArgumentException if database number is not valid
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -257,7 +256,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Setter for authentication password
         *
-        * @param string Password
+        * @param string $password Password
         * @return void
         * @author Christian Kuhn <lolli@schwarzbu.ch>
         * @api
@@ -269,7 +268,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
        /**
         * Enable data compression
         *
-        * @param boolean TRUE to enable compression
+        * @param boolean $compression TRUE to enable compression
         * @return void
         * @throws InvalidArgumentException if compression parameter is not of type boolean
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -291,7 +290,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * If compression is enabled and this is not set,
         * gzcompress default level will be used.
         *
-        * @param integer -1 to 9: Compression level
+        * @param integer $compressionLevel -1 to 9: Compression level
         * @return void
         * @throws InvalidArgumentException if compressionLevel parameter is not within allowed bounds
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -321,10 +320,10 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n) with number of tags
         *
-        * @param string Identifier for this specific cache entry
-        * @param string Data to be stored
-        * @param array Tags to associate with this cache entry
-        * @param integer Lifetime of this cache entry in seconds. If NULL is specified, default lifetime is used. "0" means unlimited lifetime.
+        * @param string $entryIdentifier Identifier for this specific cache entry
+        * @param string $data Data to be stored
+        * @param array $tags Tags to associate with this cache entry
+        * @param integer $lifetime Lifetime of this cache entry in seconds. If NULL is specified, default lifetime is used. "0" means unlimited lifetime.
         * @return void
         * @throws InvalidArgumentException if identifier is not valid
         * @throws t3lib_cache_Exception_InvalidData if data is not a string
@@ -401,7 +400,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         *
         * Scales O(1) with number of cache entries
         *
-        * @param string An identifier which describes the cache entry to load
+        * @param string $entryIdentifier An identifier which describes the cache entry to load
         * @return mixed The cache entry's content as a string or FALSE if the cache entry could not be loaded
         * @throws InvalidArgumentException if identifier is not a string
         * @author Christopher Hlubek <hlubek@networkteam.com>
@@ -433,7 +432,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         *
         * Scales O(1) with number of cache entries
         *
-        * @param string Identifier specifying the cache entry
+        * @param string $entryIdentifier Identifier specifying the cache entry
         * @return boolean TRUE if such an entry exists, FALSE if not
         * @throws InvalidArgumentException if identifier is not a string
         * @author Christopher Hlubek <hlubek@networkteam.com>
@@ -456,7 +455,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n) with number of tags
         *
-        * @param string Specifies the cache entry to remove
+        * @param string $entryIdentifier Specifies the cache entry to remove
         * @return boolean TRUE if (at least) an entry could be removed or FALSE if no entry was found
         * @throws InvalidArgumentException if identifier is not a string
         * @author Christopher Hlubek <hlubek@networkteam.com>
@@ -496,7 +495,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n) with number of tag entries
         *
-        * @param string The tag to search for
+        * @param string $tag The tag to search for
         * @return array An array of entries with all matching entries. An empty array if no entries matched
         * @throws InvalidArgumentException if tag is not a string
         * @author Christopher Hlubek <hlubek@networkteam.com>
@@ -525,7 +524,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         *
         * Scales O(n) with number of tags
         *
-        * @param array Array of tags to search for
+        * @param array $tags Array of tags to search for
         * @return array An array with identifiers of all matching entries. An empty array if no entries matched
         * @author Christopher Hlubek <hlubek@networkteam.com>
         * @author Christian Kuhn <lolli@schwarzbu.ch>
@@ -567,7 +566,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n^2) with number of tag entries
         *
-        * @param string Tag the entries must have
+        * @param string $tags Tag the entries must have
         * @return void
         * @throws InvalidArgumentException if identifier is not a string
         * @author Christopher Hlubek <hlubek@networkteam.com>
@@ -597,7 +596,7 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n^2) with number of tags
         *
-        * @param array Tags the entries must have
+        * @param array $tags Tags the entries must have
         * @return void
         * @author Christian Kuhn <lolli@schwarzbu.ch>
         * @api
@@ -655,8 +654,8 @@ class t3lib_cache_backend_RedisBackend extends t3lib_cache_backend_AbstractBacke
         * Scales O(1) with number of cache entries
         * Scales O(n^2) with number of tags
         *
-        * @param array List of identifiers to remove
-        * @param array List of tags to be handled
+        * @param array $identifiers List of identifiers to remove
+        * @param array $tags List of tags to be handled
         * @return void
         * @author Christian Kuhn <lolli@schwarzbu.ch>
         * @author Christopher Hlubek <hlubek@networkteam.com>
index e0d31c4..f5a9673 100644 (file)
@@ -78,7 +78,7 @@ class t3lib_cache_frontend_PhpFrontend extends t3lib_cache_frontend_StringFronte
                                );
                        }
                }
-               $sourceCode = '<?php' . chr(10) . $sourceCode . chr(10) . '__halt_compiler();';
+               $sourceCode = '<?php' . chr(10) . $sourceCode . chr(10) . '#';
                $this->backend->set($entryIdentifier, $sourceCode, $tags, $lifetime);
        }
 
index d980891..33cf53d 100644 (file)
  */
 class t3lib_cache_frontend_VariableFrontend extends t3lib_cache_frontend_AbstractFrontend {
 
+       /**
+        * If the extension "igbinary" is installed, use it for increased performance
+        *
+        * @var boolean
+        */
+       protected $useIgBinary = FALSE;
+
+       /**
+        * Constructs the cache
+        *
+        * @param string A identifier which describes this cache
+        * @param t3lib_cache_backend_Backend Backend to be used for this cache
+        * @author Robert Lemke <robert@typo3.org>
+        * @throws InvalidArgumentException if the identifier doesn't match PATTERN_ENTRYIDENTIFIER
+        * @internal
+        */
+       public function __construct($identifier, t3lib_cache_backend_Backend $backend) {
+               parent::__construct($identifier, $backend);
+               $this->initializeObject();
+       }
+
+       /**
+        * Initializes this cache frontend
+        *
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       protected function initializeObject() {
+               $this->useIgBinary = extension_loaded('igbinary');
+       }
+
        /**
         * Saves the value of a PHP variable in the cache. Note that the variable
         * will be serialized if necessary.
@@ -64,7 +95,11 @@ class t3lib_cache_frontend_VariableFrontend extends t3lib_cache_frontend_Abstrac
                        }
                }
 
-               $this->backend->set($entryIdentifier, serialize($variable), $tags, $lifetime);
+               if ($this->useIgBinary === TRUE) {
+                       $this->backend->set($entryIdentifier, igbinary_serialize($variable), $tags, $lifetime);
+               } else {
+                       $this->backend->set($entryIdentifier, serialize($variable), $tags, $lifetime);
+               }
        }
 
        /**
@@ -83,7 +118,7 @@ class t3lib_cache_frontend_VariableFrontend extends t3lib_cache_frontend_Abstrac
                        );
                }
 
-               return unserialize($this->backend->get($entryIdentifier));
+               return ($this->useIgBinary === TRUE) ? igbinary_unserialize($this->backend->get($entryIdentifier)) : unserialize($this->backend->get($entryIdentifier));
        }
 
        /**
@@ -105,7 +140,7 @@ class t3lib_cache_frontend_VariableFrontend extends t3lib_cache_frontend_Abstrac
                $identifiers = $this->backend->findIdentifiersByTag($tag);
 
                foreach ($identifiers as $identifier) {
-                       $entries[] = unserialize($this->backend->get($identifier));
+                       $entries[] = ($this->useIgBinary === TRUE) ? igbinary_unserialize($this->backend->get($identifier)) : unserialize($this->backend->get($identifier));
                }
 
                return $entries;
index 73b5692..52bc56d 100644 (file)
@@ -1 +1 @@
-4443
+d26e82f4de95e96f2e14b6531c8c24a2b05ccfe9
index 24d3680..77650e7 100644 (file)
  * @package TYPO3
  * @subpackage t3lib
  * @version $Id$
- * @scope prototype
  */
 class t3lib_PdoHelper {
 
-       /**
-        * @var PDO
-        */
-       protected $databaseHandle;
-
-       /**
-        * @var string
-        */
-       protected $pdoDriver;
-
-       /**
-        * Construct the helper instance and set up PDO connection.
-        *
-        * @param string $dataSourceName
-        * @param string $user
-        * @param string $password
-        * @author Karsten Dambekalns <karsten@typo3.org>
-        */
-       public function __construct($dataSourceName, $user, $password) {
-               $splitdsn = explode(':', $dataSourceName, 2);
-               $this->pdoDriver = $splitdsn[0];
-
-               $this->databaseHandle = t3lib_div::makeInstance('PDO', $dataSourceName, $user, $password);
-               $this->databaseHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-               if ($this->pdoDriver === 'mysql') {
-                       $this->databaseHandle->exec('SET SESSION sql_mode=\'ANSI_QUOTES\';');
-               }
-       }
-
        /**
         * Pumps the SQL into the database. Use for DDL only.
         *
@@ -73,15 +43,17 @@ class t3lib_PdoHelper {
         * be given as "field"(xyz) - no space between double quote and parenthesis -
         * so they can be removed automatically.
         *
+        * @param PDO $databaseHandle
+        * @param string $pdoDriver
         * @param string $pathAndFilename
         * @return void
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
-       public function importSql($pathAndFilename) {
+       static public function importSql(PDO $databaseHandle, $pdoDriver, $pathAndFilename) {
                $sql = file($pathAndFilename, FILE_IGNORE_NEW_LINES & FILE_SKIP_EMPTY_LINES);
 
                        // Remove MySQL style key length delimiters (yuck!) if we are not setting up a MySQL db
-               if ($this->pdoDriver !== 'mysql') {
+               if ($pdoDriver !== 'mysql') {
                        $sql = preg_replace('/"\([0-9]+\)/', '"', $sql);
                }
 
@@ -89,7 +61,7 @@ class t3lib_PdoHelper {
                foreach ($sql as $line) {
                        $statement .= ' ' . trim($line);
                        if (substr($statement, -1) === ';') {
-                               $this->databaseHandle->query($statement);
+                               $databaseHandle->exec($statement);
                                $statement = '';
                        }
                }
index b9304ce..bb2ae94 100644 (file)
@@ -45,6 +45,10 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
                if (!extension_loaded('apc')) {
                        $this->markTestSkipped('APC extension was not available');
                }
+
+               if (ini_get('apc.slam_defense') == 1) {
+                       $this->markTestSkipped('This testcase can only be executed with apc.slam_defense = Off');
+               }
        }
 
        /**
@@ -56,7 +60,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
        public function setThrowsExceptionIfNoFrontEndHasBeenSet() {
                $backend = new t3lib_cache_backend_ApcBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
        }
 
@@ -67,7 +71,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToSetAndCheckExistenceInCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $inCache = $backend->has($identifier);
                $this->assertTrue($inCache, 'APC backend failed to set and check entry');
@@ -80,7 +84,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToSetAndGetEntry() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $fetchedData = $backend->get($identifier);
                $this->assertEquals($data, $fetchedData, 'APC backend failed to set and retrieve data');
@@ -93,7 +97,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToRemoveEntryFromCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $backend->remove($identifier);
                $inCache = $backend->has($identifier);
@@ -107,7 +111,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToOverwriteAnEntryInTheCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $otherData = 'some other data';
                $backend->set($identifier, $otherData);
@@ -123,14 +127,14 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
                $backend = $this->setUpBackend();
 
                $data = 'Some data';
-               $entryIdentifier = 'MyIdentifier';
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
+               $identifier = uniqid('MyIdentifier');
+               $backend->set($identifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
 
                $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag1');
-               $this->assertEquals($entryIdentifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
+               $this->assertEquals($identifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
 
                $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag2');
-               $this->assertEquals($entryIdentifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
+               $this->assertEquals($identifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
        }
 
        /**
@@ -141,9 +145,9 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
                $backend = $this->setUpBackend();
 
                $data = 'Some data';
-               $entryIdentifier = 'MyIdentifier';
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag3'));
+               $identifier = uniqid('MyIdentifier');
+               $backend->set($identifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
+               $backend->set($identifier, $data, array('UnitTestTag%tag3'));
 
                $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag2');
                $this->assertEquals(array(), $retrieved, 'Found entry which should no longer exist.');
@@ -155,7 +159,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
         */
        public function hasReturnsFalseIfTheEntryDoesntExist() {
                $backend = $this->setUpBackend();
-               $identifier = 'NonExistingIdentifier';
+               $identifier = uniqid('NonExistingIdentifier');
                $inCache = $backend->has($identifier);
                $this->assertFalse($inCache,'"has" did not return false when checking on non existing identifier');
        }
@@ -166,7 +170,7 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
         */
        public function removeReturnsFalseIfTheEntryDoesntExist() {
                $backend = $this->setUpBackend();
-               $identifier = 'NonExistingIdentifier';
+               $identifier = uniqid('NonExistingIdentifier');
                $inCache = $backend->remove($identifier);
                $this->assertFalse($inCache,'"remove" did not return false when checking on non existing identifier');
        }
@@ -244,10 +248,11 @@ class t3lib_cache_backend_ApcBackendTest extends tx_phpunit_testcase {
                $backend = $this->setUpBackend();
 
                $data = str_repeat('abcde', 1024 * 1024);
-               $backend->set('tooLargeData', $data);
+               $identifier = uniqid('tooLargeData');
+               $backend->set($identifier, $data);
 
-               $this->assertTrue($backend->has('tooLargeData'));
-               $this->assertEquals($backend->get('tooLargeData'), $data);
+               $this->assertTrue($backend->has($identifier));
+               $this->assertEquals($backend->get($identifier), $data);
        }
 
        /**
index b10470b..c3e3e4b 100644 (file)
@@ -66,7 +66,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
                $backend = new t3lib_cache_backend_MemcachedBackend($backendOptions);
 
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
        }
 
@@ -89,7 +89,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
        public function setThrowsExceptionIfConfiguredServersAreUnreachable() {
                $backend = $this->setUpBackend(array('servers' => array('julle.did.this:1234')));
                $data = 'Somedata';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
        }
 
@@ -100,7 +100,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToSetAndCheckExistenceInCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $inCache = $backend->has($identifier);
                $this->assertTrue($inCache, 'Memcache failed to set and check entry');
@@ -113,7 +113,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToSetAndGetEntry() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $fetchedData = $backend->get($identifier);
                $this->assertEquals($data, $fetchedData, 'Memcache failed to set and retrieve data');
@@ -126,7 +126,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToRemoveEntryFromCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $backend->remove($identifier);
                $inCache = $backend->has($identifier);
@@ -140,7 +140,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
        public function itIsPossibleToOverwriteAnEntryInTheCache() {
                $backend = $this->setUpBackend();
                $data = 'Some data';
-               $identifier = 'MyIdentifier';
+               $identifier = uniqid('MyIdentifier');
                $backend->set($identifier, $data);
                $otherData = 'some other data';
                $backend->set($identifier, $otherData);
@@ -156,14 +156,14 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
                $backend = $this->setUpBackend();
 
                $data = 'Some data';
-               $entryIdentifier = 'MyIdentifier';
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
+               $identifier = uniqid('MyIdentifier');
+               $backend->set($identifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
 
                $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag1');
-               $this->assertEquals($entryIdentifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
+               $this->assertEquals($identifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
 
                $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag2');
-               $this->assertEquals($entryIdentifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
+               $this->assertEquals($identifier, $retrieved[0], 'Could not retrieve expected entry by tag.');
        }
 
        /**
@@ -174,11 +174,11 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
                $backend = $this->setUpBackend();
 
                $data = 'Some data';
-               $entryIdentifier = 'MyIdentifier';
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
-               $backend->set($entryIdentifier, $data, array('UnitTestTag%tag3'));
+               $identifier = uniqid('MyIdentifier');
+               $backend->set($identifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
+               $backend->set($identifier, $data, array('UnitTestTag%tag3'));
 
-               $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tag2');
+               $retrieved = $backend->findIdentifiersByTag('UnitTestTag%tagX');
                $this->assertEquals(array(), $retrieved, 'Found entry which should no longer exist.');
        }
 
@@ -188,7 +188,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
         */
        public function hasReturnsFalseIfTheEntryDoesntExist() {
                $backend = $this->setUpBackend();
-               $identifier = 'NonExistingIdentifier';
+               $identifier = uniqid('NonExistingIdentifier');
                $inCache = $backend->has($identifier);
                $this->assertFalse($inCache,'"has" did not return false when checking on non existing identifier');
        }
@@ -199,7 +199,7 @@ class t3lib_cache_backend_MemcachedBackendTest extends tx_phpunit_testcase {
         */
        public function removeReturnsFalseIfTheEntryDoesntExist() {
                $backend = $this->setUpBackend();
-               $identifier = 'NonExistingIdentifier';
+               $identifier = uniqid('NonExistingIdentifier');
                $inCache = $backend->remove($identifier);
                $this->assertFalse($inCache,'"remove" did not return false when checking on non existing identifier');
        }
index e20dcf7..20aa88f 100644 (file)
@@ -39,16 +39,6 @@ class t3lib_cache_backend_PdoBackendTest extends tx_phpunit_testcase {
         */
        protected $backupGlobalVariables;
 
-       /**
-        * @var string
-        */
-       protected $fixtureFolder;
-
-       /**
-        * @var string
-        */
-       protected $fixtureDB;
-
        /**
         * Sets up this testcase
         *
@@ -345,18 +335,11 @@ class t3lib_cache_backend_PdoBackendTest extends tx_phpunit_testcase {
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
        protected function setUpBackend() {
-               $this->fixtureFolder = sys_get_temp_dir() . '/' . 'typo3pdobackendtest/';
-               t3lib_div::mkdir_deep(sys_get_temp_dir() . '/', 'typo3pdobackendtest/');
-               $this->fixtureDB = uniqid('Cache') . '.db';
-
-               $pdoHelper = t3lib_div::makeInstance('t3lib_PdoHelper', 'sqlite:' . $this->fixtureFolder . $this->fixtureDB, '', '');
-               $pdoHelper->importSql(PATH_t3lib . 'cache/backend/resources/ddl.sql');
-
                $mockCache = $this->getMock('t3lib_cache_frontend_Frontend', array(), array(), '', FALSE);
                $mockCache->expects($this->any())->method('getIdentifier')->will($this->returnValue('TestCache'));
 
                $backendOptions = array(
-                       'dataSourceName' => 'sqlite:' . $this->fixtureFolder . $this->fixtureDB,
+                       'dataSourceName' => 'sqlite::memory:',
                        'username' => '',
                        'password' => '',
                );
@@ -373,13 +356,10 @@ class t3lib_cache_backend_PdoBackendTest extends tx_phpunit_testcase {
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
        public function tearDown() {
-               if ($this->fixtureDB) {
-                       t3lib_div::rmdir($this->fixtureFolder, TRUE);
-               }
                foreach ($this->backupGlobalVariables as $key => $data) {
                        $GLOBALS[$key] = $data;
                }
        }
 }
 
-?>
\ No newline at end of file
+?>
index 7af7056..089e88e 100644 (file)
@@ -65,7 +65,7 @@ class t3lib_cache_backend_RedisBackendTest extends tx_phpunit_testcase {
                }
 
                try {
-                       if (!fsockopen('127.0.0.1', 6379)) {
+                       if (!@fsockopen('127.0.0.1', 6379)) {
                                $this->markTestSkipped('redis server not reachable');
                        }
                } catch (Exception $e) {
index 0cf39c1..4eb8ff4 100644 (file)
@@ -52,7 +52,7 @@ class t3lib_cache_frontend_PhpFrontendTest extends tx_phpunit_testcase {
         */
        public function setPassesPhpSourceCodeTagsAndLifetimeToBackend() {
                $originalSourceCode = 'return "hello world!";';
-               $modifiedSourceCode = '<?php' . chr(10) . $originalSourceCode . chr(10) . '__halt_compiler();';
+               $modifiedSourceCode = '<?php' . chr(10) . $originalSourceCode . chr(10) . '#';
 
                $mockBackend = $this->getMock('t3lib_cache_backend_PhpCapableBackend', array(), array(), '', FALSE);
                $mockBackend->expects($this->once())->method('set')->with('Foo-Bar', $modifiedSourceCode, array('tags'), 1234);
index 8cd06f4..1fcf8c6 100644 (file)
@@ -90,6 +90,23 @@ class t3lib_cache_frontend_VariableFrontendTest extends tx_phpunit_testcase {
                $cache->set('VariableCacheTest', $theString, array(), $theLifetime);
        }
 
+       /**
+        * @test
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setUsesIgBinarySerializeIfAvailable() {
+               if (!extension_loaded('igbinary')) {
+                       $this->markTestSkipped('Cannot test igbinary support, because igbinary is not installed.');
+               }
+
+               $theString = 'Just some value';
+               $backend = $this->getMock('t3lib_cache_backend_AbstractBackend', array('get', 'set', 'has', 'remove', 'findIdentifiersByTag', 'findIdentifiersByTags', 'flush', 'flushByTag', 'flushByTags', 'collectGarbage'), array(), '', FALSE);
+               $backend->expects($this->once())->method('set')->with($this->equalTo('VariableCacheTest'), $this->equalTo(igbinary_serialize($theString)));
+
+               $cache = new t3lib_cache_frontend_VariableFrontend('VariableFrontend', $backend);
+               $cache->set('VariableCacheTest', $theString);
+       }
+
        /**
         * @test
         * @author Robert Lemke <robert@typo3.org>
@@ -130,6 +147,24 @@ class t3lib_cache_frontend_VariableFrontendTest extends tx_phpunit_testcase {
                $this->assertFalse($cache->get('VariableCacheTest'), 'The returned value was not the FALSE.');
        }
 
+       /**
+        * @test
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getUsesIgBinaryIfAvailable() {
+               if (!extension_loaded('igbinary')) {
+                       $this->markTestSkipped('Cannot test igbinary support, because igbinary is not installed.');
+               }
+
+               $theArray = array('Just some value', 'and another one.');
+               $backend = $this->getMock('t3lib_cache_backend_AbstractBackend', array('get', 'set', 'has', 'remove', 'findIdentifiersByTag', 'findIdentifiersByTags', 'flush', 'flushByTag', 'flushByTags', 'collectGarbage'), array(), '', FALSE);
+               $backend->expects($this->once())->method('get')->will($this->returnValue(igbinary_serialize($theArray)));
+
+               $cache = new t3lib_cache_frontend_VariableFrontend('VariableFrontend', $backend);
+
+               $this->assertEquals($theArray, $cache->get('VariableCacheTest'), 'The returned value was not the expected unserialized array.');
+       }
+
        /**
         * @test
         * @author Robert Lemke <robert@typo3.org>
@@ -190,6 +225,26 @@ class t3lib_cache_frontend_VariableFrontendTest extends tx_phpunit_testcase {
                $this->assertEquals($entries, $cache->getByTag($tag), 'Did not receive the expected entries');
        }
 
+       /**
+        * @test
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getByTagUsesIgBinaryIfAvailable() {
+               if (!extension_loaded('igbinary')) {
+                       $this->markTestSkipped('Cannot test igbinary support, because igbinary is not installed.');
+               }
+
+               $tag = 'sometag';
+               $identifiers = array('one', 'two');
+               $entries = array('one value', 'two value');
+               $backend = $this->getMock('t3lib_cache_backend_AbstractBackend', array('get', 'set', 'has', 'remove', 'findIdentifiersByTag', 'findIdentifiersByTags', 'flush', 'flushByTag', 'flushByTags', 'collectGarbage'), array(), '', FALSE);
+
+               $backend->expects($this->once())->method('findIdentifiersByTag')->with($this->equalTo($tag))->will($this->returnValue($identifiers));
+               $backend->expects($this->exactly(2))->method('get')->will($this->onConsecutiveCalls(igbinary_serialize('one value'), igbinary_serialize('two value')));
+
+               $cache = new t3lib_cache_frontend_VariableFrontend('VariableFrontend', $backend);
+               $this->assertEquals($entries, $cache->getByTag($tag), 'Did not receive the expected entries');
+       }
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/tests/t3lib/cache/last_synched_revision b/tests/t3lib/cache/last_synched_revision
new file mode 100644 (file)
index 0000000..f761842
--- /dev/null
@@ -0,0 +1 @@
+8d61bb9e22fcab1bedcd7ba72f8d0de9f6efc521