aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Files/Utils/ScannerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Files/Utils/ScannerTest.php')
-rw-r--r--tests/lib/Files/Utils/ScannerTest.php190
1 files changed, 190 insertions, 0 deletions
diff --git a/tests/lib/Files/Utils/ScannerTest.php b/tests/lib/Files/Utils/ScannerTest.php
new file mode 100644
index 00000000000..0c8e41c24c7
--- /dev/null
+++ b/tests/lib/Files/Utils/ScannerTest.php
@@ -0,0 +1,190 @@
+<?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\Files\Utils;
+
+use OC\Files\Filesystem;
+use OC\Files\Mount\MountPoint;
+use OC\Files\Storage\Temporary;
+use OCP\Files\Storage\IStorageFactory;
+use OCP\IUser;
+
+class TestScanner extends \OC\Files\Utils\Scanner {
+ /**
+ * @var \OC\Files\Mount\MountPoint[] $mounts
+ */
+ private $mounts = array();
+
+ /**
+ * @param \OC\Files\Mount\MountPoint $mount
+ */
+ public function addMount($mount) {
+ $this->mounts[] = $mount;
+ }
+
+ protected function getMounts($dir) {
+ return $this->mounts;
+ }
+}
+
+/**
+ * Class ScannerTest
+ *
+ * @group DB
+ *
+ * @package Test\Files\Utils
+ */
+class ScannerTest extends \Test\TestCase {
+ /**
+ * @var \Test\Util\User\Dummy
+ */
+ private $userBackend;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->userBackend = new \Test\Util\User\Dummy();
+ \OC::$server->getUserManager()->registerBackend($this->userBackend);
+ $this->loginAsUser();
+ }
+
+ protected function tearDown() {
+ $this->logout();
+ \OC::$server->getUserManager()->removeBackend($this->userBackend);
+ parent::tearDown();
+ }
+
+ public function testReuseExistingRoot() {
+ $storage = new Temporary(array());
+ $mount = new MountPoint($storage, '');
+ Filesystem::getMountManager()->addMount($mount);
+ $cache = $storage->getCache();
+
+ $storage->mkdir('folder');
+ $storage->file_put_contents('foo.txt', 'qwerty');
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->addMount($mount);
+
+ $scanner->scan('');
+ $this->assertTrue($cache->inCache('folder/bar.txt'));
+ $oldRoot = $cache->get('');
+
+ $scanner->scan('');
+ $newRoot = $cache->get('');
+ $this->assertEquals($oldRoot, $newRoot);
+ }
+
+ public function testReuseExistingFile() {
+ $storage = new Temporary(array());
+ $mount = new MountPoint($storage, '');
+ Filesystem::getMountManager()->addMount($mount);
+ $cache = $storage->getCache();
+
+ $storage->mkdir('folder');
+ $storage->file_put_contents('foo.txt', 'qwerty');
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->addMount($mount);
+
+ $scanner->scan('');
+ $this->assertTrue($cache->inCache('folder/bar.txt'));
+ $old = $cache->get('folder/bar.txt');
+
+ $scanner->scan('');
+ $new = $cache->get('folder/bar.txt');
+ $this->assertEquals($old, $new);
+ }
+
+ public function testScanSubMount() {
+ $uid = $this->getUniqueID();
+ $this->userBackend->createUser($uid, 'test');
+
+ $mountProvider = $this->getMock('\OCP\Files\Config\IMountProvider');
+
+ $storage = new Temporary(array());
+ $mount = new MountPoint($storage, '/' . $uid . '/files/foo');
+
+ $mountProvider->expects($this->any())
+ ->method('getMountsForUser')
+ ->will($this->returnCallback(function (IUser $user, IStorageFactory $storageFactory) use ($mount, $uid) {
+ if ($user->getUID() === $uid) {
+ return [$mount];
+ } else {
+ return [];
+ }
+ }));
+
+ \OC::$server->getMountProviderCollection()->registerProvider($mountProvider);
+ $cache = $storage->getCache();
+
+ $storage->mkdir('folder');
+ $storage->file_put_contents('foo.txt', 'qwerty');
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+
+ $scanner = new \OC\Files\Utils\Scanner($uid, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+
+ $this->assertFalse($cache->inCache('folder/bar.txt'));
+ $scanner->scan('/' . $uid . '/files/foo');
+ $this->assertTrue($cache->inCache('folder/bar.txt'));
+ }
+
+ /**
+ * @return array
+ */
+ public function invalidPathProvider() {
+ return [
+ [
+ '../',
+ ],
+ [
+ '..\\',
+ ],
+ [
+ '../..\\../',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider invalidPathProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Invalid path to scan
+ * @param string $invalidPath
+ */
+ public function testInvalidPathScanning($invalidPath) {
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->scan($invalidPath);
+ }
+
+ public function testPropagateEtag() {
+ $storage = new Temporary(array());
+ $mount = new MountPoint($storage, '');
+ Filesystem::getMountManager()->addMount($mount);
+ $cache = $storage->getCache();
+
+ $storage->mkdir('folder');
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+ $storage->touch('folder/bar.txt', time() - 200);
+
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->addMount($mount);
+
+ $scanner->scan('');
+ $this->assertTrue($cache->inCache('folder/bar.txt'));
+ $oldRoot = $cache->get('');
+
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+ $scanner->scan('');
+ $newRoot = $cache->get('');
+
+ $this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag());
+ }
+}