From 1d2bc9c45ecbbb7521dbf14dba6560d925691f01 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Sat, 4 Aug 2018 20:39:51 +0200 Subject: [PATCH] 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 diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js index e22fb35102..bde1f6d6a7 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 305e2ba22c..617394682e 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 0000000000..9cd4fd5603 --- /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()); + } +}