2013-08-12 17:37:15 +04:00
|
|
|
<?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;
|
|
|
|
|
2014-06-02 17:17:00 +04:00
|
|
|
use OC\Files\Filesystem;
|
2014-11-24 17:54:42 +03:00
|
|
|
use OC\Files\Mount\MountPoint;
|
2013-08-12 17:37:15 +04:00
|
|
|
use OC\Files\Storage\Temporary;
|
|
|
|
|
|
|
|
class TestScanner extends \OC\Files\Utils\Scanner {
|
|
|
|
/**
|
2014-11-24 17:54:42 +03:00
|
|
|
* @var \OC\Files\Mount\MountPoint[] $mounts
|
2013-08-12 17:37:15 +04:00
|
|
|
*/
|
|
|
|
private $mounts = array();
|
|
|
|
|
|
|
|
/**
|
2014-11-24 17:54:42 +03:00
|
|
|
* @param \OC\Files\Mount\MountPoint $mount
|
2013-08-12 17:37:15 +04:00
|
|
|
*/
|
|
|
|
public function addMount($mount) {
|
|
|
|
$this->mounts[] = $mount;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getMounts($dir) {
|
|
|
|
return $this->mounts;
|
|
|
|
}
|
2014-06-02 17:17:00 +04:00
|
|
|
|
|
|
|
public function getPropagator() {
|
|
|
|
return $this->propagator;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setPropagator($propagator) {
|
|
|
|
$this->propagator = $propagator;
|
|
|
|
}
|
2013-08-12 17:37:15 +04:00
|
|
|
}
|
|
|
|
|
2014-11-12 17:54:41 +03:00
|
|
|
class Scanner extends \Test\TestCase {
|
|
|
|
/** @var \OC\Files\Storage\Storage */
|
|
|
|
private $originalStorage;
|
|
|
|
|
|
|
|
protected function setUp() {
|
|
|
|
parent::setUp();
|
|
|
|
|
|
|
|
$this->originalStorage = \OC\Files\Filesystem::getStorage('/');
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function tearDown() {
|
|
|
|
\OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
|
|
|
|
|
|
|
|
parent::tearDown();
|
|
|
|
}
|
|
|
|
|
2013-08-12 17:37:15 +04:00
|
|
|
public function testReuseExistingRoot() {
|
|
|
|
$storage = new Temporary(array());
|
2014-11-24 17:54:42 +03:00
|
|
|
$mount = new MountPoint($storage, '');
|
2014-06-03 13:34:48 +04:00
|
|
|
Filesystem::getMountManager()->addMount($mount);
|
2013-08-12 17:37:15 +04:00
|
|
|
$cache = $storage->getCache();
|
|
|
|
|
|
|
|
$storage->mkdir('folder');
|
|
|
|
$storage->file_put_contents('foo.txt', 'qwerty');
|
|
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
|
|
|
2014-09-10 19:22:10 +04:00
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection());
|
2013-08-12 17:37:15 +04:00
|
|
|
$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());
|
2014-11-24 17:54:42 +03:00
|
|
|
$mount = new MountPoint($storage, '');
|
2014-06-03 13:34:48 +04:00
|
|
|
Filesystem::getMountManager()->addMount($mount);
|
2013-08-12 17:37:15 +04:00
|
|
|
$cache = $storage->getCache();
|
|
|
|
|
|
|
|
$storage->mkdir('folder');
|
|
|
|
$storage->file_put_contents('foo.txt', 'qwerty');
|
|
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
|
|
|
2014-09-10 19:22:10 +04:00
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection());
|
2013-08-12 17:37:15 +04:00
|
|
|
$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);
|
|
|
|
}
|
2014-06-02 17:17:00 +04:00
|
|
|
|
|
|
|
public function testChangePropagator() {
|
|
|
|
/**
|
|
|
|
* @var \OC\Files\Cache\ChangePropagator $propagator
|
|
|
|
*/
|
|
|
|
$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
|
|
|
|
|
|
|
|
$storage = new Temporary(array());
|
2014-11-24 17:54:42 +03:00
|
|
|
$mount = new MountPoint($storage, '/foo');
|
2014-06-02 17:17:00 +04:00
|
|
|
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');
|
|
|
|
|
2014-09-10 19:22:10 +04:00
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection());
|
2014-06-02 17:17:00 +04:00
|
|
|
$originalPropagator = $scanner->getPropagator();
|
|
|
|
$scanner->setPropagator($propagator);
|
|
|
|
$scanner->addMount($mount);
|
|
|
|
|
|
|
|
$scanner->scan('');
|
|
|
|
|
2014-06-04 12:01:50 +04:00
|
|
|
$changes = $propagator->getChanges();
|
|
|
|
$parents = $propagator->getAllParents();
|
|
|
|
sort($changes);
|
|
|
|
sort($parents);
|
|
|
|
$this->assertEquals(array('/foo', '/foo/folder', '/foo/folder/bar.txt', '/foo/foo.txt'), $changes);
|
|
|
|
$this->assertEquals(array('/', '/foo', '/foo/folder'), $parents);
|
2014-06-02 17:17:00 +04:00
|
|
|
|
2014-06-05 13:31:55 +04:00
|
|
|
$cache->put('foo.txt', array('storage_mtime' => time() - 50));
|
2014-06-02 17:17:00 +04:00
|
|
|
|
|
|
|
$propagator = $this->getMock('\OC\Files\Cache\ChangePropagator', array('propagateChanges'), array(), '', false);
|
|
|
|
$scanner->setPropagator($propagator);
|
|
|
|
$storage->file_put_contents('foo.txt', 'asdasd');
|
|
|
|
|
|
|
|
$scanner->scan('');
|
|
|
|
|
2014-06-04 12:01:50 +04:00
|
|
|
$changes = $propagator->getChanges();
|
|
|
|
$parents = $propagator->getAllParents();
|
|
|
|
$this->assertEquals(array('/foo/foo.txt'), $changes);
|
|
|
|
$this->assertEquals(array('/', '/foo'), $parents);
|
2014-06-02 17:17:00 +04:00
|
|
|
|
|
|
|
$scanner->setPropagator($originalPropagator);
|
|
|
|
|
|
|
|
$oldInfo = $cache->get('');
|
2014-06-05 13:31:55 +04:00
|
|
|
$cache->put('foo.txt', array('storage_mtime' => time() - 70));
|
2014-06-02 17:17:00 +04:00
|
|
|
$storage->file_put_contents('foo.txt', 'asdasd');
|
|
|
|
|
|
|
|
$scanner->scan('');
|
|
|
|
$newInfo = $cache->get('');
|
|
|
|
$this->assertNotEquals($oldInfo['etag'], $newInfo['etag']);
|
|
|
|
}
|
2013-08-12 17:37:15 +04:00
|
|
|
}
|