|
@@ -3,69 +3,194 @@
|
|
|
namespace Doctrine\Tests\Common\Cache;
|
|
|
|
|
|
use Doctrine\Common\Cache\Cache;
|
|
|
+use ArrayObject;
|
|
|
|
|
|
abstract class CacheTest extends \Doctrine\Tests\DoctrineTestCase
|
|
|
{
|
|
|
- public function testBasics()
|
|
|
+
|
|
|
+ * @dataProvider provideCrudValues
|
|
|
+ */
|
|
|
+ public function testBasicCrudOperations($value)
|
|
|
{
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
|
|
|
-
|
|
|
- $cache->save('test_key', 'testing this out');
|
|
|
-
|
|
|
-
|
|
|
- $this->assertTrue($cache->contains('test_key'));
|
|
|
+
|
|
|
+ $this->assertTrue($cache->save('key', 'value'));
|
|
|
+ $this->assertTrue($cache->contains('key'));
|
|
|
+ $this->assertEquals('value', $cache->fetch('key'));
|
|
|
|
|
|
-
|
|
|
- $this->assertEquals('testing this out', $cache->fetch('test_key'));
|
|
|
+
|
|
|
+ $this->assertTrue($cache->save('key', 'value-changed'));
|
|
|
+ $this->assertTrue($cache->contains('key'));
|
|
|
+ $this->assertEquals('value-changed', $cache->fetch('key'));
|
|
|
|
|
|
-
|
|
|
- $cache->save('test_key2', 'test2');
|
|
|
- $cache->delete('test_key2');
|
|
|
- $this->assertFalse($cache->contains('test_key2'));
|
|
|
+
|
|
|
+ $this->assertTrue($cache->delete('key'));
|
|
|
+ $this->assertFalse($cache->contains('key'));
|
|
|
}
|
|
|
|
|
|
- public function testObjects()
|
|
|
+ public function provideCrudValues()
|
|
|
{
|
|
|
- $cache = $this->_getCacheDriver();
|
|
|
-
|
|
|
-
|
|
|
- $cache->save('test_object_key', new \ArrayObject());
|
|
|
- $this->assertTrue($cache->fetch('test_object_key') instanceof \ArrayObject);
|
|
|
+ return array(
|
|
|
+ 'array' => array(array('one', 2, 3.0)),
|
|
|
+ 'string' => array('value'),
|
|
|
+ 'integer' => array(1),
|
|
|
+ 'float' => array(1.5),
|
|
|
+ 'object' => array(new ArrayObject()),
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
public function testDeleteAll()
|
|
|
{
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
- $cache->save('test_key1', '1');
|
|
|
- $cache->save('test_key2', '2');
|
|
|
- $cache->deleteAll();
|
|
|
|
|
|
- $this->assertFalse($cache->contains('test_key1'));
|
|
|
- $this->assertFalse($cache->contains('test_key2'));
|
|
|
+ $this->assertTrue($cache->save('key1', 1));
|
|
|
+ $this->assertTrue($cache->save('key2', 2));
|
|
|
+ $this->assertTrue($cache->deleteAll());
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
+ $this->assertFalse($cache->contains('key2'));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testDeleteAllAndNamespaceVersioningBetweenCaches()
|
|
|
+ {
|
|
|
+ if ( ! $this->isSharedStorage()) {
|
|
|
+ $this->markTestSkipped('The ' . __CLASS__ .' does not use shared storage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $cache1 = $this->_getCacheDriver();
|
|
|
+ $cache2 = $this->_getCacheDriver();
|
|
|
+
|
|
|
+ $this->assertTrue($cache1->save('key1', 1));
|
|
|
+ $this->assertTrue($cache2->save('key2', 2));
|
|
|
+
|
|
|
+
|
|
|
+ * they can see entries set by each other.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache1->contains('key1'));
|
|
|
+ $this->assertTrue($cache1->contains('key2'));
|
|
|
+ $this->assertTrue($cache2->contains('key1'));
|
|
|
+ $this->assertTrue($cache2->contains('key2'));
|
|
|
+
|
|
|
+
|
|
|
+ * namespace version on that object (and in the cache itself, which new
|
|
|
+ * instances will use to initialize). The second provider will retain
|
|
|
+ * its original version and still see stale data.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache1->deleteAll());
|
|
|
+ $this->assertFalse($cache1->contains('key1'));
|
|
|
+ $this->assertFalse($cache1->contains('key2'));
|
|
|
+ $this->assertTrue($cache2->contains('key1'));
|
|
|
+ $this->assertTrue($cache2->contains('key2'));
|
|
|
+
|
|
|
+
|
|
|
+ * namespace version will be initialized.
|
|
|
+ */
|
|
|
+ $cache3 = $this->_getCacheDriver();
|
|
|
+ $this->assertFalse($cache3->contains('key1'));
|
|
|
+ $this->assertFalse($cache3->contains('key2'));
|
|
|
}
|
|
|
|
|
|
public function testFlushAll()
|
|
|
{
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
- $cache->save('test_key1', '1');
|
|
|
- $cache->save('test_key2', '2');
|
|
|
- $cache->flushAll();
|
|
|
|
|
|
- $this->assertFalse($cache->contains('test_key1'));
|
|
|
- $this->assertFalse($cache->contains('test_key2'));
|
|
|
+ $this->assertTrue($cache->save('key1', 1));
|
|
|
+ $this->assertTrue($cache->save('key2', 2));
|
|
|
+ $this->assertTrue($cache->flushAll());
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
+ $this->assertFalse($cache->contains('key2'));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testFlushAllAndNamespaceVersioningBetweenCaches()
|
|
|
+ {
|
|
|
+ if ( ! $this->isSharedStorage()) {
|
|
|
+ $this->markTestSkipped('The ' . __CLASS__ .' does not use shared storage');
|
|
|
+ }
|
|
|
+
|
|
|
+ $cache1 = $this->_getCacheDriver();
|
|
|
+ $cache2 = $this->_getCacheDriver();
|
|
|
+
|
|
|
+
|
|
|
+ * namespace version before saving the first entry.
|
|
|
+ */
|
|
|
+ $cache1->deleteAll();
|
|
|
+ $this->assertTrue($cache1->save('key1', 1));
|
|
|
+
|
|
|
+
|
|
|
+ * version upon its first save operation.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache2->save('key2', 2));
|
|
|
+
|
|
|
+
|
|
|
+ * set by each other.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache1->contains('key1'));
|
|
|
+ $this->assertTrue($cache1->contains('key2'));
|
|
|
+ $this->assertTrue($cache2->contains('key1'));
|
|
|
+ $this->assertTrue($cache2->contains('key2'));
|
|
|
+
|
|
|
+
|
|
|
+ * the cache but leave their namespace version as-is.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache1->flushAll());
|
|
|
+ $this->assertFalse($cache1->contains('key1'));
|
|
|
+ $this->assertFalse($cache1->contains('key2'));
|
|
|
+ $this->assertFalse($cache2->contains('key1'));
|
|
|
+ $this->assertFalse($cache2->contains('key2'));
|
|
|
+
|
|
|
+
|
|
|
+ * version, and it will be visible to both providers.
|
|
|
+ */
|
|
|
+ $this->assertTrue($cache1->save('key1', 1));
|
|
|
+ $this->assertTrue($cache1->contains('key1'));
|
|
|
+ $this->assertTrue($cache2->contains('key1'));
|
|
|
+
|
|
|
+
|
|
|
+ * version and not share any visibility with the first two providers.
|
|
|
+ */
|
|
|
+ $cache3 = $this->_getCacheDriver();
|
|
|
+ $this->assertFalse($cache3->contains('key1'));
|
|
|
+ $this->assertFalse($cache3->contains('key2'));
|
|
|
+ $this->assertTrue($cache3->save('key3', 3));
|
|
|
+ $this->assertTrue($cache3->contains('key3'));
|
|
|
}
|
|
|
|
|
|
public function testNamespace()
|
|
|
{
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
- $cache->setNamespace('test_');
|
|
|
+
|
|
|
+ $cache->setNamespace('ns1_');
|
|
|
+
|
|
|
+ $this->assertTrue($cache->save('key1', 1));
|
|
|
+ $this->assertTrue($cache->contains('key1'));
|
|
|
+
|
|
|
+ $cache->setNamespace('ns2_');
|
|
|
+
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testDeleteAllNamespace()
|
|
|
+ {
|
|
|
+ $cache = $this->_getCacheDriver();
|
|
|
+
|
|
|
+ $cache->setNamespace('ns1');
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
$cache->save('key1', 'test');
|
|
|
+ $this->assertTrue($cache->contains('key1'));
|
|
|
|
|
|
+ $cache->setNamespace('ns2');
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
+ $cache->save('key1', 'test');
|
|
|
$this->assertTrue($cache->contains('key1'));
|
|
|
|
|
|
- $cache->setNamespace('test2_');
|
|
|
+ $cache->setNamespace('ns1');
|
|
|
+ $this->assertTrue($cache->contains('key1'));
|
|
|
+ $cache->deleteAll();
|
|
|
+ $this->assertFalse($cache->contains('key1'));
|
|
|
|
|
|
+ $cache->setNamespace('ns2');
|
|
|
+ $this->assertTrue($cache->contains('key1'));
|
|
|
+ $cache->deleteAll();
|
|
|
$this->assertFalse($cache->contains('key1'));
|
|
|
}
|
|
|
|
|
@@ -77,25 +202,38 @@ abstract class CacheTest extends \Doctrine\Tests\DoctrineTestCase
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
$stats = $cache->getStats();
|
|
|
|
|
|
- $this->assertArrayHasKey(Cache::STATS_HITS, $stats);
|
|
|
+ $this->assertArrayHasKey(Cache::STATS_HITS, $stats);
|
|
|
$this->assertArrayHasKey(Cache::STATS_MISSES, $stats);
|
|
|
$this->assertArrayHasKey(Cache::STATS_UPTIME, $stats);
|
|
|
$this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats);
|
|
|
$this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILABLE, $stats);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- * Make sure that all supported caches return "false" instead of "null" to be compatible
|
|
|
- * with ORM integration.
|
|
|
- */
|
|
|
- public function testFalseOnFailedFetch()
|
|
|
+ public function testFetchMissShouldReturnFalse()
|
|
|
{
|
|
|
$cache = $this->_getCacheDriver();
|
|
|
+
|
|
|
+
|
|
|
+ * miss to be compatible with ORM integration.
|
|
|
+ */
|
|
|
$result = $cache->fetch('nonexistent_key');
|
|
|
+
|
|
|
$this->assertFalse($result);
|
|
|
$this->assertNotNull($result);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * Return whether multiple cache providers share the same storage.
|
|
|
+ *
|
|
|
+ * This is used for skipping certain tests for shared storage behavior.
|
|
|
+ *
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ protected function isSharedStorage()
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
* @return \Doctrine\Common\Cache\CacheProvider
|
|
|
*/
|