diff options
Diffstat (limited to 'apps/files_versions/tests/VersioningTest.php')
-rw-r--r-- | apps/files_versions/tests/VersioningTest.php | 670 |
1 files changed, 373 insertions, 297 deletions
diff --git a/apps/files_versions/tests/VersioningTest.php b/apps/files_versions/tests/VersioningTest.php index b35eb9a62c0..c9f7d27d7ab 100644 --- a/apps/files_versions/tests/VersioningTest.php +++ b/apps/files_versions/tests/VersioningTest.php @@ -1,42 +1,35 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Björn Schießle <bjoern@schiessle.org> - * @author Georg Ehrke <oc.list@georgehrke.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Stefan Weil <sw@weilnetz.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Vincent Petry <pvince81@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program 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, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ - namespace OCA\Files_Versions\Tests; -require_once __DIR__ . '/../appinfo/app.php'; - +use OC\AllConfig; +use OC\Files\Cache\Watcher; +use OC\Files\Filesystem; use OC\Files\Storage\Temporary; +use OC\Files\View; +use OC\SystemConfig; +use OC\User\NoUserException; +use OCA\Files_Sharing\AppInfo\Application; +use OCA\Files_Versions\Db\VersionEntity; +use OCA\Files_Versions\Db\VersionsMapper; +use OCA\Files_Versions\Events\VersionRestoredEvent; +use OCA\Files_Versions\Storage; +use OCA\Files_Versions\Versions\IVersionManager; +use OCP\Constants; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IMimeTypeLoader; use OCP\IConfig; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Server; +use OCP\Share\IShare; +use OCP\Util; /** * Class Test_Files_versions @@ -45,67 +38,92 @@ use OCP\IConfig; * @group DB */ class VersioningTest extends \Test\TestCase { - - const TEST_VERSIONS_USER = 'test-versions-user'; - const TEST_VERSIONS_USER2 = 'test-versions-user2'; - const USERS_VERSIONS_ROOT = '/test-versions-user/files_versions'; + public const TEST_VERSIONS_USER = 'test-versions-user'; + public const TEST_VERSIONS_USER2 = 'test-versions-user2'; + public const USERS_VERSIONS_ROOT = '/test-versions-user/files_versions'; /** - * @var \OC\Files\View + * @var View */ private $rootView; + /** + * @var VersionsMapper + */ + private $versionsMapper; + /** + * @var IMimeTypeLoader + */ + private $mimeTypeLoader; + private $user1; + private $user2; - public static function setUpBeforeClass() { + public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); - $application = new \OCA\Files_Sharing\AppInfo\Application(); - $application->registerMountProviders(); + $application = new Application(); // create test user self::loginHelper(self::TEST_VERSIONS_USER2, true); self::loginHelper(self::TEST_VERSIONS_USER, true); } - public static function tearDownAfterClass() { + public static function tearDownAfterClass(): void { // cleanup test user - $user = \OC::$server->getUserManager()->get(self::TEST_VERSIONS_USER); - if ($user !== null) { $user->delete(); } - $user = \OC::$server->getUserManager()->get(self::TEST_VERSIONS_USER2); - if ($user !== null) { $user->delete(); } + $user = Server::get(IUserManager::class)->get(self::TEST_VERSIONS_USER); + if ($user !== null) { + $user->delete(); + } + $user = Server::get(IUserManager::class)->get(self::TEST_VERSIONS_USER2); + if ($user !== null) { + $user->delete(); + } parent::tearDownAfterClass(); } - protected function setUp() { + protected function setUp(): void { parent::setUp(); - $config = \OC::$server->getConfig(); - $mockConfig = $this->createMock(IConfig::class); + $config = Server::get(IConfig::class); + $mockConfig = $this->getMockBuilder(AllConfig::class) + ->onlyMethods(['getSystemValue']) + ->setConstructorArgs([Server::get(SystemConfig::class)]) + ->getMock(); $mockConfig->expects($this->any()) ->method('getSystemValue') - ->will($this->returnCallback(function ($key, $default) use ($config) { + ->willReturnCallback(function ($key, $default) use ($config) { if ($key === 'filesystem_check_changes') { - return \OC\Files\Cache\Watcher::CHECK_ONCE; + return Watcher::CHECK_ONCE; } else { return $config->getSystemValue($key, $default); } - })); - $this->overwriteService('AllConfig', $mockConfig); + }); + $this->overwriteService(AllConfig::class, $mockConfig); // clear hooks \OC_Hook::clear(); - \OC::registerShareHooks(); - \OCA\Files_Versions\Hooks::connectHooks(); + \OC::registerShareHooks(Server::get(SystemConfig::class)); + \OC::$server->boot(); self::loginHelper(self::TEST_VERSIONS_USER); - $this->rootView = new \OC\Files\View(); + $this->rootView = new View(); if (!$this->rootView->file_exists(self::USERS_VERSIONS_ROOT)) { $this->rootView->mkdir(self::USERS_VERSIONS_ROOT); } + + $this->versionsMapper = Server::get(VersionsMapper::class); + $this->mimeTypeLoader = Server::get(IMimeTypeLoader::class); + + $this->user1 = $this->createMock(IUser::class); + $this->user1->method('getUID') + ->willReturn(self::TEST_VERSIONS_USER); + $this->user2 = $this->createMock(IUser::class); + $this->user2->method('getUID') + ->willReturn(self::TEST_VERSIONS_USER2); } - protected function tearDown() { - $this->restoreService('AllConfig'); + protected function tearDown(): void { + $this->restoreService(AllConfig::class); if ($this->rootView) { $this->rootView->deleteAll(self::TEST_VERSIONS_USER . '/files/'); @@ -122,153 +140,156 @@ class VersioningTest extends \Test\TestCase { /** * @medium * test expire logic - * @dataProvider versionsProvider */ - public function testGetExpireList($versions, $sizeOfAllDeletedFiles) { + #[\PHPUnit\Framework\Attributes\DataProvider('versionsProvider')] + public function testGetExpireList($versions, $sizeOfAllDeletedFiles): void { // last interval end at 2592000 $startTime = 5000000; $testClass = new VersionStorageToTest(); - list($deleted, $size) = $testClass->callProtectedGetExpireList($startTime, $versions); + [$deleted, $size] = $testClass->callProtectedGetExpireList($startTime, $versions); // we should have deleted 16 files each of the size 1 $this->assertEquals($sizeOfAllDeletedFiles, $size); // the deleted array should only contain versions which should be deleted - foreach($deleted as $key => $path) { + foreach ($deleted as $key => $path) { unset($versions[$key]); - $this->assertEquals("delete", substr($path, 0, strlen("delete"))); + $this->assertEquals('delete', substr($path, 0, strlen('delete'))); } // the versions array should only contain versions which should be kept foreach ($versions as $version) { - $this->assertEquals("keep", $version['path']); + $this->assertEquals('keep', $version['path']); } - } - public function versionsProvider() { - return array( + public static function versionsProvider(): array { + return [ // first set of versions uniformly distributed versions - array( - array( + [ + [ // first slice (10sec) keep one version every 2 seconds - array("version" => 4999999, "path" => "keep", "size" => 1), - array("version" => 4999998, "path" => "delete", "size" => 1), - array("version" => 4999997, "path" => "keep", "size" => 1), - array("version" => 4999995, "path" => "keep", "size" => 1), - array("version" => 4999994, "path" => "delete", "size" => 1), + ['version' => 4999999, 'path' => 'keep', 'size' => 1], + ['version' => 4999998, 'path' => 'delete', 'size' => 1], + ['version' => 4999997, 'path' => 'keep', 'size' => 1], + ['version' => 4999995, 'path' => 'keep', 'size' => 1], + ['version' => 4999994, 'path' => 'delete', 'size' => 1], //next slice (60sec) starts at 4999990 keep one version every 10 secons - array("version" => 4999988, "path" => "keep", "size" => 1), - array("version" => 4999978, "path" => "keep", "size" => 1), - array("version" => 4999975, "path" => "delete", "size" => 1), - array("version" => 4999972, "path" => "delete", "size" => 1), - array("version" => 4999967, "path" => "keep", "size" => 1), - array("version" => 4999958, "path" => "delete", "size" => 1), - array("version" => 4999957, "path" => "keep", "size" => 1), + ['version' => 4999988, 'path' => 'keep', 'size' => 1], + ['version' => 4999978, 'path' => 'keep', 'size' => 1], + ['version' => 4999975, 'path' => 'delete', 'size' => 1], + ['version' => 4999972, 'path' => 'delete', 'size' => 1], + ['version' => 4999967, 'path' => 'keep', 'size' => 1], + ['version' => 4999958, 'path' => 'delete', 'size' => 1], + ['version' => 4999957, 'path' => 'keep', 'size' => 1], //next slice (3600sec) start at 4999940 keep one version every 60 seconds - array("version" => 4999900, "path" => "keep", "size" => 1), - array("version" => 4999841, "path" => "delete", "size" => 1), - array("version" => 4999840, "path" => "keep", "size" => 1), - array("version" => 4999780, "path" => "keep", "size" => 1), - array("version" => 4996401, "path" => "keep", "size" => 1), + ['version' => 4999900, 'path' => 'keep', 'size' => 1], + ['version' => 4999841, 'path' => 'delete', 'size' => 1], + ['version' => 4999840, 'path' => 'keep', 'size' => 1], + ['version' => 4999780, 'path' => 'keep', 'size' => 1], + ['version' => 4996401, 'path' => 'keep', 'size' => 1], // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - array("version" => 4996350, "path" => "delete", "size" => 1), - array("version" => 4992800, "path" => "keep", "size" => 1), - array("version" => 4989800, "path" => "delete", "size" => 1), - array("version" => 4989700, "path" => "delete", "size" => 1), - array("version" => 4989200, "path" => "keep", "size" => 1), + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4992800, 'path' => 'keep', 'size' => 1], + ['version' => 4989800, 'path' => 'delete', 'size' => 1], + ['version' => 4989700, 'path' => 'delete', 'size' => 1], + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - array("version" => 4913600, "path" => "keep", "size" => 1), - array("version" => 4852800, "path" => "delete", "size" => 1), - array("version" => 4827201, "path" => "delete", "size" => 1), - array("version" => 4827200, "path" => "keep", "size" => 1), - array("version" => 4777201, "path" => "delete", "size" => 1), - array("version" => 4777501, "path" => "delete", "size" => 1), - array("version" => 4740000, "path" => "keep", "size" => 1), + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - array("version" => 2408000, "path" => "keep", "size" => 1), - array("version" => 1803201, "path" => "delete", "size" => 1), - array("version" => 1803200, "path" => "keep", "size" => 1), - array("version" => 1800199, "path" => "delete", "size" => 1), - array("version" => 1800100, "path" => "delete", "size" => 1), - array("version" => 1198300, "path" => "keep", "size" => 1), - ), + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], + ], 16 // size of all deleted files (every file has the size 1) - ), + ], // second set of versions, here we have only really old versions - array( - array( + [ + [ // first slice (10sec) keep one version every 2 seconds // next slice (60sec) starts at 4999990 keep one version every 10 secons // next slice (3600sec) start at 4999940 keep one version every 60 seconds // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - array("version" => 4996400, "path" => "keep", "size" => 1), - array("version" => 4996350, "path" => "delete", "size" => 1), - array("version" => 4996350, "path" => "delete", "size" => 1), - array("version" => 4992800, "path" => "keep", "size" => 1), - array("version" => 4989800, "path" => "delete", "size" => 1), - array("version" => 4989700, "path" => "delete", "size" => 1), - array("version" => 4989200, "path" => "keep", "size" => 1), + ['version' => 4996400, 'path' => 'keep', 'size' => 1], + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4992800, 'path' => 'keep', 'size' => 1], + ['version' => 4989800, 'path' => 'delete', 'size' => 1], + ['version' => 4989700, 'path' => 'delete', 'size' => 1], + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - array("version" => 4913600, "path" => "keep", "size" => 1), - array("version" => 4852800, "path" => "delete", "size" => 1), - array("version" => 4827201, "path" => "delete", "size" => 1), - array("version" => 4827200, "path" => "keep", "size" => 1), - array("version" => 4777201, "path" => "delete", "size" => 1), - array("version" => 4777501, "path" => "delete", "size" => 1), - array("version" => 4740000, "path" => "keep", "size" => 1), + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - array("version" => 2408000, "path" => "keep", "size" => 1), - array("version" => 1803201, "path" => "delete", "size" => 1), - array("version" => 1803200, "path" => "keep", "size" => 1), - array("version" => 1800199, "path" => "delete", "size" => 1), - array("version" => 1800100, "path" => "delete", "size" => 1), - array("version" => 1198300, "path" => "keep", "size" => 1), - ), + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], + ], 11 // size of all deleted files (every file has the size 1) - ), + ], // third set of versions, with some gaps between - array( - array( + [ + [ // first slice (10sec) keep one version every 2 seconds - array("version" => 4999999, "path" => "keep", "size" => 1), - array("version" => 4999998, "path" => "delete", "size" => 1), - array("version" => 4999997, "path" => "keep", "size" => 1), - array("version" => 4999995, "path" => "keep", "size" => 1), - array("version" => 4999994, "path" => "delete", "size" => 1), + ['version' => 4999999, 'path' => 'keep', 'size' => 1], + ['version' => 4999998, 'path' => 'delete', 'size' => 1], + ['version' => 4999997, 'path' => 'keep', 'size' => 1], + ['version' => 4999995, 'path' => 'keep', 'size' => 1], + ['version' => 4999994, 'path' => 'delete', 'size' => 1], //next slice (60sec) starts at 4999990 keep one version every 10 secons - array("version" => 4999988, "path" => "keep", "size" => 1), - array("version" => 4999978, "path" => "keep", "size" => 1), + ['version' => 4999988, 'path' => 'keep', 'size' => 1], + ['version' => 4999978, 'path' => 'keep', 'size' => 1], //next slice (3600sec) start at 4999940 keep one version every 60 seconds // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - array("version" => 4989200, "path" => "keep", "size" => 1), + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - array("version" => 4913600, "path" => "keep", "size" => 1), - array("version" => 4852800, "path" => "delete", "size" => 1), - array("version" => 4827201, "path" => "delete", "size" => 1), - array("version" => 4827200, "path" => "keep", "size" => 1), - array("version" => 4777201, "path" => "delete", "size" => 1), - array("version" => 4777501, "path" => "delete", "size" => 1), - array("version" => 4740000, "path" => "keep", "size" => 1), + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - array("version" => 2408000, "path" => "keep", "size" => 1), - array("version" => 1803201, "path" => "delete", "size" => 1), - array("version" => 1803200, "path" => "keep", "size" => 1), - array("version" => 1800199, "path" => "delete", "size" => 1), - array("version" => 1800100, "path" => "delete", "size" => 1), - array("version" => 1198300, "path" => "keep", "size" => 1), - ), + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], + ], 9 // size of all deleted files (every file has the size 1) - ), - - ); + ], + // fourth set of versions: empty (see issue #19066) + [ + [], + 0 + ] + + ]; } - public function testRename() { - - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testRename(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -285,7 +306,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute rename hook of versions app - \OC\Files\Filesystem::rename("test.txt", "test2.txt"); + Filesystem::rename('test.txt', 'test2.txt'); $this->runCommands(); @@ -296,11 +317,10 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v2Renamed), 'version 2 of renamed file exists'); } - public function testRenameInSharedFolder() { - - \OC\Files\Filesystem::mkdir('folder1'); - \OC\Files\Filesystem::mkdir('folder1/folder2'); - \OC\Files\Filesystem::file_put_contents("folder1/test.txt", "test file"); + public function testRenameInSharedFolder(): void { + Filesystem::mkdir('folder1'); + Filesystem::mkdir('folder1/folder2'); + Filesystem::file_put_contents('folder1/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -318,20 +338,21 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); - $this->assertTrue(\OC\Files\Filesystem::file_exists('folder1/test.txt')); + $this->assertTrue(Filesystem::file_exists('folder1/test.txt')); // execute rename hook of versions app - \OC\Files\Filesystem::rename('/folder1/test.txt', '/folder1/folder2/test.txt'); + Filesystem::rename('/folder1/test.txt', '/folder1/folder2/test.txt'); $this->runCommands(); @@ -343,14 +364,13 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed), 'version 1 of renamed file exists'); $this->assertTrue($this->rootView->file_exists($v2Renamed), 'version 2 of renamed file exists'); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testMoveFolder() { - - \OC\Files\Filesystem::mkdir('folder1'); - \OC\Files\Filesystem::mkdir('folder2'); - \OC\Files\Filesystem::file_put_contents('folder1/test.txt', 'test file'); + public function testMoveFolder(): void { + Filesystem::mkdir('folder1'); + Filesystem::mkdir('folder2'); + Filesystem::file_put_contents('folder1/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -368,7 +388,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute rename hook of versions app - \OC\Files\Filesystem::rename('folder1', 'folder2/folder1'); + Filesystem::rename('folder1', 'folder2/folder1'); $this->runCommands(); @@ -380,23 +400,23 @@ class VersioningTest extends \Test\TestCase { } - public function testMoveFileIntoSharedFolderAsRecipient() { - - \OC\Files\Filesystem::mkdir('folder1'); - $fileInfo = \OC\Files\Filesystem::getFileInfo('folder1'); + public function testMoveFileIntoSharedFolderAsRecipient(): void { + Filesystem::mkdir('folder1'); + $fileInfo = Filesystem::getFileInfo('folder1'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); $versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions'; - \OC\Files\Filesystem::file_put_contents('test.txt', 'test file'); + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -412,8 +432,9 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // move file into the shared folder as recipient - \OC\Files\Filesystem::rename('/test.txt', '/folder1/test.txt'); + $success = Filesystem::rename('/test.txt', '/folder1/test.txt'); + $this->assertTrue($success); $this->assertFalse($this->rootView->file_exists($v1)); $this->assertFalse($this->rootView->file_exists($v2)); @@ -427,26 +448,26 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed)); $this->assertTrue($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testMoveFolderIntoSharedFolderAsRecipient() { - - \OC\Files\Filesystem::mkdir('folder1'); + public function testMoveFolderIntoSharedFolderAsRecipient(): void { + Filesystem::mkdir('folder1'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); $versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions'; - \OC\Files\Filesystem::mkdir('folder2'); - \OC\Files\Filesystem::file_put_contents('folder2/test.txt', 'test file'); + Filesystem::mkdir('folder2'); + Filesystem::file_put_contents('folder2/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -463,7 +484,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // move file into the shared folder as recipient - \OC\Files\Filesystem::rename('/folder2', '/folder1/folder2'); + Filesystem::rename('/folder2', '/folder1/folder2'); $this->assertFalse($this->rootView->file_exists($v1)); $this->assertFalse($this->rootView->file_exists($v2)); @@ -478,12 +499,11 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed)); $this->assertTrue($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testRenameSharedFile() { - - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testRenameSharedFile(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -502,20 +522,21 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('test.txt'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_READ | Constants::PERMISSION_UPDATE | Constants::PERMISSION_SHARE); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); - $this->assertTrue(\OC\Files\Filesystem::file_exists('test.txt')); + $this->assertTrue(Filesystem::file_exists('test.txt')); // execute rename hook of versions app - \OC\Files\Filesystem::rename('test.txt', 'test2.txt'); + Filesystem::rename('test.txt', 'test2.txt'); self::loginHelper(self::TEST_VERSIONS_USER); @@ -527,12 +548,11 @@ class VersioningTest extends \Test\TestCase { $this->assertFalse($this->rootView->file_exists($v1Renamed)); $this->assertFalse($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testCopy() { - - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testCopy(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -549,7 +569,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute copy hook of versions app - \OC\Files\Filesystem::copy("test.txt", "test2.txt"); + Filesystem::copy('test.txt', 'test2.txt'); $this->runCommands(); @@ -564,8 +584,7 @@ class VersioningTest extends \Test\TestCase { * test if we find all versions and if the versions array contain * the correct 'path' and 'name' */ - public function testGetVersions() { - + public function testGetVersions(): void { $t1 = time(); // second version is two weeks older, this way we make sure that no // version will be expired @@ -581,7 +600,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute copy hook of versions app - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, '/subfolder/test.txt'); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, '/subfolder/test.txt'); $this->assertCount(2, $versions); @@ -598,64 +617,65 @@ class VersioningTest extends \Test\TestCase { * test if we find all versions and if the versions array contain * the correct 'path' and 'name' */ - public function testGetVersionsEmptyFile() { + public function testGetVersionsEmptyFile(): void { // execute copy hook of versions app - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, ''); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, ''); $this->assertCount(0, $versions); - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, null); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, null); $this->assertCount(0, $versions); } - public function testExpireNonexistingFile() { + public function testExpireNonexistingFile(): void { $this->logout(); // needed to have a FS setup (the background job does this) \OC_Util::setupFS(self::TEST_VERSIONS_USER); - $this->assertFalse(\OCA\Files_Versions\Storage::expire('/void/unexist.txt', self::TEST_VERSIONS_USER)); + $this->assertFalse(Storage::expire('/void/unexist.txt', self::TEST_VERSIONS_USER)); } - /** - * @expectedException \OC\User\NoUserException - */ - public function testExpireNonexistingUser() { + + public function testExpireNonexistingUser(): void { + $this->expectException(NoUserException::class); + $this->logout(); // needed to have a FS setup (the background job does this) \OC_Util::setupFS(self::TEST_VERSIONS_USER); - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + Filesystem::file_put_contents('test.txt', 'test file'); - $this->assertFalse(\OCA\Files_Versions\Storage::expire('test.txt', 'unexist')); + $this->assertFalse(Storage::expire('test.txt', 'unexist')); } - public function testRestoreSameStorage() { - \OC\Files\Filesystem::mkdir('sub'); + public function testRestoreSameStorage(): void { + Filesystem::mkdir('sub'); $this->doTestRestore(); } - public function testRestoreCrossStorage() { - $storage2 = new Temporary(array()); - \OC\Files\Filesystem::mount($storage2, array(), self::TEST_VERSIONS_USER . '/files/sub'); + public function testRestoreCrossStorage(): void { + $storage2 = new Temporary([]); + Filesystem::mount($storage2, [], self::TEST_VERSIONS_USER . '/files/sub'); $this->doTestRestore(); } - public function testRestoreNoPermission() { + public function testRestoreNoPermission(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); $userHome = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER); $node = $userHome->newFolder('folder'); $file = $node->newFile('test.txt'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_READ); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_READ); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); $versions = $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'folder/test.txt' ); @@ -665,14 +685,57 @@ class VersioningTest extends \Test\TestCase { $firstVersion = current($versions); - $this->assertFalse(\OCA\Files_Versions\Storage::rollback('folder/test.txt', $firstVersion['version']), 'Revert did not happen'); + $this->assertFalse(Storage::rollback('folder/test.txt', (int)$firstVersion['version'], $this->user2), 'Revert did not happen'); $this->loginAsUser(self::TEST_VERSIONS_USER); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); $this->assertEquals('test file', $file->getContent(), 'File content has not changed'); } + public function testRestoreMovedShare(): void { + $this->markTestSkipped('Unreliable test'); + $this->loginAsUser(self::TEST_VERSIONS_USER); + + $userHome = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER); + $node = $userHome->newFolder('folder'); + $file = $node->newFile('test.txt'); + + $userHome2 = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER2); + $userHome2->newFolder('subfolder'); + + $share = Server::get(\OCP\Share\IManager::class)->newShare(); + $share->setNode($node) + ->setShareType(IShare::TYPE_USER) + ->setSharedBy(self::TEST_VERSIONS_USER) + ->setSharedWith(self::TEST_VERSIONS_USER2) + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + $shareManager = Server::get(\OCP\Share\IManager::class); + $shareManager->acceptShare($share, self::TEST_VERSIONS_USER2); + + $share->setTarget('subfolder/folder'); + $shareManager->moveShare($share, self::TEST_VERSIONS_USER2); + + $versions = $this->createAndCheckVersions( + Filesystem::getView(), + 'folder/test.txt' + ); + + $file->putContent('test file'); + + $this->loginAsUser(self::TEST_VERSIONS_USER2); + + $firstVersion = current($versions); + + $this->assertTrue(Storage::rollback('folder/test.txt', $firstVersion['version'], $this->user1)); + + $this->loginAsUser(self::TEST_VERSIONS_USER); + + Server::get(\OCP\Share\IManager::class)->deleteShare($share); + $this->assertEquals('version 2', $file->getContent(), 'File content has not changed'); + } + /** * @param string $hookName name of hook called * @param string $params variable to receive parameters provided by hook @@ -682,19 +745,19 @@ class VersioningTest extends \Test\TestCase { return; } - $eventHandler = $this->getMockBuilder(\stdclass::class) - ->setMethods(['callback']) + $eventHandler = $this->getMockBuilder(DummyHookListener::class) + ->onlyMethods(['callback']) ->getMock(); $eventHandler->expects($this->any()) ->method('callback') - ->will($this->returnCallback( - function($p) use (&$params) { + ->willReturnCallback( + function ($p) use (&$params): void { $params = $p; } - )); + ); - \OCP\Util::connectHook( + Util::connectHook( '\OCP\Versions', $hookName, $eventHandler, @@ -702,10 +765,11 @@ class VersioningTest extends \Test\TestCase { ); } - private function doTestRestore() { + private function doTestRestore(): void { $filePath = self::TEST_VERSIONS_USER . '/files/sub/test.txt'; $this->rootView->file_put_contents($filePath, 'test file'); + $fileInfo = $this->rootView->getFileInfo($filePath); $t0 = $this->rootView->filemtime($filePath); // not exactly the same timestamp as the file @@ -718,10 +782,28 @@ class VersioningTest extends \Test\TestCase { $v2 = self::USERS_VERSIONS_ROOT . '/sub/test.txt.v' . $t2; $this->rootView->mkdir(self::USERS_VERSIONS_ROOT . '/sub'); + $this->rootView->file_put_contents($v1, 'version1'); - $this->rootView->file_put_contents($v2, 'version2'); + $fileInfoV1 = $this->rootView->getFileInfo($v1); + $versionEntity = new VersionEntity(); + $versionEntity->setFileId($fileInfo->getId()); + $versionEntity->setTimestamp($t1); + $versionEntity->setSize($fileInfoV1->getSize()); + $versionEntity->setMimetype($this->mimeTypeLoader->getId($fileInfoV1->getMimetype())); + $versionEntity->setMetadata([]); + $this->versionsMapper->insert($versionEntity); - $oldVersions = \OCA\Files_Versions\Storage::getVersions( + $this->rootView->file_put_contents($v2, 'version2'); + $fileInfoV2 = $this->rootView->getFileInfo($v2); + $versionEntity = new VersionEntity(); + $versionEntity->setFileId($fileInfo->getId()); + $versionEntity->setTimestamp($t2); + $versionEntity->setSize($fileInfoV2->getSize()); + $versionEntity->setMimetype($this->mimeTypeLoader->getId($fileInfoV2->getMimetype())); + $versionEntity->setMetadata([]); + $this->versionsMapper->insert($versionEntity); + + $oldVersions = Storage::getVersions( self::TEST_VERSIONS_USER, '/sub/test.txt' ); @@ -730,17 +812,22 @@ class VersioningTest extends \Test\TestCase { $this->assertEquals('test file', $this->rootView->file_get_contents($filePath)); $info1 = $this->rootView->getFileInfo($filePath); - $params = array(); - $this->connectMockHooks('rollback', $params); + $eventDispatcher = Server::get(IEventDispatcher::class); + $eventFired = false; + $eventDispatcher->addListener(VersionRestoredEvent::class, function ($event) use (&$eventFired, $t2): void { + $eventFired = true; + $this->assertEquals('/sub/test.txt', $event->getVersion()->getVersionPath()); + $this->assertTrue($event->getVersion()->getRevisionId() > 0); + }); - $this->assertTrue(\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2)); - $expectedParams = array( - 'path' => '/sub/test.txt', - ); + $versionManager = Server::get(IVersionManager::class); + $versions = $versionManager->getVersionsForFile($this->user1, $info1); + $version = array_filter($versions, function ($version) use ($t2) { + return $version->getRevisionId() === $t2; + }); + $this->assertTrue($versionManager->rollback(current($version))); - $this->assertEquals($expectedParams['path'], $params['path']); - $this->assertTrue(array_key_exists('revision', $params)); - $this->assertTrue($params['revision'] > 0); + $this->assertTrue($eventFired, 'VersionRestoredEvent was not fired'); $this->assertEquals('version2', $this->rootView->file_get_contents($filePath)); $info2 = $this->rootView->getFileInfo($filePath); @@ -761,7 +848,7 @@ class VersioningTest extends \Test\TestCase { 'Restored file has mtime from version' ); - $newVersions = \OCA\Files_Versions\Storage::getVersions( + $newVersions = Storage::getVersions( self::TEST_VERSIONS_USER, '/sub/test.txt' ); @@ -797,11 +884,11 @@ class VersioningTest extends \Test\TestCase { /** * Test whether versions are created when overwriting as owner */ - public function testStoreVersionAsOwner() { + public function testStoreVersionAsOwner(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'test.txt' ); } @@ -809,29 +896,30 @@ class VersioningTest extends \Test\TestCase { /** * Test whether versions are created when overwriting as share recipient */ - public function testStoreVersionAsRecipient() { + public function testStoreVersionAsRecipient(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); - \OC\Files\Filesystem::mkdir('folder'); - \OC\Files\Filesystem::file_put_contents('folder/test.txt', 'test file'); + Filesystem::mkdir('folder'); + Filesystem::file_put_contents('folder/test.txt', 'test file'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); $this->loginAsUser(self::TEST_VERSIONS_USER2); $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'folder/test.txt' ); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } /** @@ -841,25 +929,21 @@ class VersioningTest extends \Test\TestCase { * is logged in. File modification must still be able to find * the owner and create versions. */ - public function testStoreVersionAsAnonymous() { + public function testStoreVersionAsAnonymous(): void { $this->logout(); // note: public link upload does this, // needed to make the hooks fire \OC_Util::setupFS(self::TEST_VERSIONS_USER); - $userView = new \OC\Files\View('/' . self::TEST_VERSIONS_USER . '/files'); + $userView = new View('/' . self::TEST_VERSIONS_USER . '/files'); $this->createAndCheckVersions( $userView, 'test.txt' ); } - /** - * @param \OC\Files\View $view - * @param string $path - */ - private function createAndCheckVersions(\OC\Files\View $view, $path) { + private function createAndCheckVersions(View $view, string $path): array { $view->file_put_contents($path, 'test file'); $view->file_put_contents($path, 'version 1'); $view->file_put_contents($path, 'version 2'); @@ -867,10 +951,10 @@ class VersioningTest extends \Test\TestCase { $this->loginAsUser(self::TEST_VERSIONS_USER); // need to scan for the versions - list($rootStorage,) = $this->rootView->resolvePath(self::TEST_VERSIONS_USER . '/files_versions'); + [$rootStorage,] = $this->rootView->resolvePath(self::TEST_VERSIONS_USER . '/files_versions'); $rootStorage->getScanner()->scan('files_versions'); - $versions = \OCA\Files_Versions\Storage::getVersions( + $versions = Storage::getVersions( self::TEST_VERSIONS_USER, '/' . $path ); @@ -881,42 +965,34 @@ class VersioningTest extends \Test\TestCase { return $versions; } - /** - * @param string $user - * @param bool $create - */ - public static function loginHelper($user, $create = false) { - + public static function loginHelper(string $user, bool $create = false) { if ($create) { - $backend = new \Test\Util\User\Dummy(); + $backend = new \Test\Util\User\Dummy(); $backend->createUser($user, $user); - \OC::$server->getUserManager()->registerBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); } - $storage = new \ReflectionClass('\OCA\Files_Sharing\SharedStorage'); - $isInitialized = $storage->getProperty('initialized'); - $isInitialized->setAccessible(true); - $isInitialized->setValue($storage, false); - $isInitialized->setAccessible(false); - \OC_Util::tearDownFS(); \OC_User::setUserId(''); - \OC\Files\Filesystem::tearDown(); + Filesystem::tearDown(); \OC_User::setUserId($user); \OC_Util::setupFS($user); \OC::$server->getUserFolder($user); } +} +class DummyHookListener { + public function callback() { + } } // extend the original class to make it possible to test protected methods -class VersionStorageToTest extends \OCA\Files_Versions\Storage { +class VersionStorageToTest extends Storage { /** * @param integer $time */ public function callProtectedGetExpireList($time, $versions) { return self::getExpireList($time, $versions); - } } |