Completed
Push — master ( 4ad6bd...3873e4 )
by Ingo
11:53
created

MemoryLimitTest::testIncreaseTimeLimitTo()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 11
nc 2
nop 0
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\Core\Tests;
4
5
use SilverStripe\Core\Environment;
6
use SilverStripe\Dev\SapphireTest;
7
8
class MemoryLimitTest extends SapphireTest
9
{
10
    protected $origMemLimitMax;
11
    protected $origTimeLimitMax;
12
    protected $origMemLimit;
13
    protected $origTimeLimit;
14
15
    protected function setUp()
16
    {
17
        parent::setUp();
18
19
        // see http://www.hardened-php.net/suhosin/configuration.html#suhosin.memory_limit
20
        if (in_array('suhosin', get_loaded_extensions())) {
21
            $this->markTestSkipped("This test cannot be run with suhosin installed");
22
        } else {
23
            $this->origMemLimit = ini_get('memory_limit');
24
            $this->origTimeLimit = ini_get('max_execution_time');
25
            $this->origMemLimitMax = Environment::getMemoryLimitMax();
26
            $this->origTimeLimitMax = Environment::getTimeLimitMax();
27
            Environment::setMemoryLimitMax(null);
28
            Environment::setTimeLimitMax(null);
29
        }
30
    }
31
32
    protected function tearDown()
33
    {
34
        if (!in_array('suhosin', get_loaded_extensions())) {
35
            ini_set('memory_limit', $this->origMemLimit);
36
            set_time_limit($this->origTimeLimit);
37
            Environment::setMemoryLimitMax($this->origMemLimitMax);
38
            Environment::setTimeLimitMax($this->origTimeLimitMax);
39
        }
40
        parent::tearDown();
41
    }
42
43
    public function testIncreaseMemoryLimitTo()
44
    {
45
        ini_set('memory_limit', '64M');
46
        Environment::setMemoryLimitMax('256M');
47
48
        // It can go up
49
        Environment::increaseMemoryLimitTo('128M');
50
        $this->assertEquals('128M', ini_get('memory_limit'));
51
52
        // But not down
53
        Environment::increaseMemoryLimitTo('64M');
54
        $this->assertEquals('128M', ini_get('memory_limit'));
55
56
        // Test the different kinds of syntaxes
57
        Environment::increaseMemoryLimitTo(1024*1024*200);
58
        $this->assertEquals('200M', ini_get('memory_limit'));
59
60
        Environment::increaseMemoryLimitTo('109600K');
61
        $this->assertEquals('200M', ini_get('memory_limit'));
62
63
        // Attempting to increase past max size only sets to max
64
        Environment::increaseMemoryLimitTo('1G');
65
        $this->assertEquals('256M', ini_get('memory_limit'));
66
67
        // No argument means unlimited (but only if originally allowed)
68
        if (is_numeric($this->origMemLimitMax) && $this->origMemLimitMax < 0) {
69
            Environment::increaseMemoryLimitTo();
70
            $this->assertEquals(-1, ini_get('memory_limit'));
71
        }
72
    }
73
74
    public function testIncreaseTimeLimitTo()
75
    {
76
        // Can't change time limit
77
        if (!set_time_limit(6000)) {
78
            $this->markTestSkipped("Cannot change time limit");
79
        }
80
81
        // It can go up
82
        $this->assertTrue(Environment::increaseTimeLimitTo(7000));
83
        $this->assertEquals(7000, ini_get('max_execution_time'));
84
85
        // But not down
86
        $this->assertTrue(Environment::increaseTimeLimitTo(5000));
87
        $this->assertEquals(7000, ini_get('max_execution_time'));
88
89
        // 0/nothing means infinity
90
        $this->assertTrue(Environment::increaseTimeLimitTo());
91
        $this->assertEquals(0, ini_get('max_execution_time'));
92
93
        // Can't go down from there
94
        $this->assertTrue(Environment::increaseTimeLimitTo(10000));
95
        $this->assertEquals(0, ini_get('max_execution_time'));
96
    }
97
}
98