From 33fd130d48c0654b4e562b02661d778b41369129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 13 Nov 2014 17:49:20 +0100 Subject: [PATCH] adding unit tests for file chunking --- lib/private/cache/file.php | 10 +++++++++ lib/private/filechunking.php | 3 ++- lib/private/files/cachingchunkhandler.php | 12 ++++++++-- tests/lib/files/storage/storage.php | 27 +++++++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lib/private/cache/file.php b/lib/private/cache/file.php index 4e7c065678e3..9f644ac2854e 100644 --- a/lib/private/cache/file.php +++ b/lib/private/cache/file.php @@ -9,9 +9,19 @@ namespace OC\Cache; +use OC\Files\View; +use OCP\Files\Storage; + class File { + /** + * @var View|Storage + */ protected $storage; + public function __construct($storage = null) { + $this->storage = $storage; + } + /** * Returns the cache storage for the logged in user * @return \OC\Files\View cache storage diff --git a/lib/private/filechunking.php b/lib/private/filechunking.php index 1f95acef3f52..d030bfe7768f 100644 --- a/lib/private/filechunking.php +++ b/lib/private/filechunking.php @@ -19,8 +19,9 @@ static public function decodeName($name) { /** * @param string[] $info */ - public function __construct($info) { + public function __construct($info, $cache = null) { $this->info = $info; + $this->cache = $cache; } public function getPrefix() { diff --git a/lib/private/files/cachingchunkhandler.php b/lib/private/files/cachingchunkhandler.php index 06c7be616d87..14e41301c698 100644 --- a/lib/private/files/cachingchunkhandler.php +++ b/lib/private/files/cachingchunkhandler.php @@ -19,6 +19,8 @@ class CachingChunkHandler implements \OCP\Files\IChunkHandler { */ private $storage; + private $cache; + public function __construct(Storage $storage) { $this->storage = $storage; } @@ -40,12 +42,14 @@ function storeChunk($fileName, $index, $numberOfChunk, $chunkSize, $data, $trans 'chunkcount' => $numberOfChunk, '' ); - $chunkHandler = new \OC_FileChunking($info); + $chunkHandler = new \OC_FileChunking($info, $this->cache); $bytesWritten = $chunkHandler->store($index, $data); if ($bytesWritten != $chunkSize) { $chunkHandler->remove($index); } $complete = false; + $actualSize = $chunkHandler->getCurrentSize(); + if ($chunkHandler->isComplete()) { $complete = true; $f = $this->storage->fopen("/files" . $fileName, 'w'); @@ -56,7 +60,11 @@ function storeChunk($fileName, $index, $numberOfChunk, $chunkSize, $data, $trans return array( 'complete' => $complete, 'bytesWritten' => $bytesWritten, - 'actualSize' => $chunkHandler->getCurrentSize() + 'actualSize' => $actualSize ); } + + public function setFileCache($cache) { + $this->cache = $cache; + } } diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php index 30f403d60df0..e1fc5f6e91c1 100644 --- a/tests/lib/files/storage/storage.php +++ b/tests/lib/files/storage/storage.php @@ -22,6 +22,9 @@ namespace Test\Files\Storage; +use OC\Files\CachingChunkHandler; +use OC\Files\Storage\Temporary; + abstract class Storage extends \Test\TestCase { /** * @var \OC\Files\Storage\Storage instance @@ -533,4 +536,28 @@ public function testInstanceOfStorage() { $this->assertTrue($this->instance->instanceOfStorage(get_class($this->instance))); $this->assertFalse($this->instance->instanceOfStorage('\OC')); } + + public function testChunkedUpload() { + $chunkHandler = $this->instance->getChunkHandler(); + $this->assertInstanceOf('\OCP\Files\IChunkHandler', $chunkHandler); + + if ($chunkHandler instanceof CachingChunkHandler) { + $chunkHandler->setFileCache(new \OC\Cache\File(new Temporary(array()))); + } + + $transferId = uniqid('transfer-'); + $return = $chunkHandler->storeChunk('chunk-test-01.txt', 0, 2, 10, '0123456789', $transferId); + $this->assertTrue(is_array($return)); + $this->assertFalse($return['complete']); + $this->assertEquals(10, $return['bytesWritten']); + $this->assertEquals(10, $return['actualSize']); + + $return = $chunkHandler->storeChunk('chunk-test-01.txt', 1, 2, 10, '0123456789', $transferId); + $this->assertTrue(is_array($return)); + $this->assertTrue($return['complete']); + $this->assertEquals(10, $return['bytesWritten']); + $this->assertEquals(20, $return['actualSize']); + + $this->instance->file_exists('chunk-test-01.txt'); + } }