PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/cases/storage/CacheTest.php

https://github.com/Daikoun/lithium
PHP | 650 lines | 508 code | 136 blank | 6 comment | 4 complexity | dedbf01a5de5e0cb85f4f18b521d3fb5 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * Lithium: the most rad php framework
  4. *
  5. * @copyright Copyright 2012, Union of RAD (http://union-of-rad.org)
  6. * @license http://opensource.org/licenses/bsd-license.php The BSD License
  7. */
  8. namespace lithium\tests\cases\storage;
  9. use SplFileInfo;
  10. use lithium\core\Libraries;
  11. use lithium\storage\Cache;
  12. class CacheTest extends \lithium\test\Unit {
  13. public function setUp() {
  14. Cache::reset();
  15. }
  16. public function tearDown() {
  17. Cache::reset();
  18. }
  19. protected function _checkPath() {
  20. $resources = Libraries::get(true, 'resources');
  21. if (is_writable($resources) && !is_dir("{$resources}/tmp/cache")) {
  22. mkdir("{$resources}/tmp/cache", 0777, true);
  23. }
  24. $directory = new SplFileInfo("{$resources}/tmp/cache");
  25. return ($directory->isDir() && $directory->isReadable() && $directory->isWritable());
  26. }
  27. public function testBasicCacheConfig() {
  28. $result = Cache::config();
  29. $this->assertFalse($result);
  30. $config = array('default' => array('adapter' => '\some\adapter', 'filters' => array()));
  31. $result = Cache::config($config);
  32. $this->assertNull($result);
  33. $expected = $config;
  34. $result = Cache::config();
  35. $this->assertEqual($expected, $result);
  36. $result = Cache::reset();
  37. $this->assertNull($result);
  38. $config = array('default' => array('adapter' => '\some\adapter', 'filters' => array()));
  39. Cache::config($config);
  40. $result = Cache::config();
  41. $expected = $config;
  42. $this->assertEqual($expected, $result);
  43. $result = Cache::reset();
  44. $this->assertNull($result);
  45. $config = array('default' => array(
  46. 'adapter' => '\some\adapter',
  47. 'filters' => array('Filter1', 'Filter2')
  48. ));
  49. Cache::config($config);
  50. $result = Cache::config();
  51. $expected = $config;
  52. $this->assertEqual($expected, $result);
  53. }
  54. public function testkeyNoContext() {
  55. $key = 'this is a cache key';
  56. $result = Cache::key($key);
  57. $expected = 'this is a cache key';
  58. $this->assertIdentical($expected, $result);
  59. $key = '1120-cache éë';
  60. $result = Cache::key($key);
  61. $expected = '1120-cache éë';
  62. $this->assertIdentical($expected, $result);
  63. }
  64. public function testKeyWithLambda() {
  65. $key = function() {
  66. return 'lambda_key';
  67. };
  68. $result = Cache::key($key);
  69. $expected = 'lambda_key';
  70. $this->assertIdentical($expected, $result);
  71. $key = function() {
  72. return 'lambda key';
  73. };
  74. $result = Cache::key($key);
  75. $expected = 'lambda key';
  76. $this->assertIdentical($expected, $result);
  77. $key = function($data = array()) {
  78. $defaults = array('foo' => 'foo', 'bar' => 'bar');
  79. $data += $defaults;
  80. return 'composed_key_with_' . $data['foo'] . '_' . $data['bar'];
  81. };
  82. $result = Cache::key($key, array('foo' => 'boo', 'bar' => 'far'));
  83. $expected = 'composed_key_with_boo_far';
  84. $this->assertIdentical($expected, $result);
  85. }
  86. public function testKeyWithClosure() {
  87. $value = 5;
  88. $key = function() use ($value) {
  89. return "closure key {$value}";
  90. };
  91. $result = Cache::key($key);
  92. $expected = 'closure key 5';
  93. $this->assertIdentical($expected, $result);
  94. $reference = 'mutable';
  95. $key = function () use (&$reference) {
  96. $reference .= ' key';
  97. return $reference;
  98. };
  99. $result = Cache::key($key);
  100. $expected = 'mutable key';
  101. $this->assertIdentical($expected, $result);
  102. $this->assertIdentical('mutable key', $reference);
  103. }
  104. public function testKeyWithClosureAndArguments() {
  105. $value = 'closure argument';
  106. $key = function($value) {
  107. return $value;
  108. };
  109. $result = Cache::key($key($value));
  110. $expected = 'closure argument';
  111. $this->assertIdentical($expected, $result);
  112. }
  113. public function testCacheWrite() {
  114. $config = array('default' => array(
  115. 'adapter' => 'Memory', 'filters' => array()
  116. ));
  117. Cache::config($config);
  118. $result = Cache::config();
  119. $expected = $config;
  120. $this->assertEqual($expected, $result);
  121. $result = Cache::write('default', 'some_key', 'some_data', '+1 minute');
  122. $this->assertTrue($result);
  123. $result = Cache::write('non_existing', 'key_value', 'data', '+1 minute');
  124. $this->assertFalse($result);
  125. }
  126. public function testCacheWriteMultipleItems() {
  127. $config = array('default' => array(
  128. 'adapter' => 'Memory', 'filters' => array(), 'strategies' => array()
  129. ));
  130. Cache::config($config);
  131. $result = Cache::config();
  132. $expected = $config;
  133. $this->assertEqual($expected, $result);
  134. $data = array(
  135. 'key1' => 'value1',
  136. 'key2' => 'value2',
  137. 'key3' => 'value3'
  138. );
  139. $result = Cache::write('default', $data, '+1 minute');
  140. $this->assertTrue($result);
  141. }
  142. public function testCacheReadMultipleItems() {
  143. $config = array('default' => array(
  144. 'adapter' => 'Memory', 'filters' => array(), 'strategies' => array()
  145. ));
  146. Cache::config($config);
  147. $result = Cache::config();
  148. $expected = $config;
  149. $this->assertEqual($expected, $result);
  150. $data = array(
  151. 'read1' => 'value1',
  152. 'read2' => 'value2',
  153. 'read3' => 'value3'
  154. );
  155. $result = Cache::write('default', $data, '+1 minute');
  156. $this->assertTrue($result);
  157. $keys = array_keys($data);
  158. $result = Cache::read('default', $keys);
  159. $this->assertEqual($data, $result);
  160. }
  161. public function testCacheReadWithConditions() {
  162. $config = array('default' => array(
  163. 'adapter' => 'Memory', 'filters' => array()
  164. ));
  165. Cache::config($config);
  166. $result = Cache::config();
  167. $expected = $config;
  168. $this->assertEqual($expected, $result);
  169. $conditions = function() {
  170. return false;
  171. };
  172. $result = Cache::read('default', 'some_key', compact('conditions'));
  173. $this->assertFalse($result);
  174. $conditions = function() use (&$config) {
  175. return (isset($config['default']));
  176. };
  177. Cache::write('default', 'some_key', 'some value', '+1 minute');
  178. $result = Cache::read('default', 'some_key', compact('conditions'));
  179. $this->assertTrue($result);
  180. $result = Cache::read('non_existing', 'key_value', compact('conditions'));
  181. $this->assertFalse($result);
  182. }
  183. public function testCacheIncrementDecrementWithConditions() {
  184. $config = array('default' => array(
  185. 'adapter' => 'Memory', 'filters' => array()
  186. ));
  187. Cache::config($config);
  188. $result = Cache::config();
  189. $expected = $config;
  190. $this->assertEqual($expected, $result);
  191. $conditions = function() {
  192. return false;
  193. };
  194. $result = Cache::increment('default', 'some_key', 1, compact('conditions'));
  195. $this->assertFalse($result);
  196. $conditions = function() use (&$config) {
  197. return (isset($config['default']));
  198. };
  199. Cache::write('default', 'some_key', 1, '+1 minute');
  200. $result = Cache::increment('default', 'some_key', 1, compact('conditions'));
  201. $this->assertEqual(2, $result);
  202. $conditions = function() {
  203. return false;
  204. };
  205. $result = Cache::decrement('default', 'decrement_some_key', 1, compact('conditions'));
  206. $this->assertFalse($result);
  207. $conditions = function() use (&$config) {
  208. return (isset($config['default']));
  209. };
  210. Cache::write('default', 'decrement_some_key', 1, '+1 minute');
  211. $result = Cache::decrement('default', 'decrement_some_key', 1, compact('conditions'));
  212. $this->assertEqual(0, $result);
  213. }
  214. public function testCacheWriteWithConditions() {
  215. $config = array('default' => array(
  216. 'adapter' => 'Memory', 'filters' => array()
  217. ));
  218. Cache::config($config);
  219. $result = Cache::config();
  220. $expected = $config;
  221. $this->assertEqual($expected, $result);
  222. $conditions = function() {
  223. return false;
  224. };
  225. $result = Cache::write(
  226. 'default', 'some_key', 'some_data', '+1 minute', compact('conditions')
  227. );
  228. $this->assertFalse($result);
  229. $conditions = function() use (&$config) {
  230. return (isset($config['default']));
  231. };
  232. $result = Cache::write(
  233. 'default', 'some_key', 'some_data', '+1 minute', compact('conditions')
  234. );
  235. $this->assertTrue($result);
  236. $result = Cache::write(
  237. 'non_existing', 'key_value', 'data', '+1 minute', compact('conditions')
  238. );
  239. $this->assertFalse($result);
  240. }
  241. public function testCacheReadThroughWrite() {
  242. $config = array('default' => array(
  243. 'adapter' => 'Memory', 'filters' => array()
  244. ));
  245. Cache::config($config);
  246. $result = Cache::config();
  247. $expected = $config;
  248. $this->assertEqual($expected, $result);
  249. $write = function() {
  250. return array('+1 minute' => 'read-through write');
  251. };
  252. $result = Cache::read('default', 'read_through');
  253. $this->assertNull($result);
  254. $result = Cache::read('default', 'read_through', compact('write'));
  255. $this->assertEqual('read-through write', $result);
  256. $result = Cache::read('default', 'read_through');
  257. $this->assertEqual('read-through write', $result);
  258. $write = array('+1 minute' => 'string read-through write');
  259. $result = Cache::read('default', 'string_read_through', compact('write'));
  260. $this->assertEqual('string read-through write', $result);
  261. $result = Cache::read('default', 'string_read_through');
  262. $this->assertEqual('string read-through write', $result);
  263. }
  264. public function testCacheReadAndWrite() {
  265. $config = array('default' => array(
  266. 'adapter' => 'Memory', 'filters' => array()
  267. ));
  268. Cache::config($config);
  269. $result = Cache::config();
  270. $expected = $config;
  271. $this->assertEqual($expected, $result);
  272. $result = Cache::read('non_existing', 'key_value');
  273. $this->assertFalse($result);
  274. $result = Cache::write('default', 'keyed', 'some data', '+1 minute');
  275. $this->assertTrue($result);
  276. $result = Cache::read('default', 'keyed');
  277. $expected = 'some data';
  278. $this->assertEqual($expected, $result);
  279. $result = Cache::write('default', 'another', array('data' => 'take two'), '+1 minute');
  280. $this->assertTrue($result);
  281. $result = Cache::read('default', 'another');
  282. $expected = array('data' => 'take two');
  283. $this->assertEqual($expected, $result);
  284. $result = Cache::write(
  285. 'default', 'another', (object) array('data' => 'take two'), '+1 minute'
  286. );
  287. $this->assertTrue($result);
  288. $result = Cache::read('default', 'another');
  289. $expected = (object) array('data' => 'take two');
  290. $this->assertEqual($expected, $result);
  291. }
  292. public function testCacheReadAndWriteWithConditions() {
  293. $config = array('default' => array(
  294. 'adapter' => 'Memory', 'filters' => array()
  295. ));
  296. Cache::config($config);
  297. $result = Cache::config();
  298. $expected = $config;
  299. $this->assertEqual($expected, $result);
  300. $conditions = function() use (&$config) {
  301. return (isset($config['default']));
  302. };
  303. $result = Cache::read('non_existing', 'key_value', compact('conditions'));
  304. $this->assertFalse($result);
  305. $result = Cache::read('default', 'key_value', compact('conditions'));
  306. $this->assertFalse($result);
  307. $result = Cache::write('default', 'keyed', 'some data', '+1 minute', compact('conditions'));
  308. $this->assertTrue($result);
  309. $conditions = function() {
  310. return false;
  311. };
  312. $result = Cache::write('default', 'keyed', 'some data', '+1 minute', compact('conditions'));
  313. $this->assertFalse($result);
  314. }
  315. public function testCacheWriteAndDelete() {
  316. $config = array('default' => array(
  317. 'adapter' => 'Memory', 'filters' => array()
  318. ));
  319. Cache::config($config);
  320. $result = Cache::config();
  321. $expected = $config;
  322. $this->assertEqual($expected, $result);
  323. $result = Cache::delete('non_existing', 'key_value');
  324. $this->assertFalse($result);
  325. $result = Cache::write('default', 'to delete', 'dead data', '+1 minute');
  326. $this->assertTrue($result);
  327. $result = Cache::delete('default', 'to delete');
  328. $this->assertTrue($result);
  329. $this->assertFalse(Cache::read('default', 'to delete'));
  330. }
  331. public function testCacheWriteAndDeleteWithConditions() {
  332. $config = array('default' => array(
  333. 'adapter' => 'Memory', 'filters' => array()
  334. ));
  335. Cache::config($config);
  336. $result = Cache::config();
  337. $expected = $config;
  338. $this->assertEqual($expected, $result);
  339. $conditions = function() use (&$config) {
  340. return (isset($config['default']));
  341. };
  342. $result = Cache::delete('non_existing', 'key_value', compact('conditions'));
  343. $this->assertFalse($result);
  344. $result = Cache::write('default', 'to delete', 'dead data', '+1 minute');
  345. $this->assertTrue($result);
  346. $result = Cache::delete('default', 'to delete', array(
  347. 'conditions' => function() {
  348. return false;
  349. }
  350. ));
  351. $this->assertFalse($result);
  352. $result = Cache::delete('default', 'to delete', compact('conditions'));
  353. $this->assertTrue($result);
  354. }
  355. public function testCacheWriteAndClear() {
  356. $config = array('default' => array(
  357. 'adapter' => 'Memory', 'filters' => array()
  358. ));
  359. Cache::config($config);
  360. $result = Cache::config();
  361. $expected = $config;
  362. $this->assertEqual($expected, $result);
  363. $result = Cache::clear('non_existing');
  364. $this->assertFalse($result);
  365. $result = Cache::write('default', 'to delete', 'dead data', '+1 minute');
  366. $this->assertTrue($result);
  367. $result = Cache::clear('default');
  368. $this->assertTrue($result);
  369. $result = Cache::read('default', 'to delete');
  370. $this->assertFalse($result);
  371. }
  372. public function testClean() {
  373. $config = array('default' => array(
  374. 'adapter' => 'Memory', 'filters' => array()
  375. ));
  376. Cache::config($config);
  377. $result = Cache::config();
  378. $expected = $config;
  379. $this->assertEqual($expected, $result);
  380. $result = Cache::clean('non_existing');
  381. $this->assertFalse($result);
  382. $result = Cache::clean('default');
  383. $this->assertFalse($result);
  384. }
  385. public function testReset() {
  386. $config = array('default' => array(
  387. 'adapter' => 'Memory', 'filters' => array()
  388. ));
  389. Cache::config($config);
  390. $result = Cache::config();
  391. $expected = $config;
  392. $this->assertEqual($expected, $result);
  393. $result = Cache::reset();
  394. $this->assertNull($result);
  395. $result = Cache::config();
  396. $this->assertFalse($result);
  397. }
  398. public function testIncrement() {
  399. $config = array('default' => array(
  400. 'adapter' => 'Memory', 'filters' => array()
  401. ));
  402. Cache::config($config);
  403. $result = Cache::config();
  404. $expected = $config;
  405. $this->assertEqual($expected, $result);
  406. $result = Cache::increment('does_not_exist', 'inc');
  407. $this->assertFalse($result);
  408. $result = Cache::write('default', 'increment', 5, '+1 minute');
  409. $this->assertTrue($result);
  410. $result = Cache::increment('default', 'increment');
  411. $this->assertTrue($result);
  412. $result = Cache::read('default', 'increment');
  413. $this->assertEqual(6, $result);
  414. }
  415. public function testDecrement() {
  416. $config = array('default' => array(
  417. 'adapter' => 'Memory', 'filters' => array()
  418. ));
  419. Cache::config($config);
  420. $result = Cache::config();
  421. $expected = $config;
  422. $this->assertEqual($expected, $result);
  423. $result = Cache::decrement('does_not_exist', 'dec');
  424. $this->assertFalse($result);
  425. $result = Cache::write('default', 'decrement', 5, '+1 minute');
  426. $this->assertTrue($result);
  427. $result = Cache::decrement('default', 'decrement');
  428. $this->assertTrue($result);
  429. $result = Cache::read('default', 'decrement');
  430. $this->assertEqual(4, $result);
  431. }
  432. public function testNonPortableCacheAdapterMethod() {
  433. $config = array('default' => array(
  434. 'adapter' => 'Memory', 'filters' => array()
  435. ));
  436. Cache::config($config);
  437. $result = Cache::config();
  438. $expected = $config;
  439. $this->assertEqual($expected, $result);
  440. }
  441. public function testIntegrationFileAdapterCacheConfig() {
  442. $result = Cache::config();
  443. $this->assertFalse($result);
  444. $config = array('default' => array('adapter' => 'File', 'filters' => array()));
  445. Cache::config($config);
  446. $this->assertEqual($config, Cache::config());
  447. }
  448. public function testIntegrationFileAdapterWrite() {
  449. $resources = Libraries::get(true, 'resources');
  450. $path = "{$resources}/tmp/cache";
  451. $this->skipIf(!$this->_checkPath(), "{$path} does not have the proper permissions.");
  452. $config = array('default' => compact('path') + array(
  453. 'adapter' => 'File',
  454. 'filters' => array()
  455. ));
  456. Cache::config($config);
  457. $result = Cache::write('default', 'key', 'value', '+1 minute');
  458. $this->assertTrue($result);
  459. $time = time() + 60;
  460. $result = file_get_contents("{$path}/key");
  461. $expected = "{:expiry:$time}\nvalue";
  462. $this->assertEqual($result, $expected);
  463. $result = unlink("{$path}/key");
  464. $this->assertTrue($result);
  465. $this->assertFalse(file_exists("{$path}/key"));
  466. }
  467. public function testIntegrationFileAdapterWithStrategies() {
  468. $resources = Libraries::get(true, 'resources');
  469. $path = "{$resources}/tmp/cache";
  470. $this->skipIf(!$this->_checkPath(), "{$path} does not have the proper permissions.");
  471. $config = array('default' => compact('path') + array(
  472. 'adapter' => 'File',
  473. 'filters' => array(),
  474. 'strategies' => array('Serializer')
  475. ));
  476. Cache::config($config);
  477. $data = array('some' => 'data');
  478. $result = Cache::write('default', 'key', $data, '+1 minute');
  479. $this->assertTrue($result);
  480. $time = time() + 60;
  481. $result = file_get_contents("{$path}/key");
  482. $expected = "{:expiry:$time}\na:1:{s:4:\"some\";s:4:\"data\";}";
  483. $this->assertEqual($result, $expected);
  484. $result = Cache::read('default', 'key');
  485. $this->assertEqual($data, $result);
  486. $result = unlink("{$path}/key");
  487. $this->assertTrue($result);
  488. $this->assertFalse(file_exists("{$path}/key"));
  489. }
  490. public function testIntegrationFileAdapterMultipleStrategies() {
  491. $resources = Libraries::get(true, 'resources');
  492. $path = "{$resources}/tmp/cache";
  493. $this->skipIf(!$this->_checkPath(), "{$path} does not have the proper permissions.");
  494. $config = array('default' => compact('path') + array(
  495. 'adapter' => 'File',
  496. 'filters' => array(),
  497. 'strategies' => array('Serializer', 'Base64')
  498. ));
  499. Cache::config($config);
  500. $data = array('some' => 'data');
  501. $result = Cache::write('default', 'key', $data, '+1 minute');
  502. $this->assertTrue($result);
  503. $time = time() + 60;
  504. $result = file_get_contents("{$path}/key");
  505. $expected = "{:expiry:$time}\nYToxOntzOjQ6InNvbWUiO3M6NDoiZGF0YSI7fQ==";
  506. $this->assertEqual($result, $expected);
  507. $result = Cache::read('default', 'key');
  508. $this->assertEqual($data, $result);
  509. $result = unlink("{$path}/key");
  510. $this->assertTrue($result);
  511. $this->assertFalse(file_exists("{$path}/key"));
  512. }
  513. }
  514. ?>