From c2fced446396dad822404f3fae3ccb1c7df0dc89 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Sat, 4 Aug 2018 20:39:39 +0200 Subject: Adds a setup check for the memory limit Signed-off-by: Michael Weimann --- core/js/setupchecks.js | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'core') diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index 93072981e99..f7ee8c73c81 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -316,6 +316,15 @@ type: OC.SetupChecks.MESSAGE_TYPE_WARNING }); } + if (!data.isTheMemoryLimitHighEnough) { + messages.push({ + msg: t( + 'core', + 'The PHP memory limit is below the recommended value of 512MB.' + ), + type: OC.SetupChecks.MESSAGE_TYPE_WARNING + }) + } } else { messages.push({ msg: t('core', 'Error occurred while checking server setup'), -- cgit v1.2.3 From 1d2bc9c45ecbbb7521dbf14dba6560d925691f01 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Sat, 4 Aug 2018 20:39:51 +0200 Subject: Adds tests for the setup memory limit checks Signed-off-by: Michael Weimann --- core/js/tests/specs/setupchecksSpec.js | 78 +++++++++++++++++++--- .../Controller/CheckSetupControllerTest.php | 53 +++++++++++++++ tests/lib/MemoryInfoTest.php | 73 ++++++++++++++++++++ 3 files changed, 193 insertions(+), 11 deletions(-) create mode 100644 tests/lib/MemoryInfoTest.php (limited to 'core') diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js index e22fb35102e..bde1f6d6a79 100644 --- a/core/js/tests/specs/setupchecksSpec.js +++ b/core/js/tests/specs/setupchecksSpec.js @@ -170,7 +170,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -217,7 +218,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -265,7 +267,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -311,7 +314,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -355,7 +359,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -399,7 +404,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -443,7 +449,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -456,6 +463,51 @@ describe('OC.SetupChecks tests', function() { }); }); + it('should return a warning if the memory limit is too small', function(done) { + var async = OC.SetupChecks.checkSetup(); + + suite.server.requests[0].respond( + 200, + { + 'Content-Type': 'application/json', + }, + JSON.stringify({ + hasFileinfoInstalled: true, + isGetenvServerWorking: true, + isReadOnlyConfig: false, + hasWorkingFileLocking: true, + hasValidTransactionIsolationLevel: true, + suggestedOverwriteCliURL: '', + isUrandomAvailable: true, + serverHasInternetConnection: true, + isMemcacheConfigured: true, + forwardedForHeadersWorking: true, + reverseProxyDocs: 'https://docs.owncloud.org/foo/bar.html', + isCorrectMemcachedPHPModuleInstalled: true, + hasPassedCodeIntegrityCheck: true, + isOpcacheProperlySetup: true, + hasOpcacheLoaded: true, + isSettimelimitAvailable: true, + hasFreeTypeSupport: true, + missingIndexes: [], + outdatedCaches: [], + cronErrors: [], + cronInfo: { + diffInSeconds: 0 + }, + isTheMemoryLimitHighEnough: false + }) + ); + + async.done(function( data, s, x ){ + expect(data).toEqual([{ + msg: 'The PHP memory limit is below the recommended value of 512MB.', + type: OC.SetupChecks.MESSAGE_TYPE_WARNING + }]); + done(); + }); + }); + it('should return an error if the response has no statuscode 200', function(done) { var async = OC.SetupChecks.checkSetup(); @@ -508,7 +560,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -553,7 +606,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -598,7 +652,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); @@ -643,7 +698,8 @@ describe('OC.SetupChecks tests', function() { cronErrors: [], cronInfo: { diffInSeconds: 0 - } + }, + isTheMemoryLimitHighEnough: true }) ); diff --git a/tests/Settings/Controller/CheckSetupControllerTest.php b/tests/Settings/Controller/CheckSetupControllerTest.php index 305e2ba22ce..617394682e7 100644 --- a/tests/Settings/Controller/CheckSetupControllerTest.php +++ b/tests/Settings/Controller/CheckSetupControllerTest.php @@ -22,6 +22,7 @@ namespace Tests\Settings\Controller; use OC\DB\Connection; +use OC\MemoryInfo; use OC\Settings\Controller\CheckSetupController; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataDisplayResponse; @@ -36,6 +37,7 @@ use OCP\IRequest; use OCP\IURLGenerator; use OC_Util; use OCP\Lock\ILockingProvider; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Http\Message\ResponseInterface; use Symfony\Component\EventDispatcher\EventDispatcher; use Test\TestCase; @@ -73,6 +75,15 @@ class CheckSetupControllerTest extends TestCase { private $lockingProvider; /** @var IDateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */ private $dateTimeFormatter; + /** @var MemoryInfo|MockObject */ + private $memoryInfo; + + /** + * Backup of the "memory_limit" ini value before tests. + * + * @var string + */ + private $memoryLimitIniValueBeforeTest; public function setUp() { parent::setUp(); @@ -103,6 +114,9 @@ class CheckSetupControllerTest extends TestCase { ->disableOriginalConstructor()->getMock(); $this->lockingProvider = $this->getMockBuilder(ILockingProvider::class)->getMock(); $this->dateTimeFormatter = $this->getMockBuilder(IDateTimeFormatter::class)->getMock(); + $this->memoryInfo = $this->getMockBuilder(MemoryInfo::class) + ->setMethods(['getMemoryLimit',]) + ->getMock(); $this->checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController') ->setConstructorArgs([ 'settings', @@ -118,6 +132,7 @@ class CheckSetupControllerTest extends TestCase { $this->db, $this->lockingProvider, $this->dateTimeFormatter, + $this->memoryInfo, ]) ->setMethods([ 'isReadOnlyConfig', @@ -424,6 +439,9 @@ class CheckSetupControllerTest extends TestCase { ->expects($this->once()) ->method('hasPassedCheck') ->willReturn(true); + $this->memoryInfo + ->method('getMemoryLimit') + ->willReturn(512 * 1024 * 1024); $expected = new DataResponse( [ @@ -465,6 +483,7 @@ class CheckSetupControllerTest extends TestCase { 'missingIndexes' => [], 'isPhpMailerUsed' => false, 'mailSettingsDocumentation' => 'https://server/index.php/settings/admin', + 'isTheMemoryLimitHighEnough' => true, ] ); $this->assertEquals($expected, $this->checkSetupController->check()); @@ -486,6 +505,7 @@ class CheckSetupControllerTest extends TestCase { $this->db, $this->lockingProvider, $this->dateTimeFormatter, + $this->memoryInfo, ]) ->setMethods(null)->getMock(); @@ -1160,4 +1180,37 @@ Array ); $this->assertEquals($expected, $this->checkSetupController->getFailedIntegrityCheckFiles()); } + + /** + * This function returns test values for the memory limit check. + * 1. the memory limit + * 2. the expected check value + * + * @return array + */ + public function getMemoryLimitTestData(): array { + return [ + 'unlimited' => [-1, true,], + '512M' => [512 * 1024 * 1024, true,], + '1G' => [1024 * 1024 * 1024, true,], + '64M' => [64 * 1024 * 1024, false,], + ]; + } + + /** + * Tests that if the memory limit is high enough, there is no message. + * + * @param string $memoryLimit The memory limit reported by MemoryInfo. + * @param bool $expected The expected memory check return value. + * @dataProvider getMemoryLimitTestData + */ + public function testMemoryLimit(string $memoryLimit, bool $expected) { + $this->memoryInfo + ->method('getMemoryLimit') + ->willReturn($memoryLimit); + $this->assertSame( + $expected, + $this->invokePrivate($this->checkSetupController, 'isTheMemoryLimitHighEnough') + ); + } } diff --git a/tests/lib/MemoryInfoTest.php b/tests/lib/MemoryInfoTest.php new file mode 100644 index 00000000000..9cd4fd56038 --- /dev/null +++ b/tests/lib/MemoryInfoTest.php @@ -0,0 +1,73 @@ +iniSettingBeforeTest = ini_get('memory_limit'); + } + + /** + * @afterClass + */ + public function restoreMemoryInfoIniSetting() { + ini_set('memory_limit', $this->iniSettingBeforeTest); + } + + /** + * Setups a MemoryInfo instance for tests. + * + * @before + */ + public function setupMemoryInfo() { + $this->memoryInfo = new MemoryInfo(); + } + + /** + * Provides test data. + * + * @return array + */ + public function getMemoryLimitTestData(): array { + return [ + 'unlimited' => ['-1', -1,], + '0' => ['0', 0,], + '134217728 bytes' => ['134217728', 134217728,], + '128M' => ['128M', 134217728,], + '131072K' => ['131072K', 134217728,], + '2G' => ['2G', 2147483648,], + ]; + } + + /** + * Tests that getMemoryLimit works as expected. + * + * @param string $iniValue The "memory_limit" ini data. + * @param int $expected The expected detected memory limit. + * @dataProvider getMemoryLimitTestData + */ + public function testMemoryLimit($iniValue, $expected) { + ini_set('memory_limit', $iniValue); + self::assertEquals($expected, $this->memoryInfo->getMemoryLimit()); + } +} -- cgit v1.2.3 From c164409ee7f921a96f95e1fe95d86fe07a98963e Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Sat, 4 Aug 2018 21:53:50 +0200 Subject: Adds a memory limit warning for console commands if the limit is below the recommended value Signed-off-by: Michael Weimann --- console.php | 8 +++++++- core/js/setupchecks.js | 2 +- lib/private/Console/Application.php | 30 +++++++++++++++++++++++++++- lib/private/MemoryInfo.php | 13 ++++++++++++ settings/Controller/CheckSetupController.php | 12 +---------- 5 files changed, 51 insertions(+), 14 deletions(-) (limited to 'core') diff --git a/console.php b/console.php index 67856a17b3b..1d5021edef0 100644 --- a/console.php +++ b/console.php @@ -85,7 +85,13 @@ try { echo "The process control (PCNTL) extensions are required in case you want to interrupt long running commands - see http://php.net/manual/en/book.pcntl.php" . PHP_EOL; } - $application = new Application(\OC::$server->getConfig(), \OC::$server->getEventDispatcher(), \OC::$server->getRequest(), \OC::$server->getLogger()); + $application = new Application( + \OC::$server->getConfig(), + \OC::$server->getEventDispatcher(), + \OC::$server->getRequest(), + \OC::$server->getLogger(), + \OC::$server->query(\OC\MemoryInfo::class) + ); $application->loadCommands(new ArgvInput(), new ConsoleOutput()); $application->run(); } catch (Exception $ex) { diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index f7ee8c73c81..7dabefe9e8f 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -316,7 +316,7 @@ type: OC.SetupChecks.MESSAGE_TYPE_WARNING }); } - if (!data.isTheMemoryLimitHighEnough) { + if (!data.isMemoryLimitSufficient) { messages.push({ msg: t( 'core', diff --git a/lib/private/Console/Application.php b/lib/private/Console/Application.php index 1de5fbd6ca3..422e78ee06f 100644 --- a/lib/private/Console/Application.php +++ b/lib/private/Console/Application.php @@ -29,6 +29,7 @@ */ namespace OC\Console; +use OC\MemoryInfo; use OC\NeedsUpdateException; use OC_App; use OCP\AppFramework\QueryException; @@ -52,20 +53,28 @@ class Application { private $request; /** @var ILogger */ private $logger; + /** @var MemoryInfo */ + private $memoryInfo; /** * @param IConfig $config * @param EventDispatcherInterface $dispatcher * @param IRequest $request * @param ILogger $logger + * @param MemoryInfo $memoryInfo */ - public function __construct(IConfig $config, EventDispatcherInterface $dispatcher, IRequest $request, ILogger $logger) { + public function __construct(IConfig $config, + EventDispatcherInterface $dispatcher, + IRequest $request, + ILogger $logger, + MemoryInfo $memoryInfo) { $defaults = \OC::$server->getThemingDefaults(); $this->config = $config; $this->application = new SymfonyApplication($defaults->getName(), \OC_Util::getVersionString()); $this->dispatcher = $dispatcher; $this->request = $request; $this->logger = $logger; + $this->memoryInfo = $memoryInfo; } /** @@ -97,6 +106,11 @@ class Application { if ($input->getOption('no-warnings')) { $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); } + + if ($this->memoryInfo->isMemoryLimitSufficient() === false) { + $this->writeMemoryLimitInfo($output); + } + try { require_once __DIR__ . '/../../../core/register_command.php'; if ($this->config->getSystemValue('installed', false)) { @@ -173,6 +187,20 @@ class Application { } } + /** + * Write a memory info output if the limit is below the recommended value. + * + * @param ConsoleOutputInterface $output + * @return void + */ + private function writeMemoryLimitInfo(ConsoleOutputInterface $output) { + $errOutput = $output->getErrorOutput(); + $errOutput->writeln( + 'The current PHP memory limit ' . + 'is below the recommended value of 512MB.' + ); + } + /** * Sets whether to automatically exit after a command execution or not. * diff --git a/lib/private/MemoryInfo.php b/lib/private/MemoryInfo.php index 14865ed682e..0501d3fd049 100644 --- a/lib/private/MemoryInfo.php +++ b/lib/private/MemoryInfo.php @@ -6,6 +6,19 @@ namespace OC; * Helper class that covers memory info. */ class MemoryInfo { + + const RECOMMENDED_MEMORY_LIMIT = 512 * 1024 * 1024; + + /** + * Tests if the memory limit is greater or equal the recommended value. + * + * @return bool + */ + public function isMemoryLimitSufficient(): bool { + $memoryLimit = $this->getMemoryLimit(); + return $memoryLimit === -1 || $memoryLimit >= self::RECOMMENDED_MEMORY_LIMIT; + } + /** * Returns the php memory limit. * diff --git a/settings/Controller/CheckSetupController.php b/settings/Controller/CheckSetupController.php index eca67667471..a64d131648b 100644 --- a/settings/Controller/CheckSetupController.php +++ b/settings/Controller/CheckSetupController.php @@ -534,16 +534,6 @@ Raw output return function_exists('opcache_get_status'); } - /** - * Tests if the php memory limit is high enough. - * - * @return bool True if more than 512 MB available, else false. - */ - protected function isTheMemoryLimitHighEnough(): bool { - $memoryLimit = $this->memoryInfo->getMemoryLimit(); - return $memoryLimit === -1 || $memoryLimit >= 512 * 1024 * 1024; - } - /** * @return DataResponse */ @@ -581,7 +571,7 @@ Raw output 'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'), 'isPhpMailerUsed' => $this->isPhpMailerUsed(), 'mailSettingsDocumentation' => $this->urlGenerator->getAbsoluteURL('index.php/settings/admin'), - 'isTheMemoryLimitHighEnough' => $this->isTheMemoryLimitHighEnough(), + 'isMemoryLimitSufficient' => $this->memoryInfo->isMemoryLimitSufficient(), ] ); } -- cgit v1.2.3 From 7aed47f776b8175e7947bb2b202b96a3f236bdce Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Sat, 4 Aug 2018 21:54:00 +0200 Subject: Adds tests for the memory checks Signed-off-by: Michael Weimann --- core/js/tests/specs/setupchecksSpec.js | 26 +++++----- .../Controller/CheckSetupControllerTest.php | 48 ++----------------- tests/lib/MemoryInfoTest.php | 56 +++++++++++++++------- 3 files changed, 57 insertions(+), 73 deletions(-) (limited to 'core') diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js index bde1f6d6a79..66c84f52bc9 100644 --- a/core/js/tests/specs/setupchecksSpec.js +++ b/core/js/tests/specs/setupchecksSpec.js @@ -171,7 +171,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -219,7 +219,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -268,7 +268,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -315,7 +315,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -360,7 +360,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -405,7 +405,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -450,7 +450,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -463,7 +463,7 @@ describe('OC.SetupChecks tests', function() { }); }); - it('should return a warning if the memory limit is too small', function(done) { + it('should return a warning if the memory limit is below the recommended value', function(done) { var async = OC.SetupChecks.checkSetup(); suite.server.requests[0].respond( @@ -495,7 +495,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: false + isMemoryLimitSufficient: false }) ); @@ -561,7 +561,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -607,7 +607,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -653,7 +653,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); @@ -699,7 +699,7 @@ describe('OC.SetupChecks tests', function() { cronInfo: { diffInSeconds: 0 }, - isTheMemoryLimitHighEnough: true + isMemoryLimitSufficient: true }) ); diff --git a/tests/Settings/Controller/CheckSetupControllerTest.php b/tests/Settings/Controller/CheckSetupControllerTest.php index 617394682e7..a7689eed801 100644 --- a/tests/Settings/Controller/CheckSetupControllerTest.php +++ b/tests/Settings/Controller/CheckSetupControllerTest.php @@ -78,13 +78,6 @@ class CheckSetupControllerTest extends TestCase { /** @var MemoryInfo|MockObject */ private $memoryInfo; - /** - * Backup of the "memory_limit" ini value before tests. - * - * @var string - */ - private $memoryLimitIniValueBeforeTest; - public function setUp() { parent::setUp(); @@ -115,7 +108,7 @@ class CheckSetupControllerTest extends TestCase { $this->lockingProvider = $this->getMockBuilder(ILockingProvider::class)->getMock(); $this->dateTimeFormatter = $this->getMockBuilder(IDateTimeFormatter::class)->getMock(); $this->memoryInfo = $this->getMockBuilder(MemoryInfo::class) - ->setMethods(['getMemoryLimit',]) + ->setMethods(['isMemoryLimitSufficient',]) ->getMock(); $this->checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController') ->setConstructorArgs([ @@ -440,8 +433,8 @@ class CheckSetupControllerTest extends TestCase { ->method('hasPassedCheck') ->willReturn(true); $this->memoryInfo - ->method('getMemoryLimit') - ->willReturn(512 * 1024 * 1024); + ->method('isMemoryLimitSufficient') + ->willReturn(true); $expected = new DataResponse( [ @@ -483,7 +476,7 @@ class CheckSetupControllerTest extends TestCase { 'missingIndexes' => [], 'isPhpMailerUsed' => false, 'mailSettingsDocumentation' => 'https://server/index.php/settings/admin', - 'isTheMemoryLimitHighEnough' => true, + 'isMemoryLimitSufficient' => true, ] ); $this->assertEquals($expected, $this->checkSetupController->check()); @@ -1180,37 +1173,4 @@ Array ); $this->assertEquals($expected, $this->checkSetupController->getFailedIntegrityCheckFiles()); } - - /** - * This function returns test values for the memory limit check. - * 1. the memory limit - * 2. the expected check value - * - * @return array - */ - public function getMemoryLimitTestData(): array { - return [ - 'unlimited' => [-1, true,], - '512M' => [512 * 1024 * 1024, true,], - '1G' => [1024 * 1024 * 1024, true,], - '64M' => [64 * 1024 * 1024, false,], - ]; - } - - /** - * Tests that if the memory limit is high enough, there is no message. - * - * @param string $memoryLimit The memory limit reported by MemoryInfo. - * @param bool $expected The expected memory check return value. - * @dataProvider getMemoryLimitTestData - */ - public function testMemoryLimit(string $memoryLimit, bool $expected) { - $this->memoryInfo - ->method('getMemoryLimit') - ->willReturn($memoryLimit); - $this->assertSame( - $expected, - $this->invokePrivate($this->checkSetupController, 'isTheMemoryLimitHighEnough') - ); - } } diff --git a/tests/lib/MemoryInfoTest.php b/tests/lib/MemoryInfoTest.php index 9cd4fd56038..057d3091b2c 100644 --- a/tests/lib/MemoryInfoTest.php +++ b/tests/lib/MemoryInfoTest.php @@ -3,16 +3,12 @@ namespace Test; use OC\MemoryInfo; +use PHPUnit\Framework\MockObject\MockObject; /** * This class provides tests for the MemoryInfo class. */ class MemoryInfoTest extends TestCase { - /** - * @var MemoryInfo - */ - private $memoryInfo; - /** * The "memory_limit" value before tests. * @@ -34,15 +30,6 @@ class MemoryInfoTest extends TestCase { ini_set('memory_limit', $this->iniSettingBeforeTest); } - /** - * Setups a MemoryInfo instance for tests. - * - * @before - */ - public function setupMemoryInfo() { - $this->memoryInfo = new MemoryInfo(); - } - /** * Provides test data. * @@ -66,8 +53,45 @@ class MemoryInfoTest extends TestCase { * @param int $expected The expected detected memory limit. * @dataProvider getMemoryLimitTestData */ - public function testMemoryLimit($iniValue, $expected) { + public function testMemoryLimit($iniValue, int $expected) { ini_set('memory_limit', $iniValue); - self::assertEquals($expected, $this->memoryInfo->getMemoryLimit()); + $memoryInfo = new MemoryInfo(); + self::assertEquals($expected, $memoryInfo->getMemoryLimit()); + } + + /** + * Provides sufficient memory limit test data. + * + * @return array + */ + public function getSufficientMemoryTestData(): array { + return [ + 'unlimited' => [-1, true,], + '512M' => [512 * 1024 * 1024, true,], + '1G' => [1024 * 1024 * 1024, true,], + '256M' => [256 * 1024 * 1024, false,], + ]; + } + + /** + * Tests that isMemoryLimitSufficient returns the correct values. + * + * @param int $memoryLimit The memory limit + * @param bool $expected If the memory limit is sufficient. + * @dataProvider getSufficientMemoryTestData + * @return void + */ + public function testIsMemoryLimitSufficient(int $memoryLimit, bool $expected) { + /* @var MemoryInfo|MockObject $memoryInfo */ + $memoryInfo = $this->getMockBuilder(MemoryInfo::class) + ->setMethods(['getMemoryLimit',]) + ->getMock(); + + $memoryInfo + ->method('getMemoryLimit') + ->willReturn($memoryLimit); + + $isMemoryLimitSufficient = $memoryInfo->isMemoryLimitSufficient(); + self::assertEquals($expected, $isMemoryLimitSufficient); } } -- cgit v1.2.3