TestModuleManager.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\TestFramework\Deploy;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\Module\ModuleList;
  9. use Magento\Framework\Module\ModuleListInterface;
  10. /**
  11. * The purpose of this class is adding test modules files to Magento code base.
  12. */
  13. class TestModuleManager
  14. {
  15. /**
  16. * Name of file of DB XML declaration.
  17. */
  18. const DECLARATIVE_FILE_NAME = "db_schema.xml";
  19. /**
  20. * Add test module files to Magento code base.
  21. *
  22. * @param string $moduleName
  23. * @return void
  24. * @throws \RuntimeException
  25. */
  26. public function addModuleFiles($moduleName)
  27. {
  28. $moduleName = str_replace("Magento_", "", $moduleName);
  29. $pathToCommittedTestModules = TESTS_MODULES_PATH . '/Magento/' . $moduleName;
  30. $pathToInstalledMagentoInstanceModules = MAGENTO_MODULES_PATH . $moduleName;
  31. $iterator = new \RecursiveIteratorIterator(
  32. new \RecursiveDirectoryIterator(
  33. $pathToCommittedTestModules,
  34. \RecursiveDirectoryIterator::FOLLOW_SYMLINKS
  35. )
  36. );
  37. /** @var \SplFileInfo $file */
  38. foreach ($iterator as $file) {
  39. if (!$file->isDir()) {
  40. $source = $file->getPathname();
  41. $relativePath = substr($source, strlen($pathToCommittedTestModules));
  42. $destination = $pathToInstalledMagentoInstanceModules . $relativePath;
  43. $targetDir = dirname($destination);
  44. if (!is_dir($targetDir)) {
  45. mkdir($targetDir, 0755, true);
  46. }
  47. copy($source, $destination);
  48. }
  49. }
  50. unset($iterator, $file);
  51. // Register the modules under '_files/'
  52. $pathPattern = $pathToInstalledMagentoInstanceModules . '/Test*/registration.php';
  53. $files = glob($pathPattern, GLOB_NOSORT);
  54. if ($files === false) {
  55. throw new \RuntimeException('glob() returned error while searching in \'' . $pathPattern . '\'');
  56. }
  57. foreach ($files as $file) {
  58. include $file;
  59. }
  60. }
  61. /**
  62. * Copy revision folder to main module
  63. *
  64. * @param string $moduleName
  65. * @param string $revisionName
  66. * @param string $dir
  67. * @return void
  68. */
  69. public function addRevision($moduleName, $revisionName, $dir)
  70. {
  71. $modulePath = str_replace("Magento_", "", $moduleName);
  72. $folder = MAGENTO_MODULES_PATH . $modulePath;
  73. $desiredPath = $folder . '/' . $dir;
  74. $revisionPath = $folder . '/revisions/' . $revisionName . '/';
  75. if (!is_dir($desiredPath)) {
  76. mkdir($desiredPath, 0777, true);
  77. }
  78. rename($revisionPath, $desiredPath);
  79. }
  80. /**
  81. * Update module version.
  82. *
  83. * @param string $moduleName Like Magento_TestSetupModule
  84. * @param string $revisionName Folder name, like reviisions/revision_1/db_schema.xml
  85. * @param string $fileName For example db_schema.xml
  86. * @param string $fileDir For example etc or Setup
  87. */
  88. public function updateRevision($moduleName, $revisionName, $fileName, $fileDir)
  89. {
  90. $modulePath = str_replace("Magento_", "", $moduleName);
  91. $folder = MAGENTO_MODULES_PATH . $modulePath;
  92. $oldFile = $folder . DIRECTORY_SEPARATOR . $fileDir . "/" . $fileName;
  93. $revisionFile = MAGENTO_MODULES_PATH . $modulePath . "/revisions/" .
  94. $revisionName . DIRECTORY_SEPARATOR . $fileName;
  95. if (!file_exists($oldFile)) {
  96. $dir = dirname($oldFile);
  97. if (!is_dir($dir)) {
  98. mkdir($dir, 0777, true);
  99. }
  100. touch($oldFile);
  101. }
  102. if (file_exists($revisionFile)) {
  103. unlink($oldFile);
  104. copy($revisionFile, $oldFile);
  105. } else {
  106. throw new \InvalidArgumentException("Old File or revision files paths are invalid");
  107. }
  108. }
  109. /**
  110. * Remove test module files to Magento code base.
  111. *
  112. * @param string $moduleName
  113. * @return void
  114. */
  115. public function removeModuleFiles($moduleName)
  116. {
  117. $modulePath = str_replace("Magento_", "", $moduleName);
  118. $folder = MAGENTO_MODULES_PATH . $modulePath;
  119. //remove test modules from magento codebase
  120. if (is_dir($folder)) {
  121. \Magento\Framework\Filesystem\Io\File::rmdirRecursive($folder);
  122. }
  123. }
  124. /**
  125. * There can be situation when config version of module can be cached
  126. * So proposed to clean shared instance of
  127. * @see ModuleList in order to achieve clean installation
  128. */
  129. public function cleanModuleList()
  130. {
  131. /**
  132. * @var \Magento\TestFramework\ObjectManager $objectManager
  133. */
  134. $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  135. $objectManager->removeSharedInstance(ModuleList::class);
  136. $objectManager->removeSharedInstance(ModuleListInterface::class);
  137. }
  138. /**
  139. * Update module files.
  140. *
  141. * @param string $moduleName
  142. * @return void
  143. */
  144. public function updateModuleFiles($moduleName)
  145. {
  146. $pathToCommittedTestModules = TESTS_MODULES_PATH . '/UpgradeScripts/' . $moduleName;
  147. $pathToInstalledMagentoInstanceModules = MAGENTO_MODULES_PATH . $moduleName;
  148. $iterator = new \RecursiveIteratorIterator(
  149. new \RecursiveDirectoryIterator(
  150. $pathToCommittedTestModules,
  151. \RecursiveDirectoryIterator::FOLLOW_SYMLINKS
  152. )
  153. );
  154. /** @var \SplFileInfo $file */
  155. foreach ($iterator as $file) {
  156. if (!$file->isDir()) {
  157. $source = $file->getPathname();
  158. $relativePath = substr($source, strlen($pathToCommittedTestModules));
  159. $destination = $pathToInstalledMagentoInstanceModules . $relativePath;
  160. $targetDir = dirname($destination);
  161. if (!is_dir($targetDir)) {
  162. mkdir($targetDir, 0755, true);
  163. }
  164. copy($source, $destination);
  165. }
  166. }
  167. }
  168. }