assertNotEquals(PHP_MAJOR_VERSION, self::UNSUPPORTED_PHP_MAJOR_VERSION, 'Current php major version equals our assummed unsupported php version'); } public function testPHPIniValues() { // core tests. $ini = new \common_configuration_PHPINIValue('text/html', 'default_mimetype'); $this->assertEquals($ini->getName(), 'default_mimetype'); $this->assertEquals($ini->isOptional(), false); $this->assertEquals($ini->getExpectedValue(), 'text/html'); $ini->setOptional(true); $this->assertEquals($ini->isOptional(), true); $ini->setName('foobar'); $this->assertEquals($ini->getName(), 'foobar'); $ini->setExpectedValue('text/xml'); $this->assertEquals($ini->getExpectedValue(), 'text/xml'); // String INI Option test. $ini->setName('default_mimetype'); $ini->setExpectedValue('text/html'); $oldIniValue = ini_get($ini->getName()); ini_set($ini->getName(), 'text/html'); $report = $ini->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $this->assertEquals($report->getStatusAsString(), 'valid'); ini_set($ini->getName(), 'text/xml'); $report = $ini->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); $this->assertEquals($report->getStatusAsString(), 'invalid'); $ini->setName('foobar'); $report = $ini->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::UNKNOWN); $this->assertEquals($report->getStatusAsString(), 'unknown'); ini_set($ini->getName(), $oldIniValue); } function testPHPRuntime() { // Core tests. $php = new \common_configuration_PHPRuntime('5.3', '5.4'); $this->assertEquals($php->getName(), 'tao.configuration.phpruntime'); //automatically set $this->assertEquals($php->getMin(), '5.3'); $this->assertEquals($php->getMax(), '5.4'); $this->assertFalse($php->isOptional()); $php->setMin('5.2'); $this->assertEquals($php->getMin(), '5.2'); $php->setMax('5.3'); $this->assertEquals($php->getMax(), '5.3'); $php->setName('foobar'); $this->assertEquals($php->getName(), 'foobar'); $php->setOptional(true); $this->assertTrue($php->isOptional()); // max & min test. $php = new \common_configuration_PHPRuntime('5.3', '7.4.x'); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $php->setMin(self::UNSUPPORTED_PHP_MAJOR_VERSION . '.5'); $php->setMax(self::UNSUPPORTED_PHP_MAJOR_VERSION . '.5.6.3'); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); // min test. $php = new \common_configuration_PHPRuntime('5.3', null); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $php->setMin(self::UNSUPPORTED_PHP_MAJOR_VERSION . '.5.3'); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); // max test. $php = new \common_configuration_PHPRuntime(null, self::UNSUPPORTED_PHP_MAJOR_VERSION . '.5'); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $php->setMax('5.2'); $this->assertEquals($php->getMax(), '5.2'); $report = $php->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); $php->setMax('5.3.x'); $this->assertEquals($php->getMax(), '5.3.99999'); } function testPHPExtension() { // Testing PHPExtension existence and version is quite hard to do. Indeed, // it depends what the installed extensions are on the computers running the tests. // Thus, I decided to use the DOM extension as a test. I've never seen a PHP installation // without the DOM extension. It comes built-in except if you compile PHP with the // --disable-dom directive. // core tests. $ext = new \common_configuration_PHPExtension(null, null, 'dom'); $this->assertEquals($ext->getMin(), null); $this->assertEquals($ext->getMax(), null); $this->assertEquals($ext->getName(), 'dom'); $this->assertEquals($ext->isOptional(), false); $ext->setMin('1.0'); $this->assertEquals($ext->getMin(), '1.0'); $ext->setMax('2.0'); $this->assertEquals($ext->getMax(), '2.0'); $ext->setName('foobar'); $this->assertEquals($ext->getName(), 'foobar'); // test with an extension that has no version information (hash) that // contains hash functions such as md5(). // We consider that if there is no version information but the extension // is loaded, the report is always valid even if min and/or max version(s) // are specified. $ext = new \common_configuration_PHPExtension(null, null, 'json'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $ext->setMin('1.0'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $ext->setMax('7.5'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $ext->setMin(null); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); // test with the dom extension that has version information. $ext = new \common_configuration_PHPExtension('19851127', '20090601', 'dom'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $ext->setMin('20050112'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); $ext->setMin(null); $ext->setMax('20020423'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::INVALID); $ext->setMin('20010731'); $ext->setMax(null); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); // Unexisting extension. $ext = new \common_configuration_PHPExtension('1.0', '1.4', 'foobar'); $report = $ext->check(); $this->assertEquals($report->getStatus(), \common_configuration_Report::UNKNOWN); } public function testFileSystemComponent() { $f = new \common_configuration_FileSystemComponent(__FILE__, 'r'); $this->assertEquals($f->getLocation(), __FILE__); $this->assertEquals($f->getExpectedRights(), 'r'); $this->assertEquals($f->getName(), 'tao.configuration.filesystem'); // automatically set. $this->assertFalse($f->isOptional()); $this->assertTrue($f->isReadable()); $this->expectException('common_configuration_MalformedRightsException'); $f->setExpectedRights('fail'); try { $f->setExpectedRights('rw'); $this->pass(); } catch (\common_configuration_MalformedRightsException $e) { $this->fail(); } } public function testSimpleComponentCollection() { // Non acyclic simple test. $collection = new \common_configuration_ComponentCollection(); $componentA = new \common_configuration_Mock(\common_configuration_Report::VALID, 'componentA'); $componentB = new \common_configuration_Mock(\common_configuration_Report::VALID, 'componentB'); $componentC = new \common_configuration_Mock(\common_configuration_Report::VALID, 'componentC'); $collection->addComponent($componentA); $collection->addComponent($componentB); $collection->addComponent($componentC); $collection->addDependency($componentC, $componentA); $collection->addDependency($componentB, $componentA); try { $reports = $collection->check(); $this->assertTrue(true); // The graph is acyclic. Perfect! $this->assertEquals(count($collection->getCheckedComponents()), 3); $this->assertEquals(count($collection->getUncheckedComponents()), 0); $this->assertEquals(count($reports), 3); // Make 'componentB' silent. $collection->silent($componentB); $reports = $collection->check(); $this->assertEquals(count($reports), 2); $this->assertEquals(count($collection->getCheckedComponents()), 3); // Make 'componentB' noisy again. $collection->noisy($componentB); $reports = $collection->check(); $this->assertEquals(count($reports), 3); // Now change some reports validity. $componentA->setExpectedStatus(\common_configuration_Report::INVALID); $reports = $collection->check(); $this->assertTrue(true); // Acyclic graph, no CyclicDependencyException thrown. $this->assertEquals(count($reports), 1); $this->assertEquals($collection->getCheckedComponents(), [$componentA]); $this->assertEquals($collection->getUncheckedComponents(), [$componentB, $componentC]); // Add an additional independant component. $componentD = new \common_configuration_Mock(\common_configuration_Report::VALID, 'componentD'); $collection->addComponent($componentD); $reports = $collection->check(); $this->assertTrue(true); // Acyclic graph, no CyclicDependencyException thrown. $this->assertEquals(count($reports), 2); $this->assertEquals($collection->getCheckedComponents(), [$componentA, $componentD]); $this->assertEquals($collection->getUncheckedComponents(), [$componentB, $componentC]); // Make the whole components valid again. $componentA->setExpectedStatus(\common_configuration_Report::VALID); $reports = $collection->check(); $this->assertTrue(true); // Acyclic graph, no CyclicDependencyException thrown. $this->assertEquals(count($reports), 4); $this->assertEquals($collection->getCheckedComponents(), [$componentA, $componentB, $componentC, $componentD]); $this->assertEquals($collection->getUncheckedComponents(), []); try { // Make the graph cyclic. $collection->addDependency($componentA, $componentB); $collection->check(); $this->assertTrue(false, 'The graph should be cyclic.'); } catch (\common_configuration_CyclicDependencyException $e) { $this->assertTrue(true); $this->assertEquals($collection->getReports(), []); $this->assertEquals($collection->getCheckedComponents(), []); $this->assertEquals($collection->getUncheckedComponents(), [$componentA, $componentB, $componentC, $componentD]); // Finally, we test a ComponentCollection reset. $collection->reset(); $this->assertEquals($collection->getReports(), []); $this->assertEquals($collection->getCheckedComponents(), []); $this->assertEquals($collection->getUncheckedComponents(), []); $reports = $collection->check(); $this->assertEquals($reports, []); $this->assertEquals($collection->getReports(), []); $this->assertEquals($collection->getCheckedComponents(), []); $this->assertEquals($collection->getUncheckedComponents(), []); } } catch (\common_configuration_CyclicDependencyException $e) { $this->assertTrue(false, 'The graph dependency formed by the ComponentCollection must be acyclic.'); } } public function testComponentFactory() { $component = \common_configuration_ComponentFactory::buildPHPRuntime('5.0', '7.4.x', true); $this->assertInstanceOf(\common_configuration_PHPRuntime::class, $component); $this->assertEquals($component->getMin(), '5.0'); // 5.5.x will be replaced internally //$this->assertEquals($component->getMax(), '5.5.x'); $this->assertTrue($component->isOptional()); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $component = \common_configuration_ComponentFactory::buildPHPExtension('spl'); $this->assertInstanceOf(\common_configuration_PHPExtension::class, $component); $this->assertNull($component->getMin()); $this->assertNull($component->getMax()); $this->assertEquals($component->getName(), 'spl'); $this->assertFalse($component->isOptional()); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $component = \common_configuration_ComponentFactory::buildPHPExtension('spl', null, null, true); $this->assertInstanceOf(\common_configuration_PHPExtension::class, $component); $this->assertEquals($component->getName(), 'spl'); $this->assertTrue($component->isOptional()); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $component = \common_configuration_ComponentFactory::buildPHPINIValue('magic_quotes_gpc', '0'); $this->assertInstanceOf(\common_configuration_PHPINIValue::class, $component); $this->assertEquals($component->getName(), 'magic_quotes_gpc'); $this->assertFalse($component->isOptional()); $location = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ConfigurationTest.php'; $component = \common_configuration_ComponentFactory::buildFileSystemComponent($location, 'r'); $this->assertInstanceOf(\common_configuration_FileSystemComponent::class, $component); $this->assertFalse($component->isOptional()); $this->assertEquals($component->getLocation(), $location); $this->assertEquals($component->getExpectedRights(), 'r'); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $array = ['type' => 'PHPRuntime', 'value' => ['min' => '5.0', 'max' => '7.4.x', 'optional' => true]]; $component = \common_configuration_ComponentFactory::buildFromArray($array); $this->assertInstanceOf(\common_configuration_PHPRuntime::class, $component); $this->assertEquals($component->getMin(), '5.0'); // 5.5.x will be replaced internally // $this->assertEquals($component->getMax(), '5.5'); $this->assertTrue($component->isOptional()); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); $array = ['type' => 'PHPExtension', 'value' => ['name' => 'spl']]; $component = \common_configuration_ComponentFactory::buildFromArray($array); $this->assertInstanceOf(\common_configuration_PHPExtension::class, $component); $this->assertEquals($component->getName(), 'spl'); $this->assertFalse($component->isOptional()); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); // 'Check' before the Component type is accepted. $array = ['type' => 'CheckPHPINIValue', 'value' => ['name' => 'magic_quotes_gpc', 'value' => '0']]; $component = \common_configuration_ComponentFactory::buildFromArray($array); $this->assertInstanceOf(\common_configuration_PHPINIValue::class, $component); $this->assertEquals($component->getName(), 'magic_quotes_gpc'); $this->assertFalse($component->isOptional()); $array = ['type' => 'FileSystemComponent', 'value' => ['location' => $location, 'rights' => 'r']]; $component = \common_configuration_ComponentFactory::buildFromArray($array); $this->assertInstanceOf(\common_configuration_FileSystemComponent::class, $component); $this->assertFalse($component->isOptional()); $this->assertEquals($component->getLocation(), $location); $this->assertEquals($component->getExpectedRights(), 'r'); $report = $component->check(); $this->assertInstanceOf(\common_configuration_Report::class, $report); $this->assertEquals($report->getStatus(), \common_configuration_Report::VALID); try { $array = ['type' => 'PHPINIValue', 'value' => []]; $component = \common_configuration_ComponentFactory::buildFromArray($array); $this->assertTrue(false, 'An exception should be raised because of missing attributes.'); } catch (\common_configuration_ComponentFactoryException $e) { $this->assertTrue(true); } } }