1<?php
2/*
3 * This file is part of PHPUnit.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11class Util_ConfigurationTest extends PHPUnit_Framework_TestCase
12{
13    /**
14     * @var PHPUnit_Util_Configuration
15     */
16    protected $configuration;
17
18    protected function setUp()
19    {
20        $this->configuration = PHPUnit_Util_Configuration::getInstance(
21            dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.xml'
22        );
23    }
24
25    /**
26     * @expectedException PHPUnit_Framework_Exception
27     */
28    public function testExceptionIsThrownForNotExistingConfigurationFile()
29    {
30        PHPUnit_Util_Configuration::getInstance('not_existing_file.xml');
31    }
32
33    public function testShouldReadColorsWhenTrueInConfigurationfile()
34    {
35        $configurationFilename =  dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.true.xml';
36        $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename);
37        $configurationValues   = $configurationInstance->getPHPUnitConfiguration();
38
39        $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_AUTO, $configurationValues['colors']);
40    }
41
42    public function testShouldReadColorsWhenFalseInConfigurationfile()
43    {
44        $configurationFilename =  dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.false.xml';
45        $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename);
46        $configurationValues   = $configurationInstance->getPHPUnitConfiguration();
47
48        $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']);
49    }
50
51    public function testShouldReadColorsWhenEmptyInConfigurationfile()
52    {
53        $configurationFilename =  dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.empty.xml';
54        $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename);
55        $configurationValues   = $configurationInstance->getPHPUnitConfiguration();
56
57        $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']);
58    }
59
60    public function testShouldReadColorsWhenInvalidInConfigurationfile()
61    {
62        $configurationFilename =  dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.colors.invalid.xml';
63        $configurationInstance = PHPUnit_Util_Configuration::getInstance($configurationFilename);
64        $configurationValues   = $configurationInstance->getPHPUnitConfiguration();
65
66        $this->assertEquals(PHPUnit_TextUI_ResultPrinter::COLOR_NEVER, $configurationValues['colors']);
67    }
68
69    public function testFilterConfigurationIsReadCorrectly()
70    {
71        $this->assertEquals(
72            [
73            'whitelist' =>
74            [
75              'addUncoveredFilesFromWhitelist'     => true,
76              'processUncoveredFilesFromWhitelist' => false,
77              'include'                            =>
78              [
79                'directory' =>
80                [
81                  0 =>
82                  [
83                    'path'   => '/path/to/files',
84                    'prefix' => '',
85                    'suffix' => '.php',
86                    'group'  => 'DEFAULT'
87                  ],
88                ],
89                'file' =>
90                [
91                  0 => '/path/to/file',
92                  1 => '/path/to/file',
93                ],
94              ],
95              'exclude' =>
96              [
97                'directory' =>
98                [
99                  0 =>
100                  [
101                    'path'   => '/path/to/files',
102                    'prefix' => '',
103                    'suffix' => '.php',
104                    'group'  => 'DEFAULT'
105                  ],
106                ],
107                'file' =>
108                [
109                  0 => '/path/to/file',
110                ],
111              ],
112            ],
113            ],
114            $this->configuration->getFilterConfiguration()
115        );
116    }
117
118    public function testGroupConfigurationIsReadCorrectly()
119    {
120        $this->assertEquals(
121            [
122            'include' =>
123            [
124              0 => 'name',
125            ],
126            'exclude' =>
127            [
128              0 => 'name',
129            ],
130            ],
131            $this->configuration->getGroupConfiguration()
132        );
133    }
134
135    public function testTestdoxGroupConfigurationIsReadCorrectly()
136    {
137        $this->assertEquals(
138            [
139                'include' =>
140                    [
141                        0 => 'name',
142                    ],
143                'exclude' =>
144                    [
145                        0 => 'name',
146                    ],
147            ],
148            $this->configuration->getTestdoxGroupConfiguration()
149        );
150    }
151
152    public function testListenerConfigurationIsReadCorrectly()
153    {
154        $dir         = __DIR__;
155        $includePath = ini_get('include_path');
156
157        ini_set('include_path', $dir . PATH_SEPARATOR . $includePath);
158
159        $this->assertEquals(
160            [
161            0 =>
162            [
163              'class'     => 'MyListener',
164              'file'      => '/optional/path/to/MyListener.php',
165              'arguments' =>
166              [
167                0 =>
168                [
169                  0 => 'Sebastian',
170                ],
171                1 => 22,
172                2 => 'April',
173                3 => 19.78,
174                4 => null,
175                5 => new stdClass,
176                6 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyTestFile.php',
177                7 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyRelativePath',
178              ],
179            ],
180            [
181              'class'     => 'IncludePathListener',
182              'file'      => __FILE__,
183              'arguments' => []
184            ],
185            [
186              'class'     => 'CompactArgumentsListener',
187              'file'      => '/CompactArgumentsListener.php',
188              'arguments' =>
189              [
190                0 => 42
191              ],
192            ],
193            ],
194            $this->configuration->getListenerConfiguration()
195        );
196
197        ini_set('include_path', $includePath);
198    }
199
200    public function testLoggingConfigurationIsReadCorrectly()
201    {
202        $this->assertEquals(
203            [
204            'lowUpperBound'        => '50',
205            'highLowerBound'       => '90',
206            'coverage-html'        => '/tmp/report',
207            'coverage-clover'      => '/tmp/clover.xml',
208            'json'                 => '/tmp/logfile.json',
209            'plain'                => '/tmp/logfile.txt',
210            'tap'                  => '/tmp/logfile.tap',
211            'logIncompleteSkipped' => false,
212            'junit'                => '/tmp/logfile.xml',
213            'testdox-html'         => '/tmp/testdox.html',
214            'testdox-text'         => '/tmp/testdox.txt',
215            'testdox-xml'          => '/tmp/testdox.xml'
216            ],
217            $this->configuration->getLoggingConfiguration()
218        );
219    }
220
221    public function testPHPConfigurationIsReadCorrectly()
222    {
223        $this->assertEquals(
224            [
225            'include_path' =>
226            [
227              dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.',
228              '/path/to/lib'
229            ],
230            'ini'    => ['foo' => 'bar'],
231            'const'  => ['FOO' => false, 'BAR' => true],
232            'var'    => ['foo' => false],
233            'env'    => ['foo' => true],
234            'post'   => ['foo' => 'bar'],
235            'get'    => ['foo' => 'bar'],
236            'cookie' => ['foo' => 'bar'],
237            'server' => ['foo' => 'bar'],
238            'files'  => ['foo' => 'bar'],
239            'request'=> ['foo' => 'bar'],
240            ],
241            $this->configuration->getPHPConfiguration()
242        );
243    }
244
245    /**
246     * @backupGlobals enabled
247     */
248    public function testPHPConfigurationIsHandledCorrectly()
249    {
250        $this->configuration->handlePHPConfiguration();
251
252        $path = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.' . PATH_SEPARATOR . '/path/to/lib';
253        $this->assertStringStartsWith($path, ini_get('include_path'));
254        $this->assertEquals(false, FOO);
255        $this->assertEquals(true, BAR);
256        $this->assertEquals(false, $GLOBALS['foo']);
257        $this->assertEquals(true, $_ENV['foo']);
258        $this->assertEquals(true, getenv('foo'));
259        $this->assertEquals('bar', $_POST['foo']);
260        $this->assertEquals('bar', $_GET['foo']);
261        $this->assertEquals('bar', $_COOKIE['foo']);
262        $this->assertEquals('bar', $_SERVER['foo']);
263        $this->assertEquals('bar', $_FILES['foo']);
264        $this->assertEquals('bar', $_REQUEST['foo']);
265    }
266
267    /**
268     * @backupGlobals enabled
269     *
270     * @see https://github.com/sebastianbergmann/phpunit/issues/1181
271     */
272    public function testHandlePHPConfigurationDoesNotOverwrittenExistingEnvArrayVariables()
273    {
274        $_ENV['foo'] = false;
275        $this->configuration->handlePHPConfiguration();
276
277        $this->assertEquals(false, $_ENV['foo']);
278        $this->assertEquals(true, getenv('foo'));
279    }
280
281    /**
282     * @backupGlobals enabled
283     *
284     * @see https://github.com/sebastianbergmann/phpunit/issues/1181
285     */
286    public function testHandlePHPConfigurationDoesNotOverriteVariablesFromPutEnv()
287    {
288        putenv('foo=putenv');
289        $this->configuration->handlePHPConfiguration();
290
291        $this->assertEquals(true, $_ENV['foo']);
292        $this->assertEquals('putenv', getenv('foo'));
293    }
294
295    public function testPHPUnitConfigurationIsReadCorrectly()
296    {
297        $this->assertEquals(
298            [
299            'backupGlobals'                              => true,
300            'backupStaticAttributes'                     => false,
301            'beStrictAboutChangesToGlobalState'          => false,
302            'bootstrap'                                  => '/path/to/bootstrap.php',
303            'cacheTokens'                                => false,
304            'columns'                                    => 80,
305            'colors'                                     => 'never',
306            'stderr'                                     => false,
307            'convertErrorsToExceptions'                  => true,
308            'convertNoticesToExceptions'                 => true,
309            'convertWarningsToExceptions'                => true,
310            'forceCoversAnnotation'                      => false,
311            'stopOnFailure'                              => false,
312            'stopOnWarning'                              => false,
313            'reportUselessTests'                         => false,
314            'strictCoverage'                             => false,
315            'disallowTestOutput'                         => false,
316            'enforceTimeLimit'                           => false,
317            'extensionsDirectory'                        => '/tmp',
318            'printerClass'                               => 'PHPUnit_TextUI_ResultPrinter',
319            'testSuiteLoaderClass'                       => 'PHPUnit_Runner_StandardTestSuiteLoader',
320            'verbose'                                    => false,
321            'timeoutForSmallTests'                       => 1,
322            'timeoutForMediumTests'                      => 10,
323            'timeoutForLargeTests'                       => 60,
324            'beStrictAboutResourceUsageDuringSmallTests' => false,
325            'disallowTodoAnnotatedTests'                 => false,
326            'failOnWarning'                              => false,
327            'failOnRisky'                                => false
328            ],
329            $this->configuration->getPHPUnitConfiguration()
330        );
331    }
332
333    public function testXincludeInConfiguration()
334    {
335        $configurationWithXinclude = PHPUnit_Util_Configuration::getInstance(
336            dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration_xinclude.xml'
337        );
338
339        $this->assertConfigurationEquals(
340            $this->configuration,
341            $configurationWithXinclude
342        );
343    }
344
345    /**
346     * @ticket 1311
347     *
348     * @uses   PHPUnit_Util_Configuration::getInstance
349     */
350    public function testWithEmptyConfigurations()
351    {
352        $emptyConfiguration = PHPUnit_Util_Configuration::getInstance(
353            dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration_empty.xml'
354        );
355
356        $logging = $emptyConfiguration->getLoggingConfiguration();
357        $this->assertEmpty($logging);
358
359        $php = $emptyConfiguration->getPHPConfiguration();
360        $this->assertEmpty($php['include_path']);
361
362        $phpunit = $emptyConfiguration->getPHPUnitConfiguration();
363        $this->assertArrayNotHasKey('bootstrap', $phpunit);
364        $this->assertArrayNotHasKey('testSuiteLoaderFile', $phpunit);
365        $this->assertArrayNotHasKey('printerFile', $phpunit);
366
367        $suite = $emptyConfiguration->getTestSuiteConfiguration();
368        $this->assertEmpty($suite->getGroups());
369
370        $filter = $emptyConfiguration->getFilterConfiguration();
371        $this->assertEmpty($filter['whitelist']['include']['directory']);
372        $this->assertEmpty($filter['whitelist']['include']['file']);
373        $this->assertEmpty($filter['whitelist']['exclude']['directory']);
374        $this->assertEmpty($filter['whitelist']['exclude']['file']);
375    }
376
377    /**
378     * Asserts that the values in $actualConfiguration equal $expectedConfiguration.
379     *
380     * @param PHPUnit_Util_Configuration $expectedConfiguration
381     * @param PHPUnit_Util_Configuration $actualConfiguration
382     */
383    protected function assertConfigurationEquals(PHPUnit_Util_Configuration $expectedConfiguration, PHPUnit_Util_Configuration $actualConfiguration)
384    {
385        $this->assertEquals(
386            $expectedConfiguration->getFilterConfiguration(),
387            $actualConfiguration->getFilterConfiguration()
388        );
389
390        $this->assertEquals(
391            $expectedConfiguration->getGroupConfiguration(),
392            $actualConfiguration->getGroupConfiguration()
393        );
394
395        $this->assertEquals(
396            $expectedConfiguration->getListenerConfiguration(),
397            $actualConfiguration->getListenerConfiguration()
398        );
399
400        $this->assertEquals(
401            $expectedConfiguration->getLoggingConfiguration(),
402            $actualConfiguration->getLoggingConfiguration()
403        );
404
405        $this->assertEquals(
406            $expectedConfiguration->getPHPConfiguration(),
407            $actualConfiguration->getPHPConfiguration()
408        );
409
410        $this->assertEquals(
411            $expectedConfiguration->getPHPUnitConfiguration(),
412            $actualConfiguration->getPHPUnitConfiguration()
413        );
414
415        $this->assertEquals(
416            $expectedConfiguration->getTestSuiteConfiguration(),
417            $actualConfiguration->getTestSuiteConfiguration()
418        );
419    }
420
421    public function testGetTestSuiteNamesReturnsTheNamesIfDefined()
422    {
423        $configuration = PHPUnit_Util_Configuration::getInstance(
424            dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.suites.xml'
425        );
426
427        $names = $configuration->getTestSuiteNames();
428
429        $this->assertEquals(['Suite One', 'Suite Two'], $names);
430    }
431}
432