[FEATURE] Allow camelCased class names in ext_autoload
authorChristian Kuhn <lolli@schwarzbu.ch>
Fri, 11 May 2012 17:52:04 +0000 (19:52 +0200)
committerBenjamin Mack <benni@typo3.org>
Sat, 12 May 2012 03:11:06 +0000 (05:11 +0200)
Remove the hurdle that class names in ext_autoload (the key part of
the returned array) have to be lower cased.

The patch adds two tests, the first one expects that a case sensitive
class name in ext_autoload.php in actually lowercases before it is
written to the autoload cache file. It fails if the autoloader patch
is not applied.
The second tests that camel cased classes can be successfully autoloaded.

Change-Id: I2ccf916d43a288a520f6f89e9002bdc4df2da0b2
Resolves: #37110
Releases: 6.0
Reviewed-on: http://review.typo3.org/11148
Reviewed-by: Tolleiv Nietsch
Tested-by: Tolleiv Nietsch
Reviewed-by: Philipp Gampe
Reviewed-by: Benjamin Mack
Tested-by: Benjamin Mack
t3lib/class.t3lib_autoloader.php
tests/Unit/t3lib/class.t3lib_autoloaderTest.php

index fc43226..f641ae0 100644 (file)
@@ -324,7 +324,7 @@ class t3lib_autoloader {
        protected static function updateRegistryCacheEntry(array $registry) {
                $cachedFileContent = 'return array(';
                foreach ($registry as $className => $classLocation) {
-                       $cachedFileContent .= LF . '\'' . $className . '\' => \'' . $classLocation . '\',';
+                       $cachedFileContent .= LF . '\'' . strtolower($className) . '\' => \'' . $classLocation . '\',';
                }
                $cachedFileContent .= LF . ');';
                $GLOBALS['typo3CacheManager']->getCache('cache_phpcode')->set(
index 4ddd0fa..aae0643 100644 (file)
@@ -164,6 +164,64 @@ class t3lib_autoloaderTest extends Tx_Phpunit_TestCase {
        /**
         * @test
         */
+       public function autoloadWritesLowerCasedClassFileToCache() {
+               $extKey = $this->createFakeExtension();
+               $extPath = PATH_site . "typo3temp/$extKey/";
+               $autoloaderFile = $extPath . "ext_autoload.php";
+
+                       // A case sensitive key (FooBar) in ext_autoload file
+               $class = "tx_${extKey}_" . uniqid('FooBar');
+               $file = $extPath . uniqid('') . '.php';
+
+               file_put_contents($autoloaderFile, "<?php\n\nreturn array('$class' => '$file');\n\n?>");
+
+                       // Inject a dummy for the core_phpcode cache to force the autoloader
+                       // to re calculate the registry
+               $mockCache = $this->getMock('t3lib_cache_frontend_AbstractFrontend', array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove', 'flush', 'flushByTag', 'requireOnce'), array(), '', FALSE);
+               $GLOBALS['typo3CacheManager'] = $this->getMock('t3lib_cache_Manager', array('getCache'));
+               $GLOBALS['typo3CacheManager']->expects($this->any())->method('getCache')->will($this->returnValue($mockCache));
+
+                       // Expect that the lower case version of the class name is written to cache
+               $mockCache->expects($this->once())->method('set')->with($this->anything(), $this->stringContains(strtolower($class), FALSE));
+
+                       // Re-initialize autoloader registry to force it to recognize the new extension
+               t3lib_autoloader::unregisterAutoloader();
+               t3lib_autoloader::registerAutoloader();
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function autoloadFindsCamelCasedClassFileIfExtAutoloadEntryIsLowerCased() {
+               $extKey = $this->createFakeExtension();
+               $extPath = PATH_site . "typo3temp/$extKey/";
+
+                       // A case sensitive key (FooBar) in ext_autoload file
+               $class = "tx_${extKey}_" . uniqid('FooBar');
+               $file = $extPath . uniqid('') . '.php';
+
+               file_put_contents($file, "<?php\n\nthrow new RuntimeException('', 1336756850);\n\n?>");
+
+                       // Inject a dummy for the core_phpcode cache to force the autoloader
+                       // to re calculate the registry
+               $mockCache = $this->getMock('t3lib_cache_frontend_AbstractFrontend', array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove', 'flush', 'flushByTag', 'requireOnce'), array(), '', FALSE);
+               $GLOBALS['typo3CacheManager'] = $this->getMock('t3lib_cache_Manager', array('getCache'));
+               $GLOBALS['typo3CacheManager']->expects($this->any())->method('getCache')->will($this->returnValue($mockCache));
+
+                       // Let cache access give back lowercased class name
+               $mockCache->expects($this->any())->method('has')->will($this->returnValue(TRUE));
+               $mockCache->expects($this->once())->method('requireOnce')->will($this->returnValue(array(strtolower($class) => $file)));
+
+                       // Re-initialize autoloader registry to force it to recognize the new extension
+               t3lib_autoloader::unregisterAutoloader();
+               t3lib_autoloader::registerAutoloader();
+               t3lib_autoloader::autoload($class);
+       }
+
+       /**
+        * @test
+        */
        public function autoloadFindsClassFileThatRespectsExtbaseNamingSchemeWithoutExtAutoloadFile() {
                $extKey = $this->createFakeExtension();
                $extPath = PATH_site . "typo3temp/$extKey/";