From 77d97d6ef0d73f113246a962d28c92d19ddbe403 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Thu, 25 Dec 2014 13:46:33 +0200 Subject: [PATCH 1/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Code/Reader/SourceArgumentsReaderTest.php | 56 ++++++ .../SourceArgumentsReaderTest.php.sample | 26 +++ .../Test/Integrity/Di/CompilerTest.php | 1 + .../ConstructorArgumentTypesTest.php | 74 ++++++++ .../Code/Reader/SourceArgumentsReader.php | 168 ++++++++++++++++++ .../Validator/ConstructorArgumentTypes.php | 54 ++++++ .../Framework/Config/Composer/Package.php | 2 +- 7 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample create mode 100644 dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php create mode 100644 lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php create mode 100644 lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php new file mode 100644 index 0000000000000..92bef840df5d4 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php @@ -0,0 +1,56 @@ +sourceArgumentsReader = new \Magento\Framework\Code\Reader\SourceArgumentsReader(); + } + + /** + * @param string $class + * @param array $expectedResult + * @dataProvider getConstructorArgumentTypesDataProvider + */ + public function testGetConstructorArgumentTypes($class, $expectedResult) + { + $class = new \ReflectionClass($class); + $actualResult = $this->sourceArgumentsReader->getConstructorArgumentTypes($class); + $this->assertEquals($expectedResult, $actualResult); + } + + public function getConstructorArgumentTypesDataProvider() + { + return [ + [ + 'Some\Testing\Name\Space\AnotherSimpleClass', + [ + '\Some\Testing\Name\Space\Item', + '\Imported\Name\Space\One', + '\Imported\Name\Space\AnotherTest\Extended', + '\Imported\Name\Space\Test', + '\Imported\Name\Space\Object\Under\Test', + '\Imported\Name\Space\Object', + '\Some\Testing\Name\Space\Test', + 'array', + '' + ], + ], + [ + '\stdClass', + [null] + ] + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample new file mode 100644 index 0000000000000..de0ee2a676fa6 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample @@ -0,0 +1,26 @@ +_validator->add(new \Magento\Framework\Code\Validator\ContextAggregation()); $this->_validator->add(new \Magento\Framework\Code\Validator\TypeDuplication()); $this->_validator->add(new \Magento\Framework\Code\Validator\ArgumentSequence()); + $this->_validator->add(new \Magento\Framework\Code\Validator\ConstructorArgumentTypes()); $this->pluginValidator = new \Magento\Framework\Interception\Code\InterfaceValidator(); } diff --git a/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php b/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php new file mode 100644 index 0000000000000..c03de973f0069 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php @@ -0,0 +1,74 @@ +argumentsReaderMock = $this->getMock( + '\Magento\Framework\Code\Reader\ArgumentsReader', + [], + [], + '', + false + ); + $this->sourceArgumentsReaderMock = $this->getMock( + '\Magento\Framework\Code\Reader\sourceArgumentsReader', + [], + [], + '', + false + ); + $this->model = new \Magento\Framework\Code\Validator\ConstructorArgumentTypes( + $this->argumentsReaderMock, + $this->sourceArgumentsReaderMock + ); + } + + public function testValidate() + { + $className = '\stdClass'; + $classMock = new \ReflectionClass($className); + $this->argumentsReaderMock->expects($this->once())->method('getConstructorArguments')->with($classMock) + ->willReturn([['name' => 'Name1', 'type' => '\Type'], ['name' => 'Name2', 'type' => '\Type2']]); + $this->sourceArgumentsReaderMock->expects($this->once())->method('getConstructorArgumentTypes') + ->with($classMock)->willReturn(['\Type', '\Type2']); + $this->assertTrue($this->model->validate($className)); + } + + /** + * @expectedException \Magento\Framework\Code\ValidationException + * @expectedExceptionMessage Invalid constructor argument(s) in \stdClass + */ + public function testValidateWithException() + { + $className = '\stdClass'; + $classMock = new \ReflectionClass($className); + $this->argumentsReaderMock->expects($this->once())->method('getConstructorArguments')->with($classMock) + ->willReturn([['name' => 'Name1', 'type' => '\FAIL']]); + $this->sourceArgumentsReaderMock->expects($this->once())->method('getConstructorArgumentTypes') + ->with($classMock)->willReturn(['\Type', '\Fail']); + $this->assertTrue($this->model->validate($className)); + } +} + + diff --git a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php new file mode 100644 index 0000000000000..0e07cc34ecf48 --- /dev/null +++ b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php @@ -0,0 +1,168 @@ +getFileName() || false == $class->hasMethod( + '__construct' + ) || !$inherited && $class->getConstructor()->class !== $class->getName() + ) { + return $output; + } + $reflectionConstructor = $class->getConstructor(); + $fileContent = file($class->getFileName()); + $availableNamespaces = $this->getImportedNamespaces($fileContent); + $availableNamespaces[0] = $class->getNamespaceName(); + $constructorStartLine = $reflectionConstructor->getStartLine() - 1; + $constructorEndLine = $reflectionConstructor->getEndLine(); + $fileContent = array_slice($fileContent, $constructorStartLine, $constructorEndLine - $constructorStartLine); + $source = ' $argument]; + } + unset($argument); + $arguments = array_filter($arguments, function ($token) { + $blacklist = [T_VARIABLE, T_WHITESPACE]; + if (isset($token[0]) && in_array($token[0], $blacklist)) { + return false; + } + return true; + }); + $arguments = array_column($arguments, 1); + $arguments = implode('', $arguments); + if (empty($arguments)) { + return $output; + } + $arguments = explode(',', $arguments); + foreach ($arguments as $key => &$argument) { + $argument = $this->removeDefaultValue($argument); + $argument = $this->resolveNamespaces($argument, $availableNamespaces); + } + unset($argument); + return $arguments; + } + + /** + * Perform namespace resolution if required and return fully qualified name. + * + * @param $argument + * @param $availableNamespaces array + * @return string + */ + protected function resolveNamespaces($argument, $availableNamespaces) + { + if (substr($argument, 0, 1) !== self::NS_SEPARATOR && $argument !== 'array' && !empty($argument)) { + $name = explode(self::NS_SEPARATOR, $argument); + $unqualifiedName = $name[0]; + $isQualifiedName = count($name) > 1 ? true : false; + if (isset($availableNamespaces[$unqualifiedName])) { + $namespace = $availableNamespaces[$unqualifiedName]; + if ($isQualifiedName) { + array_shift($name); + return $namespace . self::NS_SEPARATOR . implode(self::NS_SEPARATOR, $name); + } + return $namespace; + } else { + return self::NS_SEPARATOR . $availableNamespaces[0] . self::NS_SEPARATOR . $argument; + } + } + return $argument; + } + + /** + * Remove default value from argument. + * + * @param $argument + * @return string + */ + protected function removeDefaultValue($argument) + { + $position = strpos($argument, '='); + if (is_numeric($position)) { + return substr($argument, 0, $position); + } + return $argument; + } + + /** + * Get all imported namespaces. + * + * @param array $file + * @return array + */ + protected function getImportedNamespaces(array $file) + { + $file = implode('', $file); + $file = token_get_all($file); + $classStart = array_search('{', $file); + $file = array_slice($file, 0, $classStart); + $output = []; + foreach ($file as $position => $token) { + if (is_array($token) && $token[0] === T_USE) { + $import = array_slice($file, $position); + $importEnd = array_search(';', $import); + $import = array_slice($import, 0, $importEnd); + $imports = []; + $importsCount = 0; + foreach ($import as $item) { + if ($item === ',') { + $importsCount++; + continue; + } + $imports[$importsCount][] = $item; + } + foreach($imports as $import) { + $import = array_filter($import, function ($token) { + $whitelist = [T_NS_SEPARATOR, T_STRING, T_AS]; + if (isset($token[0]) && in_array($token[0], $whitelist)) { + return true; + } + return false; + }); + $import = array_column($import, 1); + if ($import[0] === self::NS_SEPARATOR) { + array_shift($import); + } + $importName = null; + if (in_array('as', $import)) { + $importName = array_splice($import, -1)[0]; + array_pop($import); + } + $useStatement = implode('', $import); + if ($importName) { + $output[$importName] = self::NS_SEPARATOR . $useStatement; + } else { + $key = end(explode(self::NS_SEPARATOR, $useStatement)); + $output[$key] = self::NS_SEPARATOR . $useStatement; + } + } + } + } + return $output; + } +} diff --git a/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php new file mode 100644 index 0000000000000..08ba58728a319 --- /dev/null +++ b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php @@ -0,0 +1,54 @@ +argumentsReader = $argumentsReader ?: new \Magento\Framework\Code\Reader\ArgumentsReader(); + $this->sourceArgumentsReader = + $sourceArgumentsReader ?: new \Magento\Framework\Code\Reader\SourceArgumentsReader(); + } + + /** + * Validate class constructor arguments + * + * @param string $className + * @return bool + * @throws \Magento\Framework\Code\ValidationException + */ + public function validate($className) + { + $class = new \ReflectionClass($className); + $expectedArguments = $this->argumentsReader->getConstructorArguments($class); + $actualArguments = $this->sourceArgumentsReader->getConstructorArgumentTypes($class); + $expectedArguments = array_column($expectedArguments, 'type'); + if (!empty(array_diff($expectedArguments, $actualArguments))) { + throw new \Magento\Framework\Code\ValidationException( + 'Invalid constructor argument(s) in ' . $className + ); + } + return true; + } +} diff --git a/lib/internal/Magento/Framework/Config/Composer/Package.php b/lib/internal/Magento/Framework/Config/Composer/Package.php index fe3079f9159a3..06046b543482c 100644 --- a/lib/internal/Magento/Framework/Config/Composer/Package.php +++ b/lib/internal/Magento/Framework/Config/Composer/Package.php @@ -22,7 +22,7 @@ class Package * * @param \StdClass $json */ - public function __construct(\StdClass $json) + public function __construct(\stdClass $json) { $this->json = $json; } From 040efbd7a3dce9fa6af16a143b97d5714f0fec42 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Thu, 8 Jan 2015 19:06:31 +0200 Subject: [PATCH 2/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Code/Reader/_files/SourceArgumentsReaderTest.php.sample | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample index de0ee2a676fa6..af2b52ff101f1 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample +++ b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/_files/SourceArgumentsReaderTest.php.sample @@ -21,6 +21,5 @@ class AnotherSimpleClass array $itemEight = [], $itemNine = 'test' ) { - return; } } \ No newline at end of file From f0b6a112c6cca67566a6749c9230fcb762b950a4 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 11:07:32 +0200 Subject: [PATCH 3/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Framework/Code/Validator/ConstructorArgumentTypes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php index 08ba58728a319..ab98778484521 100644 --- a/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php +++ b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php @@ -44,7 +44,8 @@ public function validate($className) $expectedArguments = $this->argumentsReader->getConstructorArguments($class); $actualArguments = $this->sourceArgumentsReader->getConstructorArgumentTypes($class); $expectedArguments = array_column($expectedArguments, 'type'); - if (!empty(array_diff($expectedArguments, $actualArguments))) { + $result = array_diff($expectedArguments, $actualArguments); + if (!empty($result)) { throw new \Magento\Framework\Code\ValidationException( 'Invalid constructor argument(s) in ' . $className ); From 437a9ea6e532994f0b8f95567d91cfc48a573118 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 11:19:10 +0200 Subject: [PATCH 4/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Framework/Code/Validator/ConstructorArgumentTypesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php b/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php index c03de973f0069..b9933923ff80b 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/Code/Validator/ConstructorArgumentTypesTest.php @@ -32,7 +32,7 @@ protected function setUp() false ); $this->sourceArgumentsReaderMock = $this->getMock( - '\Magento\Framework\Code\Reader\sourceArgumentsReader', + '\Magento\Framework\Code\Reader\SourceArgumentsReader', [], [], '', From b8b4d7ec42756fd62dc4070262e5f4bdb851857c Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 11:58:10 +0200 Subject: [PATCH 5/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Code/Reader/SourceArgumentsReader.php | 24 ++++++++++++------- .../Validator/ConstructorArgumentTypes.php | 4 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php index 0e07cc34ecf48..9e7a3ee2c35c8 100644 --- a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php +++ b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php @@ -21,9 +21,11 @@ class SourceArgumentsReader public function getConstructorArgumentTypes(\ReflectionClass $class, $inherited = false) { $output = [null]; + /** - * Skip native PHP types, classes without constructor - */ + Skip native PHP types, classes without constructor. + */ + if (!$class->getFileName() || false == $class->hasMethod( '__construct' ) || !$inherited && $class->getConstructor()->class !== $class->getName() @@ -53,7 +55,10 @@ public function getConstructorArgumentTypes(\ReflectionClass $class, $inherited } return true; }); - $arguments = array_column($arguments, 1); + $arguments = array_map(function ($element) { + return $element[1]; + }, $arguments); + $arguments = array_values($arguments); $arguments = implode('', $arguments); if (empty($arguments)) { return $output; @@ -70,8 +75,8 @@ public function getConstructorArgumentTypes(\ReflectionClass $class, $inherited /** * Perform namespace resolution if required and return fully qualified name. * - * @param $argument - * @param $availableNamespaces array + * @param string $argument + * @param array $availableNamespaces * @return string */ protected function resolveNamespaces($argument, $availableNamespaces) @@ -97,7 +102,7 @@ protected function resolveNamespaces($argument, $availableNamespaces) /** * Remove default value from argument. * - * @param $argument + * @param string $argument * @return string */ protected function removeDefaultValue($argument) @@ -136,7 +141,7 @@ protected function getImportedNamespaces(array $file) } $imports[$importsCount][] = $item; } - foreach($imports as $import) { + foreach ($imports as $import) { $import = array_filter($import, function ($token) { $whitelist = [T_NS_SEPARATOR, T_STRING, T_AS]; if (isset($token[0]) && in_array($token[0], $whitelist)) { @@ -144,7 +149,10 @@ protected function getImportedNamespaces(array $file) } return false; }); - $import = array_column($import, 1); + $import = array_map(function ($element) { + return $element[1]; + }, $import); + $import = array_values($import); if ($import[0] === self::NS_SEPARATOR) { array_shift($import); } diff --git a/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php index ab98778484521..f119bd004ddf7 100644 --- a/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php +++ b/lib/internal/Magento/Framework/Code/Validator/ConstructorArgumentTypes.php @@ -43,7 +43,9 @@ public function validate($className) $class = new \ReflectionClass($className); $expectedArguments = $this->argumentsReader->getConstructorArguments($class); $actualArguments = $this->sourceArgumentsReader->getConstructorArgumentTypes($class); - $expectedArguments = array_column($expectedArguments, 'type'); + $expectedArguments = array_map(function ($element) { + return $element['type']; + }, $expectedArguments); $result = array_diff($expectedArguments, $actualArguments); if (!empty($result)) { throw new \Magento\Framework\Code\ValidationException( From 21aa6a3cae8886caa8cac27204250fcad5975fb2 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 12:23:04 +0200 Subject: [PATCH 6/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Magento/Framework/Code/Reader/SourceArgumentsReader.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php index 9e7a3ee2c35c8..6f34672189ec3 100644 --- a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php +++ b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php @@ -21,11 +21,6 @@ class SourceArgumentsReader public function getConstructorArgumentTypes(\ReflectionClass $class, $inherited = false) { $output = [null]; - - /** - Skip native PHP types, classes without constructor. - */ - if (!$class->getFileName() || false == $class->hasMethod( '__construct' ) || !$inherited && $class->getConstructor()->class !== $class->getName() From de73fa2f240fc4ea39d7a3ff9f2aaa13fc79baf7 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 12:37:55 +0200 Subject: [PATCH 7/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Magento/Framework/Code/Reader/SourceArgumentsReader.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php index 6f34672189ec3..68ef4482b6367 100644 --- a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php +++ b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php @@ -160,7 +160,8 @@ protected function getImportedNamespaces(array $file) if ($importName) { $output[$importName] = self::NS_SEPARATOR . $useStatement; } else { - $key = end(explode(self::NS_SEPARATOR, $useStatement)); + $key = explode(self::NS_SEPARATOR, $useStatement); + $key = end($key); $output[$key] = self::NS_SEPARATOR . $useStatement; } } From 1125acf7eeb721542c1d26bb01204d057dae8779 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Fri, 9 Jan 2015 12:54:42 +0200 Subject: [PATCH 8/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Magento/Framework/Code/Reader/SourceArgumentsReader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php index 68ef4482b6367..27b087cfe6d1c 100644 --- a/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php +++ b/lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php @@ -22,8 +22,8 @@ public function getConstructorArgumentTypes(\ReflectionClass $class, $inherited { $output = [null]; if (!$class->getFileName() || false == $class->hasMethod( - '__construct' - ) || !$inherited && $class->getConstructor()->class !== $class->getName() + '__construct' + ) || !$inherited && $class->getConstructor()->class !== $class->getName() ) { return $output; } From a6825fa063c3ca8c5b7895875576ab5f28128530 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov Date: Tue, 13 Jan 2015 13:20:43 +0200 Subject: [PATCH 9/9] MAGETWO-26655: [TD] Compiler Can't Verify Case Sensitive Dependency --- .../Framework/Code/Reader/SourceArgumentsReaderTest.php | 3 ++- .../Code/Reader/_files/SourceArgumentsReaderTest.php.sample | 3 ++- .../Framework/Code/Validator/ConstructorArgumentTypesTest.php | 3 ++- .../Magento/Framework/Code/Reader/SourceArgumentsReader.php | 3 ++- .../Framework/Code/Validator/ConstructorArgumentTypes.php | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php index 92bef840df5d4..076d2ab396be5 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Code/Reader/SourceArgumentsReaderTest.php @@ -1,6 +1,7 @@