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");
         }