2 /***************************************************************
5 * (c) 2009 Ingo Renner <ingo@typo3.org>
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
17 * This script is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * This copyright notice MUST APPEAR in all copies of the script!
23 ***************************************************************/
26 // TODO implement autoloading so that we only require stuff we really need
27 require_once(PATH_t3lib
. 'class.t3lib_cache.php');
29 require_once(PATH_t3lib
. 'cache/backend/interfaces/interface.t3lib_cache_backend_backend.php');
30 require_once(PATH_t3lib
. 'cache/frontend/interfaces/interface.t3lib_cache_frontend_frontend.php');
32 require_once(PATH_t3lib
. 'cache/backend/class.t3lib_cache_backend_abstractbackend.php');
33 require_once(PATH_t3lib
. 'cache/frontend/class.t3lib_cache_frontend_abstractfrontend.php');
34 require_once(PATH_t3lib
. 'cache/class.t3lib_cache_exception.php');
35 require_once(PATH_t3lib
. 'cache/class.t3lib_cache_factory.php');
36 require_once(PATH_t3lib
. 'cache/class.t3lib_cache_manager.php');
37 require_once(PATH_t3lib
. 'cache/frontend/class.t3lib_cache_frontend_variablefrontend.php');
39 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_classalreadyloaded.php');
40 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_duplicateidentifier.php');
41 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_invalidbackend.php');
42 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_invalidcache.php');
43 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_invaliddata.php');
44 require_once(PATH_t3lib
. 'cache/exception/class.t3lib_cache_exception_nosuchcache.php');
46 require_once(PATH_t3lib
. 'cache/backend/class.t3lib_cache_backend_filebackend.php');
49 * Testcase for the Fsile cache backend
51 * This file is a backport from FLOW3
53 * @author Ingo Renner <ingo@typo3.org>
58 class t3lib_cache_backend_FileBackendTestCase
extends tx_phpunit_testcase
{
61 * If set, the tearDown() method will clean up the cache subdirectory used by this unit test.
63 * @var t3lib_cache_backend_FileBackend
67 protected $testingCacheDirectory;
70 * Sets up this testcase
74 public function setUp() {
75 $this->testingCacheDirectory
= 'typo3temp/cache/testing/';
77 $this->backend
= t3lib_div
::makeInstance(
78 't3lib_cache_backend_FileBackend',
79 array('cacheDirectory' => $this->testingCacheDirectory
)
85 * @author Robert Lemke <robert@typo3.org>
86 * @author Ingo Renner <ingo@typo3.org>
88 public function defaultCacheDirectoryIsWritable() {
89 $cacheDirectory = $this->backend
->getCacheDirectory();
91 $this->assertTrue(is_writable($cacheDirectory), 'The default cache directory "' . $cacheDirectory . '" is not writable.');
96 * @author Robert Lemke <robert@typo3.org>
97 * @expectedException t3lib_cache_Exception
99 public function setCacheDirectoryThrowsExceptionOnNonWritableDirectory() {
100 if (DIRECTORY_SEPARATOR
== '\\') {
101 $this->markTestSkipped('test not reliable in Windows environment');
103 $directoryName = '/sbin';
105 $this->backend
->setCacheDirectory($directoryName);
110 * @author Robert Lemke <robert@typo3.org>
111 * @author Ingo Renner <ingo@typo3.org>
113 public function getCacheDirectoryReturnsThePreviouslySetDirectory() {
114 $directory = $this->testingCacheDirectory
;
115 $fullPathToDirectory = t3lib_div
::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $directory;
117 $this->backend
->setCacheDirectory($directory);
118 $this->assertEquals($fullPathToDirectory, $this->backend
->getCacheDirectory(), 'getDirectory() did not return the expected value.');
123 * @author Robert Lemke <robert@typo3.org>
124 * @author Ingo Renner <ingo@typo3.org>
125 * @expectedException t3lib_cache_exception_InvalidData
127 public function setThrowsExceptionIfDataIsNotAString() {
128 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
129 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
135 $data = array('Some data');
136 $entryIdentifier = 'BackendFileTest';
138 $this->backend
->setCache($cache);
140 $this->backend
->set($entryIdentifier, $data);
145 * @author Robert Lemke <robert@typo3.org>
146 * @author Ingo Renner <ingo@typo3.org>
148 public function setReallySavesToTheSpecifiedDirectory() {
149 $cacheIdentifier = 'UnitTestCache';
150 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
151 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
157 $cache->expects($this->atLeastOnce())
158 ->method('getIdentifier')
159 ->will($this->returnValue($cacheIdentifier));
161 $data = 'some data' . microtime();
162 $entryIdentifier = 'BackendFileTest';
163 $entryIdentifierHash = sha1($entryIdentifier);
165 $this->backend
->setCache($cache);
166 $this->backend
->set($entryIdentifier, $data);
168 $cacheDirectory = $this->backend
->getCacheDirectory();
169 $pattern = $cacheDirectory
171 . $cacheIdentifier . '/'
172 . $entryIdentifierHash[0] . '/'
173 . $entryIdentifierHash[1] . '/'
174 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_GLOB
175 . t3lib_cache_backend_FileBackend
::SEPARATOR
177 $filesFound = glob($pattern);
178 $this->assertTrue(is_array($filesFound), 'filesFound was no array.');
180 $retrievedData = file_get_contents(array_pop($filesFound));
184 'The original and the retrieved data don\'t match.'
190 * @author Robert Lemke <robert@typo3.org>
191 * @author Ingo Renner <ingo@typo3.org>
193 public function setRemovesAnAlreadyExistingCacheEntryForTheSameIdentifier() {
194 $cacheIdentifier = 'UnitTestCache';
195 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
196 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
201 $cache->expects($this->atLeastOnce())
202 ->method('getIdentifier')
203 ->will($this->returnValue($cacheIdentifier));
205 $data1 = 'some data' . microtime();
206 $data2 = 'some data' . microtime();
207 $entryIdentifier = 'BackendFileRemoveBeforeSetTest';
208 $entryIdentifierHash = sha1($entryIdentifier);
210 $this->backend
->setCache($cache);
211 $this->backend
->set($entryIdentifier, $data1, array(), 500);
212 // setting a second entry with the same identifier, but different
213 // data, this should _replace_ the existing one we set before
214 $this->backend
->set($entryIdentifier, $data2, array(), 200);
216 $cacheDirectory = $this->backend
->getCacheDirectory();
217 $pattern = $cacheDirectory
219 . $cacheIdentifier . '/'
220 . $entryIdentifierHash[0] . '/'
221 . $entryIdentifierHash[1] . '/'
222 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_GLOB
223 . t3lib_cache_backend_FileBackend
::SEPARATOR
225 $filesFound = glob($pattern);
226 $this->assertEquals(1, count($filesFound), 'There was not exactly one cache entry.');
231 * @author Robert Lemke <robert@typo3.org>
232 * @author Ingo Renner <ingo@typo3.org>
234 public function setReallySavesSpecifiedTags() {
235 $cacheIdentifier = 'UnitTestCache';
236 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
237 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
242 $cache->expects($this->atLeastOnce())
243 ->method('getIdentifier')
244 ->will($this->returnValue($cacheIdentifier));
246 $data = 'some data' . microtime();
247 $entryIdentifier = 'BackendFileTest';
248 $entryIdentifierHash = sha1($entryIdentifier);
250 $this->backend
->setCache($cache);
251 $tagsDirectory = $this->backend
->getCacheDirectory() . 'tags/';
253 $this->backend
->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
255 $this->assertTrue(is_dir($tagsDirectory . 'UnitTestTag%tag1'), 'Tag directory UnitTestTag%tag1 does not exist.');
256 $this->assertTrue(is_dir($tagsDirectory . 'UnitTestTag%tag2'), 'Tag directory UnitTestTag%tag2 does not exist.');
258 $filename = $tagsDirectory . 'UnitTestTag%tag1/' . $cacheIdentifier . t3lib_cache_backend_FileBackend
::SEPARATOR
. $entryIdentifier;
259 $this->assertTrue(file_exists($filename), 'File "' . $filename . '" does not exist.');
261 $filename = $tagsDirectory . 'UnitTestTag%tag2/' . $cacheIdentifier . t3lib_cache_backend_FileBackend
::SEPARATOR
. $entryIdentifier;
262 $this->assertTrue(file_exists($filename), 'File "' . $filename . '" does not exist.');
267 * @author Robert Lemke <robert@typo3.org>
268 * @author Ingo Renner <ingo@typo3.org>
270 public function getReturnsContentOfTheCorrectCacheFile() {
271 $cacheIdentifier = 'UnitTestCache';
272 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
273 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
278 $cache->expects($this->atLeastOnce())
279 ->method('getIdentifier')
280 ->will($this->returnValue($cacheIdentifier));
282 $this->backend
->setCache($cache);
284 $entryIdentifier = 'BackendFileTest';
286 $data = 'some data' . microtime();
287 $this->backend
->set($entryIdentifier, $data, array(), 500);
289 $data = 'some other data' . microtime();
290 $this->backend
->set($entryIdentifier, $data, array(), 100);
292 $loadedData = $this->backend
->get($entryIdentifier);
294 $this->assertEquals($data, $loadedData, 'The original and the retrieved data don\'t match.');
299 * @author Robert Lemke <robert@typo3.org>
300 * @author Ingo Renner <ingo@typo3.org>
302 public function hasReturnsTheCorrectResult() {
303 $cacheIdentifier = 'UnitTestCache';
304 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
305 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
310 $cache->expects($this->atLeastOnce())
311 ->method('getIdentifier')
312 ->will($this->returnValue($cacheIdentifier));
314 $this->backend
->setCache($cache);
316 $entryIdentifier = 'BackendFileTest';
318 $data = 'some data' . microtime();
319 $this->backend
->set($entryIdentifier, $data);
321 $this->assertTrue($this->backend
->has($entryIdentifier), 'has() did not return TRUE.');
322 $this->assertFalse($this->backend
->has($entryIdentifier . 'Not'), 'has() did not return FALSE.');
327 * @author Robert Lemke <robert@typo3.org>
328 * @author Ingo Renner <ingo@typo3.org>
330 public function removeReallyRemovesACacheEntry() {
331 $cacheIdentifier = 'UnitTestCache';
332 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
333 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
338 $cache->expects($this->atLeastOnce())
339 ->method('getIdentifier')
340 ->will($this->returnValue($cacheIdentifier));
342 $data = 'some data' . microtime();
343 $entryIdentifier = 'BackendFileRemovalTest';
344 $entryIdentifierHash = sha1($entryIdentifier);
346 $cacheDirectory = $this->backend
->getCacheDirectory();
347 $this->backend
->setCache($cache);
349 $pattern = $cacheDirectory
351 . $cacheIdentifier . '/'
352 . $entryIdentifierHash[0] . '/'
353 . $entryIdentifierHash[1] . '/'
354 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_GLOB
355 . t3lib_cache_backend_FileBackend
::SEPARATOR
357 $this->backend
->set($entryIdentifier, $data);
358 $filesFound = glob($pattern);
359 $this->assertTrue(is_array($filesFound) && count($filesFound) > 0, 'The cache entry does not exist.');
361 $this->backend
->remove($entryIdentifier);
362 $filesFound = glob($pattern);
363 $this->assertTrue(count($filesFound) == 0, 'The cache entry still exists.');
368 * @author Robert Lemke <robert@typo3.org>
369 * @author Karsten Dambekalns <karsten@typo3.org>
370 * @author Ingo Renner <ingo@typo3.org>
372 public function collectGarbageReallyRemovesAnExpiredCacheEntry() {
373 $cacheIdentifier = 'UnitTestCache';
374 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
375 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
380 $cache->expects($this->atLeastOnce())
381 ->method('getIdentifier')
382 ->will($this->returnValue($cacheIdentifier));
384 $data = 'some data' . microtime();
385 $entryIdentifier = 'BackendFileRemovalTest';
386 $entryIdentifierHash = sha1($entryIdentifier);
388 $cacheDirectory = $this->backend
->getCacheDirectory();
389 $this->backend
->setCache($cache);
391 $pattern = $cacheDirectory
393 . $cacheIdentifier . '/'
394 . $entryIdentifierHash[0] . '/'
395 . $entryIdentifierHash[1] . '/'
396 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_GLOB
397 . t3lib_cache_backend_FileBackend
::SEPARATOR
400 $this->backend
->set($entryIdentifier, $data, array(), 1);
401 $filesFound = glob($pattern);
402 $this->assertTrue(is_array($filesFound) && count($filesFound) > 0, 'The cache entry does not exist.');
406 $this->backend
->collectGarbage($entryIdentifier);
407 $filesFound = glob($pattern);
408 $this->assertTrue(count($filesFound) == 0, 'The cache entry still exists.');
413 * @author Robert Lemke <robert@typo3.org>
414 * @author Karsten Dambekalns <karsten@typo3.org>
415 * @author Ingo Renner <ingo@typo3.org>
417 public function collectGarbageReallyRemovesAllExpiredCacheEntries() {
418 $cacheIdentifier = 'UnitTestCache';
419 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
420 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
425 $cache->expects($this->atLeastOnce())
426 ->method('getIdentifier')
427 ->will($this->returnValue($cacheIdentifier));
429 $data = 'some data' . microtime();
430 $entryIdentifier = 'BackendFileRemovalTest';
432 $cacheDirectory = $this->backend
->getCacheDirectory();
433 $this->backend
->setCache($cache);
435 $pattern = $cacheDirectory
437 . $cacheIdentifier . '/*/*/'
438 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_GLOB
439 . t3lib_cache_backend_FileBackend
::SEPARATOR
443 $this->backend
->set($entryIdentifier . 'A', $data, array(), 1);
444 $this->backend
->set($entryIdentifier . 'B', $data, array(), 1);
445 $this->backend
->set($entryIdentifier . 'C', $data, array(), 1);
446 $filesFound = glob($pattern);
447 $this->assertTrue(is_array($filesFound) && count($filesFound) > 0, 'The cache entries do not exist.');
451 $this->backend
->collectGarbage();
452 $filesFound = glob($pattern);
453 $this->assertTrue(count($filesFound) == 0, 'The cache entries still exist.');
458 * @author Robert Lemke <robert@typo3.org>
459 * @author Ingo Renner <ingo@typo3.org>
461 public function removeReallyRemovesTagsOfRemovedEntry() {
462 $cacheIdentifier = 'UnitTestCache';
463 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
464 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
469 $cache->expects($this->atLeastOnce())
470 ->method('getIdentifier')
471 ->will($this->returnValue($cacheIdentifier));
473 $data = 'some data' . microtime();
474 $entryIdentifier = 'BackendFileTest';
476 $this->backend
->setCache($cache);
478 $tagsDirectory = $this->backend
->getCacheDirectory() . 'tags/';
480 $this->backend
->set($entryIdentifier, $data, array('UnitTestTag%tag1', 'UnitTestTag%tag2'));
481 $this->backend
->remove($entryIdentifier);
483 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%tag1/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%tag1/' . $entryIdentifier . '" still exists.');
484 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%tag2/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%tag2/' . $entryIdentifier . '" still exists.');
489 * @author Robert Lemke <robert@typo3.org>
490 * @author Ingo Renner <ingo@typo3.org>
492 public function findIdentifiersByTagFindsCacheEntriesWithSpecifiedTag() {
493 $cacheIdentifier = 'UnitTestCache';
494 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
495 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
500 $cache->expects($this->atLeastOnce())
501 ->method('getIdentifier')
502 ->will($this->returnValue($cacheIdentifier));
504 $this->backend
->setCache($cache);
506 $data = 'some data' . microtime();
507 $this->backend
->set('BackendFileTest1', $data, array('UnitTestTag%test', 'UnitTestTag%boring'));
508 $this->backend
->set('BackendFileTest2', $data, array('UnitTestTag%test', 'UnitTestTag%special'));
509 $this->backend
->set('BackendFileTest3', $data, array('UnitTestTag%test'));
511 $expectedEntry = 'BackendFileTest2';
513 $actualEntries = $this->backend
->findIdentifiersByTag('UnitTestTag%special');
514 $this->assertTrue(is_array($actualEntries), 'actualEntries is not an array.');
516 $this->assertEquals($expectedEntry, array_pop($actualEntries));
521 * @author Robert Lemke <robert@typo3.org>
522 * @author Ingo Renner <ingo@typo3.org>
524 public function flushRemovesAllCacheEntriesAndRelatedTags() {
525 $cacheIdentifier = 'UnitTestCache';
526 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
527 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
532 $cache->expects($this->atLeastOnce())
533 ->method('getIdentifier')
534 ->will($this->returnValue($cacheIdentifier));
536 $this->backend
->setCache($cache);
538 $tagsDirectory = $this->backend
->getCacheDirectory() . 'tags/';
539 $cacheDirectory = $this->backend
->getCacheDirectory() . 'data/' . $cacheIdentifier . '/';
541 $data = 'some data' . microtime();
542 $this->backend
->set('BackendFileTest1', $data, array('UnitTestTag%test'));
543 $this->backend
->set('BackendFileTest2', $data, array('UnitTestTag%test', 'UnitTestTag%special'));
544 $this->backend
->set('BackendFileTest3', $data, array('UnitTestTag%test'));
546 $this->backend
->flush();
548 $pattern = $cacheDirectory . '*/*/*';
549 $filesFound = glob($pattern);
550 $this->assertTrue(count($filesFound) == 0, 'Still files in the cache directory');
552 $entryIdentifier = 'BackendFileTest1';
553 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier . '" still exists.');
554 $entryIdentifier = 'BackendFileTest2';
555 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier . '" still exists.');
556 $entryIdentifier = 'BackendFileTest3';
557 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%test/' . $entryIdentifier . '" still exists.');
558 $this->assertTrue(!file_exists($tagsDirectory . 'UnitTestTag%special/' . $entryIdentifier), 'File "' . $tagsDirectory . 'UnitTestTag%special/' . $entryIdentifier . '" still exists.');
563 * @author Robert Lemke <robert@typo3.org>
564 * @author Ingo Renner <ingo@typo3.org>
566 public function flushByTagRemovesCacheEntriesWithSpecifiedTag() {
567 $cacheIdentifier = 'UnitTestCache';
568 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
569 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
574 $cache->expects($this->atLeastOnce())
575 ->method('getIdentifier')
576 ->will($this->returnValue($cacheIdentifier));
578 $this->backend
->setCache($cache);
580 $data = 'some data' . microtime();
581 $this->backend
->set('BackendFileTest1', $data, array('UnitTestTag%test', 'UnitTestTag%boring'));
582 $this->backend
->set('BackendFileTest2', $data, array('UnitTestTag%test', 'UnitTestTag%special'));
583 $this->backend
->set('BackendFileTest3', $data, array('UnitTestTag%test'));
585 $this->backend
->flushByTag('UnitTestTag%special');
587 $this->assertTrue($this->backend
->has('BackendFileTest1'), 'BackendFileTest1');
588 $this->assertFalse($this->backend
->has('BackendFileTest2'), 'BackendFileTest2');
589 $this->assertTrue($this->backend
->has('BackendFileTest3'), 'BackendFileTest3');
595 * @author Robert Lemke <robert@typo3.org>
596 * @author Karsten Dambekalns <karsten@typo3.org>
597 * @author Ingo Renner <ingo@typo3.org>
599 public function hasReturnsTheCorrectResultForEntryWithExceededLifetime() {
600 $cacheIdentifier = 'UnitTestCache';
601 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
602 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
607 $cache->expects($this->atLeastOnce())
608 ->method('getIdentifier')
609 ->will($this->returnValue($cacheIdentifier));
611 $this->backend
->setCache($cache);
613 $entryIdentifier = 'BackendFileTest';
614 $data = 'some data' . microtime();
615 $this->backend
->set($entryIdentifier, $data);
617 $expiredEntryIdentifier = 'ExpiredBackendFileTest';
618 $expiredData = 'some old data' . microtime();
619 $this->backend
->set($expiredEntryIdentifier, $expiredData, array(), 1);
623 $this->assertFalse($this->backend
->has($expiredEntryIdentifier), 'has() did not return FALSE.');
628 * @author Karsten Dambekalns <karsten@typo3.org>
629 * @author Ingo Renner <ingo@typo3.org>
631 public function getReturnsFalseForEntryWithExceededLifetime() {
632 $cacheIdentifier = 'UnitTestCache';
633 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
634 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
639 $cache->expects($this->atLeastOnce())
640 ->method('getIdentifier')
641 ->will($this->returnValue($cacheIdentifier));
643 $this->backend
->setCache($cache);
645 $entryIdentifier = 'BackendFileTest';
646 $data = 'some data' . microtime();
647 $this->backend
->set($entryIdentifier, $data);
649 $expiredEntryIdentifier = 'ExpiredBackendFileTest';
650 $expiredData = 'some old data' . microtime();
651 $this->backend
->set($expiredEntryIdentifier, $expiredData, array(), 1);
655 $this->assertEquals($data, $this->backend
->get($entryIdentifier), 'The original and the retrieved data don\'t match.');
656 $this->assertFalse($this->backend
->get($expiredEntryIdentifier), 'The expired entry could be loaded.');
661 * @author Karsten Dambekalns <karsten@typo3.org>
662 * @author Ingo Renner <ingo@typo3.org>
664 public function findIdentifiersByTagReturnsEmptyArrayForEntryWithExceededLifetime() {
665 $cacheIdentifier = 'UnitTestCache';
666 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
667 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
672 $cache->expects($this->atLeastOnce())
673 ->method('getIdentifier')
674 ->will($this->returnValue($cacheIdentifier));
676 $this->backend
->setCache($cache);
678 $this->backend
->set('BackendFileTest', 'some data', array('UnitTestTag%special'), 1);
682 $this->assertEquals(array(), $this->backend
->findIdentifiersByTag('UnitTestTag%special'));
687 * @author Robert Lemke <robert@typo3.org>
688 * @author Karsten Dambekalns <karsten@typo3.org>
689 * @author Ingo Renner <ingo@typo3.org>
691 public function setWithUnlimitedLifetimeWritesCorrectEntry() {
692 $cacheIdentifier = 'UnitTestCache';
693 $cache = $this->getMock('t3lib_cache_frontend_AbstractFrontend',
694 array('getIdentifier', 'set', 'get', 'getByTag', 'has', 'remove'),
699 $cache->expects($this->atLeastOnce())
700 ->method('getIdentifier')
701 ->will($this->returnValue($cacheIdentifier));
703 $data = 'some data' . microtime();
704 $entryIdentifier = 'BackendFileTest';
705 $entryIdentifierHash = sha1($entryIdentifier);
707 $this->backend
->setCache($cache);
708 $this->backend
->set($entryIdentifier, $data, array(), 0);
710 $cacheDirectory = $this->backend
->getCacheDirectory();
712 $pattern = $cacheDirectory
714 . $cacheIdentifier . '/'
715 . $entryIdentifierHash[0] . '/'
716 . $entryIdentifierHash[1] . '/'
717 . t3lib_cache_backend_FileBackend
::FILENAME_EXPIRYTIME_UNLIMITED
718 . t3lib_cache_backend_FileBackend
::SEPARATOR
721 $filesFound = glob($pattern);
722 $this->assertTrue(is_array($filesFound), 'filesFound was no array.');
724 $retrievedData = file_get_contents(array_pop($filesFound));
725 $this->assertEquals($data, $retrievedData, 'The original and the retrieved data don\'t match.');
730 * @author Robert Lemke <robert@typo3.org>
731 * @author Ingo Renner <ingo@typo3.org>
733 public function tearDown() {
734 if (is_object($this->backend
)) {
735 $directory = $this->backend
->getCacheDirectory();
736 if (is_dir($directory)) {
737 t3lib_div
::rmdir($directory, true);