ApcUniversalClassLoaderTest.php 7.2 KB

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