Path: blob/master/src/infrastructure/cache/__tests__/PhutilKeyValueCacheTestCase.php
12242 views
<?php12final class PhutilKeyValueCacheTestCase extends PhutilTestCase {34public function testInRequestCache() {5$cache = new PhutilInRequestKeyValueCache();6$this->doCacheTest($cache);7$cache->destroyCache();8}910public function testInRequestCacheLimit() {11$cache = new PhutilInRequestKeyValueCache();12$cache->setLimit(4);1314$cache->setKey(1, 1);15$cache->setKey(2, 2);16$cache->setKey(3, 3);17$cache->setKey(4, 4);1819$this->assertEqual(20array(211 => 1,222 => 2,233 => 3,244 => 4,25),26$cache->getAllKeys());272829$cache->setKey(5, 5);3031$this->assertEqual(32array(332 => 2,343 => 3,354 => 4,365 => 5,37),38$cache->getAllKeys());39}4041public function testOnDiskCache() {42$cache = new PhutilOnDiskKeyValueCache();43$cache->setCacheFile(new TempFile());44$this->doCacheTest($cache);45$cache->destroyCache();46}4748public function testAPCCache() {49$cache = new PhutilAPCKeyValueCache();50if (!$cache->isAvailable()) {51$this->assertSkipped(pht('Cache not available.'));52}53$this->doCacheTest($cache);54}5556public function testDirectoryCache() {57$cache = new PhutilDirectoryKeyValueCache();5859$dir = Filesystem::createTemporaryDirectory();60$cache->setCacheDirectory($dir);61$this->doCacheTest($cache);62$cache->destroyCache();63}6465public function testDirectoryCacheSpecialDirectoryRules() {66$cache = new PhutilDirectoryKeyValueCache();6768$dir = Filesystem::createTemporaryDirectory();69$dir = $dir.'/dircache/';70$cache->setCacheDirectory($dir);7172$cache->setKey('a', 1);73$this->assertEqual(true, Filesystem::pathExists($dir.'/a.cache'));7475$cache->setKey('a/b', 1);76$this->assertEqual(true, Filesystem::pathExists($dir.'/a/'));77$this->assertEqual(true, Filesystem::pathExists($dir.'/a/b.cache'));7879$cache->deleteKey('a/b');80$this->assertEqual(false, Filesystem::pathExists($dir.'/a/'));81$this->assertEqual(false, Filesystem::pathExists($dir.'/a/b.cache'));8283$cache->destroyCache();84$this->assertEqual(false, Filesystem::pathExists($dir));85}8687public function testNamespaceCache() {88$namespace = 'namespace'.mt_rand();89$in_request_cache = new PhutilInRequestKeyValueCache();90$cache = new PhutilKeyValueCacheNamespace($in_request_cache);91$cache->setNamespace($namespace);9293$test_info = get_class($cache);94$keys = array(95'key1' => mt_rand(),96'key2' => '',97'key3' => 'Phabricator',98);99$cache->setKeys($keys);100$cached_keys = $in_request_cache->getAllKeys();101102foreach ($keys as $key => $value) {103$cached_key = $namespace.':'.$key;104105$this->assertTrue(106isset($cached_keys[$cached_key]),107$test_info);108109$this->assertEqual(110$value,111$cached_keys[$cached_key],112$test_info);113}114115$cache->destroyCache();116117$this->doCacheTest($cache);118$cache->destroyCache();119}120121public function testCacheStack() {122$req_cache = new PhutilInRequestKeyValueCache();123$disk_cache = new PhutilOnDiskKeyValueCache();124$disk_cache->setCacheFile(new TempFile());125$apc_cache = new PhutilAPCKeyValueCache();126127$stack = array(128$req_cache,129$disk_cache,130);131132if ($apc_cache->isAvailable()) {133$stack[] = $apc_cache;134}135136$cache = new PhutilKeyValueCacheStack();137$cache->setCaches($stack);138139$this->doCacheTest($cache);140141$disk_cache->destroyCache();142$req_cache->destroyCache();143}144145private function doCacheTest(PhutilKeyValueCache $cache) {146$key1 = 'test:'.mt_rand();147$key2 = 'test:'.mt_rand();148149$default = 'cache-miss';150$value1 = 'cache-hit1';151$value2 = 'cache-hit2';152153$test_info = get_class($cache);154155// Test that we miss correctly on missing values.156157$this->assertEqual(158$default,159$cache->getKey($key1, $default),160$test_info);161$this->assertEqual(162array(163),164$cache->getKeys(array($key1, $key2)),165$test_info);166167168// Test that we can set individual keys.169170$cache->setKey($key1, $value1);171$this->assertEqual(172$value1,173$cache->getKey($key1, $default),174$test_info);175$this->assertEqual(176array(177$key1 => $value1,178),179$cache->getKeys(array($key1, $key2)),180$test_info);181182183// Test that we can delete individual keys.184185$cache->deleteKey($key1);186187$this->assertEqual(188$default,189$cache->getKey($key1, $default),190$test_info);191$this->assertEqual(192array(193),194$cache->getKeys(array($key1, $key2)),195$test_info);196197198199// Test that we can set multiple keys.200201$cache->setKeys(202array(203$key1 => $value1,204$key2 => $value2,205));206207$this->assertEqual(208$value1,209$cache->getKey($key1, $default),210$test_info);211$this->assertEqual(212array(213$key1 => $value1,214$key2 => $value2,215),216$cache->getKeys(array($key1, $key2)),217$test_info);218219220// Test that we can delete multiple keys.221222$cache->deleteKeys(array($key1, $key2));223224$this->assertEqual(225$default,226$cache->getKey($key1, $default),227$test_info);228$this->assertEqual(229array(230),231$cache->getKeys(array($key1, $key2)),232$test_info);233234235// NOTE: The TTL tests are necessarily slow (we must sleep() through the236// TTLs) and do not work with APC (it does not TTL until the next request)237// so they're disabled by default. If you're developing the cache stack,238// it may be useful to run them.239240return;241242// Test that keys expire when they TTL.243244$cache->setKey($key1, $value1, 1);245$cache->setKey($key2, $value2, 5);246247$this->assertEqual($value1, $cache->getKey($key1, $default));248$this->assertEqual($value2, $cache->getKey($key2, $default));249250sleep(2);251252$this->assertEqual($default, $cache->getKey($key1, $default));253$this->assertEqual($value2, $cache->getKey($key2, $default));254255256// Test that setting a 0 TTL overwrites a nonzero TTL.257258$cache->setKey($key1, $value1, 1);259$this->assertEqual($value1, $cache->getKey($key1, $default));260$cache->setKey($key1, $value1, 0);261$this->assertEqual($value1, $cache->getKey($key1, $default));262sleep(2);263$this->assertEqual($value1, $cache->getKey($key1, $default));264}265266}267268269