- Added base class for sharing unit tests - Added unit tests for shared files watched to check for folder size propagationremotes/origin/stable6
parent
eb6fc14f84
commit
9f4fd0161e
@ -0,0 +1,143 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Bjoern Schiessle |
||||
* @copyright 2013 Bjoern Schiessle <schiessle@owncloud.com> |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
require_once __DIR__ . '/../../../lib/base.php'; |
||||
|
||||
use OCA\Files\Share; |
||||
|
||||
/** |
||||
* Class Test_Files_Sharing_Base |
||||
* |
||||
* Base class for sharing tests. |
||||
*/ |
||||
class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase { |
||||
|
||||
const TEST_FILES_SHARING_API_USER1 = "test-share-user1"; |
||||
const TEST_FILES_SHARING_API_USER2 = "test-share-user2"; |
||||
const TEST_FILES_SHARING_API_USER3 = "test-share-user3"; |
||||
|
||||
public $stateFilesEncryption; |
||||
public $filename; |
||||
public $data; |
||||
/** |
||||
* @var OC_FilesystemView |
||||
*/ |
||||
public $view; |
||||
public $folder; |
||||
|
||||
public static function setUpBeforeClass() { |
||||
// reset backend |
||||
\OC_User::clearBackends(); |
||||
\OC_User::useBackend('database'); |
||||
|
||||
// clear share hooks |
||||
\OC_Hook::clear('OCP\\Share'); |
||||
\OC::registerShareHooks(); |
||||
\OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); |
||||
|
||||
// create users |
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER1, true); |
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER2, true); |
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER3, true); |
||||
|
||||
} |
||||
|
||||
function setUp() { |
||||
|
||||
//login as user1 |
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER1); |
||||
|
||||
$this->data = 'foobar'; |
||||
$this->view = new \OC_FilesystemView('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); |
||||
// remember files_encryption state |
||||
$this->stateFilesEncryption = \OC_App::isEnabled('files_encryption'); |
||||
|
||||
//we don't want to tests with app files_encryption enabled |
||||
\OC_App::disable('files_encryption'); |
||||
|
||||
|
||||
$this->assertTrue(!\OC_App::isEnabled('files_encryption')); |
||||
} |
||||
|
||||
function tearDown() { |
||||
// reset app files_encryption |
||||
if ($this->stateFilesEncryption) { |
||||
\OC_App::enable('files_encryption'); |
||||
} else { |
||||
\OC_App::disable('files_encryption'); |
||||
} |
||||
} |
||||
|
||||
public static function tearDownAfterClass() { |
||||
|
||||
// cleanup users |
||||
\OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER1); |
||||
\OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER2); |
||||
\OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER3); |
||||
} |
||||
|
||||
/** |
||||
* @param $user |
||||
* @param bool $create |
||||
* @param bool $password |
||||
*/ |
||||
protected static function loginHelper($user, $create = false, $password = false) { |
||||
if ($create) { |
||||
\OC_User::createUser($user, $user); |
||||
} |
||||
|
||||
if ($password === false) { |
||||
$password = $user; |
||||
} |
||||
|
||||
\OC_Util::tearDownFS(); |
||||
\OC_User::setUserId(''); |
||||
\OC\Files\Filesystem::tearDown(); |
||||
\OC_Util::setupFS($user); |
||||
\OC_User::setUserId($user); |
||||
|
||||
$params['uid'] = $user; |
||||
$params['password'] = $password; |
||||
} |
||||
|
||||
/** |
||||
* @brief get some information from a given share |
||||
* @param int $shareID |
||||
* @return array with: item_source, share_type, share_with, item_type, permissions |
||||
*/ |
||||
protected function getShareFromId($shareID) { |
||||
$sql = 'SELECT `item_source`, `share_type`, `share_with`, `item_type`, `permissions` FROM `*PREFIX*share` WHERE `id` = ?'; |
||||
$args = array($shareID); |
||||
$query = \OCP\DB::prepare($sql); |
||||
$result = $query->execute($args); |
||||
|
||||
$share = Null; |
||||
|
||||
if ($result && $result->numRows() > 0) { |
||||
$share = $result->fetchRow(); |
||||
} |
||||
|
||||
return $share; |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,161 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Vincent Petry |
||||
* @copyright 2013 Vincent Petry <pvince81@owncloud.com> |
||||
* |
||||
* This library is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
* License as published by the Free Software Foundation; either |
||||
* version 3 of the License, or any later version. |
||||
* |
||||
* This library is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
||||
* |
||||
* You should have received a copy of the GNU Affero General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
require_once __DIR__ . '/base.php'; |
||||
|
||||
class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base { |
||||
|
||||
function setUp() { |
||||
parent::setUp(); |
||||
|
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER1); |
||||
|
||||
// prepare user1's dir structure |
||||
$textData = "dummy file data\n"; |
||||
$this->view->mkdir('container'); |
||||
$this->view->mkdir('container/shareddir'); |
||||
$this->view->mkdir('container/shareddir/subdir'); |
||||
|
||||
list($this->ownerStorage, $internalPath) = $this->view->resolvePath(''); |
||||
$this->ownerCache = $this->ownerStorage->getCache(); |
||||
$this->ownerStorage->getScanner()->scan(''); |
||||
|
||||
// share "shareddir" with user2 |
||||
$fileinfo = $this->view->getFileInfo('container/shareddir'); |
||||
\OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, |
||||
self::TEST_FILES_SHARING_API_USER2, 31); |
||||
|
||||
// login as user2 |
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER2); |
||||
|
||||
// retrieve the shared storage |
||||
$secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2); |
||||
list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/Shared/shareddir'); |
||||
$this->sharedCache = $this->sharedStorage->getCache(); |
||||
} |
||||
|
||||
function tearDown() { |
||||
$this->sharedCache->clear(); |
||||
|
||||
$fileinfo = $this->view->getFileInfo('container/shareddir'); |
||||
\OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, |
||||
self::TEST_FILES_SHARING_API_USER2); |
||||
|
||||
self::loginHelper(self::TEST_FILES_SHARING_API_USER1); |
||||
|
||||
$this->view->deleteAll('container'); |
||||
|
||||
$this->ownerCache->clear(); |
||||
|
||||
parent::tearDown(); |
||||
} |
||||
|
||||
/** |
||||
* Tests that writing a file using the shared storage will propagate the file |
||||
* size to the owner's parent folders. |
||||
*/ |
||||
function testFolderSizePropagationToOwnerStorage() { |
||||
$initialSizes = self::getOwnerDirSizes('files/container/shareddir'); |
||||
|
||||
$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
||||
$dataLen = strlen($textData); |
||||
$this->sharedCache->put('shareddir/bar.txt', array('storage_mtime' => 10)); |
||||
$this->sharedStorage->file_put_contents('shareddir/bar.txt', $textData); |
||||
$this->sharedCache->put('shareddir', array('storage_mtime' => 10)); |
||||
|
||||
// run the propagation code |
||||
$result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir'); |
||||
|
||||
$this->assertTrue($result); |
||||
|
||||
// the owner's parent dirs must have increase size |
||||
$newSizes = self::getOwnerDirSizes('files/container/shareddir'); |
||||
$this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']); |
||||
$this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']); |
||||
$this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']); |
||||
$this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']); |
||||
|
||||
// no more updates |
||||
$result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir'); |
||||
|
||||
$this->assertFalse($result); |
||||
} |
||||
|
||||
/** |
||||
* Tests that writing a file using the shared storage will propagate the file |
||||
* size to the owner's parent folders. |
||||
*/ |
||||
function testSubFolderSizePropagationToOwnerStorage() { |
||||
$initialSizes = self::getOwnerDirSizes('files/container/shareddir/subdir'); |
||||
|
||||
$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
||||
$dataLen = strlen($textData); |
||||
$this->sharedCache->put('shareddir/subdir/bar.txt', array('storage_mtime' => 10)); |
||||
$this->sharedStorage->file_put_contents('shareddir/subdir/bar.txt', $textData); |
||||
$this->sharedCache->put('shareddir/subdir', array('storage_mtime' => 10)); |
||||
|
||||
// run the propagation code |
||||
$result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir'); |
||||
|
||||
$this->assertTrue($result); |
||||
|
||||
// the owner's parent dirs must have increase size |
||||
$newSizes = self::getOwnerDirSizes('files/container/shareddir/subdir'); |
||||
$this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']); |
||||
$this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']); |
||||
$this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']); |
||||
$this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']); |
||||
$this->assertEquals($initialSizes['files/container/shareddir/subdir'] + $dataLen, $newSizes['files/container/shareddir/subdir']); |
||||
|
||||
// no more updates |
||||
$result = $this->sharedStorage->getWatcher()->checkUpdate('shareddir/subdir'); |
||||
|
||||
$this->assertFalse($result); |
||||
} |
||||
|
||||
function testNoUpdateOnRoot() { |
||||
// no updates when called for root path |
||||
$result = $this->sharedStorage->getWatcher()->checkUpdate(''); |
||||
|
||||
$this->assertFalse($result); |
||||
|
||||
// FIXME: for some reason when running this "naked" test, |
||||
// there will be remaining nonsensical entries in the |
||||
// database with a path "test-share-user1/container/..." |
||||
} |
||||
|
||||
/** |
||||
* Returns the sizes of the path and its parent dirs in a hash |
||||
* where the key is the path and the value is the size. |
||||
*/ |
||||
function getOwnerDirSizes($path) { |
||||
$result = array(); |
||||
|
||||
while ($path != '' && $path != '' && $path != '.') { |
||||
$cachedData = $this->ownerCache->get($path); |
||||
$result[$path] = $cachedData['size']; |
||||
$path = dirname($path); |
||||
} |
||||
$cachedData = $this->ownerCache->get(''); |
||||
$result[''] = $cachedData['size']; |
||||
return $result; |
||||
} |
||||
} |
Loading…
Reference in new issue