ResourceCheckerConfigCacheTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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\Config\Tests;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\Config\Resource\FileResource;
  13. use Symfony\Component\Config\ResourceCheckerConfigCache;
  14. use Symfony\Component\Config\Tests\Resource\ResourceStub;
  15. class ResourceCheckerConfigCacheTest extends TestCase
  16. {
  17. private $cacheFile = null;
  18. protected function setUp()
  19. {
  20. $this->cacheFile = tempnam(sys_get_temp_dir(), 'config_');
  21. }
  22. protected function tearDown()
  23. {
  24. $files = [$this->cacheFile, "{$this->cacheFile}.meta"];
  25. foreach ($files as $file) {
  26. if (file_exists($file)) {
  27. unlink($file);
  28. }
  29. }
  30. }
  31. public function testGetPath()
  32. {
  33. $cache = new ResourceCheckerConfigCache($this->cacheFile);
  34. $this->assertSame($this->cacheFile, $cache->getPath());
  35. }
  36. public function testCacheIsNotFreshIfEmpty()
  37. {
  38. $checker = $this->getMockBuilder('\Symfony\Component\Config\ResourceCheckerInterface')->getMock()
  39. ->expects($this->never())->method('supports');
  40. /* If there is nothing in the cache, it needs to be filled (and thus it's not fresh).
  41. It does not matter if you provide checkers or not. */
  42. unlink($this->cacheFile); // remove tempnam() side effect
  43. $cache = new ResourceCheckerConfigCache($this->cacheFile, [$checker]);
  44. $this->assertFalse($cache->isFresh());
  45. }
  46. public function testCacheIsFreshIfNoCheckerProvided()
  47. {
  48. /* For example in prod mode, you may choose not to run any checkers
  49. at all. In that case, the cache should always be considered fresh. */
  50. $cache = new ResourceCheckerConfigCache($this->cacheFile);
  51. $this->assertTrue($cache->isFresh());
  52. }
  53. public function testCacheIsFreshIfEmptyCheckerIteratorProvided()
  54. {
  55. $cache = new ResourceCheckerConfigCache($this->cacheFile, new \ArrayIterator([]));
  56. $this->assertTrue($cache->isFresh());
  57. }
  58. public function testResourcesWithoutcheckersAreIgnoredAndConsideredFresh()
  59. {
  60. /* As in the previous test, but this time we have a resource. */
  61. $cache = new ResourceCheckerConfigCache($this->cacheFile);
  62. $cache->write('', [new ResourceStub()]);
  63. $this->assertTrue($cache->isFresh()); // no (matching) ResourceChecker passed
  64. }
  65. public function testIsFreshWithchecker()
  66. {
  67. $checker = $this->getMockBuilder('\Symfony\Component\Config\ResourceCheckerInterface')->getMock();
  68. $checker->expects($this->once())
  69. ->method('supports')
  70. ->willReturn(true);
  71. $checker->expects($this->once())
  72. ->method('isFresh')
  73. ->willReturn(true);
  74. $cache = new ResourceCheckerConfigCache($this->cacheFile, [$checker]);
  75. $cache->write('', [new ResourceStub()]);
  76. $this->assertTrue($cache->isFresh());
  77. }
  78. public function testIsNotFreshWithchecker()
  79. {
  80. $checker = $this->getMockBuilder('\Symfony\Component\Config\ResourceCheckerInterface')->getMock();
  81. $checker->expects($this->once())
  82. ->method('supports')
  83. ->willReturn(true);
  84. $checker->expects($this->once())
  85. ->method('isFresh')
  86. ->willReturn(false);
  87. $cache = new ResourceCheckerConfigCache($this->cacheFile, [$checker]);
  88. $cache->write('', [new ResourceStub()]);
  89. $this->assertFalse($cache->isFresh());
  90. }
  91. public function testCacheIsNotFreshWhenUnserializeFails()
  92. {
  93. $checker = $this->getMockBuilder('\Symfony\Component\Config\ResourceCheckerInterface')->getMock();
  94. $cache = new ResourceCheckerConfigCache($this->cacheFile, [$checker]);
  95. $cache->write('foo', [new FileResource(__FILE__)]);
  96. $metaFile = "{$this->cacheFile}.meta";
  97. file_put_contents($metaFile, str_replace('FileResource', 'ClassNotHere', file_get_contents($metaFile)));
  98. $this->assertFalse($cache->isFresh());
  99. }
  100. public function testCacheKeepsContent()
  101. {
  102. $cache = new ResourceCheckerConfigCache($this->cacheFile);
  103. $cache->write('FOOBAR');
  104. $this->assertSame('FOOBAR', file_get_contents($cache->getPath()));
  105. }
  106. public function testCacheIsNotFreshIfNotExistsMetaFile()
  107. {
  108. $checker = $this->getMockBuilder('\Symfony\Component\Config\ResourceCheckerInterface')->getMock();
  109. $cache = new ResourceCheckerConfigCache($this->cacheFile, [$checker]);
  110. $cache->write('foo', [new FileResource(__FILE__)]);
  111. $metaFile = "{$this->cacheFile}.meta";
  112. unlink($metaFile);
  113. $this->assertFalse($cache->isFresh());
  114. }
  115. }