Completed
Pull Request — master (#16)
by
unknown
01:25
created

PhpIniCheck::check()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 8.9777
c 0
b 0
f 0
cc 6
nc 6
nop 0
1
<?php
2
namespace BretRZaun\StatusPage\Check;
3
4
use BretRZaun\StatusPage\Result;
5
6
class PhpIniCheck extends AbstractCheck
7
{
8
9
    const TypeBoolean = 'boolean';
10
    const TypeMemory  = 'memory';
11
    const TypeNumber  = 'number';
12
    const TypeRegex   = 'regex';
13
    const TypeString  = 'string';
14
15
    protected $varName;
16
    protected $varType;
17
    protected $varValue;
18
    protected $maxValue;
19
    protected $iniValue;
20
21
    /**
22
     * PhpIniCheck constructor.
23
     *
24
     * @param string $label
25
     * @param string $varName <b>Name</b> of ini value - used for ini_get(...)
26
     * @param string $varType <b>Type</b> of ini value - see class constant
27
     * @param mixed $varValue <b>Value</b> which is expected
28
     * @param null $maxValue <b>maximum</b> value is optional used for numbers
29
     *
30
     * @return PhpIniCheck
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
31
     */
32
    public function __construct(string $label, string $varName, string $varType, $varValue, $maxValue=null)
33
    {
34
        parent::__construct($label);
35
        $this->varName = $varName;
36
        $this->varType = $varType;
37
        $this->varValue = $varValue;
38
        $this->maxValue = $maxValue;
39
        $this->iniValue = ini_get($varName);
40
    }
41
42
    /**
43
     * @param string $size
44
     * @return int|bool(false)
0 ignored issues
show
Documentation introduced by
The doc-type int|bool(false) could not be parsed: Expected "|" or "end of type", but got "(" at position 8. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
45
     */
46
    protected function stringToMegabyte(string $size)
47
    {
48
        $value = preg_replace('~[^0-9]*~','', $size);
49
        switch (substr(strtolower($size), -1)) {
50
            case 'm':
51
                return (int)$value;
52
            case 'k':
53
                return round((int)$value / 1024);
54
            case 'g':
55
                return ((int)$value * 1024);
56
            default:
57
                return false;
58
        }
59
    }
60
61
62
    /**
63
     * @return Result
64
     */
65
    public function check(): Result
66
    {
67
        switch ($this->varType) {
68
            case self::TypeBoolean:
69
                return $this->checkBoolean();
70
            case self::TypeMemory:
71
                return $this->checkMemory();
72
            case self::TypeNumber:
73
                return $this->checkNumber();
74
            case self::TypeRegex:
75
                return $this->checkRegex();
76
            case self::TypeString:
77
                return $this->checkString();
78
            default:
79
                $result = new Result($this->label);
80
                $result->setSuccess(false);
81
                $result->setError("Invalid Type: " . $this->varType);
82
                return $result;
83
        }
84
    }
85
86
    /**
87
     * @return Result
88
     */
89
    protected function checkBoolean() {
90
        $result = new Result($this->label);
91
        $result->setSuccess( boolval($this->iniValue) === boolval($this->varValue) );
92
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval(boolval($this->iniValue))."' instead of expected '".strval(boolval($this->varValue))."'");
93
        return $result;
94
    }
95
96
    /**
97
     * @return Result
98
     */
99
    protected function checkMemory() {
100
        $result = new Result($this->label);
101
        if ($this->iniValue != -1) {
102
            $value = $this->stringToMegabyte($this->iniValue);
103
            $result->setSuccess( $value >= $this->varValue );
104
            $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', minimum expected is '".strval($this->varValue)."'");
105
        }
106
        return $result;
107
    }
108
109
    /**
110
     * @return Result
111
     */
112
    protected function checkNumber() {
113
        $result = new Result($this->label);
114 View Code Duplication
        if (!is_null($this->varValue)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
115
            if ($this->iniValue < $this->varValue) {
116
                $result->setSuccess(false);
117
                $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', minimum expected is '".strval($this->varValue)."'");
118
                return $result;
119
            }
120
        }
121 View Code Duplication
        if (!is_null($this->maxValue)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
122
            if ($this->iniValue > $this->maxValue) {
123
                $result->setSuccess(false);
124
                $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', maximum expected is '".strval($this->maxValue)."'");
125
                return $result;
126
            }
127
        }
128
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue));
129
        return $result;
130
    }
131
132
    /**
133
     * @return Result
134
     */
135
    protected function checkRegex() {
136
        $result = new Result($this->label);
137
        $result->setSuccess(preg_match('~'.$this->varValue.'~', $this->iniValue));
138
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', expected is '".strval($this->varValue)."'");
139
        return $result;
140
    }
141
142
    /**
143
     * @return Result
144
     */
145
    protected function checkString() {
146
        $result = new Result($this->label);
147
        $result->setSuccess( strval($this->iniValue) == strval($this->varValue) );
148
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', expected is '".strval($this->varValue)."'");
149
        return $result;
150
    }
151
152
}
153