MemcachedEngineTest.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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($settings = []) {
  65. $defaults = [
  66. 'className' => 'Memcached',
  67. 'prefix' => 'cake_',
  68. 'duration' => 3600
  69. ];
  70. Cache::drop('memcached');
  71. Cache::config('memcached', array_merge($defaults, $settings));
  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. * testSettings method
  90. *
  91. * @return void
  92. */
  93. public function testSettings() {
  94. $settings = Cache::settings('memcached');
  95. unset($settings['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, $settings);
  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. $settings = 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($settings);
  148. }
  149. /**
  150. * testPhpSerializerSetting method
  151. *
  152. * @return void
  153. */
  154. public function testPhpSerializerSetting() {
  155. $Memcached = new TestMemcachedEngine();
  156. $settings = array(
  157. 'className' => 'Memcached',
  158. 'servers' => array('127.0.0.1:11211'),
  159. 'persistent' => false,
  160. 'serialize' => 'php'
  161. );
  162. $Memcached->init($settings);
  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. $settings = array(
  177. 'engine' => 'Memcached',
  178. 'servers' => array('127.0.0.1:11211'),
  179. 'persistent' => false,
  180. 'serialize' => 'json'
  181. );
  182. $Memcached->init($settings);
  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. $settings = array(
  197. 'engine' => 'Memcached',
  198. 'servers' => array('127.0.0.1:11211'),
  199. 'persistent' => false,
  200. 'serialize' => 'igbinary'
  201. );
  202. $Memcached->init($settings);
  203. $this->assertEquals(Memcached::SERIALIZER_IGBINARY, $Memcached->getMemcached()->getOption(Memcached::OPT_SERIALIZER));
  204. }
  205. /**
  206. * testJsonSerializerThrowException method
  207. *
  208. * @return void
  209. */
  210. public function testJsonSerializerThrowException() {
  211. $this->skipIf(
  212. Memcached::HAVE_JSON,
  213. 'Memcached extension is compiled with json support'
  214. );
  215. $Memcached = new TestMemcachedEngine();
  216. $settings = array(
  217. 'className' => 'Memcached',
  218. 'servers' => array('127.0.0.1:11211'),
  219. 'persistent' => false,
  220. 'serialize' => 'json'
  221. );
  222. $this->setExpectedException(
  223. 'Cake\Error\Exception', 'Memcached extension is not compiled with json support'
  224. );
  225. $Memcached->init($settings);
  226. }
  227. /**
  228. * testIgbinarySerializerThrowException method
  229. *
  230. * @return void
  231. */
  232. public function testIgbinarySerializerThrowException() {
  233. $this->skipIf(
  234. Memcached::HAVE_IGBINARY,
  235. 'Memcached extension is compiled with igbinary support'
  236. );
  237. $Memcached = new TestMemcachedEngine();
  238. $settings = array(
  239. 'engine' => 'Memcached',
  240. 'servers' => array('127.0.0.1:11211'),
  241. 'persistent' => false,
  242. 'serialize' => 'igbinary'
  243. );
  244. $this->setExpectedException(
  245. 'Cake\Error\Exception', 'Memcached extension is not compiled with igbinary support'
  246. );
  247. $Memcached->init($settings);
  248. }
  249. /**
  250. * test using authentication without memcached installed with SASL support
  251. * throw an exception
  252. *
  253. * @return void
  254. */
  255. public function testSaslAuthException() {
  256. $Memcached = new TestMemcachedEngine();
  257. $settings = array(
  258. 'engine' => 'Memcached',
  259. 'servers' => array('127.0.0.1:11211'),
  260. 'persistent' => false,
  261. 'login' => 'test',
  262. 'password' => 'password'
  263. );
  264. $this->skipIf(
  265. method_exists($Memcached->getMemcached(), 'setSaslAuthData'),
  266. 'Memcached extension is installed with SASL support'
  267. );
  268. $this->setExpectedException(
  269. 'Cake\Error\Exception', 'Memcached extension is not build with SASL support'
  270. );
  271. $Memcached->init($settings);
  272. }
  273. /**
  274. * testSettings method
  275. *
  276. * @return void
  277. */
  278. public function testMultipleServers() {
  279. $servers = array('127.0.0.1:11211', '127.0.0.1:11222');
  280. $available = true;
  281. $Memcached = new \Memcached();
  282. foreach ($servers as $server) {
  283. list($host, $port) = explode(':', $server);
  284. //@codingStandardsIgnoreStart
  285. if (!$Memcached->addServer($host, $port)) {
  286. $available = false;
  287. }
  288. //@codingStandardsIgnoreEnd
  289. }
  290. $this->skipIf(!$available, 'Need memcached servers at ' . implode(', ', $servers) . ' to run this test.');
  291. $Memcached = new MemcachedEngine();
  292. $Memcached->init(array('engine' => 'Memcached', 'servers' => $servers));
  293. $settings = $Memcached->settings();
  294. $this->assertEquals($settings['servers'], $servers);
  295. Cache::drop('dual_server');
  296. }
  297. /**
  298. * test connecting to an ipv6 server.
  299. *
  300. * @return void
  301. */
  302. public function testConnectIpv6() {
  303. $Memcached = new MemcachedEngine();
  304. $result = $Memcached->init(array(
  305. 'prefix' => 'cake_',
  306. 'duration' => 200,
  307. 'engine' => 'Memcached',
  308. 'servers' => array(
  309. '[::1]:11211'
  310. )
  311. ));
  312. $this->assertTrue($result);
  313. }
  314. /**
  315. * test non latin domains.
  316. *
  317. * @return void
  318. */
  319. public function testParseServerStringNonLatin() {
  320. $Memcached = new TestMemcachedEngine();
  321. $result = $Memcached->parseServerString('schülervz.net:13211');
  322. $this->assertEquals(array('schülervz.net', '13211'), $result);
  323. $result = $Memcached->parseServerString('sülül:1111');
  324. $this->assertEquals(array('sülül', '1111'), $result);
  325. }
  326. /**
  327. * test unix sockets.
  328. *
  329. * @return void
  330. */
  331. public function testParseServerStringUnix() {
  332. $Memcached = new TestMemcachedEngine();
  333. $result = $Memcached->parseServerString('unix:///path/to/memcachedd.sock');
  334. $this->assertEquals(array('unix:///path/to/memcachedd.sock', 0), $result);
  335. }
  336. /**
  337. * testReadAndWriteCache method
  338. *
  339. * @return void
  340. */
  341. public function testReadAndWriteCache() {
  342. $this->_configCache(['duration' => 1]);
  343. $result = Cache::read('test', 'memcached');
  344. $expecting = '';
  345. $this->assertEquals($expecting, $result);
  346. $data = 'this is a test of the emergency broadcasting system';
  347. $result = Cache::write('test', $data, 'memcached');
  348. $this->assertTrue($result);
  349. $result = Cache::read('test', 'memcached');
  350. $expecting = $data;
  351. $this->assertEquals($expecting, $result);
  352. Cache::delete('test', 'memcached');
  353. }
  354. /**
  355. * testExpiry method
  356. *
  357. * @return void
  358. */
  359. public function testExpiry() {
  360. $this->_configCache(['duration' => 1]);
  361. $result = Cache::read('test', 'memcached');
  362. $this->assertFalse($result);
  363. $data = 'this is a test of the emergency broadcasting system';
  364. $result = Cache::write('other_test', $data, 'memcached');
  365. $this->assertTrue($result);
  366. sleep(2);
  367. $result = Cache::read('other_test', 'memcached');
  368. $this->assertFalse($result);
  369. $this->_configCache(['duration' => '+1 second']);
  370. $data = 'this is a test of the emergency broadcasting system';
  371. $result = Cache::write('other_test', $data, 'memcached');
  372. $this->assertTrue($result);
  373. sleep(3);
  374. $result = Cache::read('other_test', 'memcached');
  375. $this->assertFalse($result);
  376. $result = Cache::read('other_test', 'memcached');
  377. $this->assertFalse($result);
  378. $this->_configCache(['duration' => '+29 days']);
  379. $data = 'this is a test of the emergency broadcasting system';
  380. $result = Cache::write('long_expiry_test', $data, 'memcached');
  381. $this->assertTrue($result);
  382. sleep(2);
  383. $result = Cache::read('long_expiry_test', 'memcached');
  384. $expecting = $data;
  385. $this->assertEquals($expecting, $result);
  386. }
  387. /**
  388. * testDeleteCache method
  389. *
  390. * @return void
  391. */
  392. public function testDeleteCache() {
  393. $data = 'this is a test of the emergency broadcasting system';
  394. $result = Cache::write('delete_test', $data, 'memcached');
  395. $this->assertTrue($result);
  396. $result = Cache::delete('delete_test', 'memcached');
  397. $this->assertTrue($result);
  398. }
  399. /**
  400. * testDecrement method
  401. *
  402. * @return void
  403. */
  404. public function testDecrement() {
  405. $result = Cache::write('test_decrement', 5, 'memcached');
  406. $this->assertTrue($result);
  407. $result = Cache::decrement('test_decrement', 1, 'memcached');
  408. $this->assertEquals(4, $result);
  409. $result = Cache::read('test_decrement', 'memcached');
  410. $this->assertEquals(4, $result);
  411. $result = Cache::decrement('test_decrement', 2, 'memcached');
  412. $this->assertEquals(2, $result);
  413. $result = Cache::read('test_decrement', 'memcached');
  414. $this->assertEquals(2, $result);
  415. Cache::delete('test_decrement', 'memcached');
  416. }
  417. /**
  418. * test decrementing compressed keys
  419. *
  420. * @return void
  421. */
  422. public function testDecrementCompressedKeys() {
  423. Cache::config('compressed_memcached', array(
  424. 'engine' => 'Memcached',
  425. 'duration' => '+2 seconds',
  426. 'servers' => array('127.0.0.1:11211'),
  427. 'compress' => true
  428. ));
  429. $result = Cache::write('test_decrement', 5, 'compressed_memcached');
  430. $this->assertTrue($result);
  431. $result = Cache::decrement('test_decrement', 1, 'compressed_memcached');
  432. $this->assertEquals(4, $result);
  433. $result = Cache::read('test_decrement', 'compressed_memcached');
  434. $this->assertEquals(4, $result);
  435. $result = Cache::decrement('test_decrement', 2, 'compressed_memcached');
  436. $this->assertEquals(2, $result);
  437. $result = Cache::read('test_decrement', 'compressed_memcached');
  438. $this->assertEquals(2, $result);
  439. Cache::delete('test_decrement', 'compressed_memcached');
  440. }
  441. /**
  442. * testIncrement method
  443. *
  444. * @return void
  445. */
  446. public function testIncrement() {
  447. $result = Cache::write('test_increment', 5, 'memcached');
  448. $this->assertTrue($result);
  449. $result = Cache::increment('test_increment', 1, 'memcached');
  450. $this->assertEquals(6, $result);
  451. $result = Cache::read('test_increment', 'memcached');
  452. $this->assertEquals(6, $result);
  453. $result = Cache::increment('test_increment', 2, 'memcached');
  454. $this->assertEquals(8, $result);
  455. $result = Cache::read('test_increment', 'memcached');
  456. $this->assertEquals(8, $result);
  457. Cache::delete('test_increment', 'memcached');
  458. }
  459. /**
  460. * test incrementing compressed keys
  461. *
  462. * @return void
  463. */
  464. public function testIncrementCompressedKeys() {
  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_increment', 5, 'compressed_memcached');
  472. $this->assertTrue($result);
  473. $result = Cache::increment('test_increment', 1, 'compressed_memcached');
  474. $this->assertEquals(6, $result);
  475. $result = Cache::read('test_increment', 'compressed_memcached');
  476. $this->assertEquals(6, $result);
  477. $result = Cache::increment('test_increment', 2, 'compressed_memcached');
  478. $this->assertEquals(8, $result);
  479. $result = Cache::read('test_increment', 'compressed_memcached');
  480. $this->assertEquals(8, $result);
  481. Cache::delete('test_increment', 'compressed_memcached');
  482. }
  483. /**
  484. * test that configurations don't conflict, when a file engine is declared after a memcached one.
  485. *
  486. * @return void
  487. */
  488. public function testConfigurationConflict() {
  489. Cache::config('long_memcached', array(
  490. 'engine' => 'Memcached',
  491. 'duration' => '+2 seconds',
  492. 'servers' => array('127.0.0.1:11211'),
  493. ));
  494. Cache::config('short_memcached', array(
  495. 'engine' => 'Memcached',
  496. 'duration' => '+1 seconds',
  497. 'servers' => array('127.0.0.1:11211'),
  498. ));
  499. $this->assertTrue(Cache::write('duration_test', 'yay', 'long_memcached'));
  500. $this->assertTrue(Cache::write('short_duration_test', 'boo', 'short_memcached'));
  501. $this->assertEquals('yay', Cache::read('duration_test', 'long_memcached'), 'Value was not read %s');
  502. $this->assertEquals('boo', Cache::read('short_duration_test', 'short_memcached'), 'Value was not read %s');
  503. sleep(1);
  504. $this->assertEquals('yay', Cache::read('duration_test', 'long_memcached'), 'Value was not read %s');
  505. sleep(2);
  506. $this->assertFalse(Cache::read('short_duration_test', 'short_memcached'), 'Cache was not invalidated %s');
  507. $this->assertFalse(Cache::read('duration_test', 'long_memcached'), 'Value did not expire %s');
  508. Cache::delete('duration_test', 'long_memcached');
  509. Cache::delete('short_duration_test', 'short_memcached');
  510. }
  511. /**
  512. * test clearing memcached.
  513. *
  514. * @return void
  515. */
  516. public function testClear() {
  517. Cache::config('memcached2', array(
  518. 'engine' => 'Memcached',
  519. 'prefix' => 'cake2_',
  520. 'duration' => 3600
  521. ));
  522. Cache::write('some_value', 'cache1', 'memcached');
  523. $result = Cache::clear(true, 'memcached');
  524. $this->assertTrue($result);
  525. $this->assertEquals('cache1', Cache::read('some_value', 'memcached'));
  526. Cache::write('some_value', 'cache2', 'memcached2');
  527. $result = Cache::clear(false, 'memcached');
  528. $this->assertTrue($result);
  529. $this->assertFalse(Cache::read('some_value', 'memcached'));
  530. $this->assertEquals('cache2', Cache::read('some_value', 'memcached2'));
  531. Cache::clear(false, 'memcached2');
  532. }
  533. /**
  534. * test that a 0 duration can successfully write.
  535. *
  536. * @return void
  537. */
  538. public function testZeroDuration() {
  539. $this->_configCache(['duration' => 0]);
  540. $result = Cache::write('test_key', 'written!', 'memcached');
  541. $this->assertTrue($result);
  542. $result = Cache::read('test_key', 'memcached');
  543. $this->assertEquals('written!', $result);
  544. }
  545. /**
  546. * test that durations greater than 30 days never expire
  547. *
  548. * @return void
  549. */
  550. public function testLongDurationEqualToZero() {
  551. $memcached = new TestMemcachedEngine();
  552. $memcached->settings['compress'] = false;
  553. $mock = $this->getMock('Memcached');
  554. $memcached->setMemcached($mock);
  555. $mock->expects($this->once())
  556. ->method('set')
  557. ->with('key', 'value', 0);
  558. $value = 'value';
  559. $memcached->write('key', $value, 50 * DAY);
  560. }
  561. /**
  562. * Tests that configuring groups for stored keys return the correct values when read/written
  563. * Shows that altering the group value is equivalent to deleting all keys under the same
  564. * group
  565. *
  566. * @return void
  567. */
  568. public function testGroupReadWrite() {
  569. Cache::config('memcached_groups', array(
  570. 'engine' => 'Memcached',
  571. 'duration' => 3600,
  572. 'groups' => array('group_a', 'group_b'),
  573. 'prefix' => 'test_'
  574. ));
  575. Cache::config('memcached_helper', array(
  576. 'engine' => 'Memcached',
  577. 'duration' => 3600,
  578. 'prefix' => 'test_'
  579. ));
  580. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  581. $this->assertEquals('value', Cache::read('test_groups', 'memcached_groups'));
  582. Cache::increment('group_a', 1, 'memcached_helper');
  583. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  584. $this->assertTrue(Cache::write('test_groups', 'value2', 'memcached_groups'));
  585. $this->assertEquals('value2', Cache::read('test_groups', 'memcached_groups'));
  586. Cache::increment('group_b', 1, 'memcached_helper');
  587. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  588. $this->assertTrue(Cache::write('test_groups', 'value3', 'memcached_groups'));
  589. $this->assertEquals('value3', Cache::read('test_groups', 'memcached_groups'));
  590. }
  591. /**
  592. * Tests that deleteing from a groups-enabled config is possible
  593. *
  594. * @return void
  595. */
  596. public function testGroupDelete() {
  597. Cache::config('memcached_groups', array(
  598. 'engine' => 'Memcached',
  599. 'duration' => 3600,
  600. 'groups' => array('group_a', 'group_b')
  601. ));
  602. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  603. $this->assertEquals('value', Cache::read('test_groups', 'memcached_groups'));
  604. $this->assertTrue(Cache::delete('test_groups', 'memcached_groups'));
  605. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  606. }
  607. /**
  608. * Test clearing a cache group
  609. *
  610. * @return void
  611. */
  612. public function testGroupClear() {
  613. Cache::config('memcached_groups', array(
  614. 'engine' => 'Memcached',
  615. 'duration' => 3600,
  616. 'groups' => array('group_a', 'group_b')
  617. ));
  618. $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
  619. $this->assertTrue(Cache::clearGroup('group_a', 'memcached_groups'));
  620. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  621. $this->assertTrue(Cache::write('test_groups', 'value2', 'memcached_groups'));
  622. $this->assertTrue(Cache::clearGroup('group_b', 'memcached_groups'));
  623. $this->assertFalse(Cache::read('test_groups', 'memcached_groups'));
  624. }
  625. }