123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test;
- use OC\Files\Storage\Temporary;
- use OCP\Files\Mount\IMountManager;
- use OCP\IConfig;
- use Test\Traits\UserTrait;
- /**
- * Test the storage functions of OC_Helper
- *
- * @group DB
- */
- class HelperStorageTest extends \Test\TestCase {
- use UserTrait;
- /** @var string */
- private $user;
- /** @var \OC\Files\Storage\Storage */
- private $storageMock;
- /** @var \OC\Files\Storage\Storage */
- private $storage;
- private bool $savedQuotaIncludeExternalStorage;
- protected function setUp(): void {
- parent::setUp();
- $this->user = $this->getUniqueID('user_');
- $this->createUser($this->user, $this->user);
- $this->savedQuotaIncludeExternalStorage = $this->getIncludeExternalStorage();
- \OC\Files\Filesystem::tearDown();
- \OC_User::setUserId($this->user);
- \OC\Files\Filesystem::init($this->user, '/' . $this->user . '/files');
- /** @var IMountManager $manager */
- $manager = \OC::$server->get(IMountManager::class);
- $manager->removeMount('/' . $this->user);
- $this->storageMock = null;
- }
- protected function tearDown(): void {
- $this->setIncludeExternalStorage($this->savedQuotaIncludeExternalStorage);
- $this->user = null;
- if ($this->storageMock) {
- $this->storageMock->getCache()->clear();
- $this->storageMock = null;
- }
- \OC\Files\Filesystem::tearDown();
- \OC_User::setUserId('');
- \OC::$server->getConfig()->deleteAllUserValues($this->user);
- parent::tearDown();
- }
- /**
- * Returns a storage mock that returns the given value as
- * free space
- *
- * @param int $freeSpace free space value
- * @return \OC\Files\Storage\Storage
- */
- private function getStorageMock($freeSpace = 12) {
- $this->storageMock = $this->getMockBuilder(Temporary::class)
- ->setMethods(['free_space'])
- ->setConstructorArgs([''])
- ->getMock();
- $this->storageMock->expects($this->once())
- ->method('free_space')
- ->willReturn(12);
- return $this->storageMock;
- }
- /**
- * Test getting the storage info
- */
- public function testGetStorageInfo() {
- $homeStorage = $this->getStorageMock(12);
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $this->user . '/files');
- $homeStorage->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']);
- }
- private function getIncludeExternalStorage(): bool {
- $class = new \ReflectionClass(\OC_Helper::class);
- $prop = $class->getProperty('quotaIncludeExternalStorage');
- $prop->setAccessible(true);
- return $prop->getValue(null) ?? false;
- }
- private function setIncludeExternalStorage(bool $include) {
- $class = new \ReflectionClass(\OC_Helper::class);
- $prop = $class->getProperty('quotaIncludeExternalStorage');
- $prop->setAccessible(true);
- $prop->setValue(null, $include);
- }
- /**
- * Test getting the storage info, ignoring extra mount points
- */
- public function testGetStorageInfoExcludingExtStorage() {
- $homeStorage = $this->getStorageMock(12);
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $this->user . '/files');
- $homeStorage->file_put_contents('test.txt', '01234');
- $extStorage = new \OC\Files\Storage\Temporary([]);
- $extStorage->file_put_contents('extfile.txt', 'abcdefghijklmnopq');
- $extStorage->getScanner()->scan(''); // update root size
- $this->setIncludeExternalStorage(false);
- \OC\Files\Filesystem::mount($extStorage, [], '/' . $this->user . '/files/ext');
- $storageInfo = \OC_Helper::getStorageInfo('');
- $this->assertEquals(12, $storageInfo['free']);
- $this->assertEquals(5, $storageInfo['used']);
- $this->assertEquals(17, $storageInfo['total']);
- }
- /**
- * Test getting the storage info, including extra mount points
- */
- public function testGetStorageInfoIncludingExtStorage() {
- $homeStorage = new \OC\Files\Storage\Temporary([]);
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $this->user . '/files');
- $homeStorage->file_put_contents('test.txt', '01234');
- $extStorage = new \OC\Files\Storage\Temporary([]);
- $extStorage->file_put_contents('extfile.txt', 'abcdefghijklmnopq');
- $extStorage->getScanner()->scan(''); // update root size
- \OC\Files\Filesystem::mount($extStorage, [], '/' . $this->user . '/files/ext');
- $this->setIncludeExternalStorage(true);
- $config = \OC::$server->get(IConfig::class);
- $config->setUserValue($this->user, 'files', 'quota', '25');
- $storageInfo = \OC_Helper::getStorageInfo('');
- $this->assertEquals(3, $storageInfo['free']);
- $this->assertEquals(22, $storageInfo['used']);
- $this->assertEquals(25, $storageInfo['total']);
- $config->setUserValue($this->user, 'files', 'quota', 'default');
- }
- /**
- * Test getting the storage info excluding extra mount points
- * when user has no quota set, even when quota ext storage option
- * was set
- */
- public function testGetStorageInfoIncludingExtStorageWithNoUserQuota() {
- $homeStorage = $this->getStorageMock(12);
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $this->user . '/files');
- $homeStorage->file_put_contents('test.txt', '01234');
- $extStorage = new \OC\Files\Storage\Temporary([]);
- $extStorage->file_put_contents('extfile.txt', 'abcdefghijklmnopq');
- $extStorage->getScanner()->scan(''); // update root size
- \OC\Files\Filesystem::mount($extStorage, [], '/' . $this->user . '/files/ext');
- $config = \OC::$server->getConfig();
- $this->setIncludeExternalStorage(true);
- $storageInfo = \OC_Helper::getStorageInfo('');
- $this->assertEquals(12, $storageInfo['free'], '12 bytes free in home storage');
- $this->assertEquals(22, $storageInfo['used'], '5 bytes of home storage and 17 bytes of the temporary storage are used');
- $this->assertEquals(34, $storageInfo['total'], '5 bytes used and 12 bytes free in home storage as well as 17 bytes used in temporary storage');
- }
- /**
- * Test getting the storage info with quota enabled
- */
- public function testGetStorageInfoWithQuota() {
- $homeStorage = $this->getStorageMock(12);
- $homeStorage->file_put_contents('test.txt', '01234');
- $homeStorage = new \OC\Files\Storage\Wrapper\Quota(
- [
- 'storage' => $homeStorage,
- 'quota' => 7
- ]
- );
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $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
- */
- public function testGetStorageInfoWhenSizeExceedsQuota() {
- $homeStorage = $this->getStorageMock(12);
- $homeStorage->file_put_contents('test.txt', '0123456789');
- $homeStorage = new \OC\Files\Storage\Wrapper\Quota(
- [
- 'storage' => $homeStorage,
- 'quota' => 7
- ]
- );
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $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
- */
- public function testGetStorageInfoWhenFreeSpaceLessThanQuota() {
- $homeStorage = $this->getStorageMock(12);
- $homeStorage->file_put_contents('test.txt', '01234');
- $homeStorage = new \OC\Files\Storage\Wrapper\Quota(
- [
- 'storage' => $homeStorage,
- 'quota' => 18
- ]
- );
- \OC\Files\Filesystem::mount($homeStorage, [], '/' . $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']);
- }
- }
|