From f1b41c9f0fb291d1ba9ac267dbbf10b865165118 Mon Sep 17 00:00:00 2001 From: Alex Calandra <calandra.aj@gmail.com> Date: Mon, 30 Jul 2018 10:50:08 -0500 Subject: [PATCH 1/4] MQE-1118: Handle XML merge failures gracefully - Added filename to error messages for loadXML usage in initDom --- src/Magento/FunctionalTestingFramework/Config/Dom.php | 11 +++++++++-- .../DataGenerator/Config/Dom.php | 2 +- .../DataGenerator/Config/OperationDom.php | 2 +- .../FunctionalTestingFramework/Page/Config/Dom.php | 2 +- .../Page/Config/SectionDom.php | 2 +- .../Test/Config/ActionGroupDom.php | 2 +- .../FunctionalTestingFramework/Test/Config/Dom.php | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Config/Dom.php index 1305574cc..c76b8c088 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom.php @@ -6,6 +6,8 @@ namespace Magento\FunctionalTestingFramework\Config; +use Magento\FunctionalTestingFramework\Config\Dom\ValidationException; + /** * Magento configuration XML DOM utility */ @@ -354,13 +356,18 @@ public function getDom() * Create DOM document based on $xml parameter * * @param string $xml + * @param string $filename * @return \DOMDocument * @throws \Magento\FunctionalTestingFramework\Config\Dom\ValidationException */ - protected function initDom($xml) + protected function initDom($xml, $filename = null) { $dom = new \DOMDocument(); - $dom->loadXML($xml); + try { + $dom->loadXML($xml); + } catch (\Exception $exception) { + throw new ValidationException($filename . "\n"); + } if ($this->schemaFile) { $errors = self::validateDomDocument($dom, $this->schemaFile, $this->errorFormat); if (count($errors)) { diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php index 1da3e9c0e..abef7390a 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php @@ -65,7 +65,7 @@ public function __construct( */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); if (strpos($filename, self::DATA_FILE_NAME_ENDING)) { $entityNodes = $dom->getElementsByTagName('entity'); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/OperationDom.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/OperationDom.php index f4617c61e..98694ea47 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/OperationDom.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/OperationDom.php @@ -65,7 +65,7 @@ public function __construct( */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); if (strpos($filename, self::METADATA_FILE_NAME_ENDING)) { $operationNodes = $dom->getElementsByTagName('operation'); diff --git a/src/Magento/FunctionalTestingFramework/Page/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Page/Config/Dom.php index 0226a286a..0d8739636 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Page/Config/Dom.php @@ -76,7 +76,7 @@ public function __construct( */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); $pagesNode = $dom->getElementsByTagName('pages')->item(0); $this->validationUtil->validateChildUniqueness($pagesNode, $filename); diff --git a/src/Magento/FunctionalTestingFramework/Page/Config/SectionDom.php b/src/Magento/FunctionalTestingFramework/Page/Config/SectionDom.php index 7115adb34..c3476e7dd 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Config/SectionDom.php +++ b/src/Magento/FunctionalTestingFramework/Page/Config/SectionDom.php @@ -67,7 +67,7 @@ public function __construct( */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); $sectionNodes = $dom->getElementsByTagName('section'); foreach ($sectionNodes as $sectionNode) { $sectionNode->setAttribute(self::SECTION_META_FILENAME_ATTRIBUTE, $filename); diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/ActionGroupDom.php b/src/Magento/FunctionalTestingFramework/Test/Config/ActionGroupDom.php index ab8bc66f5..36f7a4384 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/ActionGroupDom.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/ActionGroupDom.php @@ -26,7 +26,7 @@ class ActionGroupDom extends Dom */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); if (strpos($filename, self::ACTION_GROUP_FILE_NAME_ENDING)) { $actionGroupNodes = $dom->getElementsByTagName('actionGroup'); diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php index ae301b5b1..828586b3c 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php @@ -79,7 +79,7 @@ public function __construct( */ public function initDom($xml, $filename = null) { - $dom = parent::initDom($xml); + $dom = parent::initDom($xml, $filename); if (strpos($filename, self::TEST_FILE_NAME_ENDING)) { $testNodes = $dom->getElementsByTagName('test'); From 3409b4b2c72913277658d201e32c207d93aa34d3 Mon Sep 17 00:00:00 2001 From: Alex Calandra <calandra.aj@gmail.com> Date: Mon, 30 Jul 2018 11:13:54 -0500 Subject: [PATCH 2/4] MQE-1118: Handle XML merge failures gracefully - Added Test and made error a tiny bit more specific (error is caught by child classes given context) --- .../Test/Config/ActionGroupDomTest.php | 17 +++++++++++++++++ .../FunctionalTestingFramework/Config/Dom.php | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php index 8d0bc19ca..ceb677947 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php @@ -6,6 +6,7 @@ namespace Tests\unit\Magento\FunctionalTestFramework\Test\Config; use Magento\FunctionalTestingFramework\Exceptions\Collector\ExceptionCollector; +use Magento\FunctionalTestingFramework\Config\Dom\ValidationException; use Magento\FunctionalTestingFramework\Test\Config\ActionGroupDom; use Magento\FunctionalTestingFramework\Util\MagentoTestCase; @@ -29,4 +30,20 @@ public function testActionGroupDomStepKeyValidation() $this->expectException(\Exception::class); $exceptionCollector->throwException(); } + + /** + * Test Action Group invalid XML + */ + public function testActionGroupDomInvalidXmlValidation() + { + $sampleXml = "<actionGroups> + <actionGroup name=\"actionGroupWithoutArguments\"> + <wait> + </actionGroup> + </actionGroups>"; + + $exceptionCollector = new ExceptionCollector(); + $this->expectException(ValidationException::class); + new ActionGroupDom($sampleXml, 'bad.xml', $exceptionCollector); + } } diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Config/Dom.php index c76b8c088..820d3c65d 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom.php @@ -366,7 +366,7 @@ protected function initDom($xml, $filename = null) try { $dom->loadXML($xml); } catch (\Exception $exception) { - throw new ValidationException($filename . "\n"); + throw new ValidationException("XML Parse Error: $filename\n"); } if ($this->schemaFile) { $errors = self::validateDomDocument($dom, $this->schemaFile, $this->errorFormat); From 428721a6d9f78677ef64641f2f1017f4fea6ff00 Mon Sep 17 00:00:00 2001 From: Alex Calandra <calandra.aj@gmail.com> Date: Mon, 30 Jul 2018 11:46:28 -0500 Subject: [PATCH 3/4] MQE-118: Handle XML merge failures gracefully - Added exception message check in unit test --- .../Test/Config/ActionGroupDomTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php index ceb677947..5d1dd7878 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php @@ -37,13 +37,14 @@ public function testActionGroupDomStepKeyValidation() public function testActionGroupDomInvalidXmlValidation() { $sampleXml = "<actionGroups> - <actionGroup name=\"actionGroupWithoutArguments\"> + <actionGroup name=\"sampleActionGroup\"> <wait> </actionGroup> </actionGroups>"; $exceptionCollector = new ExceptionCollector(); $this->expectException(ValidationException::class); - new ActionGroupDom($sampleXml, 'bad.xml', $exceptionCollector); + $this->expectExceptionMessage("XML Parse Error: invalid.xml\n"); + new ActionGroupDom($sampleXml, 'invalid.xml', $exceptionCollector); } } From ecf02f26372f10f2fabae024d5bb770226623057 Mon Sep 17 00:00:00 2001 From: Alex Calandra <calandra.aj@gmail.com> Date: Mon, 13 Aug 2018 11:09:14 -0500 Subject: [PATCH 4/4] MQE-118: Handle XML merge failures gracefully - Added check for false returns from loadXML --- src/Magento/FunctionalTestingFramework/Config/Dom.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Config/Dom.php index 820d3c65d..566fbd5b3 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom.php @@ -364,7 +364,10 @@ protected function initDom($xml, $filename = null) { $dom = new \DOMDocument(); try { - $dom->loadXML($xml); + $domSuccess = $dom->loadXML($xml); + if (!$domSuccess) { + throw new \Exception(); + } } catch (\Exception $exception) { throw new ValidationException("XML Parse Error: $filename\n"); }