classname = '__Twig_Tests_Cache_ReadOnlyFilesystemTest_Template_'.$nonce; $this->directory = sys_get_temp_dir().'/twig-test'; $this->cache = new ReadOnlyFilesystemCache($this->directory); } protected function tearDown(): void { if (file_exists($this->directory)) { FilesystemHelper::removeDir($this->directory); } } public function testLoad() { $key = $this->directory.'/cache/ro-cachefile.php'; $dir = \dirname($key); @mkdir($dir, 0777, true); $this->assertDirectoryExists($dir); $this->assertFalse(class_exists($this->classname, false)); $content = $this->generateSource(); file_put_contents($key, $content); $this->cache->load($key); $this->assertTrue(class_exists($this->classname, false)); } public function testLoadMissing() { $key = $this->directory.'/cache/cachefile.php'; $this->assertFalse(class_exists($this->classname, false)); $this->cache->load($key); $this->assertFalse(class_exists($this->classname, false)); } public function testWrite() { $key = $this->directory.'/cache/cachefile.php'; $content = $this->generateSource(); $this->assertFileDoesNotExist($key); $this->assertFileDoesNotExist($this->directory); $this->cache->write($key, $content); $this->assertFileDoesNotExist($this->directory); $this->assertFileDoesNotExist($key); } public function testGetTimestamp() { $key = $this->directory.'/cache/cachefile.php'; $dir = \dirname($key); @mkdir($dir, 0777, true); $this->assertDirectoryExists($dir); // Create the file with a specific modification time. touch($key, 1234567890); $this->assertSame(1234567890, $this->cache->getTimestamp($key)); } public function testGetTimestampMissingFile() { $key = $this->directory.'/cache/cachefile.php'; $this->assertSame(0, $this->cache->getTimestamp($key)); } /** * Test file cache is tolerant towards trailing (back)slashes on the configured cache directory. * * @dataProvider provideDirectories */ public function testGenerateKey($expected, $input) { $cache = new ReadOnlyFilesystemCache($input); $this->assertMatchesRegularExpression($expected, $cache->generateKey('_test_', static::class)); } public static function provideDirectories() { $pattern = '#a/b/[a-zA-Z0-9]+/[a-zA-Z0-9]+.php$#'; return [ [$pattern, 'a/b'], [$pattern, 'a/b/'], [$pattern, 'a/b\\'], [$pattern, 'a/b\\/'], [$pattern, 'a/b\\//'], ['#/'.substr($pattern, 1), '/a/b'], ]; } private function generateSource() { return strtr(' $this->classname, ]); } }