ApcUniversalClassLoaderTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Tests\Component\ClassLoader;
  11. use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
  12. class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
  13. {
  14. protected function setUp()
  15. {
  16. if (!extension_loaded('apc')) {
  17. $this->markTestSkipped('The apc extension is not available.');
  18. }
  19. if (!(ini_get('apc.enabled') && ini_get('apc.enable_cli'))) {
  20. $this->markTestSkipped('The apc extension is available, but not enabled.');
  21. }
  22. apc_clear_cache('user');
  23. }
  24. protected function tearDown()
  25. {
  26. apc_clear_cache('user');
  27. }
  28. public function testConstructor()
  29. {
  30. $loader = new ApcUniversalClassLoader('test.prefix.');
  31. $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  32. $this->assertEquals($loader->findFile('\Apc\Namespaced\FooBar'), apc_fetch('test.prefix.\Apc\Namespaced\FooBar'), '__construct() takes a prefix as its first argument');
  33. }
  34. /**
  35. * @dataProvider getLoadClassTests
  36. */
  37. public function testLoadClass($className, $testClassName, $message)
  38. {
  39. $loader = new ApcUniversalClassLoader('test.prefix.');
  40. $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  41. $loader->registerPrefix('Apc_Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  42. $loader->loadClass($testClassName);
  43. $this->assertTrue(class_exists($className), $message);
  44. }
  45. public function getLoadClassTests()
  46. {
  47. return array(
  48. array('\\Apc\\Namespaced\\Foo', '\\Apc\\Namespaced\\Foo', '->loadClass() loads Apc\Namespaced\Foo class'),
  49. array('Apc_Pearlike_Foo', 'Apc_Pearlike_Foo', '->loadClass() loads Apc_Pearlike_Foo class'),
  50. array('\\Apc\\Namespaced\\Bar', '\\Apc\\Namespaced\\Bar', '->loadClass() loads Apc\Namespaced\Bar class with a leading slash'),
  51. array('Apc_Pearlike_Bar', '\\Apc_Pearlike_Bar', '->loadClass() loads Apc_Pearlike_Bar class with a leading slash'),
  52. );
  53. }
  54. /**
  55. * @dataProvider getLoadClassFromFallbackTests
  56. */
  57. public function testLoadClassFromFallback($className, $testClassName, $message)
  58. {
  59. $loader = new ApcUniversalClassLoader('test.prefix.fallback');
  60. $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  61. $loader->registerPrefix('Apc_Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  62. $loader->registerNamespaceFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/fallback');
  63. $loader->registerPrefixFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/fallback');
  64. $loader->loadClass($testClassName);
  65. $this->assertTrue(class_exists($className), $message);
  66. }
  67. public function getLoadClassFromFallbackTests()
  68. {
  69. return array(
  70. array('\\Apc\\Namespaced\\Baz', '\\Apc\\Namespaced\\Baz', '->loadClass() loads Apc\Namespaced\Baz class'),
  71. array('Apc_Pearlike_Baz', 'Apc_Pearlike_Baz', '->loadClass() loads Apc_Pearlike_Baz class'),
  72. array('\\Apc\\Namespaced\\FooBar', '\\Apc\\Namespaced\\FooBar', '->loadClass() loads Apc\Namespaced\Baz class from fallback dir'),
  73. array('Apc_Pearlike_FooBar', 'Apc_Pearlike_FooBar', '->loadClass() loads Apc_Pearlike_Baz class from fallback dir'),
  74. );
  75. }
  76. /**
  77. * @dataProvider getLoadClassNamespaceCollisionTests
  78. */
  79. public function testLoadClassNamespaceCollision($namespaces, $className, $message)
  80. {
  81. $loader = new ApcUniversalClassLoader('test.prefix.collision.');
  82. $loader->registerNamespaces($namespaces);
  83. $loader->loadClass($className);
  84. $this->assertTrue(class_exists($className), $message);
  85. }
  86. public function getLoadClassNamespaceCollisionTests()
  87. {
  88. return array(
  89. array(
  90. array(
  91. 'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  92. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  93. ),
  94. '\Apc\NamespaceCollision\A\Foo',
  95. '->loadClass() loads NamespaceCollision\A\Foo from alpha.',
  96. ),
  97. array(
  98. array(
  99. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  100. 'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  101. ),
  102. '\Apc\NamespaceCollision\A\Bar',
  103. '->loadClass() loads NamespaceCollision\A\Bar from alpha.',
  104. ),
  105. array(
  106. array(
  107. 'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  108. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  109. ),
  110. '\Apc\NamespaceCollision\A\B\Foo',
  111. '->loadClass() loads NamespaceCollision\A\B\Foo from beta.',
  112. ),
  113. array(
  114. array(
  115. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  116. 'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  117. ),
  118. '\Apc\NamespaceCollision\A\B\Bar',
  119. '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
  120. ),
  121. );
  122. }
  123. /**
  124. * @dataProvider getLoadClassPrefixCollisionTests
  125. */
  126. public function testLoadClassPrefixCollision($prefixes, $className, $message)
  127. {
  128. $loader = new ApcUniversalClassLoader('test.prefix.collision.');
  129. $loader->registerPrefixes($prefixes);
  130. $loader->loadClass($className);
  131. $this->assertTrue(class_exists($className), $message);
  132. }
  133. public function getLoadClassPrefixCollisionTests()
  134. {
  135. return array(
  136. array(
  137. array(
  138. 'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  139. 'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  140. ),
  141. 'ApcPrefixCollision_A_Foo',
  142. '->loadClass() loads ApcPrefixCollision_A_Foo from alpha.',
  143. ),
  144. array(
  145. array(
  146. 'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  147. 'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  148. ),
  149. 'ApcPrefixCollision_A_Bar',
  150. '->loadClass() loads ApcPrefixCollision_A_Bar from alpha.',
  151. ),
  152. array(
  153. array(
  154. 'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  155. 'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  156. ),
  157. 'ApcPrefixCollision_A_B_Foo',
  158. '->loadClass() loads ApcPrefixCollision_A_B_Foo from beta.',
  159. ),
  160. array(
  161. array(
  162. 'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  163. 'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  164. ),
  165. 'ApcPrefixCollision_A_B_Bar',
  166. '->loadClass() loads ApcPrefixCollision_A_B_Bar from beta.',
  167. ),
  168. );
  169. }
  170. }