diff options
author | Robin Appelman <icewind@owncloud.com> | 2013-06-07 17:12:16 +0200 |
---|---|---|
committer | Robin Appelman <icewind@owncloud.com> | 2013-06-07 17:12:16 +0200 |
commit | f35578ec54b5ce4133e668625d6a7a34bfc6b1e9 (patch) | |
tree | 6a603a3e0f2c5637529f64c90750d78e9e3e9c4f /tests | |
parent | bd675124096707a925faac2774516975ec7049c1 (diff) | |
parent | 81b6cab94fcaa5c3bc76a92d38997cd7928cb37d (diff) | |
download | nextcloud-server-f35578ec54b5ce4133e668625d6a7a34bfc6b1e9.tar.gz nextcloud-server-f35578ec54b5ce4133e668625d6a7a34bfc6b1e9.zip |
merge master into storage-wrapper
Diffstat (limited to 'tests')
-rw-r--r-- | tests/enable_all.php | 1 | ||||
-rw-r--r-- | tests/lib/backgroundjob/dummyjoblist.php | 131 | ||||
-rw-r--r-- | tests/lib/backgroundjob/queuedjob.php | 42 | ||||
-rw-r--r-- | tests/lib/backgroundjob/timedjob.php | 68 | ||||
-rw-r--r-- | tests/lib/cache/file.php | 21 | ||||
-rw-r--r-- | tests/lib/files/cache/cache.php | 129 | ||||
-rw-r--r-- | tests/lib/files/cache/watcher.php | 10 | ||||
-rw-r--r-- | tests/lib/files/filesystem.php | 2 | ||||
-rw-r--r-- | tests/lib/files/view.php | 73 | ||||
-rw-r--r-- | tests/lib/hooks/basicemitter.php | 261 | ||||
-rw-r--r-- | tests/lib/hooks/legacyemitter.php | 55 | ||||
-rw-r--r-- | tests/lib/public/contacts.php | 2 | ||||
-rw-r--r-- | tests/lib/session/memory.php | 16 | ||||
-rw-r--r-- | tests/lib/session/session.php | 64 | ||||
-rw-r--r-- | tests/lib/template.php | 7 | ||||
-rw-r--r-- | tests/lib/user/manager.php | 304 | ||||
-rw-r--r-- | tests/lib/user/session.php | 155 | ||||
-rw-r--r-- | tests/lib/user/user.php | 364 | ||||
-rw-r--r-- | tests/lib/vcategories.php | 11 | ||||
-rw-r--r-- | tests/lib/vobject.php | 19 | ||||
-rw-r--r-- | tests/phpunit-autotest.xml | 27 | ||||
-rw-r--r-- | tests/phpunit.xml | 16 |
22 files changed, 1746 insertions, 32 deletions
diff --git a/tests/enable_all.php b/tests/enable_all.php index 44af0115650..111ed0e1357 100644 --- a/tests/enable_all.php +++ b/tests/enable_all.php @@ -8,6 +8,7 @@ require_once __DIR__.'/../lib/base.php'; +OC_App::enable('files_encryption'); OC_App::enable('calendar'); OC_App::enable('contacts'); OC_App::enable('apptemplateadvanced'); diff --git a/tests/lib/backgroundjob/dummyjoblist.php b/tests/lib/backgroundjob/dummyjoblist.php new file mode 100644 index 00000000000..d91d6b344b5 --- /dev/null +++ b/tests/lib/backgroundjob/dummyjoblist.php @@ -0,0 +1,131 @@ +<?php +/** + * Copyright (c) 2013 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\BackgroundJob; + +class JobRun extends \Exception { +} + +/** + * Class DummyJobList + * + * in memory job list for testing purposes + */ +class DummyJobList extends \OC\BackgroundJob\JobList { + /** + * @var \OC\BackgroundJob\Job[] + */ + private $jobs = array(); + + private $last = 0; + + /** + * @param \OC\BackgroundJob\Job|string $job + * @param mixed $argument + */ + public function add($job, $argument = null) { + $job->setArgument($argument); + if (!$this->has($job, null)) { + $this->jobs[] = $job; + } + } + + /** + * @param \OC\BackgroundJob\Job|string $job + * @param mixed $argument + */ + public function remove($job, $argument = null) { + $index = array_search($job, $this->jobs); + if ($index !== false) { + unset($this->jobs[$index]); + } + } + + /** + * check if a job is in the list + * + * @param $job + * @param mixed $argument + * @return bool + */ + public function has($job, $argument) { + return array_search($job, $this->jobs) !== false; + } + + /** + * get all jobs in the list + * + * @return \OC\BackgroundJob\Job[] + */ + public function getAll() { + return $this->jobs; + } + + /** + * get the next job in the list + * + * @return \OC\BackgroundJob\Job + */ + public function getNext() { + if (count($this->jobs) > 0) { + if ($this->last < (count($this->jobs) - 1)) { + $i = $this->last + 1; + } else { + $i = 0; + } + return $this->jobs[$i]; + } else { + return null; + } + } + + /** + * set the job that was last ran + * + * @param \OC\BackgroundJob\Job $job + */ + public function setLastJob($job) { + $i = array_search($job, $this->jobs); + if ($i !== false) { + $this->last = $i; + } else { + $this->last = 0; + } + } + + /** + * @param int $id + * @return Job + */ + public function getById($id) { + foreach ($this->jobs as $job) { + if ($job->getId() === $id) { + return $job; + } + } + return null; + } + + /** + * get the id of the last ran job + * + * @return int + */ + public function getLastJob() { + return $this->last; + } + + /** + * set the lastRun of $job to now + * + * @param \OC\BackgroundJob\Job $job + */ + public function setLastRun($job) { + $job->setLastRun(time()); + } +} diff --git a/tests/lib/backgroundjob/queuedjob.php b/tests/lib/backgroundjob/queuedjob.php new file mode 100644 index 00000000000..1d373473cd7 --- /dev/null +++ b/tests/lib/backgroundjob/queuedjob.php @@ -0,0 +1,42 @@ +<?php +/** + * Copyright (c) 2013 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\BackgroundJob; + +class TestQueuedJob extends \OC\BackgroundJob\QueuedJob { + public function run($argument) { + throw new JobRun(); //throw an exception so we can detect if this function is called + } +} + +class QueuedJob extends \PHPUnit_Framework_TestCase { + /** + * @var DummyJobList $jobList + */ + private $jobList; + /** + * @var \OC\BackgroundJob\TimedJob $job + */ + private $job; + + public function setup() { + $this->jobList = new DummyJobList(); + $this->job = new TestQueuedJob(); + $this->jobList->add($this->job); + } + + public function testJobShouldBeRemoved() { + try { + $this->assertTrue($this->jobList->has($this->job, null)); + $this->job->execute($this->jobList); + $this->fail("job should have been run"); + } catch (JobRun $e) { + $this->assertFalse($this->jobList->has($this->job, null)); + } + } +} diff --git a/tests/lib/backgroundjob/timedjob.php b/tests/lib/backgroundjob/timedjob.php new file mode 100644 index 00000000000..0af933afef8 --- /dev/null +++ b/tests/lib/backgroundjob/timedjob.php @@ -0,0 +1,68 @@ +<?php +/** + * Copyright (c) 2013 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\BackgroundJob; + +class TestTimedJob extends \OC\BackgroundJob\TimedJob { + public function __construct() { + $this->setInterval(10); + } + + public function run($argument) { + throw new JobRun(); //throw an exception so we can detect if this function is called + } +} + +class TimedJob extends \PHPUnit_Framework_TestCase { + /** + * @var DummyJobList $jobList + */ + private $jobList; + /** + * @var \OC\BackgroundJob\TimedJob $job + */ + private $job; + + public function setup() { + $this->jobList = new DummyJobList(); + $this->job = new TestTimedJob(); + $this->jobList->add($this->job); + } + + public function testShouldRunAfterInterval() { + $this->job->setLastRun(time() - 12); + try { + $this->job->execute($this->jobList); + $this->fail("job should have run"); + } catch (JobRun $e) { + } + } + + public function testShouldNotRunWithinInterval() { + $this->job->setLastRun(time() - 5); + try { + $this->job->execute($this->jobList); + } catch (JobRun $e) { + $this->fail("job should not have run"); + } + } + + public function testShouldNotTwice() { + $this->job->setLastRun(time() - 15); + try { + $this->job->execute($this->jobList); + $this->fail("job should have run the first time"); + } catch (JobRun $e) { + try { + $this->job->execute($this->jobList); + } catch (JobRun $e) { + $this->fail("job should not have run the second time"); + } + } + } +} diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php index 5dcd3268804..038cb21b257 100644 --- a/tests/lib/cache/file.php +++ b/tests/lib/cache/file.php @@ -22,7 +22,8 @@ class Test_Cache_File extends Test_Cache { private $user; - + private $datadir; + function skip() { //$this->skipUnless(OC_User::isLoggedIn()); } @@ -31,15 +32,20 @@ class Test_Cache_File extends Test_Cache { //clear all proxies and hooks so we can do clean testing OC_FileProxy::clearProxies(); OC_Hook::clear('OC_Filesystem'); - + + //disabled atm //enable only the encryption hook if needed - if(OC_App::isEnabled('files_encryption')) { - OC_FileProxy::register(new OC_FileProxy_Encryption()); - } - + //if(OC_App::isEnabled('files_encryption')) { + // OC_FileProxy::register(new OC_FileProxy_Encryption()); + //} + //set up temporary storage \OC\Files\Filesystem::clearMounts(); - \OC\Files\Filesystem::mount('\OC\Files\Storage\Temporary',array(),'/'); + $storage = new \OC\Files\Storage\Temporary(array()); + \OC\Files\Filesystem::mount($storage,array(),'/'); + $datadir = str_replace('local::', '', $storage->getId()); + $this->datadir = OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data'); + OC_Config::setValue('datadirectory', $datadir); OC_User::clearBackends(); OC_User::useBackend(new OC_User_Dummy()); @@ -59,5 +65,6 @@ class Test_Cache_File extends Test_Cache { public function tearDown() { OC_User::setUserId($this->user); + OC_Config::setValue('datadirectory', $this->datadir); } } diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php index 4051a6e234b..f272655925b 100644 --- a/tests/lib/files/cache/cache.php +++ b/tests/lib/files/cache/cache.php @@ -8,6 +8,8 @@ namespace Test\Files\Cache; +use PHPUnit_Framework_MockObject_MockObject; + class LongId extends \OC\Files\Storage\Temporary { public function getId() { return 'long:' . str_repeat('foo', 50) . parent::getId(); @@ -19,11 +21,19 @@ class Cache extends \PHPUnit_Framework_TestCase { * @var \OC\Files\Storage\Temporary $storage; */ private $storage; + /** + * @var \OC\Files\Storage\Temporary $storage2; + */ + private $storage2; /** * @var \OC\Files\Cache\Cache $cache */ private $cache; + /** + * @var \OC\Files\Cache\Cache $cache2 + */ + private $cache2; public function testSimple() { $file1 = 'foo'; @@ -170,6 +180,13 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->cache->put($file4, $data); $this->cache->put($file5, $data); + /* simulate a second user with a different storage id but the same folder structure */ + $this->cache2->put($file1, $folderData); + $this->cache2->put($file2, $folderData); + $this->cache2->put($file3, $folderData); + $this->cache2->put($file4, $data); + $this->cache2->put($file5, $data); + $this->cache->move('folder/foo', 'folder/foobar'); $this->assertFalse($this->cache->inCache('folder/foo')); @@ -180,6 +197,16 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertTrue($this->cache->inCache('folder/foobar')); $this->assertTrue($this->cache->inCache('folder/foobar/1')); $this->assertTrue($this->cache->inCache('folder/foobar/2')); + + /* the folder structure of the second user must not change! */ + $this->assertTrue($this->cache2->inCache('folder/bar')); + $this->assertTrue($this->cache2->inCache('folder/foo')); + $this->assertTrue($this->cache2->inCache('folder/foo/1')); + $this->assertTrue($this->cache2->inCache('folder/foo/2')); + + $this->assertFalse($this->cache2->inCache('folder/foobar')); + $this->assertFalse($this->cache2->inCache('folder/foobar/1')); + $this->assertFalse($this->cache2->inCache('folder/foobar/2')); } function testGetIncomplete() { @@ -211,6 +238,23 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertEquals(array($storageId, 'foo'), \OC\Files\Cache\Cache::getById($id)); } + function testStorageMTime() { + $data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file'); + $this->cache->put('foo', $data); + $cachedData = $this->cache->get('foo'); + $this->assertEquals($data['mtime'], $cachedData['storage_mtime']);//if no storage_mtime is saved, mtime should be used + + $this->cache->put('foo', array('storage_mtime' => 30));//when setting storage_mtime, mtime is also set + $cachedData = $this->cache->get('foo'); + $this->assertEquals(30, $cachedData['storage_mtime']); + $this->assertEquals(30, $cachedData['mtime']); + + $this->cache->put('foo', array('mtime' => 25));//setting mtime does not change storage_mtime + $cachedData = $this->cache->get('foo'); + $this->assertEquals(30, $cachedData['storage_mtime']); + $this->assertEquals(25, $cachedData['mtime']); + } + function testLongId() { $storage = new LongId(array()); $cache = $storage->getCache(); @@ -220,12 +264,97 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertEquals(array(md5($storageId), 'foo'), \OC\Files\Cache\Cache::getById($id)); } + /** + * @brief this test show the bug resulting if we have no normalizer installed + */ + public function testWithoutNormalizer() { + // folder name "Schön" with U+00F6 (normalized) + $folderWith00F6 = "\x53\x63\x68\xc3\xb6\x6e"; + + // folder name "Schön" with U+0308 (un-normalized) + $folderWith0308 = "\x53\x63\x68\x6f\xcc\x88\x6e"; + + /** + * @var \OC\Files\Cache\Cache | PHPUnit_Framework_MockObject_MockObject $cacheMock + */ + $cacheMock = $this->getMock('\OC\Files\Cache\Cache', array('normalize'), array($this->storage), '', true); + + $cacheMock->expects($this->any()) + ->method('normalize') + ->will($this->returnArgument(0)); + + $data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory'); + + // put root folder + $this->assertFalse($cacheMock->get('folder')); + $this->assertGreaterThan(0, $cacheMock->put('folder', $data)); + + // put un-normalized folder + $this->assertFalse($cacheMock->get('folder/' .$folderWith0308)); + $this->assertGreaterThan(0, $cacheMock->put('folder/' .$folderWith0308, $data)); + + // get un-normalized folder by name + $unNormalizedFolderName = $cacheMock->get('folder/' .$folderWith0308); + + // check if database layer normalized the folder name (this should not happen) + $this->assertEquals($folderWith0308, $unNormalizedFolderName['name']); + + // put normalized folder + $this->assertFalse($cacheMock->get('folder/' . $folderWith00F6)); + $this->assertGreaterThan(0, $cacheMock->put('folder/' .$folderWith00F6, $data)); + + // this is our bug, we have two different hashes with the same name (Schön) + $this->assertEquals(2, count($cacheMock->getFolderContents('folder'))); + } + + /** + * @brief this test shows that there is no bug if we use the normalizer + */ + public function testWithNormalizer() { + + if(!class_exists('Patchwork\PHP\Shim\Normalizer')) { + $this->markTestSkipped('The 3rdparty Normalizer extension is not available.'); + return; + } + + // folder name "Schön" with U+00F6 (normalized) + $folderWith00F6 = "\x53\x63\x68\xc3\xb6\x6e"; + + // folder name "Schön" with U+0308 (un-normalized) + $folderWith0308 = "\x53\x63\x68\x6f\xcc\x88\x6e"; + + $data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory'); + + // put root folder + $this->assertFalse($this->cache->get('folder')); + $this->assertGreaterThan(0, $this->cache->put('folder', $data)); + + // put un-normalized folder + $this->assertFalse($this->cache->get('folder/' .$folderWith0308)); + $this->assertGreaterThan(0, $this->cache->put('folder/' .$folderWith0308, $data)); + + // get un-normalized folder by name + $unNormalizedFolderName = $this->cache->get('folder/' .$folderWith0308); + + // check if folder name was normalized + $this->assertEquals($folderWith00F6, $unNormalizedFolderName['name']); + + // put normalized folder + $this->assertTrue(is_array($this->cache->get('folder/' . $folderWith00F6))); + $this->assertGreaterThan(0, $this->cache->put('folder/' .$folderWith00F6, $data)); + + // at this point we should have only one folder named "Schön" + $this->assertEquals(1, count($this->cache->getFolderContents('folder'))); + } + public function tearDown() { $this->cache->clear(); } public function setUp() { $this->storage = new \OC\Files\Storage\Temporary(array()); + $this->storage2 = new \OC\Files\Storage\Temporary(array()); $this->cache = new \OC\Files\Cache\Cache($this->storage); + $this->cache2 = new \OC\Files\Cache\Cache($this->storage2); } } diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php index 8ef6ab44d10..e43c86ed438 100644 --- a/tests/lib/files/cache/watcher.php +++ b/tests/lib/files/cache/watcher.php @@ -35,7 +35,7 @@ class Watcher extends \PHPUnit_Framework_TestCase { $updater = $storage->getWatcher(); //set the mtime to the past so it can detect an mtime change - $cache->put('', array('mtime' => 10)); + $cache->put('', array('storage_mtime' => 10)); $this->assertTrue($cache->inCache('folder/bar.txt')); $this->assertTrue($cache->inCache('folder/bar2.txt')); @@ -47,14 +47,14 @@ class Watcher extends \PHPUnit_Framework_TestCase { $cachedData = $cache->get('bar.test'); $this->assertEquals(3, $cachedData['size']); - $cache->put('bar.test', array('mtime' => 10)); + $cache->put('bar.test', array('storage_mtime' => 10)); $storage->file_put_contents('bar.test', 'test data'); $updater->checkUpdate('bar.test'); $cachedData = $cache->get('bar.test'); $this->assertEquals(9, $cachedData['size']); - $cache->put('folder', array('mtime' => 10)); + $cache->put('folder', array('storage_mtime' => 10)); $storage->unlink('folder/bar2.txt'); $updater->checkUpdate('folder'); @@ -69,7 +69,7 @@ class Watcher extends \PHPUnit_Framework_TestCase { $updater = $storage->getWatcher(); //set the mtime to the past so it can detect an mtime change - $cache->put('', array('mtime' => 10)); + $cache->put('', array('storage_mtime' => 10)); $storage->unlink('foo.txt'); $storage->rename('folder', 'foo.txt'); @@ -85,7 +85,7 @@ class Watcher extends \PHPUnit_Framework_TestCase { $updater = $storage->getWatcher(); //set the mtime to the past so it can detect an mtime change - $cache->put('foo.txt', array('mtime' => 10)); + $cache->put('foo.txt', array('storage_mtime' => 10)); $storage->unlink('foo.txt'); $storage->rename('folder', 'foo.txt'); diff --git a/tests/lib/files/filesystem.php b/tests/lib/files/filesystem.php index 6ce45e6178a..bef70cc725b 100644 --- a/tests/lib/files/filesystem.php +++ b/tests/lib/files/filesystem.php @@ -72,7 +72,7 @@ class Filesystem extends \PHPUnit_Framework_TestCase { $this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('\path')); $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo//bar/')); $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo////bar')); - if (class_exists('Normalizer')) { + if (class_exists('Patchwork\PHP\Shim\Normalizer')) { $this->assertEquals("/foo/bar\xC3\xBC", \OC\Files\Filesystem::normalizePath("/foo/baru\xCC\x88")); } } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index a064e44f3ef..01f9a9cca11 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -7,6 +7,12 @@ namespace Test\Files; +class TemporaryNoTouch extends \OC\Files\Storage\Temporary { + public function touch($path, $mtime = null) { + return false; + } +} + class View extends \PHPUnit_Framework_TestCase { /** * @var \OC\Files\Storage\Storage[] $storages; @@ -220,7 +226,7 @@ class View extends \PHPUnit_Framework_TestCase { $cachedData = $rootView->getFileInfo('foo.txt'); $this->assertEquals(16, $cachedData['size']); - $rootView->putFileInfo('foo.txt', array('mtime' => 10)); + $rootView->putFileInfo('foo.txt', array('storage_mtime' => 10)); $storage1->file_put_contents('foo.txt', 'foo'); clearstatcache(); @@ -228,12 +234,73 @@ class View extends \PHPUnit_Framework_TestCase { $this->assertEquals(3, $cachedData['size']); } + function testCopyBetweenStorages() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->mkdir('substorage/emptyfolder'); + $rootView->copy('substorage', 'anotherfolder'); + $this->assertTrue($rootView->is_dir('/anotherfolder')); + $this->assertTrue($rootView->is_dir('/substorage')); + $this->assertTrue($rootView->is_dir('/anotherfolder/emptyfolder')); + $this->assertTrue($rootView->is_dir('/substorage/emptyfolder')); + $this->assertTrue($rootView->file_exists('/anotherfolder/foo.txt')); + $this->assertTrue($rootView->file_exists('/anotherfolder/foo.png')); + $this->assertTrue($rootView->file_exists('/anotherfolder/folder/bar.txt')); + $this->assertTrue($rootView->file_exists('/substorage/foo.txt')); + $this->assertTrue($rootView->file_exists('/substorage/foo.png')); + $this->assertTrue($rootView->file_exists('/substorage/folder/bar.txt')); + } + + function testMoveBetweenStorages() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->rename('foo.txt', 'substorage/folder/foo.txt'); + $this->assertFalse($rootView->file_exists('foo.txt')); + $this->assertTrue($rootView->file_exists('substorage/folder/foo.txt')); + $rootView->rename('substorage/folder', 'anotherfolder'); + $this->assertFalse($rootView->is_dir('substorage/folder')); + $this->assertTrue($rootView->file_exists('anotherfolder/foo.txt')); + $this->assertTrue($rootView->file_exists('anotherfolder/bar.txt')); + } + + function testTouch() { + $storage = $this->getTestStorage(true, '\Test\Files\TemporaryNoTouch'); + + \OC\Files\Filesystem::mount($storage, array(), '/'); + + $rootView = new \OC\Files\View(''); + $oldCachedData = $rootView->getFileInfo('foo.txt'); + + $rootView->touch('foo.txt', 500); + + $cachedData = $rootView->getFileInfo('foo.txt'); + $this->assertEquals(500, $cachedData['mtime']); + $this->assertEquals($oldCachedData['storage_mtime'], $cachedData['storage_mtime']); + + $rootView->putFileInfo('foo.txt', array('storage_mtime' => 1000)); //make sure the watcher detects the change + $rootView->file_put_contents('foo.txt', 'asd'); + $cachedData = $rootView->getFileInfo('foo.txt'); + $this->assertGreaterThanOrEqual($cachedData['mtime'], $oldCachedData['mtime']); + $this->assertEquals($cachedData['storage_mtime'], $cachedData['mtime']); + } + /** * @param bool $scan * @return \OC\Files\Storage\Storage */ - private function getTestStorage($scan = true) { - $storage = new \OC\Files\Storage\Temporary(array()); + private function getTestStorage($scan = true, $class = '\OC\Files\Storage\Temporary') { + /** + * @var \OC\Files\Storage\Storage $storage + */ + $storage = new $class(array()); $textData = "dummy file data\n"; $imgData = file_get_contents(\OC::$SERVERROOT . '/core/img/logo.png'); $storage->mkdir('folder'); diff --git a/tests/lib/hooks/basicemitter.php b/tests/lib/hooks/basicemitter.php new file mode 100644 index 00000000000..f48dc53c563 --- /dev/null +++ b/tests/lib/hooks/basicemitter.php @@ -0,0 +1,261 @@ +<?php +/** + * Copyright (c) 2013 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\Hooks; + +/** + * Class DummyEmitter + * + * class to make BasicEmitter::emit publicly available + * + * @package Test\Hooks + */ +class DummyEmitter extends \OC\Hooks\BasicEmitter { + public function emitEvent($scope, $method, $arguments = array()) { + $this->emit($scope, $method, $arguments); + } +} + +/** + * Class EmittedException + * + * a dummy exception so we can check if an event is emitted + * + * @package Test\Hooks + */ +class EmittedException extends \Exception { +} + +class BasicEmitter extends \PHPUnit_Framework_TestCase { + /** + * @var \OC\Hooks\Emitter $emitter + */ + protected $emitter; + + public function setUp() { + $this->emitter = new DummyEmitter(); + } + + public function nonStaticCallBack() { + throw new EmittedException; + } + + public static function staticCallBack() { + throw new EmittedException; + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testAnonymousFunction() { + $this->emitter->listen('Test', 'test', function () { + throw new EmittedException; + }); + $this->emitter->emitEvent('Test', 'test'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testStaticCallback() { + $this->emitter->listen('Test', 'test', array('\Test\Hooks\BasicEmitter', 'staticCallBack')); + $this->emitter->emitEvent('Test', 'test'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testNonStaticCallback() { + $this->emitter->listen('Test', 'test', array($this, 'nonStaticCallBack')); + $this->emitter->emitEvent('Test', 'test'); + } + + public function testOnlyCallOnce() { + $count = 0; + $listener = function () use (&$count) { + $count++; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->assertEquals(1, $count, 'Listener called an invalid number of times (' . $count . ') expected 1'); + } + + public function testDifferentMethods() { + $count = 0; + $listener = function () use (&$count) { + $count++; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Test', 'foo', $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->emitter->emitEvent('Test', 'foo'); + $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); + } + + public function testDifferentScopes() { + $count = 0; + $listener = function () use (&$count) { + $count++; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Bar', 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->emitter->emitEvent('Bar', 'test'); + $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); + } + + public function testDifferentCallbacks() { + $count = 0; + $listener1 = function () use (&$count) { + $count++; + }; + $listener2 = function () use (&$count) { + $count++; + }; + $this->emitter->listen('Test', 'test', $listener1); + $this->emitter->listen('Test', 'test', $listener2); + $this->emitter->emitEvent('Test', 'test'); + $this->assertEquals(2, $count, 'Listener called an invalid number of times (' . $count . ') expected 2'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testArguments() { + $this->emitter->listen('Test', 'test', function ($foo, $bar) { + if ($foo == 'foo' and $bar == 'bar') { + throw new EmittedException; + } + }); + $this->emitter->emitEvent('Test', 'test', array('foo', 'bar')); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testNamedArguments() { + $this->emitter->listen('Test', 'test', function ($foo, $bar) { + if ($foo == 'foo' and $bar == 'bar') { + throw new EmittedException; + } + }); + $this->emitter->emitEvent('Test', 'test', array('foo' => 'foo', 'bar' => 'bar')); + } + + public function testRemoveAllSpecified() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->removeListener('Test', 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + } + + public function testRemoveWildcardListener() { + $listener1 = function () { + throw new EmittedException; + }; + $listener2 = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener1); + $this->emitter->listen('Test', 'test', $listener2); + $this->emitter->removeListener('Test', 'test'); + $this->emitter->emitEvent('Test', 'test'); + } + + public function testRemoveWildcardMethod() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Test', 'foo', $listener); + $this->emitter->removeListener('Test', null, $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->emitter->emitEvent('Test', 'foo'); + } + + public function testRemoveWildcardScope() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Bar', 'test', $listener); + $this->emitter->removeListener(null, 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->emitter->emitEvent('Bar', 'test'); + } + + public function testRemoveWildcardScopeAndMethod() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Test', 'foo', $listener); + $this->emitter->listen('Bar', 'foo', $listener); + $this->emitter->removeListener(null, null, $listener); + $this->emitter->emitEvent('Test', 'test'); + $this->emitter->emitEvent('Test', 'foo'); + $this->emitter->emitEvent('Bar', 'foo'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testRemoveKeepOtherCallback() { + $listener1 = function () { + throw new EmittedException; + }; + $listener2 = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener1); + $this->emitter->listen('Test', 'test', $listener2); + $this->emitter->removeListener('Test', 'test', $listener1); + $this->emitter->emitEvent('Test', 'test'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testRemoveKeepOtherMethod() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Test', 'foo', $listener); + $this->emitter->removeListener('Test', 'foo', $listener); + $this->emitter->emitEvent('Test', 'test'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testRemoveKeepOtherScope() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->listen('Bar', 'test', $listener); + $this->emitter->removeListener('Bar', 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + } + + /** + * @expectedException \Test\Hooks\EmittedException + */ + public function testRemoveNonExistingName() { + $listener = function () { + throw new EmittedException; + }; + $this->emitter->listen('Test', 'test', $listener); + $this->emitter->removeListener('Bar', 'test', $listener); + $this->emitter->emitEvent('Test', 'test'); + } +} diff --git a/tests/lib/hooks/legacyemitter.php b/tests/lib/hooks/legacyemitter.php new file mode 100644 index 00000000000..a7bed879a72 --- /dev/null +++ b/tests/lib/hooks/legacyemitter.php @@ -0,0 +1,55 @@ +<?php +/** + * Copyright (c) 2013 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\Hooks; + +/** + * Class DummyLegacyEmitter + * + * class to make LegacyEmitter::emit publicly available + * + * @package Test\Hooks + */ +class DummyLegacyEmitter extends \OC\Hooks\LegacyEmitter { + public function emitEvent($scope, $method, $arguments = array()) { + $this->emit($scope, $method, $arguments); + } +} + +class LegacyEmitter extends BasicEmitter { + + //we can't use exceptions here since OC_Hooks catches all exceptions + private static $emitted = false; + + public function setUp() { + $this->emitter = new DummyLegacyEmitter(); + self::$emitted = false; + \OC_Hook::clear('Test','test'); + } + + public static function staticLegacyCallBack() { + self::$emitted = true; + } + + public static function staticLegacyArgumentsCallBack($arguments) { + if ($arguments['foo'] == 'foo' and $arguments['bar'] == 'bar') + self::$emitted = true; + } + + public function testLegacyHook() { + \OC_Hook::connect('Test', 'test', '\Test\Hooks\LegacyEmitter', 'staticLegacyCallBack'); + $this->emitter->emitEvent('Test', 'test'); + $this->assertEquals(true, self::$emitted); + } + + public function testLegacyArguments() { + \OC_Hook::connect('Test', 'test', '\Test\Hooks\LegacyEmitter', 'staticLegacyArgumentsCallBack'); + $this->emitter->emitEvent('Test', 'test', array('foo' => 'foo', 'bar' => 'bar')); + $this->assertEquals(true, self::$emitted); + } +} diff --git a/tests/lib/public/contacts.php b/tests/lib/public/contacts.php index ce5d762226b..d6008876a00 100644 --- a/tests/lib/public/contacts.php +++ b/tests/lib/public/contacts.php @@ -19,8 +19,6 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. */ -OC::autoload('OCP\Contacts'); - class Test_Contacts extends PHPUnit_Framework_TestCase { diff --git a/tests/lib/session/memory.php b/tests/lib/session/memory.php new file mode 100644 index 00000000000..2dc236b73bf --- /dev/null +++ b/tests/lib/session/memory.php @@ -0,0 +1,16 @@ +<?php + +/** + * Copyright (c) 2013 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\Session; + +class Memory extends Session { + public function setUp() { + $this->instance = new \OC\Session\Memory(uniqid()); + } +} diff --git a/tests/lib/session/session.php b/tests/lib/session/session.php new file mode 100644 index 00000000000..72dee44e7cb --- /dev/null +++ b/tests/lib/session/session.php @@ -0,0 +1,64 @@ +<?php + +/** + * Copyright (c) 2013 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\Session; + +abstract class Session extends \PHPUnit_Framework_TestCase { + /** + * @var \OC\Session\Session + */ + protected $instance; + + public function tearDown() { + $this->instance->clear(); + } + + public function testNotExistsEmpty() { + $this->assertFalse($this->instance->exists('foo')); + } + + public function testExistsAfterSet() { + $this->instance->set('foo', 1); + $this->assertTrue($this->instance->exists('foo')); + } + + public function testNotExistsAfterRemove() { + $this->instance->set('foo', 1); + $this->instance->remove('foo'); + $this->assertFalse($this->instance->exists('foo')); + } + + public function testGetNonExisting() { + $this->assertNull($this->instance->get('foo')); + } + + public function testGetAfterSet() { + $this->instance->set('foo', 'bar'); + $this->assertEquals('bar', $this->instance->get(('foo'))); + } + + public function testRemoveNonExisting() { + $this->instance->remove('foo'); + } + + public function testNotExistsAfterClear() { + $this->instance->set('foo', 1); + $this->instance->clear(); + $this->assertFalse($this->instance->exists('foo')); + } + + public function testArrayInterface() { + $this->assertFalse(isset($this->instance['foo'])); + $this->instance['foo'] = 'bar'; + $this->assertTrue(isset($this->instance['foo'])); + $this->assertEquals('bar', $this->instance['foo']); + unset($this->instance['foo']); + $this->assertFalse(isset($this->instance['foo'])); + } +} diff --git a/tests/lib/template.php b/tests/lib/template.php index 6e88d4c07fc..fd12119da58 100644 --- a/tests/lib/template.php +++ b/tests/lib/template.php @@ -20,10 +20,13 @@ * */ -OC::autoload('OC_Template'); - class Test_TemplateFunctions extends PHPUnit_Framework_TestCase { + public function setUp() { + $loader = new \OC\Autoloader(); + $loader->load('OC_Template'); + } + public function testP() { // FIXME: do we need more testcases? $htmlString = "<script>alert('xss');</script>"; diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php new file mode 100644 index 00000000000..bc49f6db4b2 --- /dev/null +++ b/tests/lib/user/manager.php @@ -0,0 +1,304 @@ +<?php + +/** + * Copyright (c) 2013 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\User; + +class Manager extends \PHPUnit_Framework_TestCase { + public function testUserExistsSingleBackendExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $this->assertTrue($manager->userExists('foo')); + } + + public function testUserExistsSingleBackendNotExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $this->assertFalse($manager->userExists('foo')); + } + + public function testUserExistsNoBackends() { + $manager = new \OC\User\Manager(); + + $this->assertFalse($manager->userExists('foo')); + } + + public function testUserExistsTwoBackendsSecondExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + */ + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $this->assertTrue($manager->userExists('foo')); + } + + public function testUserExistsTwoBackendsFirstExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + */ + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->never()) + ->method('userExists'); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $this->assertTrue($manager->userExists('foo')); + } + + public function testGetOneBackendExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $this->assertEquals('foo', $manager->get('foo')->getUID()); + } + + public function testGetOneBackendNotExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $this->assertEquals(null, $manager->get('foo')); + } + + public function testSearchOneBackend() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('getUsers') + ->with($this->equalTo('fo')) + ->will($this->returnValue(array('foo', 'afoo'))); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $result = $manager->search('fo'); + $this->assertEquals(2, count($result)); + $this->assertEquals('afoo', $result[0]->getUID()); + $this->assertEquals('foo', $result[1]->getUID()); + } + + public function testSearchTwoBackendLimitOffset() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->once()) + ->method('getUsers') + ->with($this->equalTo('fo'), $this->equalTo(3), $this->equalTo(1)) + ->will($this->returnValue(array('foo1', 'foo2'))); + + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + */ + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->once()) + ->method('getUsers') + ->with($this->equalTo('fo'), $this->equalTo(1), $this->equalTo(0)) + ->will($this->returnValue(array('foo3'))); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $result = $manager->search('fo', 3, 1); + $this->assertEquals(3, count($result)); + $this->assertEquals('foo1', $result[0]->getUID()); + $this->assertEquals('foo2', $result[1]->getUID()); + $this->assertEquals('foo3', $result[2]->getUID()); + } + + public function testCreateUserSingleBackendNotExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(true)); + + $backend->expects($this->once()) + ->method('createUser') + ->with($this->equalTo('foo'), $this->equalTo('bar')); + + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $user = $manager->createUser('foo', 'bar'); + $this->assertEquals('foo', $user->getUID()); + } + + /** + * @expectedException \Exception + */ + public function testCreateUserSingleBackendExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(true)); + + $backend->expects($this->never()) + ->method('createUser'); + + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $manager->createUser('foo', 'bar'); + } + + public function testCreateUserSingleBackendNotSupported() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $backend->expects($this->never()) + ->method('createUser'); + + $backend->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $this->assertFalse($manager->createUser('foo', 'bar')); + } + + public function testCreateUserNoBackends() { + $manager = new \OC\User\Manager(); + + $this->assertFalse($manager->createUser('foo', 'bar')); + } + + /** + * @expectedException \Exception + */ + public function testCreateUserTwoBackendExists() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend1 + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(true)); + + $backend1->expects($this->never()) + ->method('createUser'); + + $backend1->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(false)); + + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend2 + */ + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(true)); + + $backend2->expects($this->never()) + ->method('createUser'); + + $backend2->expects($this->once()) + ->method('userExists') + ->with($this->equalTo('foo')) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $manager->createUser('foo', 'bar'); + } +} diff --git a/tests/lib/user/session.php b/tests/lib/user/session.php new file mode 100644 index 00000000000..274e9e2831e --- /dev/null +++ b/tests/lib/user/session.php @@ -0,0 +1,155 @@ +<?php + +/** + * Copyright (c) 2013 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\User; + +class Session extends \PHPUnit_Framework_TestCase { + public function testGetUser() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->once()) + ->method('get') + ->with('user_id') + ->will($this->returnValue('foo')); + + $backend = $this->getMock('OC_User_Dummy'); + $backend->expects($this->once()) + ->method('userExists') + ->with('foo') + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $userSession = new \OC\User\Session($manager, $session); + $user = $userSession->getUser(); + $this->assertEquals('foo', $user->getUID()); + } + + public function testSetUser() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->once()) + ->method('set') + ->with('user_id', 'foo'); + + $manager = $this->getMock('\OC\User\Manager'); + + $backend = $this->getMock('OC_User_Dummy'); + + $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('foo')); + + $userSession = new \OC\User\Session($manager, $session); + $userSession->setUser($user); + } + + public function testLoginValidPasswordEnabled() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->once()) + ->method('set') + ->with('user_id', 'foo'); + + $manager = $this->getMock('\OC\User\Manager'); + + $backend = $this->getMock('OC_User_Dummy'); + + $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); + $user->expects($this->once()) + ->method('checkPassword') + ->with('bar') + ->will($this->returnValue(true)); + $user->expects($this->once()) + ->method('isEnabled') + ->will($this->returnValue(true)); + $user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue('foo')); + + $manager->expects($this->once()) + ->method('get') + ->with('foo') + ->will($this->returnValue($user)); + + $userSession = new \OC\User\Session($manager, $session); + $userSession->login('foo', 'bar'); + $this->assertEquals($user, $userSession->getUser()); + } + + public function testLoginValidPasswordDisabled() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->never()) + ->method('set'); + + $manager = $this->getMock('\OC\User\Manager'); + + $backend = $this->getMock('OC_User_Dummy'); + + $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); + $user->expects($this->once()) + ->method('checkPassword') + ->with('bar') + ->will($this->returnValue(true)); + $user->expects($this->once()) + ->method('isEnabled') + ->will($this->returnValue(false)); + + $manager->expects($this->once()) + ->method('get') + ->with('foo') + ->will($this->returnValue($user)); + + $userSession = new \OC\User\Session($manager, $session); + $userSession->login('foo', 'bar'); + } + + public function testLoginInValidPassword() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->never()) + ->method('set'); + + $manager = $this->getMock('\OC\User\Manager'); + + $backend = $this->getMock('OC_User_Dummy'); + + $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); + $user->expects($this->once()) + ->method('checkPassword') + ->with('bar') + ->will($this->returnValue(false)); + $user->expects($this->never()) + ->method('isEnabled'); + + $manager->expects($this->once()) + ->method('get') + ->with('foo') + ->will($this->returnValue($user)); + + $userSession = new \OC\User\Session($manager, $session); + $userSession->login('foo', 'bar'); + } + + public function testLoginNonExisting() { + $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $session->expects($this->never()) + ->method('set'); + + $manager = $this->getMock('\OC\User\Manager'); + + $backend = $this->getMock('OC_User_Dummy'); + + $manager->expects($this->once()) + ->method('get') + ->with('foo') + ->will($this->returnValue(null)); + + $userSession = new \OC\User\Session($manager, $session); + $userSession->login('foo', 'bar'); + } +} diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php new file mode 100644 index 00000000000..b0d170cbfc5 --- /dev/null +++ b/tests/lib/user/user.php @@ -0,0 +1,364 @@ +<?php + +/** + * Copyright (c) 2013 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\User; + +use OC\Hooks\PublicEmitter; + +class User extends \PHPUnit_Framework_TestCase { + public function testDisplayName() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Backend'); + $backend->expects($this->once()) + ->method('getDisplayName') + ->with($this->equalTo('foo')) + ->will($this->returnValue('Foo')); + + $backend->expects($this->any()) + ->method('implementsActions') + ->with($this->equalTo(\OC_USER_BACKEND_GET_DISPLAYNAME)) + ->will($this->returnValue(true)); + + $user = new \OC\User\User('foo', $backend); + $this->assertEquals('Foo', $user->getDisplayName()); + } + + public function testDisplayNameNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Backend'); + $backend->expects($this->never()) + ->method('getDisplayName'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->with($this->equalTo(\OC_USER_BACKEND_GET_DISPLAYNAME)) + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertEquals('foo', $user->getDisplayName()); + } + + public function testSetPassword() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('setPassword') + ->with($this->equalTo('foo'), $this->equalTo('bar')); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_SET_PASSWORD) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->setPassword('bar','')); + } + + public function testSetPasswordNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->never()) + ->method('setPassword'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertFalse($user->setPassword('bar','')); + } + + public function testDelete() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('deleteUser') + ->with($this->equalTo('foo')); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->delete()); + } + + public function testCheckPassword() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('checkPassword') + ->with($this->equalTo('foo'), $this->equalTo('bar')) + ->will($this->returnValue(true)); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_CHECK_PASSWORD) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->checkPassword('bar')); + } + + public function testCheckPasswordNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->never()) + ->method('checkPassword'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertFalse($user->checkPassword('bar')); + } + + public function testGetHome() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('getHome') + ->with($this->equalTo('foo')) + ->will($this->returnValue('/home/foo')); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_GET_HOME) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend); + $this->assertEquals('/home/foo', $user->getHome()); + } + + public function testGetHomeNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->never()) + ->method('getHome'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertEquals(\OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/foo', $user->getHome()); + } + + public function testCanChangePassword() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_SET_PASSWORD) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->canChangePassword()); + } + + public function testCanChangePasswordNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertFalse($user->canChangePassword()); + } + + public function testCanChangeDisplayName() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_SET_DISPLAYNAME) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->canChangeDisplayName()); + } + + public function testCanChangeDisplayNameNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnValue(false)); + + $user = new \OC\User\User('foo', $backend); + $this->assertFalse($user->canChangeDisplayName()); + } + + public function testSetDisplayNameSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Database'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_SET_DISPLAYNAME) { + return true; + } else { + return false; + } + })); + + $backend->expects($this->once()) + ->method('setDisplayName') + ->with('foo','Foo'); + + $user = new \OC\User\User('foo', $backend); + $this->assertTrue($user->setDisplayName('Foo')); + $this->assertEquals('Foo',$user->getDisplayName()); + } + + public function testSetDisplayNameNotSupported() { + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Database'); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + return false; + })); + + $backend->expects($this->never()) + ->method('setDisplayName'); + + $user = new \OC\User\User('foo', $backend); + $this->assertFalse($user->setDisplayName('Foo')); + $this->assertEquals('foo',$user->getDisplayName()); + } + + public function testSetPasswordHooks() { + $hooksCalled = 0; + $test = $this; + + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('setPassword'); + + /** + * @param \OC\User\User $user + * @param string $password + */ + $hook = function ($user, $password) use ($test, &$hooksCalled) { + $hooksCalled++; + $test->assertEquals('foo', $user->getUID()); + $test->assertEquals('bar', $password); + }; + + $emitter = new PublicEmitter(); + $emitter->listen('\OC\User', 'preSetPassword', $hook); + $emitter->listen('\OC\User', 'postSetPassword', $hook); + + $backend->expects($this->any()) + ->method('implementsActions') + ->will($this->returnCallback(function ($actions) { + if ($actions === \OC_USER_BACKEND_SET_PASSWORD) { + return true; + } else { + return false; + } + })); + + $user = new \OC\User\User('foo', $backend, $emitter); + + $user->setPassword('bar',''); + $this->assertEquals(2, $hooksCalled); + } + + public function testDeleteHooks() { + $hooksCalled = 0; + $test = $this; + + /** + * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('deleteUser'); + + /** + * @param \OC\User\User $user + */ + $hook = function ($user) use ($test, &$hooksCalled) { + $hooksCalled++; + $test->assertEquals('foo', $user->getUID()); + }; + + $emitter = new PublicEmitter(); + $emitter->listen('\OC\User', 'preDelete', $hook); + $emitter->listen('\OC\User', 'postDelete', $hook); + + $user = new \OC\User\User('foo', $backend, $emitter); + $this->assertTrue($user->delete()); + $this->assertEquals(2, $hooksCalled); + } +} diff --git a/tests/lib/vcategories.php b/tests/lib/vcategories.php index e79dd49870c..df5f600f20d 100644 --- a/tests/lib/vcategories.php +++ b/tests/lib/vcategories.php @@ -81,6 +81,17 @@ class Test_VCategories extends PHPUnit_Framework_TestCase { } + public function testrenameCategory() { + $defcategories = array('Friends', 'Family', 'Wrok', 'Other'); + $catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories); + + $this->assertTrue($catmgr->rename('Wrok', 'Work')); + $this->assertTrue($catmgr->hasCategory('Work')); + $this->assertFalse($catmgr->hasCategory('Wrok')); + $this->assertFalse($catmgr->rename('Wrok', 'Work')); + + } + public function testAddToCategory() { $objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9); diff --git a/tests/lib/vobject.php b/tests/lib/vobject.php index 1103a4b3297..f28d22a1fcd 100644 --- a/tests/lib/vobject.php +++ b/tests/lib/vobject.php @@ -10,10 +10,29 @@ class Test_VObject extends PHPUnit_Framework_TestCase { public function setUp() { Sabre\VObject\Property::$classMap['SUMMARY'] = 'OC\VObject\StringProperty'; + Sabre\VObject\Property::$classMap['ORG'] = 'OC\VObject\CompoundProperty'; } function testStringProperty() { $property = Sabre\VObject\Property::create('SUMMARY', 'Escape;this,please'); $this->assertEquals("SUMMARY:Escape\;this\,please\r\n", $property->serialize()); } + + function testCompoundProperty() { + + $arr = array( + 'ABC, Inc.', + 'North American Division', + 'Marketing;Sales', + ); + + $property = Sabre\VObject\Property::create('ORG'); + $property->setParts($arr); + + $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $property->value); + $this->assertEquals('ORG:ABC\, Inc.;North American Division;Marketing\;Sales' . "\r\n", $property->serialize()); + $this->assertEquals(3, count($property->getParts())); + $parts = $property->getParts(); + $this->assertEquals('Marketing;Sales', $parts[2]); + } }
\ No newline at end of file diff --git a/tests/phpunit-autotest.xml b/tests/phpunit-autotest.xml index 23cd123edc6..e9ee7d8d70d 100644 --- a/tests/phpunit-autotest.xml +++ b/tests/phpunit-autotest.xml @@ -5,10 +5,25 @@ <file>apps.php</file> </testsuite> <!-- filters for code coverage --> - <whitelist processUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">..</directory> - <exclude> - <directory suffix=".php">../3rdparty</directory> - </exclude> - </whitelist> + <filter> + <!-- whitelist processUncoveredFilesFromWhitelist="true" --> + <whitelist> + <directory suffix=".php">..</directory> + <exclude> + <directory suffix=".php">../3rdparty</directory> + <directory suffix=".php">../apps/files/l10n</directory> + <directory suffix=".php">../apps/files_external/l10n</directory> + <directory suffix=".php">../apps/files_external/3rdparty</directory> + <directory suffix=".php">../apps/files_versions/l10n</directory> + <directory suffix=".php">../apps/files_encryption/l10n</directory> + <directory suffix=".php">../apps/files_encryption/3rdparty</directory> + <directory suffix=".php">../apps/files_sharing/l10n</directory> + <directory suffix=".php">../apps/files_trashbin/l10n</directory> + <directory suffix=".php">../apps/user_ldap/l10n</directory> + <directory suffix=".php">../apps/user_webdavauth/l10n</directory> + <directory suffix=".php">../lib/MDB2</directory> + </exclude> + </whitelist> + </filter> </phpunit> + diff --git a/tests/phpunit.xml b/tests/phpunit.xml index f5a686c3020..510c38a3c8b 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -5,12 +5,16 @@ <file>apps.php</file> </testsuite> <!-- filters for code coverage --> - <whitelist processUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">..</directory> - <exclude> - <directory suffix=".php">../3rdparty</directory> - </exclude> - </whitelist> + <filter> + <!-- whitelist processUncoveredFilesFromWhitelist="true" --> + <whitelist> + <directory suffix=".php">..</directory> + <exclude> + <directory suffix=".php">../3rdparty</directory> + <directory suffix=".php">../lib/MDB2</directory> + </exclude> + </whitelist> + </filter> <listeners> <listener class="PHPUnit_Util_Log_JSON"></listener> </listeners> |