summaryrefslogtreecommitdiffstats
path: root/apps/files_trashbin/tests
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-01-21 16:29:52 +0100
committerVincent Petry <pvince81@owncloud.com>2015-01-23 12:20:54 +0100
commit67f1534e0fd7c14e97fe5b17bd92aa2277520604 (patch)
tree52b863953936295764a52036cebc1162a6507dfd /apps/files_trashbin/tests
parent5fb8a4715d6ed34b1d94c5508700f3c488c0f734 (diff)
downloadnextcloud-server-67f1534e0fd7c14e97fe5b17bd92aa2277520604.tar.gz
nextcloud-server-67f1534e0fd7c14e97fe5b17bd92aa2277520604.zip
Call final unlink in trash wrapper's storage
In the case of cross-storage delete, the files are copied to the trash, then deleted. The final delete on the source storage would still reach the trash wrapper. This fix makes forwards that second call to the wrapped storage to make the final delete work. It fixes the issue with remote shares, local shares and external storage. Also, it uses a new function "renameRecursive" that renames the files and preserves the mtimes (like "copy_recursive" did in the past))
Diffstat (limited to 'apps/files_trashbin/tests')
-rw-r--r--apps/files_trashbin/tests/storage.php132
1 files changed, 132 insertions, 0 deletions
diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php
new file mode 100644
index 00000000000..c340b9d2362
--- /dev/null
+++ b/apps/files_trashbin/tests/storage.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\Files_trashbin\Tests\Storage;
+
+use OC\Files\Storage\Home;
+use OC\Files\Storage\Temporary;
+use OC\Files\Mount\MountPoint;
+use OC\Files\Filesystem;
+
+class Storage extends \Test\TestCase {
+ /**
+ * @var \OCA\Files_trashbin\Storage
+ */
+ private $wrapper;
+
+ /**
+ * @var \OCP\Files\Storage
+ */
+ private $storage;
+
+ /**
+ * @var string
+ */
+ private $user;
+
+ /**
+ * @var \OC\Files\Storage\Storage
+ **/
+ private $originalStorage;
+
+ /**
+ * @var \OC\Files\View
+ */
+ private $userView;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->user = $this->getUniqueId('user');
+ \OC_User::createUser($this->user, $this->user);
+
+ // this will setup the FS
+ $this->loginAsUser($this->user);
+
+ $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
+
+ $mockUser = $this->getMock('\OCP\IUser');
+ $mockUser->expects($this->any())
+ ->method('getHome')
+ ->will($this->returnValue($this->originalStorage->getLocalFolder($this->user)));
+ $mockUser->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue($this->user));
+
+ // use temp as root storage so we can wrap it for testing
+ $this->storage = new Home(
+ array('user' => $mockUser)
+ );
+ $this->wrapper = new \OCA\Files_Trashbin\Storage(
+ array(
+ 'storage' => $this->storage,
+ 'mountPoint' => $this->user,
+ )
+ );
+
+ // make room for a new root
+ Filesystem::clearMounts();
+ $rootMount = new MountPoint($this->originalStorage, '');
+ Filesystem::getMountManager()->addMount($rootMount);
+ $homeMount = new MountPoint($this->wrapper, $this->user);
+ Filesystem::getMountManager()->addMount($homeMount);
+
+ $this->userView = new \OC\Files\View('/' . $this->user . '/files/');
+ $this->userView->file_put_contents('test.txt', 'foo');
+ }
+
+ protected function tearDown() {
+ \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
+ $this->logout();
+ parent::tearDown();
+ }
+
+ public function testSingleStorageDelete() {
+ $this->assertTrue($this->storage->file_exists('files/test.txt'));
+ $this->userView->unlink('test.txt');
+ $this->storage->getScanner()->scan('');
+ $this->assertFalse($this->userView->getFileInfo('test.txt'));
+ $this->assertFalse($this->storage->file_exists('files/test.txt'));
+
+ // check if file is in trashbin
+ $rootView = new \OC\Files\View('/');
+ $results = $rootView->getDirectoryContent($this->user . '/files_trashbin/files/');
+ $this->assertEquals(1, count($results));
+ $name = $results[0]->getName();
+ $this->assertEquals('test.txt', substr($name, 0, strrpos($name, '.')));
+ }
+
+ public function testCrossStorageDelete() {
+ $storage2 = new Temporary(array());
+ $wrapper2 = new \OCA\Files_Trashbin\Storage(
+ array(
+ 'storage' => $storage2,
+ 'mountPoint' => $this->user . '/files/substorage',
+ )
+ );
+
+ $mount = new MountPoint($wrapper2, $this->user . '/files/substorage');
+ Filesystem::getMountManager()->addMount($mount);
+
+ $this->userView->file_put_contents('substorage/subfile.txt', 'foo');
+ $storage2->getScanner()->scan('');
+ $this->assertTrue($storage2->file_exists('subfile.txt'));
+ $this->userView->unlink('substorage/subfile.txt');
+
+ $storage2->getScanner()->scan('');
+ $this->assertFalse($this->userView->getFileInfo('substorage/subfile.txt'));
+ $this->assertFalse($storage2->file_exists('subfile.txt'));
+
+ // check if file is in trashbin
+ $rootView = new \OC\Files\View('/');
+ $results = $rootView->getDirectoryContent($this->user . '/files_trashbin/files');
+ $this->assertEquals(1, count($results));
+ $name = $results[0]->getName();
+ $this->assertEquals('subfile.txt', substr($name, 0, strrpos($name, '.')));
+ }
+}