Yaffs site version 1.1
[yaffs-website] / vendor / twig / twig / test / Twig / Tests / Cache / FilesystemTest.php
1 <?php
2
3 /*
4  * This file is part of Twig.
5  *
6  * (c) Fabien Potencier
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 require_once dirname(dirname(__FILE__)).'/FilesystemHelper.php';
13
14 class Twig_Tests_Cache_FilesystemTest extends PHPUnit_Framework_TestCase
15 {
16     private $classname;
17     private $directory;
18     private $cache;
19
20     protected function setUp()
21     {
22         $nonce = hash('sha256', uniqid(mt_rand(), true));
23         $this->classname = '__Twig_Tests_Cache_FilesystemTest_Template_'.$nonce;
24         $this->directory = sys_get_temp_dir().'/twig-test';
25         $this->cache = new Twig_Cache_Filesystem($this->directory);
26     }
27
28     protected function tearDown()
29     {
30         if (file_exists($this->directory)) {
31             Twig_Tests_FilesystemHelper::removeDir($this->directory);
32         }
33     }
34
35     public function testLoad()
36     {
37         $key = $this->directory.'/cache/cachefile.php';
38
39         $dir = dirname($key);
40         @mkdir($dir, 0777, true);
41         $this->assertTrue(is_dir($dir));
42         $this->assertFalse(class_exists($this->classname, false));
43
44         $content = $this->generateSource();
45         file_put_contents($key, $content);
46
47         $this->cache->load($key);
48
49         $this->assertTrue(class_exists($this->classname, false));
50     }
51
52     public function testLoadMissing()
53     {
54         $key = $this->directory.'/cache/cachefile.php';
55
56         $this->assertFalse(class_exists($this->classname, false));
57
58         $this->cache->load($key);
59
60         $this->assertFalse(class_exists($this->classname, false));
61     }
62
63     public function testWrite()
64     {
65         $key = $this->directory.'/cache/cachefile.php';
66         $content = $this->generateSource();
67
68         $this->assertFileNotExists($key);
69         $this->assertFileNotExists($this->directory);
70
71         $this->cache->write($key, $content);
72
73         $this->assertFileExists($this->directory);
74         $this->assertFileExists($key);
75         $this->assertSame(file_get_contents($key), $content);
76     }
77
78     /**
79      * @expectedException RuntimeException
80      * @expectedExceptionMessage Unable to create the cache directory
81      */
82     public function testWriteFailMkdir()
83     {
84         if (defined('PHP_WINDOWS_VERSION_BUILD')) {
85             $this->markTestSkipped('Read-only directories not possible on Windows.');
86         }
87
88         $key = $this->directory.'/cache/cachefile.php';
89         $content = $this->generateSource();
90
91         $this->assertFileNotExists($key);
92
93         // Create read-only root directory.
94         @mkdir($this->directory, 0555, true);
95         $this->assertTrue(is_dir($this->directory));
96
97         $this->cache->write($key, $content);
98     }
99
100     /**
101      * @expectedException RuntimeException
102      * @expectedExceptionMessage Unable to write in the cache directory
103      */
104     public function testWriteFailDirWritable()
105     {
106         if (defined('PHP_WINDOWS_VERSION_BUILD')) {
107             $this->markTestSkipped('Read-only directories not possible on Windows.');
108         }
109
110         $key = $this->directory.'/cache/cachefile.php';
111         $content = $this->generateSource();
112
113         $this->assertFileNotExists($key);
114
115         // Create root directory.
116         @mkdir($this->directory, 0777, true);
117         // Create read-only subdirectory.
118         @mkdir($this->directory.'/cache', 0555);
119         $this->assertTrue(is_dir($this->directory.'/cache'));
120
121         $this->cache->write($key, $content);
122     }
123
124     /**
125      * @expectedException RuntimeException
126      * @expectedExceptionMessage Failed to write cache file
127      */
128     public function testWriteFailWriteFile()
129     {
130         $key = $this->directory.'/cache/cachefile.php';
131         $content = $this->generateSource();
132
133         $this->assertFileNotExists($key);
134
135         // Create a directory in the place of the cache file.
136         @mkdir($key, 0777, true);
137         $this->assertTrue(is_dir($key));
138
139         $this->cache->write($key, $content);
140     }
141
142     public function testGetTimestamp()
143     {
144         $key = $this->directory.'/cache/cachefile.php';
145
146         $dir = dirname($key);
147         @mkdir($dir, 0777, true);
148         $this->assertTrue(is_dir($dir));
149
150         // Create the file with a specific modification time.
151         touch($key, 1234567890);
152
153         $this->assertSame(1234567890, $this->cache->getTimestamp($key));
154     }
155
156     public function testGetTimestampMissingFile()
157     {
158         $key = $this->directory.'/cache/cachefile.php';
159         $this->assertSame(0, $this->cache->getTimestamp($key));
160     }
161
162     /**
163      * Test file cache is tolerant towards trailing (back)slashes on the configured cache directory.
164      *
165      * @dataProvider provideDirectories
166      */
167     public function testGenerateKey($expected, $input)
168     {
169         $cache = new Twig_Cache_Filesystem($input);
170         $this->assertRegExp($expected, $cache->generateKey('_test_', get_class($this)));
171     }
172
173     public function provideDirectories()
174     {
175         $pattern = '#a/b/[a-zA-Z0-9]+/[a-zA-Z0-9]+.php$#';
176
177         return array(
178             array($pattern, 'a/b'),
179             array($pattern, 'a/b/'),
180             array($pattern, 'a/b\\'),
181             array($pattern, 'a/b\\/'),
182             array($pattern, 'a/b\\//'),
183             array('#/'.substr($pattern, 1), '/a/b'),
184         );
185     }
186
187     private function generateSource()
188     {
189         return strtr('<?php class {{classname}} {}', array(
190             '{{classname}}' => $this->classname,
191         ));
192     }
193 }