]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fixed total space display when data size exceeds quota
authorVincent Petry <pvince81@owncloud.com>
Mon, 10 Mar 2014 14:19:18 +0000 (15:19 +0100)
committerVincent Petry <pvince81@owncloud.com>
Mon, 10 Mar 2014 16:59:14 +0000 (17:59 +0100)
The total space display in the personal page now shows the quota value
instead of used space when used space exceeds the quota (soft quota).

lib/private/files/storage/wrapper/quota.php
lib/private/helper.php
tests/lib/helperstorage.php [new file with mode: 0644]

index 26c952e694ac6aa8793823ca4a21dccb4ffe6089..0e0d5b1310465bfb2636753dc2c5d53fc4818896 100644 (file)
@@ -29,6 +29,13 @@ class Quota extends Wrapper {
                $this->sizeRoot = isset($parameters['root']) ? $parameters['root'] : '';
        }
 
+       /**
+        * @return quota value
+        */
+       public function getQuota() {
+               return $this->quota;
+       }
+
        /**
         * @param string $path
         */
index b9956d5ec1cd4d3f6ba59a09360cc7ae66f1723b..0b1a26bbecdfba70088ca199defe21af623f1108 100644 (file)
@@ -914,13 +914,22 @@ class OC_Helper {
                if ($used < 0) {
                        $used = 0;
                }
-               $free = \OC\Files\Filesystem::free_space($path);
+               $quota = 0;
+               // TODO: need a better way to get total space from storage
+               $storage = $rootInfo->getStorage();
+               if ($storage instanceof \OC\Files\Storage\Wrapper\Quota) {
+                       $quota = $storage->getQuota();
+               }
+               $free = $storage->free_space('');
                if ($free >= 0) {
                        $total = $free + $used;
                } else {
                        $total = $free; //either unknown or unlimited
                }
                if ($total > 0) {
+                       if ($quota > 0 && $total > $quota) {
+                               $total = $quota;
+                       }
                        // prevent division by zero or error codes (negative values)
                        $relative = round(($used / $total) * 10000) / 100;
                } else {
diff --git a/tests/lib/helperstorage.php b/tests/lib/helperstorage.php
new file mode 100644 (file)
index 0000000..010a54e
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Test the storage functions of OC_Helper
+ */
+class Test_Helper_Storage extends PHPUnit_Framework_TestCase {
+       private $user;
+       private $storageMock;
+
+       public function setUp() {
+               $this->user = 'user_' . uniqid();
+               \OC\Files\Filesystem::tearDown();
+               \OC\Files\Filesystem::init($this->user, '/' . $this->user . '/files');
+
+               $this->storageMock = $this->getMock(
+                       '\OC\Files\Storage\Temporary',
+                       array('free_space'),
+                       array('')
+               );
+
+               \OC\Files\Filesystem::clearMounts();
+
+               $this->storageMock->expects($this->once())
+                       ->method('free_space')
+                       ->will($this->returnValue(12));
+       }
+
+       public function tearDown() {
+               $this->user = null;
+
+               $this->storageMock->getCache()->clear();
+               \OC\Files\Filesystem::tearDown();
+       }
+
+       /**
+        * Test getting the storage info
+        */
+       function testGetStorageInfo() {
+               \OC\Files\Filesystem::mount($this->storageMock, array(), '/' . $this->user . '/files');
+               $this->storageMock->file_put_contents('test.txt', '01234');
+
+               $storageInfo = \OC_Helper::getStorageInfo('');
+               $this->assertEquals(12, $storageInfo['free']);
+               $this->assertEquals(5, $storageInfo['used']);
+               $this->assertEquals(17, $storageInfo['total']);
+       }
+
+       /**
+        * Test getting the storage info with quota enabled
+        */
+       function testGetStorageInfoWithQuota() {
+               $this->storageMock->file_put_contents('test.txt', '01234');
+               $this->storageMock = new \OC\Files\Storage\Wrapper\Quota(
+                       array(
+                               'storage' => $this->storageMock,
+                               'quota' => 7
+                       )
+               );
+               \OC\Files\Filesystem::mount($this->storageMock, array(), '/' . $this->user . '/files');
+
+               $storageInfo = \OC_Helper::getStorageInfo('');
+               $this->assertEquals(2, $storageInfo['free']);
+               $this->assertEquals(5, $storageInfo['used']);
+               $this->assertEquals(7, $storageInfo['total']);
+       }
+
+       /**
+        * Test getting the storage info when data exceeds quota
+        */
+       function testGetStorageInfoWhenSizeExceedsQuota() {
+               $this->storageMock->file_put_contents('test.txt', '0123456789');
+               $this->storageMock = new \OC\Files\Storage\Wrapper\Quota(
+                       array(
+                               'storage' => $this->storageMock,
+                               'quota' => 7
+                       )
+               );
+               \OC\Files\Filesystem::mount($this->storageMock, array(), '/' . $this->user . '/files');
+
+               $storageInfo = \OC_Helper::getStorageInfo('');
+               $this->assertEquals(0, $storageInfo['free']);
+               $this->assertEquals(10, $storageInfo['used']);
+               // total = quota
+               $this->assertEquals(7, $storageInfo['total']);
+       }
+
+       /**
+        * Test getting the storage info when the remaining
+        * free storage space is less than the quota
+        */
+       function testGetStorageInfoWhenFreeSpaceLessThanQuota() {
+               $this->storageMock->file_put_contents('test.txt', '01234');
+               $this->storageMock = new \OC\Files\Storage\Wrapper\Quota(
+                       array(
+                               'storage' => $this->storageMock,
+                               'quota' => 18
+                       )
+               );
+               \OC\Files\Filesystem::mount($this->storageMock, array(), '/' . $this->user . '/files');
+
+               $storageInfo = \OC_Helper::getStorageInfo('');
+               $this->assertEquals(12, $storageInfo['free']);
+               $this->assertEquals(5, $storageInfo['used']);
+               // total = free + used (because quota > total)
+               $this->assertEquals(17, $storageInfo['total']);
+       }
+}