MemcachedEngineTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. <?php
  2. /**
  3. * PHP 5
  4. *
  5. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  6. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  7. *
  8. * Licensed under The MIT License
  9. * For full copyright and license information, please see the LICENSE.txt
  10. * Redistributions of files must retain the above copyright notice
  11. *
  12. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  13. * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  14. * @since CakePHP(tm) v 2.5.0
  15. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  16. */
  17. namespace Cake\Test\TestCase\Cache\Engine;
  18. use Cake\Cache\Cache;
  19. use Cake\Cache\Engine\MemcachedEngine;
  20. use Cake\Core\Configure;
  21. use Cake\TestSuite\TestCase;
  22. use \Memcached;
  23. /**
  24. * Class TestMemcachedEngine
  25. *
  26. */
  27. class TestMemcachedEngine extends MemcachedEngine {
  28. /**
  29. * public accessor to _parseServerString
  30. *
  31. * @param string $server
  32. * @return array
  33. */
  34. public function parseServerString($server) {
  35. return $this->_parseServerString($server);
  36. }
  37. public function setMemcached($memcached) {
  38. $this->_Memcached = $memcached;
  39. }
  40. public function getMemcached() {
  41. return $this->_Memcached;
  42. }
  43. }
  44. /**
  45. * MemcachedEngineTest class
  46. *
  47. */
  48. class MemcachedEngineTest extends TestCase {
  49. /**
  50. * setUp method
  51. *
  52. * @return void
  53. */
  54. public function setUp() {
  55. parent::setUp();
  56. $this->skipIf(!class_exists('Memcached'), 'Memcached is not installed or configured properly.');
  57. $this->_configCache();
  58. }
  59. /**
  60. * Helper method for testing.
  61. *
  62. * @return void
  63. */
  64. protected function _configCache($config = []) {
  65. $defaults = [
  66. 'className' => 'Memcached',
  67. 'prefix' => 'cake_',
  68. 'duration' => 3600
  69. ];
  70. Cache::drop('memcached');
  71. Cache::config('memcached', array_merge($defaults, $config));
  72. }
  73. /**
  74. * tearDown method
  75. *
  76. * @return void
  77. */
  78. public function tearDown() {
  79. parent::tearDown();
  80. Cache::drop('memcached');
  81. Cache::drop('memcached2');
  82. Cache::drop('memcached_groups');
  83. Cache::drop('memcached_helper');
  84. Cache::drop('compressed_memcached');
  85. Cache::drop('long_memcached');
  86. Cache::drop('short_memcached');
  87. }
  88. /**
  89. * testConfig method
  90. *
  91. * @return void
  92. */
  93. public function testConfig() {
  94. $config = Cache::engine('memcached')->config();
  95. unset($config['path']);
  96. $expecting = array(
  97. 'prefix' => 'cake_',
  98. 'duration' => 3600,
  99. 'probability' => 100,
  100. 'servers' => array('127.0.0.1'),
  101. 'persistent' => false,
  102. 'compress' => false,
  103. 'login' => null,
  104. 'password' => null,
  105. 'groups' => array(),
  106. 'serialize' => 'php'
  107. );
  108. $this->assertEquals($expecting, $config);
  109. }
  110. /**
  111. * testCompressionSetting method
  112. *
  113. * @return void
  114. */
  115. public function testCompressionSetting() {
  116. $Memcached = new TestMemcachedEngine();
  117. $Memcached->init(array(
  118. 'engine' => 'Memcached',
  119. 'servers' => array('127.0.0.1:11211'),
  120. 'compress' => false
  121. ));
  122. $this->assertFalse($Memcached->getMemcached()->getOption(\Memcached::OPT_COMPRESSION));
  123. $MemcachedCompressed = new TestMemcachedEngine();
  124. $MemcachedCompressed->init(array(
  125. 'engine' => 'Memcached',
  126. 'servers' => array('127.0.0.1:11211'),
  127. 'compress' => true
  128. ));
  129. $this->assertTrue($MemcachedCompressed->getMemcached()->getOption(\Memcached::OPT_COMPRESSION));
  130. }
  131. /**
  132. * test accepts only valid serializer engine
  133. *
  134. * @return void
  135. */
  136. public function testInvalidSerializerSetting() {
  137. $Memcached = new TestMemcachedEngine();
  138. $config = array(
  139. 'className' => 'Memcached',
  140. 'servers' => array('127.0.0.1:11211'),
  141. 'persistent' => false,
  142. 'serialize' => 'invalid_serializer'
  143. );
  144. $this->setExpectedException(
  145. 'Cake\Error\Exception', 'invalid_serializer is not a valid serializer engine for Memcached'
  146. );
  147. $Memcached->init($config);
  148. }
  149. /**
  150. * testPhpSerializerSetting method
  151. *
  152. * @return void
  153. */
  154. public function testPhpSerializerSetting() {
  155. $Memcached = new TestMemcachedEngine();
  156. $config = array(
  157. 'className' => 'Memcached',
  158. 'servers' => array('127.0.0.1:11211'),
  159. 'persistent' => false,
  160. 'serialize' => 'php'
  161. );
  162. $Memcached->init($config);
  163. $this->assertEquals(Memcached::SERIALIZER_PHP, $Memcached->getMemcached()->getOption(Memcached::OPT_SERIALIZER));
  164. }
  165. /**
  166. * testJsonSerializerSetting method
  167. *
  168. * @return void
  169. */
  170. public function testJsonSerializerSetting() {
  171. $this->skipIf(
  172. !Memcached::HAVE_JSON,
  173. 'Memcached extension is not compiled with json support'
  174. );
  175. $Memcached = new TestMemcachedEngine();
  176. $config = array(
  177. 'engine' => 'Memcached',
  178. 'servers' => array('127.0.0.1:11211'),
  179. 'persistent' => false,
  180. 'serialize' => 'json'
  181. );
  182. $Memcached->init($config);
  183. $this->assertEquals(Memcached::SERIALIZER_JSON, $Memcached->getMemcached()->getOption(Memcached::OPT_SERIALIZER));
  184. }
  185. /**
  186. * testIgbinarySerializerSetting method
  187. *
  188. * @return void
  189. */
  190. public function testIgbinarySerializerSetting() {
  191. $this->skipIf(
  192. !Memcached::HAVE_IGBINARY,
  193. 'Memcached extension is not compiled with igbinary support'
  194. );
  195. $Memcached = new TestMemcachedEngine();
  196. $config = array(
  197. 'engine' => 'Memcached',
  198. 'servers' => array('127.0.0.1:11211'),
  199. 'persistent' => false,
  200. 'serialize' => 'igbinary'
  201. );
  202. $Memcached->init($config);
  203. $this->assertEquals(Memcached::SERIALIZER_IGBINARY, $Memcached->getMemcached()->getOption(Memcached::OPT_SERIALIZER));
  204. }
  205. /**
  206. * testMsgpackSerializerSetting method
  207. *
  208. * @return void
  209. */
  210. public function testMsgpackSerializerSetting() {
  211. $this->skipIf(
  212. !defined('Memcached::HAVE_MSGPACK') || !Memcached::HAVE_MSGPACK,
  213. 'Memcached extension is not compiled with msgpack support'
  214. );
  215. $Memcached = new TestMemcachedEngine();
  216. $settings = array(
  217. 'engine' => 'Memcached',
  218. 'servers' => array('127.0.0.1:11211'),
  219. 'persistent' => false,
  220. 'serialize' => 'msgpack'
  221. );
  222. $Memcached->init($settings);
  223. $this->assertEquals(Memcached::SERIALIZER_MSGPACK, $Memcached->getMemcached()->getOption(Memcached::OPT_SERIALIZER));
  224. }
  225. /**
  226. * testJsonSerializerThrowException method
  227. *
  228. * @return void
  229. */
  230. public function testJsonSerializerThrowException() {
  231. $this->skipIf(
  232. Memcached::HAVE_JSON,
  233. 'Memcached extension is compiled with json support'
  234. );
  235. $Memcached = new TestMemcachedEngine();
  236. $config = array(
  237. 'className' => 'Memcached',
  238. 'servers' => array('127.0.0.1:11211'),
  239. 'persistent' => false,
  240. 'serialize' => 'json'
  241. );
  242. $this->setExpectedException(
  243. 'Cake\Error\Exception', 'Memcached extension is not compiled with json support'
  244. );
  245. $Memcached->init($config);
  246. }
  247. /**
  248. * testMsgpackSerializerThrowException method
  249. *
  250. * @return void
  251. */
  252. public function testMsgpackSerializerThrowException() {
  253. $this->skipIf(
  254. defined('Memcached::HAVE_MSGPACK') && Memcached::HAVE_MSGPACK,
  255. 'Memcached extension is compiled with msgpack support'
  256. );
  257. $Memcached = new TestMemcachedEngine();
  258. $settings = array(
  259. 'engine' => 'Memcached',
  260. 'servers' => array('127.0.0.1:11211'),
  261. 'persistent' => false,
  262. 'serialize' => 'msgpack'
  263. );
  264. $this->setExpectedException(
  265. 'Cake\Error\Exception', 'msgpack is not a valid serializer engine for Memcached'
  266. );
  267. $Memcached->init($settings);
  268. }
  269. /**
  270. * testIgbinarySerializerThrowException method
  271. *
  272. * @return void
  273. */
  274. public function testIgbinarySerializerThrowException() {
  275. $this->skipIf(
  276. Memcached::HAVE_IGBINARY,
  277. 'Memcached extension is compiled with igbinary support'
  278. );
  279. $Memcached = new TestMemcachedEngine();
  280. $config = array(
  281. 'engine' => 'Memcached',
  282. 'servers' => array('127.0.0.1:11211'),
  283. 'persistent' => false,
  284. 'serialize' => 'igbinary'
  285. );
  286. $this->setExpectedException(
  287. 'Cake\Error\Exception', 'Memcached extension is not compiled with igbinary support'
  288. );
  289. $Memcached->init($config);
  290. }
  291. /**
  292. * test using authentication without memcached installed with SASL support
  293. * throw an exception
  294. *
  295. * @return void
  296. */
  297. public function testSaslAuthException() {
  298. $Memcached = new TestMemcachedEngine();
  299. $config = array(
  300. 'engine' => 'Memcached',
  301. 'servers' => array('127.0.0.1:11211'),
  302. 'persistent' => false,
  303. 'login' => 'test',
  304. 'password' => 'password'
  305. );
  306. $this->skipIf(
  307. method_exists($Memcached->getMemcached(), 'setSaslAuthData'),
  308. 'Memcached extension is installed with SASL support'
  309. );
  310. $this->setExpectedException(
  311. 'Cake\Error\Exception', 'Memcached extension is not build with SASL support'
  312. );
  313. $Memcached->init($config);
  314. }
  315. /**
  316. * testConfig method
  317. *
  318. * @return void
  319. */
  320. public function testMultipleServers() {
  321. $servers = array('127.0.0.1:11211', '127.0.0.1:11222');
  322. $available = true;
  323. $Memcached = new \Memcached();
  324. foreach ($servers as $server) {
  325. list($host, $port) = explode(':', $server);
  326. //@codingStandardsIgnoreStart
  327. if (!$Memcached->addServer($host, $port)) {
  328. $available = false;
  329. }
  330. //@codingStandardsIgnoreEnd
  331. }
  332. $this->skipIf(!$available, 'Need memcached servers at ' . implode(', ', $servers) . ' to run this test.');
  333. $Memcached = new MemcachedEngine();
  334. $Memcached->init(array('engine' => 'Memcached', 'servers' => $servers));
  335. $config = $Memcached->config();
  336. $this->assertEquals($config['servers'], $servers);
  337. Cache::drop('dual_server');
  338. }
  339. /**
  340. * test connecting to an ipv6 server.
  341. *
  342. * @return void
  343. */
  344. public function testConnectIpv6() {
  345. $Memcached = new MemcachedEngine();
  346. $result = $Memcached->init(array(
  347. 'prefix' => 'cake_',
  348. 'duration' => 200,
  349. 'engine' => 'Memcached',
  350. 'servers' => array(
  351. '[::1]:11211'
  352. )
  353. ));
  354. $this->assertTrue($result);
  355. }
  356. /**
  357. * test non latin domains.
  358. *
  359. * @return void
  360. */
  361. public function testParseServerStringNonLatin() {
  362. $Memcached = new TestMemcachedEngine();
  363. $result = $Memcached->parseServerString('schülervz.net:13211');
  364. $this->assertEquals(array('schülervz.net', '13211'), $result);
  365. $result = $Memcached->parseServerString('sülül:1111');
  366. $this->assertEquals(array('sülül', '1111'), $result);
  367. }
  368. /**
  369. * test unix sockets.
  370. *
  371. * @return void
  372. */
  373. public function testParseServerStringUnix() {
  374. $Memcached = new TestMemcachedEngine();
  375. $result = $Memcached->parseServerString('unix:///path/to/memcachedd.sock');
  376. $this->assertEquals(array('unix:///path/to/memcachedd.sock', 0), $result);
  377. }
  378. /**
  379. * testReadAndWriteCache method
  380. *
  381. * @return void
  382. */
  383. public function testReadAndWriteCache() {
  384. $this->_configCache(['duration' => 1]);
  385. $result = Cache::read('test', 'memcached');
  386. $expecting = '';
  387. $this->assertEquals($expecting, $result);
  388. $data = 'this is a test of the emergency broadcasting system';
  389. $result = Cache::write('test', $data, 'memcached');
  390. $this->assertTrue($result);
  391. $result = Cache::read('test', 'memcached');
  392. $expecting = $data;
  393. $this->assertEquals($expecting, $result);
  394. Cache::delete('test', 'memcached');
  395. }
  396. /**
  397. * testExpiry method
  398. *
  399. * @return void
  400. */
  401. public function testExpiry() {
  402. $this->_configCache(['duration' => 1]);
  403. $result = Cache::read('test', 'memcached');
  404. $this->assertFalse($result);
  405. $data = 'this is a test of the emergency broadcasting system';
  406. $result = Cache::write('other_test', $data, 'memcached');
  407. $this->assertTrue($result);
  408. sleep(2);
  409. $result = Cache::read('other_test', 'memcached');
  410. $this->assertFalse($result);
  411. $this->_configCache(['duration' => '+1 second']);
  412. $data = 'this is a test of the emergency broadcasting system';
  413. $result = Cache::write('other_test', $data, 'memcached');
  414. $this->assertTrue($result);
  415. sleep(3);
  416. $result = Cache::read('other_test', 'memcached');
  417. $this->assertFalse($result);
  418. $result = Cache::read('other_test', 'memcached');
  419. $this->assertFalse($result);
  420. $this->_configCache(['duration' => '+29 days']);
  421. $data = 'this is a test of the emergency broadcasting system';
  422. $result = Cache::write('long_expiry_test', $data, 'memcached');
  423. $this->assertTrue($result);
  424. sleep(2);
  425. $result = Cache::read('long_expiry_test', 'memcached');
  426. $expecting = $data;
  427. $this->assertEquals($expecting, $result);
  428. }
  429. /**
  430. * testDeleteCache method
  431. *
  432. * @return void
  433. */
  434. public function testDeleteCache() {
  435. $data = 'this is a test of the emergency broadcasting system';
  436. $result = Cache::write('delete_test', $data, 'memcached');
  437. $this->assertTrue($result);
  438. $result = Cache::delete('delete_test', 'memcached');
  439. $this->assertTrue($result);
  440. }
  441. /**
  442. * testDecrement method
  443. *
  444. * @return void
  445. */
  446. public function testDecrement() {
  447. $result = Cache::write('test_decrement', 5, 'memcached');
  448. $this->assertTrue($result);
  449. $result = Cache::decrement('test_decrement', 1, 'memcached');
  450. $this->assertEquals(4, $result);
  451. $result = Cache::read('test_decrement', 'memcached');
  452. $this->assertEquals(4, $result);
  453. $result = Cache::decrement('test_decrement', 2, 'memcached');
  454. $this->assertEquals(2, $result);
  455. $result = Cache::read('test_decrement', 'memcached');
  456. $this->assertEquals(2, $result);
  457. Cache::delete('test_decrement', 'memcached');
  458. }
  459. /**
  460. * test decrementing compressed keys
  461. *
  462. * @return void
  463. */
  464. public function testDecrementCompressedKeys() {
  465. Cache::config('compressed_memcached', array(
  466. 'engine' => 'Memcached',
  467. 'duration' => '+2 seconds',
  468. 'servers' => array('127.0.0.1:11211'),
  469. 'compress' => true
  470. ));
  471. $result = Cache::write('test_decrement', 5, 'compressed_memcached');
  472. $this->assertTrue($result);
  473. $result = Cache::decrement('test_decrement', 1, 'compressed_memcached');
  474. $this->assertEquals(4, $result);
  475. $result = Cache::read('test_decrement', 'compressed_memcached');
  476. $this->assertEquals(4, $result);
  477. $result = Cache::decrement('test_decrement', 2, 'compressed_memcached');
  478. $this->assertEquals(2, $result);
  479. $result = Cache::read('test_decrement', 'compressed_memcached');
  480. $this->assertEquals(2, $result);
  481. Cache::delete('test_decrement', 'compressed_memcached');
  482. }
  483. /**
  484. * testIncrement method
  485. *
  486. * @return void
  487. */
  488. public function testIncrement() {
  489. $result = Cache::write('test_increment', 5, 'memcached');
  490. $this->assertTrue($result);
  491. $result = Cache::increment('test_increment', 1, 'memcached');
  492. $this->assertEquals(6, $result);
  493. $result = Cache::read('test_increment', 'memcached');
  494. $this->assertEquals(6, $result);
  495. $result = Cache::increment('test_increment', 2, 'memcached');
  496. $this->assertEquals(8, $result);
  497. $result = Cache::read('test_increment', 'memcached');
  498. $this->assertEquals(8, $result);
  499. Cache::delete('test_increment', 'memcached');
  500. }
  501. /**
  502. * test incrementing compressed keys
  503. *
  504. * @return void
  505. */
  506. public function testIncrementCompressedKeys() {
  507. Cache::config('compressed_memcached', array(
  508. 'engine' => 'Memcached',
  509. 'duration' => '+2 seconds',
  510. 'servers' => array('127.0.0.1:11211'),
  511. 'compress' => true
  512. ));
  513. $result = Cache::write('test_increment', 5, 'compressed_memcached');
  514. $this->assertTrue($result);
  515. $result = Cache::increment('test_increment', 1, 'compressed_memcached');
  516. $this->assertEquals(6, $result);
  517. $result = Cache::read('test_increment', 'compressed_memcached');
  518. $this->assertEquals(6, $result);
  519. $result = Cache::increment('test_increment', 2, 'compressed_memcached');
  520. $this->assertEquals(8, $result);
  521. $result = Cache::read('test_increment', 'compressed_memcached');
  522. $this->assertEquals(8, $result);
  523. Cache::delete('test_increment', 'compressed_memcached');
  524. }
  525. /**
  526. * test that configurations don't conflict, when a file engine is declared after a memcached one.
  527. *
  528. * @return void
  529. */
  530. public function testConfigurationConflict() {
  531. Cache::config('long_memcached', array(
  532. 'engine' => 'Memcached',
  533. 'duration' => '+2 seconds',
  534. 'servers' => array('127.0.0.1:11211'),
  535. ));
  536. Cache::config('short_memcached', array(
  537. 'engine' => 'Memcached',
  538. 'duration' => '+1 seconds',
  539. 'servers' => array('127.0.0.1:11211'),
  540. ));
  541. $this->assertTrue(Cache::write('duration_test', 'yay', 'long_memcached'));
  542. $this->assertTrue(Cache::write('short_duration_test', 'boo', 'short_memcached'));
  543. $this->assertEquals('yay', Cache::read('duration_test', 'long_memcached'), 'Value was not read %s');
  544. $this->assertEquals('boo', Cache::read('short_duration_test', 'short_memcached'), 'Value was not read %s');
  545. sleep(1);
  546. $this->assertEquals('yay', Cache::read('duration_test', 'long_memcached'), 'Value was not read %s');
  547. sleep(2);
  548. $this->assertFalse(Cache::read('short_duration_test', 'short_memcached'), 'Cache was not invalidated %s');
  549. $this->assertFalse(Cache::read('duration_test', 'long_memcached'), 'Value did not expire %s');
  550. Cache::delete('duration_test', 'long_memcached');
  551. Cache::delete('short_duration_test', 'short_memcached');
  552. }
  553. /**
  554. * test clearing memcached.
  555. *
  556. * @return void
  557. */
  558. public function testClear() {
  559. $this->assertFalse(defined('HHVM_VERSION'), 'Remove me when travis updates hhvm to 2.5');
  560. Cache::config('memcached2', array(
  561. 'engine' => 'Memcached',
  562. 'prefix' => 'cake2_',
  563. 'duration' => 3600
  564. ));
  565. Cache::write('some_value', 'cache1', 'memcached');
  566. $result = Cache::clear(true, 'memcached');
  567. $this->assertTrue($result);
  568. $this->assertEquals('cache1', Cache::read('some_value', 'memcached'));
  569. Cache::write('some_value', 'cache2', 'memcached2');
  570. $result = Cache::clear(false, 'memcached');
  571. $this->assertTrue($result);
  572. $this->assertFalse(Cache::read('some_value', 'memcached'));
  573. $this->assertEquals('cache2', Cache::read('some_value', 'memcached2'));
  574. Cache::clear(false, 'memcached2');
  575. }
  576. /**
  577. * test that a 0 duration can successfully write.
  578. *
  579. * @return void
  580. */
  581. public function testZeroDuration() {
  582. $this->_configCache(['duration' => 0]);
  583. $result = Cache::write('test_key', 'written!', 'memcached');
  584. $this->assertTrue($result);
  585. $result = Cache::read('test_key', 'memcached');
  586. $this->assertEquals('written!', $result);
  587. }
  588. /**
  589. * test that durations greater than 30 days never expire
  590. *
  591. * @return void
  592. */
  593. public function testLongDurationEqualToZero() {
  594. $memcached = new TestMemcachedEngine();
  595. $memcached->init(['prefix' => 'Foo_', 'compress' => false, 'duration' => 50 * DAY]);
  596. $mock = $this->getMock('Memcached');
  597. $memcached->setMemcached($mock);
  598. $mock->expects($this->once())
  599. ->method('set')
  600. ->with('Foo_key', 'value', 0);
  601. $value = 'value';
  602. $memcached->write('key', $value);
  603. }
  604. /**
  605. * Tests that configuring groups for stored keys return the correct values when read/written
  606. * Shows that altering the group value is equivalent to deleting all keys under the same
  607. * group
  608. *
  609. * @return void
  610. */
  611. public function testGroupReadWrite() {
  612. Cache::config('memcached_groups', array(
  613. 'engine' => 'Memcached',
  614. 'duration' => 3600,
  615. 'groups' => array('group_a', 'group_b'),
  616. 'prefix' => 'test_'
  617. ));
  618. Cache::config('memcached_helper', array(
  619. 'engine' => 'Memcached',
  620. 'duration' => 3600,
  621. 'prefix' => 'test_'
  622. ));
  623. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  624. $this->assertEquals('value', Cache::read('test_groups', 'memcached_groups'));
  625. Cache::increment('group_a', 1, 'memcached_helper');
  626. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  627. $this->assertTrue(Cache::write('test_groups', 'value2', 'memcached_groups'));
  628. $this->assertEquals('value2', Cache::read('test_groups', 'memcached_groups'));
  629. Cache::increment('group_b', 1, 'memcached_helper');
  630. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  631. $this->assertTrue(Cache::write('test_groups', 'value3', 'memcached_groups'));
  632. $this->assertEquals('value3', Cache::read('test_groups', 'memcached_groups'));
  633. }
  634. /**
  635. * Tests that deleteing from a groups-enabled config is possible
  636. *
  637. * @return void
  638. */
  639. public function testGroupDelete() {
  640. Cache::config('memcached_groups', array(
  641. 'engine' => 'Memcached',
  642. 'duration' => 3600,
  643. 'groups' => array('group_a', 'group_b')
  644. ));
  645. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  646. $this->assertEquals('value', Cache::read('test_groups', 'memcached_groups'));
  647. $this->assertTrue(Cache::delete('test_groups', 'memcached_groups'));
  648. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  649. }
  650. /**
  651. * Test clearing a cache group
  652. *
  653. * @return void
  654. */
  655. public function testGroupClear() {
  656. Cache::config('memcached_groups', array(
  657. 'engine' => 'Memcached',
  658. 'duration' => 3600,
  659. 'groups' => array('group_a', 'group_b')
  660. ));
  661. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  662. $this->assertTrue(Cache::clearGroup('group_a', 'memcached_groups'));
  663. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  664. $this->assertTrue(Cache::write('test_groups', 'value2', 'memcached_groups'));
  665. $this->assertTrue(Cache::clearGroup('group_b', 'memcached_groups'));
  666. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  667. }
  668. }