ApcUniversalClassLoaderTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 skipIfAPCExtensionIsNotLoadedOrEnabled()
  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. }
  23. public function testConstructor()
  24. {
  25. $this->skipIfAPCExtensionIsNotLoadedOrEnabled();
  26. $loader = new ApcUniversalClassLoader('test.prefix.');
  27. $loader->registerNamespace('Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  28. $this->assertEquals($loader->findFile('\Namespaced\Bar'), apc_fetch('test.prefix.\Namespaced\Bar'), '__construct() takes a prefix as its first argument');
  29. }
  30. /**
  31. * @dataProvider getLoadClassTests
  32. */
  33. public function testLoadClass($className, $testClassName, $message)
  34. {
  35. $this->skipIfAPCExtensionIsNotLoadedOrEnabled();
  36. $loader = new ApcUniversalClassLoader('test.prefix.');
  37. $loader->registerNamespace('Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  38. $loader->registerPrefix('Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  39. $loader->loadClass($testClassName);
  40. $this->assertTrue(class_exists($className), $message);
  41. }
  42. public function getLoadClassTests()
  43. {
  44. return array(
  45. array('\\Namespaced\\Foo', 'Namespaced\\Foo', '->loadClass() loads Namespaced\Foo class'),
  46. array('\\Pearlike_Foo', 'Pearlike_Foo', '->loadClass() loads Pearlike_Foo class'),
  47. array('\\Namespaced\\Bar', '\\Namespaced\\Bar', '->loadClass() loads Namespaced\Bar class with a leading slash'),
  48. array('\\Pearlike_Bar', '\\Pearlike_Bar', '->loadClass() loads Pearlike_Bar class with a leading slash'),
  49. );
  50. }
  51. /**
  52. * @dataProvider getLoadClassFromFallbackTests
  53. */
  54. public function testLoadClassFromFallback($className, $testClassName, $message)
  55. {
  56. $this->skipIfAPCExtensionIsNotLoadedOrEnabled();
  57. $loader = new ApcUniversalClassLoader('test.prefix.');
  58. $loader->registerNamespace('Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  59. $loader->registerPrefix('Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
  60. $loader->registerNamespaceFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback');
  61. $loader->registerPrefixFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback');
  62. $loader->loadClass($testClassName);
  63. $this->assertTrue(class_exists($className), $message);
  64. }
  65. public function getLoadClassFromFallbackTests()
  66. {
  67. return array(
  68. array('\\Namespaced\\Baz', 'Namespaced\\Baz', '->loadClass() loads Namespaced\Baz class'),
  69. array('\\Pearlike_Baz', 'Pearlike_Baz', '->loadClass() loads Pearlike_Baz class'),
  70. array('\\Namespaced\\FooBar', 'Namespaced\\FooBar', '->loadClass() loads Namespaced\Baz class from fallback dir'),
  71. array('\\Pearlike_FooBar', 'Pearlike_FooBar', '->loadClass() loads Pearlike_Baz class from fallback dir'),
  72. );
  73. }
  74. /**
  75. * @dataProvider getLoadClassNamespaceCollisionTests
  76. */
  77. public function testLoadClassNamespaceCollision($namespaces, $className, $message)
  78. {
  79. $this->skipIfAPCExtensionIsNotLoadedOrEnabled();
  80. $loader = new ApcUniversalClassLoader('test.prefix.');
  81. $loader->registerNamespaces($namespaces);
  82. $loader->loadClass($className);
  83. $this->assertTrue(class_exists($className), $message);
  84. }
  85. public function getLoadClassNamespaceCollisionTests()
  86. {
  87. return array(
  88. array(
  89. array(
  90. 'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  91. 'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  92. ),
  93. 'NamespaceCollision\A\Foo',
  94. '->loadClass() loads NamespaceCollision\A\Foo from alpha.',
  95. ),
  96. array(
  97. array(
  98. 'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  99. 'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  100. ),
  101. 'NamespaceCollision\A\Bar',
  102. '->loadClass() loads NamespaceCollision\A\Bar from alpha.',
  103. ),
  104. array(
  105. array(
  106. 'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  107. 'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  108. ),
  109. 'NamespaceCollision\A\B\Foo',
  110. '->loadClass() loads NamespaceCollision\A\B\Foo from beta.',
  111. ),
  112. array(
  113. array(
  114. 'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  115. 'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  116. ),
  117. 'NamespaceCollision\A\B\Bar',
  118. '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
  119. ),
  120. );
  121. }
  122. /**
  123. * @dataProvider getLoadClassPrefixCollisionTests
  124. */
  125. public function testLoadClassPrefixCollision($prefixes, $className, $message)
  126. {
  127. $this->skipIfAPCExtensionIsNotLoadedOrEnabled();
  128. $loader = new ApcUniversalClassLoader('test.prefix.');
  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. 'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  139. 'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  140. ),
  141. 'PrefixCollision_A_Foo',
  142. '->loadClass() loads PrefixCollision_A_Foo from alpha.',
  143. ),
  144. array(
  145. array(
  146. 'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  147. 'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  148. ),
  149. 'PrefixCollision_A_Bar',
  150. '->loadClass() loads PrefixCollision_A_Bar from alpha.',
  151. ),
  152. array(
  153. array(
  154. 'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  155. 'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  156. ),
  157. 'PrefixCollision_A_B_Foo',
  158. '->loadClass() loads PrefixCollision_A_B_Foo from beta.',
  159. ),
  160. array(
  161. array(
  162. 'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
  163. 'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
  164. ),
  165. 'PrefixCollision_A_B_Bar',
  166. '->loadClass() loads PrefixCollision_A_B_Bar from beta.',
  167. ),
  168. );
  169. }
  170. }