From b044323c1656aeeec508afab8457755cc1e8c587 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sun, 26 Nov 2023 12:50:45 +0200 Subject: [PATCH] AndroidTestRunner: Fix treatement of quotes in test args This has two parts, under testrunner, make sure to pass test args that has quotes as \\\" so that the Android app gets a \" after parsing the intent extras. The app args are then is passed to C++ where QProcess::splitCommand() is used to parse the args string into a list, and to preserve the quotes in this case, the former call expects triple quotes to to get the quote character preserved in the split list. Fixes: QTQAINFRA-5703 Change-Id: Iad81cadf24a6def21ef1536c882ecd510c4426cf Reviewed-by: Axel Spoerl --- src/plugins/platforms/android/androidjnimain.cpp | 11 ++++++++--- src/tools/androidtestrunner/main.cpp | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 2c7ddb08100..fcb2cae8c9a 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -36,6 +36,9 @@ #include + +using namespace Qt::StringLiterals; + QT_BEGIN_NAMESPACE static JavaVM *m_javaVM = nullptr; @@ -439,14 +442,16 @@ namespace QtAndroid static jboolean startQtAndroidPlugin(JNIEnv *env, jobject /*object*/, jstring paramsString) { + Q_UNUSED(env) + m_androidPlatformIntegration = nullptr; m_androidAssetsFileEngineHandler = new AndroidAssetsFileEngineHandler(); m_androidContentFileEngineHandler = new AndroidContentFileEngineHandler(); m_mainLibraryHnd = nullptr; - const char *nativeString = env->GetStringUTFChars(paramsString, 0); - const QStringList argsList = QProcess::splitCommand(QString::fromUtf8(nativeString)); - env->ReleaseStringUTFChars(paramsString, nativeString); + // QProcess::splitCommand() treats triple quotes as the quote character itself. + QString params = QJniObject(paramsString).toString().replace("\""_L1, "\"\"\""_L1); + const QStringList argsList = QProcess::splitCommand(params); for (const QString &arg : argsList) m_applicationParams.append(arg.toUtf8()); diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index defa7500aea..2ef1f22601e 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -355,7 +355,7 @@ static bool parseTestArgs() if (match.hasMatch()) { logType = match.capturedTexts().at(1); } else { - unhandledArgs << QStringLiteral(" \\\"%1\\\"").arg(arg); + unhandledArgs << " %1"_L1.arg(arg).replace("\""_L1, "\\\""_L1); } } }