From 2898e09bb499d05a850d738fd0aac53b62bc4e29 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 29 Jan 2024 16:25:13 +0100 Subject: [PATCH] iOS: Move app URL gathering from devicectl to a function And add a test to document what we expect from devicectl. Change-Id: I2f5312ebadef60239b77308acb7114f1d55143b4 Reviewed-by: Eike Ziller --- src/plugins/ios/devicectlutils.cpp | 13 +++++ src/plugins/ios/devicectlutils.h | 1 + src/plugins/ios/iosrunner.cpp | 15 ++--- .../ios/devicectlutils/tst_devicectlutils.cpp | 58 +++++++++++++++++++ 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/plugins/ios/devicectlutils.cpp b/src/plugins/ios/devicectlutils.cpp index fa012dbc6c6..11595bec479 100644 --- a/src/plugins/ios/devicectlutils.cpp +++ b/src/plugins/ios/devicectlutils.cpp @@ -83,4 +83,17 @@ expected_str> parseDeviceInfo(const QByteArray &rawOutput return make_unexpected(QLatin1String("Device is not handled by devicectl")); } +Utils::expected_str parseAppInfo(const QByteArray &rawOutput, const QString &bundleIdentifier) +{ + const Utils::expected_str result = parseDevicectlResult(rawOutput); + if (!result) + return make_unexpected(result.error()); + const QJsonArray apps = (*result)["apps"].toArray(); + for (const QJsonValue &app : apps) { + if (app["bundleIdentifier"].toString() == bundleIdentifier) + return QUrl(app["url"].toString()); + } + return {}; +} + } // namespace Ios::Internal diff --git a/src/plugins/ios/devicectlutils.h b/src/plugins/ios/devicectlutils.h index ac239439452..b80a1262885 100644 --- a/src/plugins/ios/devicectlutils.h +++ b/src/plugins/ios/devicectlutils.h @@ -22,5 +22,6 @@ const char vYes[] = "YES"; 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); } // namespace Ios::Internal diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index c3209709d42..31444b79f8a 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -146,19 +146,12 @@ GroupItem DeviceCtlRunner::findApp(const QString &bundleIdentifier, Storage resultValue = parseDevicectlResult( - process.rawStdOut()); - if (resultValue) { - const QJsonArray apps = (*resultValue)["apps"].toArray(); - for (const QJsonValue &app : apps) { - if (app["bundleIdentifier"].toString() == bundleIdentifier) { - appInfo->pathOnDevice = QUrl(app["url"].toString()); - break; - } - } + const expected_str pathOnDevice = parseAppInfo(process.rawStdOut(), bundleIdentifier); + if (pathOnDevice) { + appInfo->pathOnDevice = *pathOnDevice; return DoneResult::Success; } - reportFailure(resultValue.error()); + reportFailure(pathOnDevice.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 861b2203954..f67fd04562d 100644 --- a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp +++ b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp @@ -17,6 +17,8 @@ private slots: void parseDeviceInfo_data(); void parseDeviceInfo(); + + void parseAppInfo(); }; void tst_Devicectlutils::parseError_data() @@ -305,6 +307,62 @@ void tst_Devicectlutils::parseDeviceInfo() } } +void tst_Devicectlutils::parseAppInfo() +{ + const QByteArray data(R"raw( +{ + "info" : { + "arguments" : [ + "devicectl", + "device", + "info", + "apps", + "--device", + "00000000-0000000000000000", + "--quiet", + "--json-output", + "-" + ], + "commandType" : "devicectl.device.info.apps", + "environment" : { + "TERM" : "xterm-256color" + }, + "jsonVersion" : 2, + "outcome" : "success", + "version" : "355.7.7" + }, + "result" : { + "apps" : [ + { + "appClip" : false, + "builtByDeveloper" : true, + "bundleIdentifier" : "org.iuehrg.cmake-widgets", + "bundleVersion" : "0.1", + "defaultApp" : false, + "hidden" : false, + "internalApp" : false, + "name" : "cmake_widgets", + "removable" : true, + "url" : "file:///private/var/containers/Bundle/Application/FAEC04B7-41E6-4A3C-952E-D89792DA053C/cmake_widgets.app/", + "version" : "0.1" + } + ], + "defaultAppsIncluded" : false, + "deviceIdentifier" : "00000000-0000-0000-0000-000000000000", + "hiddenAppsIncluded" : false, + "internalAppsIncluded" : false, + "removableAppsIncluded" : true + } +})raw"); + + const Utils::expected_str result + = Ios::Internal::parseAppInfo(data, "org.iuehrg.cmake-widgets"); + QVERIFY(result); + QCOMPARE(*result, + QUrl("file:///private/var/containers/Bundle/Application/" + "FAEC04B7-41E6-4A3C-952E-D89792DA053C/cmake_widgets.app/")); +} + QTEST_GUILESS_MAIN(tst_Devicectlutils) #include "tst_devicectlutils.moc"