diff options
Diffstat (limited to 'tests/lib/Cache')
-rw-r--r-- | tests/lib/Cache/CappedMemoryCacheTest.php | 79 | ||||
-rw-r--r-- | tests/lib/Cache/FileCacheTest.php | 172 | ||||
-rw-r--r-- | tests/lib/Cache/TestCache.php | 73 |
3 files changed, 324 insertions, 0 deletions
diff --git a/tests/lib/Cache/CappedMemoryCacheTest.php b/tests/lib/Cache/CappedMemoryCacheTest.php new file mode 100644 index 00000000000..27e5df4e265 --- /dev/null +++ b/tests/lib/Cache/CappedMemoryCacheTest.php @@ -0,0 +1,79 @@ +<?php +/** + * ownCloud + * + * @author Robin Appelman + * @copyright 2016 Robin Appelman icewind@owncloud.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Cache; + +/** + * Class CappedMemoryCacheTest + * + * @group DB + * + * @package Test\Cache + */ +class CappedMemoryCacheTest extends TestCache { + public function setUp() { + parent::setUp(); + $this->instance = new \OC\Cache\CappedMemoryCache(); + } + + public function testSetOverCap() { + $instance = new \OC\Cache\CappedMemoryCache(3); + + $instance->set('1', 'a'); + $instance->set('2', 'b'); + $instance->set('3', 'c'); + $instance->set('4', 'd'); + $instance->set('5', 'e'); + + $this->assertFalse($instance->hasKey('1')); + $this->assertFalse($instance->hasKey('2')); + $this->assertTrue($instance->hasKey('3')); + $this->assertTrue($instance->hasKey('4')); + $this->assertTrue($instance->hasKey('5')); + } + + function testClear() { + $value = 'ipsum lorum'; + $this->instance->set('1_value1', $value); + $this->instance->set('1_value2', $value); + $this->instance->set('2_value1', $value); + $this->instance->set('3_value1', $value); + + $this->assertTrue($this->instance->clear()); + $this->assertFalse($this->instance->hasKey('1_value1')); + $this->assertFalse($this->instance->hasKey('1_value2')); + $this->assertFalse($this->instance->hasKey('2_value1')); + $this->assertFalse($this->instance->hasKey('3_value1')); + } + + function testIndirectSet() { + $this->instance->set('array', []); + + $this->instance['array'][] = 'foo'; + + $this->assertEquals(['foo'], $this->instance->get('array')); + + $this->instance['array']['bar'] = 'qwerty'; + + $this->assertEquals(['foo', 'bar' => 'qwerty'], $this->instance->get('array')); + } +} diff --git a/tests/lib/Cache/FileCacheTest.php b/tests/lib/Cache/FileCacheTest.php new file mode 100644 index 00000000000..d2725bf9033 --- /dev/null +++ b/tests/lib/Cache/FileCacheTest.php @@ -0,0 +1,172 @@ +<?php +/** + * ownCloud + * + * @author Robin Appelman + * @copyright 2012 Robin Appelman icewind@owncloud.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Cache; + +/** + * Class FileCacheTest + * + * @group DB + * + * @package Test\Cache + */ +class FileCacheTest extends TestCache { + /** + * @var string + * */ + private $user; + /** + * @var string + * */ + private $datadir; + /** + * @var \OC\Files\Storage\Storage + * */ + private $storage; + /** + * @var \OC\Files\View + * */ + private $rootView; + + function skip() { + //$this->skipUnless(OC_User::isLoggedIn()); + } + + protected function setUp() { + parent::setUp(); + + //clear all proxies and hooks so we can do clean testing + \OC_Hook::clear('OC_Filesystem'); + + //set up temporary storage + $this->storage = \OC\Files\Filesystem::getStorage('/'); + \OC\Files\Filesystem::clearMounts(); + $storage = new \OC\Files\Storage\Temporary(array()); + \OC\Files\Filesystem::mount($storage,array(),'/'); + $datadir = str_replace('local::', '', $storage->getId()); + $config = \OC::$server->getConfig(); + $this->datadir = $config->getSystemValue('cachedirectory', \OC::$SERVERROOT.'/data/cache'); + $config->setSystemValue('cachedirectory', $datadir); + + \OC_User::clearBackends(); + \OC_User::useBackend(new \Test\Util\User\Dummy()); + + //login + \OC::$server->getUserManager()->createUser('test', 'test'); + + $this->user = \OC_User::getUser(); + \OC_User::setUserId('test'); + + //set up the users dir + $this->rootView = new \OC\Files\View(''); + $this->rootView->mkdir('/test'); + + $this->instance=new \OC\Cache\File(); + + // forces creation of cache folder for subsequent tests + $this->instance->set('hack', 'hack'); + } + + protected function tearDown() { + if ($this->instance) { + $this->instance->remove('hack', 'hack'); + } + + \OC_User::setUserId($this->user); + \OC::$server->getConfig()->setSystemValue('cachedirectory', $this->datadir); + + // Restore the original mount point + \OC\Files\Filesystem::clearMounts(); + \OC\Files\Filesystem::mount($this->storage, array(), '/'); + + parent::tearDown(); + } + + private function setupMockStorage() { + $mockStorage = $this->getMock( + '\OC\Files\Storage\Local', + ['filemtime', 'unlink'], + [['datadir' => \OC::$server->getTempManager()->getTemporaryFolder()]] + ); + + \OC\Files\Filesystem::mount($mockStorage, array(), '/test/cache'); + + return $mockStorage; + } + + public function testGarbageCollectOldKeys() { + $mockStorage = $this->setupMockStorage(); + + $mockStorage->expects($this->atLeastOnce()) + ->method('filemtime') + ->will($this->returnValue(100)); + $mockStorage->expects($this->once()) + ->method('unlink') + ->with('key1') + ->will($this->returnValue(true)); + + $this->instance->set('key1', 'value1'); + $this->instance->gc(); + } + + public function testGarbageCollectLeaveRecentKeys() { + $mockStorage = $this->setupMockStorage(); + + $mockStorage->expects($this->atLeastOnce()) + ->method('filemtime') + ->will($this->returnValue(time() + 3600)); + $mockStorage->expects($this->never()) + ->method('unlink') + ->with('key1'); + $this->instance->set('key1', 'value1'); + $this->instance->gc(); + } + + public function lockExceptionProvider() { + return [ + [new \OCP\Lock\LockedException('key1')], + [new \OCP\Files\LockNotAcquiredException('key1', 1)], + ]; + } + + /** + * @dataProvider lockExceptionProvider + */ + public function testGarbageCollectIgnoreLockedKeys($testException) { + $mockStorage = $this->setupMockStorage(); + + $mockStorage->expects($this->atLeastOnce()) + ->method('filemtime') + ->will($this->returnValue(100)); + $mockStorage->expects($this->atLeastOnce()) + ->method('unlink') + ->will($this->onConsecutiveCalls( + $this->throwException($testException), + $this->returnValue(true) + )); + + $this->instance->set('key1', 'value1'); + $this->instance->set('key2', 'value2'); + + $this->instance->gc(); + } +} diff --git a/tests/lib/Cache/TestCache.php b/tests/lib/Cache/TestCache.php new file mode 100644 index 00000000000..75ff65207ee --- /dev/null +++ b/tests/lib/Cache/TestCache.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Cache; + +abstract class TestCache extends \Test\TestCase { + /** + * @var \OCP\ICache cache; + */ + protected $instance; + + protected function tearDown() { + if($this->instance) { + $this->instance->clear(); + } + + parent::tearDown(); + } + + function testSimple() { + $this->assertNull($this->instance->get('value1')); + $this->assertFalse($this->instance->hasKey('value1')); + + $value='foobar'; + $this->instance->set('value1', $value); + $this->assertTrue($this->instance->hasKey('value1')); + $received=$this->instance->get('value1'); + $this->assertEquals($value, $received, 'Value received from cache not equal to the original'); + $value='ipsum lorum'; + $this->instance->set('value1', $value); + $received=$this->instance->get('value1'); + $this->assertEquals($value, $received, 'Value not overwritten by second set'); + + $value2='foobar'; + $this->instance->set('value2', $value2); + $received2=$this->instance->get('value2'); + $this->assertTrue($this->instance->hasKey('value1')); + $this->assertTrue($this->instance->hasKey('value2')); + $this->assertEquals($value, $received, 'Value changed while setting other variable'); + $this->assertEquals($value2, $received2, 'Second value not equal to original'); + + $this->assertFalse($this->instance->hasKey('not_set')); + $this->assertNull($this->instance->get('not_set'), 'Unset value not equal to null'); + + $this->assertTrue($this->instance->remove('value1')); + $this->assertFalse($this->instance->hasKey('value1')); + } + + function testClear() { + $value='ipsum lorum'; + $this->instance->set('1_value1', $value); + $this->instance->set('1_value2', $value); + $this->instance->set('2_value1', $value); + $this->instance->set('3_value1', $value); + + $this->assertTrue($this->instance->clear('1_')); + $this->assertFalse($this->instance->hasKey('1_value1')); + $this->assertFalse($this->instance->hasKey('1_value2')); + $this->assertTrue($this->instance->hasKey('2_value1')); + $this->assertTrue($this->instance->hasKey('3_value1')); + + $this->assertTrue($this->instance->clear()); + $this->assertFalse($this->instance->hasKey('1_value1')); + $this->assertFalse($this->instance->hasKey('1_value2')); + $this->assertFalse($this->instance->hasKey('2_value1')); + $this->assertFalse($this->instance->hasKey('3_value1')); + } +} |