summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLukas Reschke <lukas@owncloud.com>2015-02-26 16:35:13 +0100
committerLukas Reschke <lukas@owncloud.com>2015-02-26 16:35:13 +0100
commit9baf758150e348f7e1f0edf57bb432a0cbf6ff1b (patch)
treec9cf57bc8a7dbe4eb1c03b98933814e2177f110b /tests
parent2d9886d1c31801156c74935d4a38d6f6959dc66c (diff)
parent232de3bdc093e839048d5b00d7f08ecc87ba7908 (diff)
downloadnextcloud-server-9baf758150e348f7e1f0edf57bb432a0cbf6ff1b.tar.gz
nextcloud-server-9baf758150e348f7e1f0edf57bb432a0cbf6ff1b.zip
Merge pull request #14503 from owncloud/quota-preventdatalossforfailedmove
Fix file move/copy when storage space is not enough
Diffstat (limited to 'tests')
-rw-r--r--tests/lib/files/storage/wrapper/quota.php22
-rw-r--r--tests/lib/files/view.php51
2 files changed, 73 insertions, 0 deletions
diff --git a/tests/lib/files/storage/wrapper/quota.php b/tests/lib/files/storage/wrapper/quota.php
index dc4de4697db..8ca8f308b71 100644
--- a/tests/lib/files/storage/wrapper/quota.php
+++ b/tests/lib/files/storage/wrapper/quota.php
@@ -99,6 +99,28 @@ class Quota extends \Test\Files\Storage\Storage {
$this->assertEquals('foobarqwe', $instance->file_get_contents('foo'));
}
+ public function testStreamCopyWithEnoughSpace() {
+ $instance = $this->getLimitedStorage(16);
+ $inputStream = fopen('data://text/plain,foobarqwerty', 'r');
+ $outputStream = $instance->fopen('foo', 'w+');
+ list($count, $result) = \OC_Helper::streamCopy($inputStream, $outputStream);
+ $this->assertEquals(12, $count);
+ $this->assertTrue($result);
+ fclose($inputStream);
+ fclose($outputStream);
+ }
+
+ public function testStreamCopyNotEnoughSpace() {
+ $instance = $this->getLimitedStorage(9);
+ $inputStream = fopen('data://text/plain,foobarqwerty', 'r');
+ $outputStream = $instance->fopen('foo', 'w+');
+ list($count, $result) = \OC_Helper::streamCopy($inputStream, $outputStream);
+ $this->assertEquals(9, $count);
+ $this->assertFalse($result);
+ fclose($inputStream);
+ fclose($outputStream);
+ }
+
public function testReturnFalseWhenFopenFailed() {
$failStorage = $this->getMock(
'\OC\Files\Storage\Local',
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index b4b6d0deb2e..0d88ec1d66a 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -872,6 +872,57 @@ class View extends \Test\TestCase {
$this->assertEquals($time, $view->filemtime('/test/sub/storage/foo/bar.txt'));
}
+ public function testRenameFailDeleteTargetKeepSource() {
+ $this->doTestCopyRenameFail('rename');
+ }
+
+ public function testCopyFailDeleteTargetKeepSource() {
+ $this->doTestCopyRenameFail('copy');
+ }
+
+ private function doTestCopyRenameFail($operation) {
+ $storage1 = new Temporary(array());
+ $storage2 = new Temporary(array());
+ $storage2 = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage2, 'quota' => 9));
+ $storage1->mkdir('sub');
+ $storage1->file_put_contents('foo.txt', '0123456789ABCDEFGH');
+ $storage1->mkdir('dirtomove');
+ $storage1->file_put_contents('dirtomove/indir1.txt', '0123456'); // fits
+ $storage1->file_put_contents('dirtomove/indir2.txt', '0123456789ABCDEFGH'); // doesn't fit
+ $storage2->file_put_contents('existing.txt', '0123');
+ $storage1->getScanner()->scan('');
+ $storage2->getScanner()->scan('');
+ \OC\Files\Filesystem::mount($storage1, array(), '/test/');
+ \OC\Files\Filesystem::mount($storage2, array(), '/test/sub/storage');
+
+ // move file
+ $view = new \OC\Files\View('');
+ $this->assertTrue($storage1->file_exists('foo.txt'));
+ $this->assertFalse($storage2->file_exists('foo.txt'));
+ $this->assertFalse($view->$operation('/test/foo.txt', '/test/sub/storage/foo.txt'));
+ $this->assertFalse($storage2->file_exists('foo.txt'));
+ $this->assertFalse($storage2->getCache()->get('foo.txt'));
+ $this->assertTrue($storage1->file_exists('foo.txt'));
+
+ // if target exists, it will be deleted too
+ $this->assertFalse($view->$operation('/test/foo.txt', '/test/sub/storage/existing.txt'));
+ $this->assertFalse($storage2->file_exists('existing.txt'));
+ $this->assertFalse($storage2->getCache()->get('existing.txt'));
+ $this->assertTrue($storage1->file_exists('foo.txt'));
+
+ // move folder
+ $this->assertFalse($view->$operation('/test/dirtomove/', '/test/sub/storage/dirtomove/'));
+ // since the move failed, the full source tree is kept
+ $this->assertTrue($storage1->file_exists('dirtomove/indir1.txt'));
+ // but the target file stays
+ $this->assertTrue($storage2->file_exists('dirtomove/indir1.txt'));
+ // second file not moved/copied
+ $this->assertTrue($storage1->file_exists('dirtomove/indir2.txt'));
+ $this->assertFalse($storage2->file_exists('dirtomove/indir2.txt'));
+ $this->assertFalse($storage2->getCache()->get('dirtomove/indir2.txt'));
+
+ }
+
public function testDeleteFailKeepCache() {
/**
* @var \PHPUnit_Framework_MockObject_MockObject | \OC\Files\Storage\Temporary $storage