diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake index db1bbc84c26..529d08cb590 100644 --- a/cmake/QtTestHelpers.cmake +++ b/cmake/QtTestHelpers.cmake @@ -231,6 +231,7 @@ function(qt_internal_get_test_arg_definitions optional_args single_value_args mu QML_IMPORTPATH TESTDATA QT_TEST_SERVER_LIST + ANDROID_TESTRUNNER_PRE_TEST_ADB_COMMANDS ${__default_private_args} ${__default_public_args} PARENT_SCOPE @@ -448,6 +449,8 @@ endfunction() # The option forces adding the provided TESTDATA to resources. # MANUAL # The option indicates that the test is a manual test. +# ANDROID_TESTRUNNER_PRE_TEST_ADB_COMMANDS +# Passes --pre-test-adb-command to androidTestRunner. Android specific argument. function(qt_internal_add_test name) qt_internal_get_test_arg_definitions(optional_args single_value_args multi_value_args) @@ -660,6 +663,13 @@ function(qt_internal_add_test name) endif() qt_internal_android_test_runner_arguments("${name}" test_executable extra_test_args) list(APPEND extra_test_args "--timeout" "${android_timeout}" "--verbose") + + if(arg_ANDROID_TESTRUNNER_PRE_TEST_ADB_COMMANDS) + foreach(command IN LISTS arg_ANDROID_TESTRUNNER_PRE_TEST_ADB_COMMANDS) + list(APPEND extra_test_args "--pre-test-adb-command" "${command}") + endforeach() + endif() + set(test_working_dir "${CMAKE_CURRENT_BINARY_DIR}") elseif(QNX) set(test_working_dir "") diff --git a/src/tools/androidtestrunner/doc/androidtestrunner.qdoc b/src/tools/androidtestrunner/doc/androidtestrunner.qdoc index 21f231868a4..28c5516b22a 100644 --- a/src/tools/androidtestrunner/doc/androidtestrunner.qdoc +++ b/src/tools/androidtestrunner/doc/androidtestrunner.qdoc @@ -106,6 +106,8 @@ \li \c {--ndk-stack }: Specifies the path to the \l {Android: ndk-stack}{ndk-stack} tool for symbolizing crash stack traces. Defaults to the tool path found under \c $ANDROID_NDK_ROOT. + \li \c {--pre-test-adb-command }: call the adb after + installation and before the test run. \li \c {-- }: Passes anything after the dashes as test arguments. \li \c --verbose: Prints verbose output. \li \c --help: Displays the help information. diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index 228aa676f5b..1b3f3349bfc 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -48,6 +48,7 @@ struct Options QStringList amStarttestArgs; QString apkPath; QString ndkStackPath; + QList preTestRunAdbCommands; bool showLogcatOutput = false; std::optional stdoutLogger; }; @@ -168,6 +169,12 @@ static bool parseOptions() g_options.helpRequested = true; } else if (argument.compare("--verbose"_L1, Qt::CaseInsensitive) == 0) { g_options.verbose = true; + } else if (argument.compare("--pre-test-adb-command"_L1, Qt::CaseInsensitive) == 0) { + if (i + 1 == arguments.size()) + g_options.helpRequested = true; + else { + g_options.preTestRunAdbCommands += QProcess::splitCommand(arguments.at(++i)); + } } else if (argument.compare("--"_L1, Qt::CaseInsensitive) == 0) { ++i; break; @@ -243,6 +250,9 @@ static void printHelp() "\n" " --verbose: Prints out information during processing.\n" "\n" + " --pre-test-adb-command : call the adb after\n" + " installation and before the test run.\n" + "\n" " --help: Displays this information.\n", qPrintable(QCoreApplication::arguments().at(0)) ); @@ -863,6 +873,16 @@ int main(int argc, char *argv[]) if (!g_testInfo.isPackageInstalled) return EXIT_ERROR; + // Call additional adb command if set after installation and before starting the test + for (const auto &command : g_options.preTestRunAdbCommands) { + QByteArray output; + if (!execAdbCommand(command, &output)) { + qCritical("The pre test ADB command \"%s\" failed with output:\n%s", + qUtf8Printable(command.join(u' ')), output.constData()); + return EXIT_ERROR; + } + } + // Pre test start const QString formattedStartTime = getCurrentTimeString();