ApcClassLoaderTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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\Component\ClassLoader\Tests;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\ClassLoader\ApcClassLoader;
  13. use Symfony\Component\ClassLoader\ClassLoader;
  14. /**
  15. * @group legacy
  16. */
  17. class ApcClassLoaderTest extends TestCase
  18. {
  19. protected function setUp()
  20. {
  21. if (!(filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN))) {
  22. $this->markTestSkipped('The apc extension is not enabled.');
  23. } else {
  24. apcu_clear_cache();
  25. }
  26. }
  27. protected function tearDown()
  28. {
  29. if (filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN)) {
  30. apcu_clear_cache();
  31. }
  32. }
  33. public function testConstructor()
  34. {
  35. $loader = new ClassLoader();
  36. $loader->addPrefix('Apc\Namespaced', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  37. $loader = new ApcClassLoader('test.prefix.', $loader);
  38. $this->assertEquals($loader->findFile('\Apc\Namespaced\FooBar'), apcu_fetch('test.prefix.\Apc\Namespaced\FooBar'), '__construct() takes a prefix as its first argument');
  39. }
  40. /**
  41. * @dataProvider getLoadClassTests
  42. */
  43. public function testLoadClass($className, $testClassName, $message)
  44. {
  45. $loader = new ClassLoader();
  46. $loader->addPrefix('Apc\Namespaced', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  47. $loader->addPrefix('Apc_Pearlike_', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  48. $loader = new ApcClassLoader('test.prefix.', $loader);
  49. $loader->loadClass($testClassName);
  50. $this->assertTrue(class_exists($className), $message);
  51. }
  52. public function getLoadClassTests()
  53. {
  54. return [
  55. ['\\Apc\\Namespaced\\Foo', 'Apc\\Namespaced\\Foo', '->loadClass() loads Apc\Namespaced\Foo class'],
  56. ['Apc_Pearlike_Foo', 'Apc_Pearlike_Foo', '->loadClass() loads Apc_Pearlike_Foo class'],
  57. ];
  58. }
  59. /**
  60. * @dataProvider getLoadClassFromFallbackTests
  61. */
  62. public function testLoadClassFromFallback($className, $testClassName, $message)
  63. {
  64. $loader = new ClassLoader();
  65. $loader->addPrefix('Apc\Namespaced', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  66. $loader->addPrefix('Apc_Pearlike_', __DIR__.\DIRECTORY_SEPARATOR.'Fixtures');
  67. $loader->addPrefix('', [__DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/fallback']);
  68. $loader = new ApcClassLoader('test.prefix.fallback', $loader);
  69. $loader->loadClass($testClassName);
  70. $this->assertTrue(class_exists($className), $message);
  71. }
  72. public function getLoadClassFromFallbackTests()
  73. {
  74. return [
  75. ['\\Apc\\Namespaced\\Baz', 'Apc\\Namespaced\\Baz', '->loadClass() loads Apc\Namespaced\Baz class'],
  76. ['Apc_Pearlike_Baz', 'Apc_Pearlike_Baz', '->loadClass() loads Apc_Pearlike_Baz class'],
  77. ['\\Apc\\Namespaced\\FooBar', 'Apc\\Namespaced\\FooBar', '->loadClass() loads Apc\Namespaced\Baz class from fallback dir'],
  78. ['Apc_Pearlike_FooBar', 'Apc_Pearlike_FooBar', '->loadClass() loads Apc_Pearlike_Baz class from fallback dir'],
  79. ];
  80. }
  81. /**
  82. * @dataProvider getLoadClassNamespaceCollisionTests
  83. */
  84. public function testLoadClassNamespaceCollision($namespaces, $className, $message)
  85. {
  86. $loader = new ClassLoader();
  87. $loader->addPrefixes($namespaces);
  88. $loader = new ApcClassLoader('test.prefix.collision.', $loader);
  89. $loader->loadClass($className);
  90. $this->assertTrue(class_exists($className), $message);
  91. }
  92. public function getLoadClassNamespaceCollisionTests()
  93. {
  94. return [
  95. [
  96. [
  97. 'Apc\\NamespaceCollision\\A' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  98. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  99. ],
  100. 'Apc\NamespaceCollision\A\Foo',
  101. '->loadClass() loads NamespaceCollision\A\Foo from alpha.',
  102. ],
  103. [
  104. [
  105. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  106. 'Apc\\NamespaceCollision\\A' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  107. ],
  108. 'Apc\NamespaceCollision\A\Bar',
  109. '->loadClass() loads NamespaceCollision\A\Bar from alpha.',
  110. ],
  111. [
  112. [
  113. 'Apc\\NamespaceCollision\\A' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  114. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  115. ],
  116. 'Apc\NamespaceCollision\A\B\Foo',
  117. '->loadClass() loads NamespaceCollision\A\B\Foo from beta.',
  118. ],
  119. [
  120. [
  121. 'Apc\\NamespaceCollision\\A\\B' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
  122. 'Apc\\NamespaceCollision\\A' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
  123. ],
  124. 'Apc\NamespaceCollision\A\B\Bar',
  125. '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
  126. ],
  127. ];
  128. }
  129. /**
  130. * @dataProvider getLoadClassPrefixCollisionTests
  131. */
  132. public function testLoadClassPrefixCollision($prefixes, $className, $message)
  133. {
  134. $loader = new ClassLoader();
  135. $loader->addPrefixes($prefixes);
  136. $loader = new ApcClassLoader('test.prefix.collision.', $loader);
  137. $loader->loadClass($className);
  138. $this->assertTrue(class_exists($className), $message);
  139. }
  140. public function getLoadClassPrefixCollisionTests()
  141. {
  142. return [
  143. [
  144. [
  145. 'ApcPrefixCollision_A_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  146. 'ApcPrefixCollision_A_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  147. ],
  148. 'ApcPrefixCollision_A_Foo',
  149. '->loadClass() loads ApcPrefixCollision_A_Foo from alpha.',
  150. ],
  151. [
  152. [
  153. 'ApcPrefixCollision_A_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  154. 'ApcPrefixCollision_A_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  155. ],
  156. 'ApcPrefixCollision_A_Bar',
  157. '->loadClass() loads ApcPrefixCollision_A_Bar from alpha.',
  158. ],
  159. [
  160. [
  161. 'ApcPrefixCollision_A_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  162. 'ApcPrefixCollision_A_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  163. ],
  164. 'ApcPrefixCollision_A_B_Foo',
  165. '->loadClass() loads ApcPrefixCollision_A_B_Foo from beta.',
  166. ],
  167. [
  168. [
  169. 'ApcPrefixCollision_A_B_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
  170. 'ApcPrefixCollision_A_' => __DIR__.\DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
  171. ],
  172. 'ApcPrefixCollision_A_B_Bar',
  173. '->loadClass() loads ApcPrefixCollision_A_B_Bar from beta.',
  174. ],
  175. ];
  176. }
  177. }