Completed
Push — master ( 0aa8ac...a01137 )
by Bret R.
01:24
created

PhpIniCheck::checkStatus()   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
nc 6
cc 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 checkStatus(): 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
    {
91
        $result = new Result($this->label);
92
        // some boolval advance
93
        switch (strtolower($this->iniValue)) {
94
            case 'on':
95
                $this->iniValue = true;
96
                break;
97
            case 'off':
98
                $this->iniValue = false;
99
                break;
100
            case 'yes':
101
                $this->iniValue = true;
102
                break;
103
            case 'no':
104
                $this->iniValue = false;
105
                break;
106
        }
107
108
        $result->setSuccess( boolval($this->iniValue) === boolval($this->varValue) );
109
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval(boolval($this->iniValue))."' instead of expected '".strval(boolval($this->varValue))."'");
110
        return $result;
111
    }
112
113
    /**
114
     * @return Result
115
     */
116
    protected function checkMemory()
117
    {
118
        $result = new Result($this->label);
119
        if ($this->iniValue != -1) {
120
            $value = $this->stringToMegabyte($this->iniValue);
0 ignored issues
show
Bug introduced by
It seems like $this->iniValue can also be of type boolean; however, BretRZaun\StatusPage\Che...eck::stringToMegabyte() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
121
            $result->setSuccess( $value >= $this->varValue );
122
            $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', minimum expected is '".strval($this->varValue)."'");
123
        }
124
        return $result;
125
    }
126
127
    /**
128
     * @return Result
129
     */
130
    protected function checkNumber()
131
    {
132
        $result = new Result($this->label);
133 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...
134
            if ($this->iniValue < $this->varValue) {
135
                $result->setSuccess(false);
136
                $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', minimum expected is '".strval($this->varValue)."'");
137
                return $result;
138
            }
139
        }
140 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...
141
            if ($this->iniValue > $this->maxValue) {
142
                $result->setSuccess(false);
143
                $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', maximum expected is '".strval($this->maxValue)."'");
144
                return $result;
145
            }
146
        }
147
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue));
148
        return $result;
149
    }
150
151
    /**
152
     * @return Result
153
     */
154
    protected function checkRegex()
155
    {
156
        $result = new Result($this->label);
157
        $result->setSuccess(preg_match('~'.$this->varValue.'~', $this->iniValue));
158
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', expected is '".strval($this->varValue)."'");
159
        return $result;
160
    }
161
162
    /**
163
     * @return Result
164
     */
165
    protected function checkString()
166
    {
167
        $result = new Result($this->label);
168
        $result->setSuccess( strval($this->iniValue) == strval($this->varValue) );
169
        $result->setError("php.ini value of '".$this->varName."' is set to '".strval($this->iniValue)."', expected is '".strval($this->varValue)."'");
170
        return $result;
171
    }
172
173
}
174