server/tests/lib/files/cache/scanner.php
Andreas Fischer 4a9f1cc74d Merge remote-tracking branch 'owncloud/master' into fixing-4866-master
* owncloud/master: (98 commits)
  [tx-robot] updated from transifex
  files: when filtering search results, ensure results are children of the fakeroot not just path starting the same
  setting a default on filecache column unencrypted_size
  [tx-robot] updated from transifex
  remove unneccessary lib in namespace
  namespaces use upcasefirst parts when _ is left in namespace and files are named after their classes the autoloader will also find classes in the lib folder of an app its magic!
  initialize variable
  calculate correct permissions while toggle the password protection
  make sure that both $permissions and $oldPermissions have the same type
  Add copyright, remove starting blank line
  update inherit docs comment
  Fix insert/update/delete helper functions for oracle
  Add missing return true statements to legacy preferences functions
  Add missing static
  Convert OC_Preference to object interface
  fix race condition in lazy preview loading
  use {count} instead of 'One' for more versatile translation
  fix double translation of error message
  use n to translate title
  fixing typos and l10n
  ...

Conflicts:
	tests/lib/files/cache/scanner.php
2013-09-23 12:44:11 +02:00

236 lines
8.5 KiB
PHP

<?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\Cache;
class Scanner extends \PHPUnit_Framework_TestCase {
/**
* @var \OC\Files\Storage\Storage $storage
*/
private $storage;
/**
* @var \OC\Files\Cache\Scanner $scanner
*/
private $scanner;
/**
* @var \OC\Files\Cache\Cache $cache
*/
private $cache;
function testFile() {
$data = "dummy file data\n";
$this->storage->file_put_contents('foo.txt', $data);
$this->scanner->scanFile('foo.txt');
$this->assertEquals($this->cache->inCache('foo.txt'), true);
$cachedData = $this->cache->get('foo.txt');
$this->assertEquals($cachedData['size'], strlen($data));
$this->assertEquals($cachedData['mimetype'], 'text/plain');
$this->assertNotEquals($cachedData['parent'], -1); //parent folders should be scanned automatically
$data = file_get_contents(\OC::$SERVERROOT . '/core/img/logo.png');
$this->storage->file_put_contents('foo.png', $data);
$this->scanner->scanFile('foo.png');
$this->assertEquals($this->cache->inCache('foo.png'), true);
$cachedData = $this->cache->get('foo.png');
$this->assertEquals($cachedData['size'], strlen($data));
$this->assertEquals($cachedData['mimetype'], 'image/png');
}
private function fillTestFolders() {
$textData = "dummy file data\n";
$imgData = file_get_contents(\OC::$SERVERROOT . '/core/img/logo.png');
$this->storage->mkdir('folder');
$this->storage->file_put_contents('foo.txt', $textData);
$this->storage->file_put_contents('foo.png', $imgData);
$this->storage->file_put_contents('folder/bar.txt', $textData);
}
function testFolder() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertEquals($this->cache->inCache(''), true);
$this->assertEquals($this->cache->inCache('foo.txt'), true);
$this->assertEquals($this->cache->inCache('foo.png'), true);
$this->assertEquals($this->cache->inCache('folder'), true);
$this->assertEquals($this->cache->inCache('folder/bar.txt'), true);
$cachedDataText = $this->cache->get('foo.txt');
$cachedDataText2 = $this->cache->get('foo.txt');
$cachedDataImage = $this->cache->get('foo.png');
$cachedDataFolder = $this->cache->get('');
$cachedDataFolder2 = $this->cache->get('folder');
$this->assertEquals($cachedDataImage['parent'], $cachedDataText['parent']);
$this->assertEquals($cachedDataFolder['fileid'], $cachedDataImage['parent']);
$this->assertEquals($cachedDataFolder['size'], $cachedDataImage['size'] + $cachedDataText['size'] + $cachedDataText2['size']);
$this->assertEquals($cachedDataFolder2['size'], $cachedDataText2['size']);
}
function testShallow() {
$this->fillTestFolders();
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$this->assertEquals($this->cache->inCache(''), true);
$this->assertEquals($this->cache->inCache('foo.txt'), true);
$this->assertEquals($this->cache->inCache('foo.png'), true);
$this->assertEquals($this->cache->inCache('folder'), true);
$this->assertEquals($this->cache->inCache('folder/bar.txt'), false);
$cachedDataFolder = $this->cache->get('');
$cachedDataFolder2 = $this->cache->get('folder');
$this->assertEquals(-1, $cachedDataFolder['size']);
$this->assertEquals(-1, $cachedDataFolder2['size']);
$this->scanner->scan('folder', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$cachedDataFolder2 = $this->cache->get('folder');
$this->assertNotEquals($cachedDataFolder2['size'], -1);
$this->cache->correctFolderSize('folder');
$cachedDataFolder = $this->cache->get('');
$this->assertNotEquals($cachedDataFolder['size'], -1);
}
function testBackgroundScan() {
$this->fillTestFolders();
$this->storage->mkdir('folder2');
$this->storage->file_put_contents('folder2/bar.txt', 'foobar');
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$this->assertFalse($this->cache->inCache('folder/bar.txt'));
$this->assertFalse($this->cache->inCache('folder/2bar.txt'));
$cachedData = $this->cache->get('');
$this->assertEquals(-1, $cachedData['size']);
$this->scanner->backgroundScan();
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$cachedData = $this->cache->get('');
$this->assertnotEquals(-1, $cachedData['size']);
$this->assertFalse($this->cache->getIncomplete());
}
public function testReuseExisting() {
$this->fillTestFolders();
$this->scanner->scan('');
$oldData = $this->cache->get('');
$this->storage->unlink('folder/bar.txt');
$this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder')));
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE);
$newData = $this->cache->get('');
$this->assertNotEquals($oldData['etag'], $newData['etag']);
$this->assertEquals($oldData['size'], $newData['size']);
$oldData = $newData;
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
$newData = $this->cache->get('');
$this->assertEquals($oldData['etag'], $newData['etag']);
$this->assertEquals(-1, $newData['size']);
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE);
$oldData = $this->cache->get('');
$this->assertNotEquals(-1, $oldData['size']);
$this->scanner->scanFile('', \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE);
$newData = $this->cache->get('');
$this->assertEquals($oldData['etag'], $newData['etag']);
$this->assertEquals($oldData['size'], $newData['size']);
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE);
$newData = $this->cache->get('');
$this->assertEquals($oldData['etag'], $newData['etag']);
$this->assertEquals($oldData['size'], $newData['size']);
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE);
$newData = $this->cache->get('');
$this->assertEquals($oldData['etag'], $newData['etag']);
$this->assertEquals($oldData['size'], $newData['size']);
}
public function testRemovedFile() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('foo.txt'));
$this->storage->unlink('foo.txt');
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$this->assertFalse($this->cache->inCache('foo.txt'));
}
public function testRemovedFolder() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$this->storage->unlink('/folder');
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$this->assertFalse($this->cache->inCache('folder'));
$this->assertFalse($this->cache->inCache('folder/bar.txt'));
}
public function testScanRemovedFile(){
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$this->storage->unlink('folder/bar.txt');
$this->scanner->scanFile('folder/bar.txt');
$this->assertFalse($this->cache->inCache('folder/bar.txt'));
}
public function testETagRecreation() {
$this->fillTestFolders();
$this->scanner->scan('folder/bar.txt');
// manipulate etag to simulate an empty etag
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
$data0 = $this->cache->get('folder/bar.txt');
$data1 = $this->cache->get('folder');
$data2 = $this->cache->get('');
$data0['etag'] = '';
$this->cache->put('folder/bar.txt', $data0);
// rescan
$this->scanner->scan('folder/bar.txt', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
// verify cache content
$newData0 = $this->cache->get('folder/bar.txt');
$newData1 = $this->cache->get('folder');
$newData2 = $this->cache->get('');
$this->assertNotEmpty($newData0['etag']);
$this->assertNotEquals($data1['etag'], $newData1['etag']);
$this->assertNotEquals($data2['etag'], $newData2['etag']);
}
function setUp() {
$this->storage = new \OC\Files\Storage\Temporary(array());
$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
$this->cache = new \OC\Files\Cache\Cache($this->storage);
}
function tearDown() {
if ($this->cache) {
$ids = $this->cache->getAll();
$permissionsCache = $this->storage->getPermissionsCache();
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
$this->cache->clear();
}
}
}