diff --git a/dev/tests/verification/Resources/MagentoCliTest.txt b/dev/tests/verification/Resources/MagentoCliTest.txt
new file mode 100644
index 000000000..3efc73c01
--- /dev/null
+++ b/dev/tests/verification/Resources/MagentoCliTest.txt
@@ -0,0 +1,59 @@
+Test filesverification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml
")
+ */
+class MagentoCliTestCest
+{
+ /**
+ * @var bool
+ */
+ private $isSuccess = false;
+
+ /**
+ * @param AcceptanceTester $I
+ * @throws \Exception
+ */
+ public function _after(AcceptanceTester $I)
+ {
+ if ($this->isSuccess) {
+ unlink(__FILE__);
+ }
+ }
+
+ /**
+ * @Features({"TestModule"})
+ * @param AcceptanceTester $I
+ * @return void
+ * @throws \Exception
+ */
+ public function MagentoCliTest(AcceptanceTester $I)
+ {
+ $magentoCli1 = $I->magentoCLI("maintenance:enable", 45, "\"stuffHere\""); // stepKey: magentoCli1
+ $I->comment($magentoCli1);
+ $magentoCli2 = $I->magentoCLI("maintenance:enable", 120, "\"stuffHere\""); // stepKey: magentoCli2
+ $I->comment($magentoCli2);
+ $magentoCli3 = $I->magentoCLISecret("config:set somePath " . $I->getSecret("someKey"), 45); // stepKey: magentoCli3
+ $I->comment($magentoCli3); // stepKey: magentoCli3
+ $magentoCli4 = $I->magentoCLISecret("config:set somePath " . $I->getSecret("someKey"), 120); // stepKey: magentoCli4
+ $I->comment($magentoCli4); // stepKey: magentoCli4
+ }
+
+ public function _passed(AcceptanceTester $I)
+ {
+ // Test passed successfully.
+ $this->isSuccess = true;
+ }
+}
diff --git a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml
new file mode 100644
index 000000000..23914943a
--- /dev/null
+++ b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/tests/verification/Tests/BasicCestGenerationTest.php b/dev/tests/verification/Tests/BasicCestGenerationTest.php
index 39802c50d..a900edbd3 100644
--- a/dev/tests/verification/Tests/BasicCestGenerationTest.php
+++ b/dev/tests/verification/Tests/BasicCestGenerationTest.php
@@ -59,4 +59,17 @@ public function testWithXmlComments()
{
$this->generateAndCompareTest('XmlCommentedTest');
}
+
+ /**
+ * Tests magentoCLI and magentoCLISecret commands with env 'MAGENTO_CLI_WAIT_TIMEOUT' set
+ *
+ * @throws \Exception
+ * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException
+ */
+ public function testMagentoCli()
+ {
+ putenv("MAGENTO_CLI_WAIT_TIMEOUT=45");
+ $this->generateAndCompareTest('MagentoCliTest');
+ putenv("MAGENTO_CLI_WAIT_TIMEOUT");
+ }
}
diff --git a/etc/config/.env.example b/etc/config/.env.example
index 3291d1082..b3ec2ad41 100644
--- a/etc/config/.env.example
+++ b/etc/config/.env.example
@@ -61,6 +61,9 @@ MODULE_ALLOWLIST=Magento_Framework,ConfigurableProductWishlist,ConfigurableProdu
#*** Default timeout for wait actions
WAIT_TIMEOUT=60
+#*** Default timeout for 'magentoCLI' and 'magentoCLISecret' command
+MAGENTO_CLI_WAIT_TIMEOUT=60
+
#*** Uncomment and set to enable all tests, regardless of passing status, to have all their Allure artifacts.
#VERBOSE_ARTIFACTS=true
diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php
index f2580deaf..057876659 100644
--- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php
+++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php
@@ -530,9 +530,9 @@ public function scrollToTopOfPage()
/**
* Takes given $command and executes it against bin/magento or custom exposed entrypoint. Returns command output.
*
- * @param string $command
- * @param integer $timeout
- * @param string $arguments
+ * @param string $command
+ * @param integer|null $timeout
+ * @param string|null $arguments
* @return string
*
* @throws TestFrameworkException
@@ -846,9 +846,9 @@ public function fillSecretField($field, $value)
* Function used to create data that contains sensitive credentials in a override.
* The data is decrypted immediately prior to data creation to avoid exposure in console or log.
*
- * @param string $command
- * @param null $timeout
- * @param null $arguments
+ * @param string $command
+ * @param integer|null $timeout
+ * @param string|null $arguments
* @throws TestFrameworkException
* @return string
*/
diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php
index 451b58aa0..d8ed23098 100644
--- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php
+++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php
@@ -184,6 +184,17 @@ public static function getDefaultWaitTimeout()
return getenv('WAIT_TIMEOUT');
}
+ /**
+ * Retrieve default timeout for 'magentoCLI' or 'magentoCLISecret' in seconds
+ *
+ * @return integer
+ */
+ public static function getDefaultMagentoCLIWaitTimeout()
+ {
+ $timeout = getenv('MAGENTO_CLI_WAIT_TIMEOUT');
+ return !empty($timeout) ? $timeout : self::DEFAULT_COMMAND_WAIT_TIMEOUT;
+ }
+
/**
* This function returns the string property stepKey.
*
diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php
index 0dfb0f8ee..46a05c946 100644
--- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php
+++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php
@@ -842,7 +842,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato
}
if (in_array($actionObject->getType(), ActionObject::COMMAND_ACTION_ATTRIBUTES)) {
- $time = $time ?? ActionObject::DEFAULT_COMMAND_WAIT_TIMEOUT;
+ $time = $time ?? ActionObject::getDefaultMagentoCLIWaitTimeout();
} else {
$time = $time ?? ActionObject::getDefaultWaitTimeout();
}