diff --git a/src/plugins/ios/devicectlutils.cpp b/src/plugins/ios/devicectlutils.cpp index 11595bec479..c9d48d9f015 100644 --- a/src/plugins/ios/devicectlutils.cpp +++ b/src/plugins/ios/devicectlutils.cpp @@ -96,4 +96,15 @@ Utils::expected_str parseAppInfo(const QByteArray &rawOutput, const QStrin return {}; } +Utils::expected_str parseProcessIdentifier(const QByteArray &rawOutput) +{ + const expected_str result = parseDevicectlResult(rawOutput); + if (!result) + return make_unexpected(result.error()); + const QJsonArray matchingProcesses = (*result)["runningProcesses"].toArray(); + if (matchingProcesses.size() > 0) + return matchingProcesses.first()["processIdentifier"].toInteger(-1); + return -1; +} + } // namespace Ios::Internal diff --git a/src/plugins/ios/devicectlutils.h b/src/plugins/ios/devicectlutils.h index b80a1262885..fa8fe7c6718 100644 --- a/src/plugins/ios/devicectlutils.h +++ b/src/plugins/ios/devicectlutils.h @@ -23,5 +23,6 @@ Utils::expected_str parseDevicectlResult(const QByteArray &rawOutput Utils::expected_str> parseDeviceInfo(const QByteArray &rawOutput, const QString &deviceUsbId); Utils::expected_str parseAppInfo(const QByteArray &rawOutput, const QString &bundleIdentifier); +Utils::expected_str parseProcessIdentifier(const QByteArray &rawOutput); } // namespace Ios::Internal diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 31444b79f8a..9f24f4ac40b 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -178,17 +178,12 @@ GroupItem DeviceCtlRunner::findProcess(Storage &appInfo) return SetupResult::Continue; }; const auto onDone = [this, appInfo](const Process &process) { - const Utils::expected_str resultValue = parseDevicectlResult( - process.rawStdOut()); - if (resultValue) { - const QJsonArray matchingProcesses = (*resultValue)["runningProcesses"].toArray(); - if (matchingProcesses.size() > 0) { - appInfo->processIdentifier - = matchingProcesses.first()["processIdentifier"].toInteger(-1); - } + const Utils::expected_str pid = parseProcessIdentifier(process.rawStdOut()); + if (pid) { + appInfo->processIdentifier = *pid; return DoneResult::Success; } - reportFailure(resultValue.error()); + reportFailure(pid.error()); return DoneResult::Error; }; return ProcessTask(onSetup, onDone); diff --git a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp index f67fd04562d..11d093d8e4d 100644 --- a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp +++ b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp @@ -19,6 +19,8 @@ private slots: void parseDeviceInfo(); void parseAppInfo(); + + void parseProcessIdentifier(); }; void tst_Devicectlutils::parseError_data() @@ -363,6 +365,48 @@ void tst_Devicectlutils::parseAppInfo() "FAEC04B7-41E6-4A3C-952E-D89792DA053C/cmake_widgets.app/")); } +void tst_Devicectlutils::parseProcessIdentifier() +{ + const QByteArray data(R"raw( +{ + "info" : { + "arguments" : [ + "devicectl", + "device", + "info", + "processes", + "--device", + "00000000-0000000000000000", + "--quiet", + "--json-output", + "-", + "--filter", + "executable.path BEGINSWITH '/private/var/containers/Bundle/Application/00000000-0000-0000-0000-000000000000/test.app'" + ], + "commandType" : "devicectl.device.info.processes", + "environment" : { + "TERM" : "xterm-256color" + }, + "jsonVersion" : 2, + "outcome" : "success", + "version" : "355.7.7" + }, + "result" : { + "deviceIdentifier" : "00000000-0000-0000-0000-000000000000", + "runningProcesses" : [ + { + "executable" : "file:///private/var/containers/Bundle/Application/00000000-0000-0000-0000-000000000000/test.app/test", + "processIdentifier" : 1000 + } + ] + } +})raw"); + + const Utils::expected_str result = Ios::Internal::parseProcessIdentifier(data); + QVERIFY(result); + QCOMPARE(*result, 1000); +} + QTEST_GUILESS_MAIN(tst_Devicectlutils) #include "tst_devicectlutils.moc"