Skip to content

Commit 400d5e5

Browse files
committed
MQE-1031: Empty files are flagged during generation or dealt with
gracefully - Added check for empty file
1 parent c62b9d2 commit 400d5e5

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Tests\unit\Magento\FunctionalTestFramework\Test\Config\Reader;
7+
8+
use Magento\FunctionalTestingFramework\Config\FileResolver\Module;
9+
use Magento\FunctionalTestingFramework\Config\Reader\Filesystem;
10+
use Magento\FunctionalTestingFramework\Config\ValidationState;
11+
use Magento\FunctionalTestingFramework\Util\Iterator\File;
12+
use PHPUnit\Framework\TestCase;
13+
use AspectMock\Test as AspectMock;
14+
use tests\unit\Util\TestLoggingUtil;
15+
16+
class FilesystemTest extends TestCase
17+
{
18+
/**
19+
* Before test functionality
20+
* @return void
21+
*/
22+
public function setUp()
23+
{
24+
TestLoggingUtil::getInstance()->setMockLoggingUtil();
25+
}
26+
27+
/**
28+
* Test Reading Empty Files
29+
* @throws \Exception
30+
*/
31+
public function testEmptyXmlFile()
32+
{
33+
// create mocked items and read the file
34+
$someFile = $this->setMockFile("somepath.xml", "");
35+
$filesystem = $this->createPseudoFileSystem($someFile);
36+
$filesystem->read();
37+
38+
// validate log statement
39+
TestLoggingUtil::getInstance()->validateMockLogStatement(
40+
"warning",
41+
"XML File is empty.",
42+
["File" => "somepath.xml"]
43+
);
44+
}
45+
46+
/**
47+
* Function used to set mock for File created in test
48+
*
49+
* @param string $fileName
50+
* @param string $content
51+
* @return object
52+
* @throws \Exception
53+
*/
54+
public function setMockFile($fileName, $content)
55+
{
56+
$file = AspectMock::double(
57+
File::class,
58+
[
59+
'current' => "",
60+
'count' => 1,
61+
'getFilename' => $fileName
62+
]
63+
)->make();
64+
65+
//set mocked data property for File
66+
$property = new \ReflectionProperty(File::class, 'data');
67+
$property->setAccessible(true);
68+
$property->setValue($file, [$fileName => $content]);
69+
70+
return $file;
71+
}
72+
73+
/**
74+
* Function used to set mock for filesystem class during test
75+
*
76+
* @param string $fileList
77+
* @return object
78+
* @throws \Exception
79+
*/
80+
public function createPseudoFileSystem($fileList)
81+
{
82+
$filesystem = AspectMock::double(Filesystem::class)->make();
83+
84+
//set resolver to use mocked resolver
85+
$mockFileResolver = AspectMock::double(Module::class, ['get' => $fileList])->make();
86+
$property = new \ReflectionProperty(Filesystem::class, 'fileResolver');
87+
$property->setAccessible(true);
88+
$property->setValue($filesystem, $mockFileResolver);
89+
90+
//set validator to use mocked validator
91+
$mockValidation = AspectMock::double(ValidationState::class, ['isValidationRequired' => false])->make();
92+
$property = new \ReflectionProperty(Filesystem::class, 'validationState');
93+
$property->setAccessible(true);
94+
$property->setValue($filesystem, $mockValidation);
95+
96+
return $filesystem;
97+
}
98+
99+
/**
100+
* After class functionality
101+
* @return void
102+
*/
103+
public static function tearDownAfterClass()
104+
{
105+
TestLoggingUtil::getInstance()->clearMockLoggingUtil();
106+
parent::tearDownAfterClass();
107+
}
108+
}

src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* See COPYING.txt for license details.
55
*/
66
namespace Magento\FunctionalTestingFramework\Config\Reader;
7+
use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig;
8+
use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil;
79

810
/**
911
* Filesystem configuration loader. Loads configuration from XML files, split by scopes.
@@ -144,6 +146,10 @@ protected function readFiles($fileList)
144146
/** @var \Magento\FunctionalTestingFramework\Config\Dom $configMerger */
145147
$configMerger = null;
146148
foreach ($fileList as $key => $content) {
149+
//check if file is empty and continue to next if it is
150+
if (!$this->verifyFileStatus($content, $fileList->getFilename())) {
151+
continue;
152+
}
147153
try {
148154
if (!$configMerger) {
149155
$configMerger = $this->createConfigMerger($this->domDocumentClass, $content);
@@ -192,4 +198,24 @@ protected function createConfigMerger($mergerClass, $initialContents)
192198
}
193199
return $result;
194200
}
201+
202+
/**
203+
* Checks if content is empty and logs warning, returns false if file is empty
204+
*
205+
* @param string $content
206+
* @param string $fileName
207+
* @return bool
208+
*/
209+
protected function verifyFileStatus($content, $fileName)
210+
{
211+
if (empty($content)) {
212+
if (MftfApplicationConfig::getConfig()->verboseEnabled()) {
213+
LoggingUtil::getInstance()->getLogger(Filesystem::class)->warn(
214+
"XML File is empty.", ["File" => $fileName]
215+
);
216+
}
217+
return false;
218+
}
219+
return true;
220+
}
195221
}

src/Magento/FunctionalTestingFramework/Config/Reader/MftfFilesystem.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public function readFiles($fileList)
2525
/** @var \Magento\FunctionalTestingFramework\Test\Config\Dom $configMerger */
2626
$configMerger = null;
2727
foreach ($fileList as $key => $content) {
28+
//check if file is empty and continue to next if it is
29+
if (!parent::verifyFileStatus($content, $fileList->getFilename())) {
30+
continue;
31+
}
2832
try {
2933
if (!$configMerger) {
3034
$configMerger = $this->createConfigMerger(

0 commit comments

Comments
 (0)