2012-09-22 13:43:10 +00: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\Cache;
|
|
|
|
|
|
2013-05-23 18:29:46 +00:00
|
|
|
|
use PHPUnit_Framework_MockObject_MockObject;
|
|
|
|
|
|
2013-02-15 20:49:40 +00:00
|
|
|
|
class LongId extends \OC\Files\Storage\Temporary {
|
|
|
|
|
public function getId() {
|
|
|
|
|
return 'long:' . str_repeat('foo', 50) . parent::getId();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-07 14:23:15 +00:00
|
|
|
|
class Cache extends \Test\TestCase {
|
2012-09-22 13:43:10 +00:00
|
|
|
|
/**
|
2013-11-08 11:57:28 +00:00
|
|
|
|
* @var \OC\Files\Storage\Temporary $storage ;
|
2012-09-22 13:43:10 +00:00
|
|
|
|
*/
|
2014-11-10 15:00:08 +00:00
|
|
|
|
protected $storage;
|
2013-05-16 15:47:41 +00:00
|
|
|
|
/**
|
2013-11-08 11:57:28 +00:00
|
|
|
|
* @var \OC\Files\Storage\Temporary $storage2 ;
|
2013-05-16 15:47:41 +00:00
|
|
|
|
*/
|
2014-11-10 15:00:08 +00:00
|
|
|
|
protected $storage2;
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* @var \OC\Files\Cache\Cache $cache
|
|
|
|
|
*/
|
2014-11-10 15:00:08 +00:00
|
|
|
|
protected $cache;
|
2013-05-16 15:47:41 +00:00
|
|
|
|
/**
|
|
|
|
|
* @var \OC\Files\Cache\Cache $cache2
|
|
|
|
|
*/
|
2014-11-10 15:00:08 +00:00
|
|
|
|
protected $cache2;
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2014-12-10 11:55:01 +00:00
|
|
|
|
public function testGetNumericId() {
|
|
|
|
|
$this->assertNotNull($this->cache->getNumericStorageId());
|
|
|
|
|
}
|
|
|
|
|
|
2012-09-22 13:43:10 +00:00
|
|
|
|
public function testSimple() {
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$file1 = 'foo';
|
|
|
|
|
$file2 = 'foo/bar';
|
2012-09-22 13:43:10 +00:00
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'foo/folder');
|
|
|
|
|
$data2 = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->assertFalse($this->cache->inCache($file1));
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($this->cache->get($file1), null);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$id1 = $this->cache->put($file1, $data1);
|
|
|
|
|
$this->assertTrue($this->cache->inCache($file1));
|
|
|
|
|
$cacheData1 = $this->cache->get($file1);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
foreach ($data1 as $key => $value) {
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($value, $cacheData1[$key]);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($cacheData1['mimepart'], 'foo');
|
|
|
|
|
$this->assertEquals($cacheData1['fileid'], $id1);
|
|
|
|
|
$this->assertEquals($id1, $this->cache->getId($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->assertFalse($this->cache->inCache($file2));
|
|
|
|
|
$id2 = $this->cache->put($file2, $data2);
|
|
|
|
|
$this->assertTrue($this->cache->inCache($file2));
|
|
|
|
|
$cacheData2 = $this->cache->get($file2);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
foreach ($data2 as $key => $value) {
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($value, $cacheData2[$key]);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($cacheData1['fileid'], $cacheData2['parent']);
|
|
|
|
|
$this->assertEquals($cacheData2['fileid'], $id2);
|
|
|
|
|
$this->assertEquals($id2, $this->cache->getId($file2));
|
|
|
|
|
$this->assertEquals($id1, $this->cache->getParentId($file2));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
|
|
|
|
$newSize = 1050;
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$newId2 = $this->cache->put($file2, array('size' => $newSize));
|
|
|
|
|
$cacheData2 = $this->cache->get($file2);
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($newId2, $id2);
|
|
|
|
|
$this->assertEquals($cacheData2['size'], $newSize);
|
|
|
|
|
$this->assertEquals($cacheData1, $this->cache->get($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache->remove($file2);
|
|
|
|
|
$this->assertFalse($this->cache->inCache($file2));
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($this->cache->get($file2), null);
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->assertTrue($this->cache->inCache($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($cacheData1, $this->cache->get($id1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testPartial() {
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$file1 = 'foo';
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache->put($file1, array('size' => 10));
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals(array('size' => 10), $this->cache->get($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache->put($file1, array('mtime' => 15));
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals(array('size' => 10, 'mtime' => 15), $this->cache->get($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache->put($file1, array('size' => 12));
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals(array('size' => 12, 'mtime' => 15), $this->cache->get($file1));
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
/**
|
|
|
|
|
* @dataProvider folderDataProvider
|
|
|
|
|
*/
|
|
|
|
|
public function testFolder($folder) {
|
|
|
|
|
$file2 = $folder.'/bar';
|
|
|
|
|
$file3 = $folder.'/foo';
|
2012-10-27 16:05:40 +00:00
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
2012-09-23 13:25:03 +00:00
|
|
|
|
$fileData = array();
|
|
|
|
|
$fileData['bar'] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo'] = array('size' => 20, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$this->cache->put($folder, $data1);
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache->put($file2, $fileData['bar']);
|
|
|
|
|
$this->cache->put($file3, $fileData['foo']);
|
2012-09-23 13:25:03 +00:00
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$content = $this->cache->getFolderContents($folder);
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals(count($content), 2);
|
2012-09-23 13:25:03 +00:00
|
|
|
|
foreach ($content as $cachedData) {
|
|
|
|
|
$data = $fileData[$cachedData['name']];
|
|
|
|
|
foreach ($data as $name => $value) {
|
2013-01-26 20:41:14 +00:00
|
|
|
|
$this->assertEquals($value, $cachedData[$name]);
|
2012-09-23 13:25:03 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2012-10-27 15:02:05 +00:00
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$file4 = $folder.'/unkownSize';
|
2012-10-27 15:02:05 +00:00
|
|
|
|
$fileData['unkownSize'] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
$this->cache->put($file4, $fileData['unkownSize']);
|
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$this->assertEquals(-1, $this->cache->calculateFolderSize($folder));
|
2012-10-27 15:02:05 +00:00
|
|
|
|
|
|
|
|
|
$fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
$this->cache->put($file4, $fileData['unkownSize']);
|
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$this->assertEquals(1025, $this->cache->calculateFolderSize($folder));
|
2012-10-27 16:05:40 +00:00
|
|
|
|
|
2013-07-29 14:23:14 +00:00
|
|
|
|
$this->cache->remove($file2);
|
|
|
|
|
$this->cache->remove($file3);
|
|
|
|
|
$this->cache->remove($file4);
|
2014-08-07 12:39:07 +00:00
|
|
|
|
$this->assertEquals(0, $this->cache->calculateFolderSize($folder));
|
|
|
|
|
|
|
|
|
|
$this->cache->remove($folder);
|
|
|
|
|
$this->assertFalse($this->cache->inCache($folder.'/foo'));
|
|
|
|
|
$this->assertFalse($this->cache->inCache($folder.'/bar'));
|
|
|
|
|
}
|
2013-07-29 14:23:14 +00:00
|
|
|
|
|
2015-01-15 17:46:42 +00:00
|
|
|
|
public function testRemoveRecursive() {
|
|
|
|
|
$folderData = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
$fileData = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'text/plain');
|
|
|
|
|
$folders = ['folder', 'folder/subfolder', 'folder/sub2', 'folder/sub2/sub3'];
|
|
|
|
|
$files = ['folder/foo.txt', 'folder/bar.txt', 'folder/subfolder/asd.txt', 'folder/sub2/qwerty.txt', 'folder/sub2/sub3/foo.txt'];
|
|
|
|
|
|
|
|
|
|
foreach($folders as $folder){
|
|
|
|
|
$this->cache->put($folder, $folderData);
|
|
|
|
|
}
|
|
|
|
|
foreach ($files as $file) {
|
|
|
|
|
$this->cache->put($file, $fileData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->cache->remove('folder');
|
|
|
|
|
foreach ($files as $file) {
|
|
|
|
|
$this->assertFalse($this->cache->inCache($file));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-07 12:39:07 +00:00
|
|
|
|
public function folderDataProvider() {
|
|
|
|
|
|
|
|
|
|
return array(
|
|
|
|
|
array('folder'),
|
|
|
|
|
// that was too easy, try something harder
|
|
|
|
|
array('☺, WHITE SMILING FACE, UTF-8 hex E298BA'),
|
|
|
|
|
// what about 4 byte utf-8
|
|
|
|
|
array('😐, NEUTRAL_FACE, UTF-8 hex F09F9890'),
|
|
|
|
|
// now the crazy stuff
|
|
|
|
|
array(', UNASSIGNED PRIVATE USE, UTF-8 hex EF9890'),
|
2014-09-08 13:26:41 +00:00
|
|
|
|
// and my favorite
|
|
|
|
|
array('w͢͢͝h͡o͢͡ ̸͢k̵͟n̴͘ǫw̸̛s͘ ̀́w͘͢ḩ̵a҉̡͢t ̧̕h́o̵r͏̵rors̡ ̶͡͠lį̶e͟͟ ̶͝in͢ ͏t̕h̷̡͟e ͟͟d̛a͜r̕͡k̢̨ ͡h̴e͏a̷̢̡rt́͏ ̴̷͠ò̵̶f̸ u̧͘ní̛͜c͢͏o̷͏d̸͢e̡͝')
|
2014-08-07 12:39:07 +00:00
|
|
|
|
);
|
2012-09-23 13:25:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-01-09 16:27:55 +00:00
|
|
|
|
public function testEncryptedFolder() {
|
|
|
|
|
$file1 = 'folder';
|
|
|
|
|
$file2 = 'folder/bar';
|
|
|
|
|
$file3 = 'folder/foo';
|
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
$fileData = array();
|
2015-03-30 15:29:05 +00:00
|
|
|
|
$fileData['bar'] = array('size' => 1000, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo'] = array('size' => 20, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file');
|
2014-01-09 16:27:55 +00:00
|
|
|
|
|
|
|
|
|
$this->cache->put($file1, $data1);
|
|
|
|
|
$this->cache->put($file2, $fileData['bar']);
|
|
|
|
|
$this->cache->put($file3, $fileData['foo']);
|
|
|
|
|
|
|
|
|
|
$content = $this->cache->getFolderContents($file1);
|
|
|
|
|
$this->assertEquals(count($content), 2);
|
|
|
|
|
foreach ($content as $cachedData) {
|
|
|
|
|
$data = $fileData[$cachedData['name']];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$file4 = 'folder/unkownSize';
|
|
|
|
|
$fileData['unkownSize'] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
$this->cache->put($file4, $fileData['unkownSize']);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(-1, $this->cache->calculateFolderSize($file1));
|
|
|
|
|
|
|
|
|
|
$fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
$this->cache->put($file4, $fileData['unkownSize']);
|
|
|
|
|
|
2015-04-07 12:30:01 +00:00
|
|
|
|
$this->assertEquals(1025, $this->cache->calculateFolderSize($file1));
|
2014-01-09 16:27:55 +00:00
|
|
|
|
// direct cache entry retrieval returns the original values
|
2014-01-17 11:29:21 +00:00
|
|
|
|
$entry = $this->cache->get($file1);
|
|
|
|
|
$this->assertEquals(1025, $entry['size']);
|
2014-01-09 16:27:55 +00:00
|
|
|
|
|
|
|
|
|
$this->cache->remove($file2);
|
|
|
|
|
$this->cache->remove($file3);
|
|
|
|
|
$this->cache->remove($file4);
|
|
|
|
|
$this->assertEquals(0, $this->cache->calculateFolderSize($file1));
|
|
|
|
|
|
|
|
|
|
$this->cache->remove('folder');
|
|
|
|
|
$this->assertFalse($this->cache->inCache('folder/foo'));
|
|
|
|
|
$this->assertFalse($this->cache->inCache('folder/bar'));
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-08 11:57:28 +00:00
|
|
|
|
public function testRootFolderSizeForNonHomeStorage() {
|
|
|
|
|
$dir1 = 'knownsize';
|
|
|
|
|
$dir2 = 'unknownsize';
|
|
|
|
|
$fileData = array();
|
|
|
|
|
$fileData[''] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
$fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
$fileData[$dir2] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
|
|
|
|
|
$this->cache->put('', $fileData['']);
|
|
|
|
|
$this->cache->put($dir1, $fileData[$dir1]);
|
|
|
|
|
$this->cache->put($dir2, $fileData[$dir2]);
|
|
|
|
|
|
|
|
|
|
$this->assertTrue($this->cache->inCache($dir1));
|
|
|
|
|
$this->assertTrue($this->cache->inCache($dir2));
|
|
|
|
|
|
|
|
|
|
// check that root size ignored the unknown sizes
|
|
|
|
|
$this->assertEquals(-1, $this->cache->calculateFolderSize(''));
|
|
|
|
|
|
|
|
|
|
// clean up
|
|
|
|
|
$this->cache->remove('');
|
|
|
|
|
$this->cache->remove($dir1);
|
|
|
|
|
$this->cache->remove($dir2);
|
|
|
|
|
|
|
|
|
|
$this->assertFalse($this->cache->inCache($dir1));
|
|
|
|
|
$this->assertFalse($this->cache->inCache($dir2));
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-08 12:58:21 +00:00
|
|
|
|
function testStatus() {
|
|
|
|
|
$this->assertEquals(\OC\Files\Cache\Cache::NOT_FOUND, $this->cache->getStatus('foo'));
|
|
|
|
|
$this->cache->put('foo', array('size' => -1));
|
|
|
|
|
$this->assertEquals(\OC\Files\Cache\Cache::PARTIAL, $this->cache->getStatus('foo'));
|
|
|
|
|
$this->cache->put('foo', array('size' => -1, 'mtime' => 20, 'mimetype' => 'foo/file'));
|
|
|
|
|
$this->assertEquals(\OC\Files\Cache\Cache::SHALLOW, $this->cache->getStatus('foo'));
|
|
|
|
|
$this->cache->put('foo', array('size' => 10));
|
|
|
|
|
$this->assertEquals(\OC\Files\Cache\Cache::COMPLETE, $this->cache->getStatus('foo'));
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-18 12:29:39 +00:00
|
|
|
|
public function putWithAllKindOfQuotesData() {
|
|
|
|
|
return [
|
|
|
|
|
['`backtick`'],
|
|
|
|
|
['´forward´'],
|
|
|
|
|
['\'single\''],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider putWithAllKindOfQuotesData
|
|
|
|
|
* @param $fileName
|
|
|
|
|
*/
|
|
|
|
|
public function testPutWithAllKindOfQuotes($fileName) {
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(\OC\Files\Cache\Cache::NOT_FOUND, $this->cache->get($fileName));
|
|
|
|
|
$this->cache->put($fileName, array('size' => 20, 'mtime' => 25, 'mimetype' => 'foo/file', 'etag' => $fileName));
|
|
|
|
|
|
|
|
|
|
$cacheEntry = $this->cache->get($fileName);
|
|
|
|
|
$this->assertEquals($fileName, $cacheEntry['etag']);
|
|
|
|
|
$this->assertEquals($fileName, $cacheEntry['path']);
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-26 11:23:15 +00:00
|
|
|
|
function testSearch() {
|
|
|
|
|
$file1 = 'folder';
|
|
|
|
|
$file2 = 'folder/foobar';
|
|
|
|
|
$file3 = 'folder/foo';
|
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'foo/folder');
|
|
|
|
|
$fileData = array();
|
|
|
|
|
$fileData['foobar'] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo'] = array('size' => 20, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
|
|
|
|
|
$this->cache->put($file1, $data1);
|
|
|
|
|
$this->cache->put($file2, $fileData['foobar']);
|
|
|
|
|
$this->cache->put($file3, $fileData['foo']);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(2, count($this->cache->search('%foo%')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('foo')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('%folder%')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('folder%')));
|
|
|
|
|
$this->assertEquals(3, count($this->cache->search('%')));
|
2012-10-27 08:34:25 +00:00
|
|
|
|
|
2014-07-03 17:01:00 +00:00
|
|
|
|
// case insensitive search should match the same files
|
|
|
|
|
$this->assertEquals(2, count($this->cache->search('%Foo%')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('Foo')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('%Folder%')));
|
|
|
|
|
$this->assertEquals(1, count($this->cache->search('Folder%')));
|
|
|
|
|
|
2012-10-27 08:34:25 +00:00
|
|
|
|
$this->assertEquals(3, count($this->cache->searchByMime('foo')));
|
|
|
|
|
$this->assertEquals(2, count($this->cache->searchByMime('foo/file')));
|
2012-10-26 11:23:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-12-04 13:01:15 +00:00
|
|
|
|
function testSearchByTag() {
|
|
|
|
|
$userId = $this->getUniqueId('user');
|
|
|
|
|
\OC_User::createUser($userId, $userId);
|
|
|
|
|
$this->loginAsUser($userId);
|
|
|
|
|
$user = new \OC\User\User($userId, null);
|
|
|
|
|
|
|
|
|
|
$file1 = 'folder';
|
|
|
|
|
$file2 = 'folder/foobar';
|
|
|
|
|
$file3 = 'folder/foo';
|
|
|
|
|
$file4 = 'folder/foo2';
|
|
|
|
|
$file5 = 'folder/foo3';
|
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'foo/folder');
|
|
|
|
|
$fileData = array();
|
|
|
|
|
$fileData['foobar'] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo'] = array('size' => 20, 'mtime' => 25, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo2'] = array('size' => 25, 'mtime' => 28, 'mimetype' => 'foo/file');
|
|
|
|
|
$fileData['foo3'] = array('size' => 88, 'mtime' => 34, 'mimetype' => 'foo/file');
|
|
|
|
|
|
|
|
|
|
$id1 = $this->cache->put($file1, $data1);
|
|
|
|
|
$id2 = $this->cache->put($file2, $fileData['foobar']);
|
|
|
|
|
$id3 = $this->cache->put($file3, $fileData['foo']);
|
|
|
|
|
$id4 = $this->cache->put($file4, $fileData['foo2']);
|
|
|
|
|
$id5 = $this->cache->put($file5, $fileData['foo3']);
|
|
|
|
|
|
|
|
|
|
$tagManager = \OC::$server->getTagManager()->load('files', null, null, $userId);
|
|
|
|
|
$this->assertTrue($tagManager->tagAs($id1, 'tag1'));
|
|
|
|
|
$this->assertTrue($tagManager->tagAs($id1, 'tag2'));
|
|
|
|
|
$this->assertTrue($tagManager->tagAs($id2, 'tag2'));
|
|
|
|
|
$this->assertTrue($tagManager->tagAs($id3, 'tag1'));
|
|
|
|
|
$this->assertTrue($tagManager->tagAs($id4, 'tag2'));
|
|
|
|
|
|
|
|
|
|
// use tag name
|
|
|
|
|
$results = $this->cache->searchByTag('tag1', $userId);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals(2, count($results));
|
|
|
|
|
|
2014-12-15 10:32:32 +00:00
|
|
|
|
usort($results, function($value1, $value2) { return $value1['name'] >= $value2['name']; });
|
|
|
|
|
|
2014-12-04 13:01:15 +00:00
|
|
|
|
$this->assertEquals('folder', $results[0]['name']);
|
|
|
|
|
$this->assertEquals('foo', $results[1]['name']);
|
|
|
|
|
|
|
|
|
|
// use tag id
|
|
|
|
|
$tags = $tagManager->getTagsForUser($userId);
|
|
|
|
|
$this->assertNotEmpty($tags);
|
|
|
|
|
$tags = array_filter($tags, function($tag) { return $tag->getName() === 'tag2'; });
|
|
|
|
|
$results = $this->cache->searchByTag(current($tags)->getId(), $userId);
|
|
|
|
|
$this->assertEquals(3, count($results));
|
|
|
|
|
|
2014-12-15 10:32:32 +00:00
|
|
|
|
usort($results, function($value1, $value2) { return $value1['name'] >= $value2['name']; });
|
|
|
|
|
|
2014-12-04 13:01:15 +00:00
|
|
|
|
$this->assertEquals('folder', $results[0]['name']);
|
2014-12-15 10:32:32 +00:00
|
|
|
|
$this->assertEquals('foo2', $results[1]['name']);
|
|
|
|
|
$this->assertEquals('foobar', $results[2]['name']);
|
2014-12-04 13:01:15 +00:00
|
|
|
|
|
|
|
|
|
$tagManager->delete('tag1');
|
|
|
|
|
$tagManager->delete('tag2');
|
|
|
|
|
|
|
|
|
|
$this->logout();
|
|
|
|
|
\OC_User::deleteUser($userId);
|
|
|
|
|
}
|
|
|
|
|
|
2012-11-02 21:25:33 +00:00
|
|
|
|
function testMove() {
|
|
|
|
|
$file1 = 'folder';
|
|
|
|
|
$file2 = 'folder/bar';
|
|
|
|
|
$file3 = 'folder/foo';
|
|
|
|
|
$file4 = 'folder/foo/1';
|
|
|
|
|
$file5 = 'folder/foo/2';
|
|
|
|
|
$data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'foo/bar');
|
2013-04-19 13:03:59 +00:00
|
|
|
|
$folderData = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
2012-11-02 21:25:33 +00:00
|
|
|
|
|
2013-04-19 13:03:59 +00:00
|
|
|
|
$this->cache->put($file1, $folderData);
|
|
|
|
|
$this->cache->put($file2, $folderData);
|
|
|
|
|
$this->cache->put($file3, $folderData);
|
2012-11-02 21:25:33 +00:00
|
|
|
|
$this->cache->put($file4, $data);
|
|
|
|
|
$this->cache->put($file5, $data);
|
|
|
|
|
|
2013-05-16 15:47:41 +00:00
|
|
|
|
/* 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);
|
|
|
|
|
|
2012-11-02 21:25:33 +00:00
|
|
|
|
$this->cache->move('folder/foo', 'folder/foobar');
|
|
|
|
|
|
|
|
|
|
$this->assertFalse($this->cache->inCache('folder/foo'));
|
|
|
|
|
$this->assertFalse($this->cache->inCache('folder/foo/1'));
|
|
|
|
|
$this->assertFalse($this->cache->inCache('folder/foo/2'));
|
|
|
|
|
|
|
|
|
|
$this->assertTrue($this->cache->inCache('folder/bar'));
|
|
|
|
|
$this->assertTrue($this->cache->inCache('folder/foobar'));
|
|
|
|
|
$this->assertTrue($this->cache->inCache('folder/foobar/1'));
|
|
|
|
|
$this->assertTrue($this->cache->inCache('folder/foobar/2'));
|
2013-05-16 15:47:41 +00:00
|
|
|
|
|
|
|
|
|
/* 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'));
|
2012-11-02 21:25:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2012-11-21 22:02:43 +00:00
|
|
|
|
function testGetIncomplete() {
|
|
|
|
|
$file1 = 'folder1';
|
|
|
|
|
$file2 = 'folder2';
|
|
|
|
|
$file3 = 'folder3';
|
|
|
|
|
$file4 = 'folder4';
|
|
|
|
|
$data = array('size' => 10, 'mtime' => 50, 'mimetype' => 'foo/bar');
|
|
|
|
|
|
|
|
|
|
$this->cache->put($file1, $data);
|
|
|
|
|
$data['size'] = -1;
|
|
|
|
|
$this->cache->put($file2, $data);
|
|
|
|
|
$this->cache->put($file3, $data);
|
|
|
|
|
$data['size'] = 12;
|
|
|
|
|
$this->cache->put($file4, $data);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals($file3, $this->cache->getIncomplete());
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-11 00:06:21 +00:00
|
|
|
|
function testNonExisting() {
|
|
|
|
|
$this->assertFalse($this->cache->get('foo.txt'));
|
|
|
|
|
$this->assertEquals(array(), $this->cache->getFolderContents('foo'));
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-26 22:59:29 +00:00
|
|
|
|
function testGetById() {
|
|
|
|
|
$storageId = $this->storage->getId();
|
|
|
|
|
$data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$id = $this->cache->put('foo', $data);
|
2014-09-17 20:24:43 +00:00
|
|
|
|
|
|
|
|
|
if (strlen($storageId) > 64) {
|
|
|
|
|
$storageId = md5($storageId);
|
|
|
|
|
}
|
2013-01-26 22:59:29 +00:00
|
|
|
|
$this->assertEquals(array($storageId, 'foo'), \OC\Files\Cache\Cache::getById($id));
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-10 11:27:35 +00:00
|
|
|
|
function testStorageMTime() {
|
|
|
|
|
$data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$this->cache->put('foo', $data);
|
|
|
|
|
$cachedData = $this->cache->get('foo');
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->assertEquals($data['mtime'], $cachedData['storage_mtime']); //if no storage_mtime is saved, mtime should be used
|
2013-02-10 11:27:35 +00:00
|
|
|
|
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->cache->put('foo', array('storage_mtime' => 30)); //when setting storage_mtime, mtime is also set
|
2013-02-10 11:27:35 +00:00
|
|
|
|
$cachedData = $this->cache->get('foo');
|
|
|
|
|
$this->assertEquals(30, $cachedData['storage_mtime']);
|
|
|
|
|
$this->assertEquals(30, $cachedData['mtime']);
|
|
|
|
|
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->cache->put('foo', array('mtime' => 25)); //setting mtime does not change storage_mtime
|
2013-02-10 11:27:35 +00:00
|
|
|
|
$cachedData = $this->cache->get('foo');
|
|
|
|
|
$this->assertEquals(30, $cachedData['storage_mtime']);
|
|
|
|
|
$this->assertEquals(25, $cachedData['mtime']);
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-15 20:49:40 +00:00
|
|
|
|
function testLongId() {
|
|
|
|
|
$storage = new LongId(array());
|
|
|
|
|
$cache = $storage->getCache();
|
|
|
|
|
$storageId = $storage->getId();
|
|
|
|
|
$data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
|
|
|
|
|
$id = $cache->put('foo', $data);
|
|
|
|
|
$this->assertEquals(array(md5($storageId), 'foo'), \OC\Files\Cache\Cache::getById($id));
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-23 18:29:46 +00:00
|
|
|
|
/**
|
2014-05-19 15:50:53 +00:00
|
|
|
|
* this test show the bug resulting if we have no normalizer installed
|
2013-05-23 18:29:46 +00:00
|
|
|
|
*/
|
|
|
|
|
public function testWithoutNormalizer() {
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// folder name "Schön" with U+00F6 (normalized)
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$folderWith00F6 = "\x53\x63\x68\xc3\xb6\x6e";
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// folder name "Schön" with U+0308 (un-normalized)
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$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');
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// put root folder
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$this->assertFalse($cacheMock->get('folder'));
|
|
|
|
|
$this->assertGreaterThan(0, $cacheMock->put('folder', $data));
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// put un-normalized folder
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->assertFalse($cacheMock->get('folder/' . $folderWith0308));
|
|
|
|
|
$this->assertGreaterThan(0, $cacheMock->put('folder/' . $folderWith0308, $data));
|
2013-05-23 18:29:46 +00:00
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// get un-normalized folder by name
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$unNormalizedFolderName = $cacheMock->get('folder/' . $folderWith0308);
|
2013-05-25 18:36:51 +00:00
|
|
|
|
|
|
|
|
|
// 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));
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->assertGreaterThan(0, $cacheMock->put('folder/' . $folderWith00F6, $data));
|
2013-05-25 18:36:51 +00:00
|
|
|
|
|
2013-05-23 18:29:46 +00:00
|
|
|
|
// this is our bug, we have two different hashes with the same name (Schön)
|
|
|
|
|
$this->assertEquals(2, count($cacheMock->getFolderContents('folder')));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2014-05-19 15:50:53 +00:00
|
|
|
|
* this test shows that there is no bug if we use the normalizer
|
2013-05-23 18:29:46 +00:00
|
|
|
|
*/
|
|
|
|
|
public function testWithNormalizer() {
|
|
|
|
|
|
2013-11-08 11:57:28 +00:00
|
|
|
|
if (!class_exists('Patchwork\PHP\Shim\Normalizer')) {
|
2013-05-24 18:37:11 +00:00
|
|
|
|
$this->markTestSkipped('The 3rdparty Normalizer extension is not available.');
|
2013-05-23 18:29:46 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// folder name "Schön" with U+00F6 (normalized)
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$folderWith00F6 = "\x53\x63\x68\xc3\xb6\x6e";
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// folder name "Schön" with U+0308 (un-normalized)
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$folderWith0308 = "\x53\x63\x68\x6f\xcc\x88\x6e";
|
|
|
|
|
|
|
|
|
|
$data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// put root folder
|
2013-05-23 18:29:46 +00:00
|
|
|
|
$this->assertFalse($this->cache->get('folder'));
|
|
|
|
|
$this->assertGreaterThan(0, $this->cache->put('folder', $data));
|
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// put un-normalized folder
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->assertFalse($this->cache->get('folder/' . $folderWith0308));
|
|
|
|
|
$this->assertGreaterThan(0, $this->cache->put('folder/' . $folderWith0308, $data));
|
2013-05-23 18:29:46 +00:00
|
|
|
|
|
2013-05-25 18:36:51 +00:00
|
|
|
|
// get un-normalized folder by name
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$unNormalizedFolderName = $this->cache->get('folder/' . $folderWith0308);
|
2013-05-25 18:36:51 +00:00
|
|
|
|
|
|
|
|
|
// check if folder name was normalized
|
|
|
|
|
$this->assertEquals($folderWith00F6, $unNormalizedFolderName['name']);
|
|
|
|
|
|
|
|
|
|
// put normalized folder
|
|
|
|
|
$this->assertTrue(is_array($this->cache->get('folder/' . $folderWith00F6)));
|
2013-11-08 11:57:28 +00:00
|
|
|
|
$this->assertGreaterThan(0, $this->cache->put('folder/' . $folderWith00F6, $data));
|
2013-05-25 18:36:51 +00:00
|
|
|
|
|
2013-05-23 18:29:46 +00:00
|
|
|
|
// at this point we should have only one folder named "Schön"
|
|
|
|
|
$this->assertEquals(1, count($this->cache->getFolderContents('folder')));
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-08 18:43:02 +00:00
|
|
|
|
function bogusPathNamesProvider() {
|
|
|
|
|
return array(
|
|
|
|
|
array('/bogus.txt', 'bogus.txt'),
|
|
|
|
|
array('//bogus.txt', 'bogus.txt'),
|
|
|
|
|
array('bogus/', 'bogus'),
|
|
|
|
|
array('bogus//', 'bogus'),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test bogus paths with leading or doubled slashes
|
|
|
|
|
*
|
|
|
|
|
* @dataProvider bogusPathNamesProvider
|
|
|
|
|
*/
|
|
|
|
|
public function testBogusPaths($bogusPath, $fixedBogusPath) {
|
|
|
|
|
$data = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
|
|
|
|
|
|
|
|
|
|
// put root folder
|
|
|
|
|
$this->assertFalse($this->cache->get(''));
|
|
|
|
|
$parentId = $this->cache->put('', $data);
|
|
|
|
|
$this->assertGreaterThan(0, $parentId);
|
|
|
|
|
|
|
|
|
|
$this->assertGreaterThan(0, $this->cache->put($bogusPath, $data));
|
|
|
|
|
|
|
|
|
|
$newData = $this->cache->get($fixedBogusPath);
|
|
|
|
|
$this->assertNotFalse($newData);
|
|
|
|
|
|
|
|
|
|
$this->assertEquals($fixedBogusPath, $newData['path']);
|
|
|
|
|
// parent is the correct one, resolved properly (they used to not be)
|
|
|
|
|
$this->assertEquals($parentId, $newData['parent']);
|
|
|
|
|
|
|
|
|
|
$newDataFromBogus = $this->cache->get($bogusPath);
|
|
|
|
|
// same entry
|
|
|
|
|
$this->assertEquals($newData, $newDataFromBogus);
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-03 10:14:45 +00:00
|
|
|
|
public function testNoReuseOfFileId() {
|
|
|
|
|
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'text/plain');
|
|
|
|
|
$this->cache->put('somefile.txt', $data1);
|
|
|
|
|
$info = $this->cache->get('somefile.txt');
|
|
|
|
|
$fileId = $info['fileid'];
|
|
|
|
|
$this->cache->remove('somefile.txt');
|
|
|
|
|
$data2 = array('size' => 200, 'mtime' => 100, 'mimetype' => 'text/plain');
|
|
|
|
|
$this->cache->put('anotherfile.txt', $data2);
|
|
|
|
|
$info2 = $this->cache->get('anotherfile.txt');
|
|
|
|
|
$fileId2 = $info2['fileid'];
|
|
|
|
|
$this->assertNotEquals($fileId, $fileId2);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-07 14:23:15 +00:00
|
|
|
|
protected function tearDown() {
|
2013-06-24 10:59:56 +00:00
|
|
|
|
if ($this->cache) {
|
|
|
|
|
$this->cache->clear();
|
|
|
|
|
}
|
2014-11-07 14:23:15 +00:00
|
|
|
|
|
|
|
|
|
parent::tearDown();
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-11-07 14:23:15 +00:00
|
|
|
|
protected function setUp() {
|
|
|
|
|
parent::setUp();
|
|
|
|
|
|
2012-09-22 13:43:10 +00:00
|
|
|
|
$this->storage = new \OC\Files\Storage\Temporary(array());
|
2013-05-16 15:47:41 +00:00
|
|
|
|
$this->storage2 = new \OC\Files\Storage\Temporary(array());
|
2012-09-26 15:52:02 +00:00
|
|
|
|
$this->cache = new \OC\Files\Cache\Cache($this->storage);
|
2013-05-16 15:47:41 +00:00
|
|
|
|
$this->cache2 = new \OC\Files\Cache\Cache($this->storage2);
|
2012-09-22 13:43:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|