StaticBackendTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <?php
  2. /**
  3. * @package Zend_Cache
  4. * @subpackage UnitTests
  5. */
  6. /**
  7. * Zend_Cache
  8. */
  9. require_once 'Zend/Cache.php';
  10. require_once 'Zend/Cache/Backend/Static.php';
  11. /**
  12. * Zend_Log
  13. */
  14. require_once 'Zend/Log.php';
  15. require_once 'Zend/Log/Writer/Null.php';
  16. /**
  17. * Common tests for backends
  18. */
  19. require_once 'CommonBackendTest.php';
  20. /**
  21. * @package Zend_Cache
  22. * @subpackage UnitTests
  23. */
  24. class Zend_Cache_StaticBackendTest extends Zend_Cache_CommonBackendTest {
  25. protected $_instance;
  26. protected $_instance2;
  27. protected $_cache_dir;
  28. protected $_requestUriOld;
  29. protected $_innerCache;
  30. public function __construct($name = null, array $data = array(), $dataName = '')
  31. {
  32. parent::__construct('Zend_Cache_Backend_Static', $data, $dataName);
  33. }
  34. public function setUp($notag = false)
  35. {
  36. $this->mkdir();
  37. $this->_cache_dir = $this->mkdir();
  38. @mkdir($this->_cache_dir.'/tags');
  39. $this->_innerCache = Zend_Cache::factory('Core','File',
  40. array('automatic_serialization'=>true), array('cache_dir'=>$this->_cache_dir.'/tags')
  41. );
  42. $this->_instance = new Zend_Cache_Backend_Static(array(
  43. 'public_dir' => $this->_cache_dir,
  44. 'tag_cache' => $this->_innerCache
  45. ));
  46. $logger = new Zend_Log(new Zend_Log_Writer_Null());
  47. $this->_instance->setDirectives(array('logger' => $logger));
  48. $this->_requestUriOld =
  49. isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null;
  50. $_SERVER['REQUEST_URI'] = '/foo';
  51. $this->_instance->setDirectives(array('logging' => true));
  52. $this->_instance->save('bar : data to cache', bin2hex('/bar'), array('tag3', 'tag4'));
  53. $this->_instance->save('bar2 : data to cache', bin2hex('/bar2'), array('tag3', 'tag1'));
  54. $this->_instance->save('bar3 : data to cache', bin2hex('/bar3'), array('tag2', 'tag3'));
  55. }
  56. public function tearDown()
  57. {
  58. parent::tearDown();
  59. unset($this->_instance);
  60. $_SERVER['REQUEST_URI'] = $this->_requestUriOld;
  61. $this->rmdir();
  62. }
  63. public function testConstructorCorrectCall()
  64. {
  65. $test = new Zend_Cache_Backend_Static(array());
  66. }
  67. public function testRemoveCorrectCall()
  68. {
  69. $this->assertTrue($this->_instance->remove('/bar'));
  70. $this->assertFalse($this->_instance->test(bin2hex('/bar')));
  71. $this->assertFalse($this->_instance->remove('/barbar'));
  72. $this->assertFalse($this->_instance->test(bin2hex('/barbar')));
  73. }
  74. public function testOptionsSetTagCache()
  75. {
  76. $test = new Zend_Cache_Backend_Static(array('tag_cache'=>$this->_innerCache));
  77. $this->assertTrue($test->getInnerCache() instanceof Zend_Cache_Core);
  78. }
  79. public function testSaveCorrectCall()
  80. {
  81. $res = $this->_instance->save('data to cache', bin2hex('/foo'), array('tag1', 'tag2'));
  82. $this->assertTrue($res);
  83. }
  84. public function testSaveWithNullLifeTime()
  85. {
  86. $this->_instance->setDirectives(array('lifetime' => null));
  87. $res = $this->_instance->save('data to cache', bin2hex('/foo'), array('tag1', 'tag2'));
  88. $this->assertTrue($res);
  89. }
  90. public function testSaveWithSpecificLifeTime()
  91. {
  92. $this->_instance->setDirectives(array('lifetime' => 3600));
  93. $res = $this->_instance->save('data to cache', bin2hex('/foo'), array('tag1', 'tag2'), 10);
  94. $this->assertTrue($res);
  95. }
  96. public function testSaveWithSpecificExtension()
  97. {
  98. $res = $this->_instance->save(serialize(array('data to cache', 'xml')), bin2hex('/foo2'));
  99. $this->assertTrue($this->_instance->test(bin2hex('/foo2')));
  100. unlink($this->_instance->getOption('public_dir') . '/foo2.xml');
  101. }
  102. public function testSaveWithSubFolder()
  103. {
  104. $res = $this->_instance->save('data to cache', bin2hex('/foo/bar'));
  105. $this->assertTrue($res);
  106. $this->assertTrue($this->_instance->test(bin2hex('/foo/bar')));
  107. unlink($this->_instance->getOption('public_dir') . '/foo/bar.html');
  108. rmdir($this->_instance->getOption('public_dir') . '/foo');
  109. }
  110. public function testFilename0()
  111. {
  112. $res = $this->_instance->save('content', bin2hex('/0'));
  113. $this->assertTrue($res);
  114. $this->assertTrue($this->_instance->test(bin2hex('/0')));
  115. $this->assertEquals('content', $this->_instance->load(bin2hex('/0')));
  116. }
  117. public function testDirectoryPermAsString()
  118. {
  119. $this->_instance->setOption('cache_directory_perm', '777');
  120. $res = $this->_instance->save('data to cache', bin2hex('/foo/bar'));
  121. $this->assertTrue($res);
  122. $perms = fileperms($this->_instance->getOption('public_dir') . '/foo');
  123. $this->assertEquals('777', substr(decoct($perms), -3));
  124. unlink($this->_instance->getOption('public_dir') . '/foo/bar.html');
  125. rmdir($this->_instance->getOption('public_dir') . '/foo');
  126. }
  127. /**
  128. * @group GH-91
  129. */
  130. public function testDirectoryUmaskTriggersError()
  131. {
  132. try {
  133. $this->_instance->setOption('cache_directory_umask', '777');
  134. $this->fail();
  135. } catch (PHPUnit_Framework_Error $e) {
  136. $this->assertEquals(
  137. "'cache_directory_umask' is deprecated -> please use 'cache_directory_perm' instead",
  138. $e->getMessage()
  139. );
  140. }
  141. }
  142. /**
  143. * @group GH-91
  144. */
  145. public function testFileUmaskTriggersError()
  146. {
  147. try {
  148. $this->_instance->setOption('cache_file_umask', '777');
  149. $this->fail();
  150. } catch (PHPUnit_Framework_Error $e) {
  151. $this->assertEquals(
  152. "'cache_file_umask' is deprecated -> please use 'cache_file_perm' instead",
  153. $e->getMessage()
  154. );
  155. }
  156. }
  157. public function testSaveWithSpecificExtensionWithTag()
  158. {
  159. $res = $this->_instance->save(serialize(array('data to cache', 'xml')), bin2hex('/foo'), array('tag1'));
  160. $this->assertTrue($this->_instance->test(bin2hex('/foo')));
  161. unlink($this->_instance->getOption('public_dir') . '/foo.xml');
  162. }
  163. public function testRemovalWithSpecificExtension()
  164. {
  165. $res = $this->_instance->save(serialize(array('data to cache', 'xml')), bin2hex('/foo3'), array('tag1'));
  166. $this->assertTrue($this->_instance->test(bin2hex('/foo3')));
  167. $this->assertTrue($this->_instance->remove('/foo3'));
  168. $this->assertFalse($this->_instance->test(bin2hex('/foo3')));
  169. }
  170. public function testTestWithAnExistingCacheId()
  171. {
  172. $res = $this->_instance->test(bin2hex('/bar'));
  173. if (!$res) {
  174. $this->fail('test() return false');
  175. }
  176. return;
  177. }
  178. public function testTestWithANonExistingCacheId()
  179. {
  180. $this->assertFalse($this->_instance->test(bin2hex('/barbar')));
  181. }
  182. public function testTestWithAnExistingCacheIdAndANullLifeTime()
  183. {
  184. $this->_instance->setDirectives(array('lifetime' => null));
  185. $res = $this->_instance->test(bin2hex('/bar'));
  186. if (!$res) {
  187. $this->fail('test() return false');
  188. }
  189. return;
  190. }
  191. public function testGetWithANonExistingCacheId()
  192. {
  193. $this->assertFalse($this->_instance->load(bin2hex('/barbar')));
  194. }
  195. public function testGetWithAnExistingCacheId()
  196. {
  197. $this->assertEquals('bar : data to cache', $this->_instance->load(bin2hex('/bar')));
  198. }
  199. public function testGetWithAnExistingCacheIdAndUTFCharacters()
  200. {
  201. $data = '"""""' . "'" . '\n' . 'ééééé';
  202. $this->_instance->save($data, bin2hex('/foo'));
  203. $this->assertEquals($data, $this->_instance->load(bin2hex('/foo')));
  204. }
  205. public function testCleanModeMatchingTags()
  206. {
  207. $this->assertTrue($this->_instance->clean('matchingTag', array('tag3')));
  208. $this->assertFalse($this->_instance->test(bin2hex('/bar')));
  209. $this->assertFalse($this->_instance->test(bin2hex('/bar2')));
  210. }
  211. public function testCleanModeMatchingTags2()
  212. {
  213. $this->assertTrue($this->_instance->clean('matchingTag', array('tag3', 'tag4')));
  214. $this->assertFalse($this->_instance->test(bin2hex('/bar')));
  215. }
  216. public function testCleanModeNotMatchingTags()
  217. {
  218. $this->assertTrue($this->_instance->clean('notMatchingTag', array('tag3')));
  219. $this->assertTrue($this->_instance->test(bin2hex('/bar')));
  220. $this->assertTrue($this->_instance->test(bin2hex('/bar2')));
  221. }
  222. public function testCleanModeNotMatchingTags2()
  223. {
  224. $this->assertTrue($this->_instance->clean('notMatchingTag', array('tag4')));
  225. $this->assertTrue($this->_instance->test(bin2hex('/bar')));
  226. $this->assertFalse($this->_instance->test(bin2hex('/bar2')));
  227. }
  228. public function testCleanModeNotMatchingTags3()
  229. {
  230. $this->assertTrue($this->_instance->clean('notMatchingTag', array('tag4', 'tag1')));
  231. $this->assertTrue($this->_instance->test(bin2hex('/bar')));
  232. $this->assertTrue($this->_instance->test(bin2hex('/bar2')));
  233. $this->assertFalse($this->_instance->test(bin2hex('/bar3')));
  234. }
  235. public function testCleanModeAll()
  236. {
  237. $this->assertTrue($this->_instance->clean('all'));
  238. $this->assertFalse($this->_instance->test(bin2hex('bar')));
  239. $this->assertFalse($this->_instance->test(bin2hex('bar2')));
  240. }
  241. /**
  242. * @group ZF-10558
  243. */
  244. public function testRemoveRecursively()
  245. {
  246. @mkdir($this->_cache_dir . '/issues/zf10558', 0777, true);
  247. $id = '/issues/zf10558';
  248. $pathFile = $this->_cache_dir . $id . '/index.html';
  249. file_put_contents($pathFile, '<strong>foo</strong>');
  250. $this->_instance->removeRecursively($id);
  251. $this->assertFileNotExists($pathFile);
  252. $this->assertFileNotExists(dirname($pathFile));
  253. rmdir($this->_cache_dir . '/issues/');
  254. }
  255. // Irrelevant Tests (from common tests)
  256. public function testGetWithAnExpiredCacheId()
  257. {
  258. $this->markTestSkipped('Irrelevant Test');
  259. }
  260. public function testCleanModeOld()
  261. {
  262. $this->markTestSkipped('Irrelevant Test');
  263. }
  264. // Helper Methods
  265. public function mkdir()
  266. {
  267. $tmp = $this->getTmpDir();
  268. @mkdir($tmp);
  269. return $tmp;
  270. }
  271. public function rmdir()
  272. {
  273. $tmpDir = $this->getTmpDir(false);
  274. foreach (glob("$tmpDir*") as $dirname) {
  275. @rmdir($dirname);
  276. }
  277. }
  278. public function getTmpDir($date = true)
  279. {
  280. $suffix = '';
  281. $tmp = sys_get_temp_dir();
  282. if ($date) {
  283. $suffix = date('mdyHis');
  284. }
  285. if (is_writeable($tmp)) {
  286. return $tmp . DIRECTORY_SEPARATOR . 'zend_cache_tmp_dir_' . $suffix;
  287. } else {
  288. throw new Exception("no writable tmpdir found");
  289. }
  290. }
  291. }