Adds tests for the setup memory limit checks

Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
This commit is contained in:
Michael Weimann 2018-08-04 20:39:51 +02:00 committed by John Molakvoæ (skjnldsv)
parent c2fced4463
commit 1d2bc9c45e
No known key found for this signature in database
GPG Key ID: 60C25B8C072916CF
3 changed files with 193 additions and 11 deletions

View File

@ -170,7 +170,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -217,7 +218,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -265,7 +267,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -311,7 +314,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -355,7 +359,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -399,7 +404,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -443,7 +449,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 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) { it('should return an error if the response has no statuscode 200', function(done) {
var async = OC.SetupChecks.checkSetup(); var async = OC.SetupChecks.checkSetup();
@ -508,7 +560,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -553,7 +606,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -598,7 +652,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );
@ -643,7 +698,8 @@ describe('OC.SetupChecks tests', function() {
cronErrors: [], cronErrors: [],
cronInfo: { cronInfo: {
diffInSeconds: 0 diffInSeconds: 0
} },
isTheMemoryLimitHighEnough: true
}) })
); );

View File

@ -22,6 +22,7 @@
namespace Tests\Settings\Controller; namespace Tests\Settings\Controller;
use OC\DB\Connection; use OC\DB\Connection;
use OC\MemoryInfo;
use OC\Settings\Controller\CheckSetupController; use OC\Settings\Controller\CheckSetupController;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataDisplayResponse; use OCP\AppFramework\Http\DataDisplayResponse;
@ -36,6 +37,7 @@ use OCP\IRequest;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OC_Util; use OC_Util;
use OCP\Lock\ILockingProvider; use OCP\Lock\ILockingProvider;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcher;
use Test\TestCase; use Test\TestCase;
@ -73,6 +75,15 @@ class CheckSetupControllerTest extends TestCase {
private $lockingProvider; private $lockingProvider;
/** @var IDateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */ /** @var IDateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */
private $dateTimeFormatter; private $dateTimeFormatter;
/** @var MemoryInfo|MockObject */
private $memoryInfo;
/**
* Backup of the "memory_limit" ini value before tests.
*
* @var string
*/
private $memoryLimitIniValueBeforeTest;
public function setUp() { public function setUp() {
parent::setUp(); parent::setUp();
@ -103,6 +114,9 @@ class CheckSetupControllerTest extends TestCase {
->disableOriginalConstructor()->getMock(); ->disableOriginalConstructor()->getMock();
$this->lockingProvider = $this->getMockBuilder(ILockingProvider::class)->getMock(); $this->lockingProvider = $this->getMockBuilder(ILockingProvider::class)->getMock();
$this->dateTimeFormatter = $this->getMockBuilder(IDateTimeFormatter::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') $this->checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController')
->setConstructorArgs([ ->setConstructorArgs([
'settings', 'settings',
@ -118,6 +132,7 @@ class CheckSetupControllerTest extends TestCase {
$this->db, $this->db,
$this->lockingProvider, $this->lockingProvider,
$this->dateTimeFormatter, $this->dateTimeFormatter,
$this->memoryInfo,
]) ])
->setMethods([ ->setMethods([
'isReadOnlyConfig', 'isReadOnlyConfig',
@ -424,6 +439,9 @@ class CheckSetupControllerTest extends TestCase {
->expects($this->once()) ->expects($this->once())
->method('hasPassedCheck') ->method('hasPassedCheck')
->willReturn(true); ->willReturn(true);
$this->memoryInfo
->method('getMemoryLimit')
->willReturn(512 * 1024 * 1024);
$expected = new DataResponse( $expected = new DataResponse(
[ [
@ -465,6 +483,7 @@ class CheckSetupControllerTest extends TestCase {
'missingIndexes' => [], 'missingIndexes' => [],
'isPhpMailerUsed' => false, 'isPhpMailerUsed' => false,
'mailSettingsDocumentation' => 'https://server/index.php/settings/admin', 'mailSettingsDocumentation' => 'https://server/index.php/settings/admin',
'isTheMemoryLimitHighEnough' => true,
] ]
); );
$this->assertEquals($expected, $this->checkSetupController->check()); $this->assertEquals($expected, $this->checkSetupController->check());
@ -486,6 +505,7 @@ class CheckSetupControllerTest extends TestCase {
$this->db, $this->db,
$this->lockingProvider, $this->lockingProvider,
$this->dateTimeFormatter, $this->dateTimeFormatter,
$this->memoryInfo,
]) ])
->setMethods(null)->getMock(); ->setMethods(null)->getMock();
@ -1160,4 +1180,37 @@ Array
); );
$this->assertEquals($expected, $this->checkSetupController->getFailedIntegrityCheckFiles()); $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')
);
}
} }

View File

@ -0,0 +1,73 @@
<?php
namespace Test;
use OC\MemoryInfo;
/**
* This class provides tests for the MemoryInfo class.
*/
class MemoryInfoTest extends TestCase {
/**
* @var MemoryInfo
*/
private $memoryInfo;
/**
* The "memory_limit" value before tests.
*
* @var string
*/
private $iniSettingBeforeTest;
/**
* @beforeClass
*/
public function backupMemoryInfoIniSetting() {
$this->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());
}
}