aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Sokolovskii <[email protected]>2023-01-24 15:25:20 +0100
committerArtem Sokolovskii <[email protected]>2023-02-22 11:46:23 +0000
commit0c72395148c27891c6e9adbc618d72c28c8cce60 (patch)
tree1dc94a2a1b30eaff855b9489bb4ace1da67b346a
parent53397306b962e6f7dade3292694b2387078fee07 (diff)
Android: Add SdkManagerOutputParser tests
Change-Id: I0d0f7318aa670885def5c6a41b9c76ab539713c2 Reviewed-by: Alessandro Portale <[email protected]>
-rw-r--r--src/plugins/android/CMakeLists.txt1
-rw-r--r--src/plugins/android/android.qbs2
-rw-r--r--src/plugins/android/androidplugin.cpp7
-rw-r--r--src/plugins/android/androidsdkmanager_test.cpp1
-rw-r--r--src/plugins/android/sdkmanageroutputparser.cpp7
-rw-r--r--src/plugins/android/sdkmanageroutputparser.h2
-rw-r--r--src/plugins/android/sdkmanageroutputparser_test.cpp793
-rw-r--r--src/plugins/android/sdkmanageroutputparser_test.h74
8 files changed, 881 insertions, 6 deletions
diff --git a/src/plugins/android/CMakeLists.txt b/src/plugins/android/CMakeLists.txt
index b00b254e8a8..9246c94e829 100644
--- a/src/plugins/android/CMakeLists.txt
+++ b/src/plugins/android/CMakeLists.txt
@@ -59,5 +59,6 @@ extend_qtc_plugin(Android
CONDITION WITH_TESTS
SOURCES
androidsdkmanager_test.cpp androidsdkmanager_test.h
+ sdkmanageroutputparser_test.cpp sdkmanageroutputparser_test.h
android_tst.qrc
)
diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs
index 1d18d0b708a..3db92841863 100644
--- a/src/plugins/android/android.qbs
+++ b/src/plugins/android/android.qbs
@@ -123,6 +123,8 @@ Project {
"android_tst.qrc",
"androidsdkmanager_test.cpp",
"androidsdkmanager_test.h",
+ "sdkmanageroutputparser_test.cpp",
+ "sdkmanageroutputparser_test.h,
]
}
}
diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp
index 8d4d14d3980..b8ff5dbe0b8 100644
--- a/src/plugins/android/androidplugin.cpp
+++ b/src/plugins/android/androidplugin.cpp
@@ -17,11 +17,15 @@
#include "androidqtversion.h"
#include "androidrunconfiguration.h"
#include "androidruncontrol.h"
-#include "androidsdkmanager_test.h"
#include "androidsettingswidget.h"
#include "androidtoolchain.h"
#include "androidtr.h"
+#ifdef WITH_TESTS
+# include "androidsdkmanager_test.h"
+# include "sdkmanageroutputparser_test.h"
+#endif
+
#include "javaeditor.h"
#include "javalanguageserver.h"
@@ -118,6 +122,7 @@ void AndroidPlugin::initialize()
#ifdef WITH_TESTS
addTest<AndroidSdkManagerTest>();
+ addTest<SdkManagerOutputParserTest>();
#endif
}
diff --git a/src/plugins/android/androidsdkmanager_test.cpp b/src/plugins/android/androidsdkmanager_test.cpp
index 9bed162cbda..de97bbc85e1 100644
--- a/src/plugins/android/androidsdkmanager_test.cpp
+++ b/src/plugins/android/androidsdkmanager_test.cpp
@@ -1,4 +1,3 @@
-
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
diff --git a/src/plugins/android/sdkmanageroutputparser.cpp b/src/plugins/android/sdkmanageroutputparser.cpp
index 2989ec35ddc..96eb9e4b171 100644
--- a/src/plugins/android/sdkmanageroutputparser.cpp
+++ b/src/plugins/android/sdkmanageroutputparser.cpp
@@ -3,8 +3,9 @@
#include "sdkmanageroutputparser.h"
-#include "avdmanageroutputparser.h"
+#include "androidconstants.h"
#include "androidsdkpackage.h"
+#include "avdmanageroutputparser.h"
#include <utils/algorithm.h>
@@ -440,8 +441,8 @@ SdkManagerOutputParser::MarkerTag SdkManagerOutputParser::parseMarkers(const QSt
if (line.startsWith(QLatin1String(pair.second)))
return pair.first;
}
-
- QRegularExpressionMatch match = QRegularExpression("^[a-zA-Z]+[A-Za-z0-9;._-]+").match(line);
+ static const QRegularExpression reg("^[a-zA-Z]+[A-Za-z0-9;._-]+");
+ const QRegularExpressionMatch match = reg.match(line);
if (match.hasMatch() && match.captured(0) == line)
return GenericToolMarker;
diff --git a/src/plugins/android/sdkmanageroutputparser.h b/src/plugins/android/sdkmanageroutputparser.h
index 5f0534dfbde..9457d88e1c1 100644
--- a/src/plugins/android/sdkmanageroutputparser.h
+++ b/src/plugins/android/sdkmanageroutputparser.h
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
-#include "androidconstants.h"
#include "androidsdkpackage.h"
#include <utils/filepath.h>
@@ -74,6 +73,7 @@ private:
MarkerTag m_currentSection = MarkerTag::None;
QHash<AndroidSdkPackage *, int> m_systemImages;
+ friend class SdkManagerOutputParserTest;
};
} // namespace Internal
} // namespace Android
diff --git a/src/plugins/android/sdkmanageroutputparser_test.cpp b/src/plugins/android/sdkmanageroutputparser_test.cpp
new file mode 100644
index 00000000000..f7f2388b1fc
--- /dev/null
+++ b/src/plugins/android/sdkmanageroutputparser_test.cpp
@@ -0,0 +1,793 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "sdkmanageroutputparser_test.h"
+#include "sdkmanageroutputparser.h"
+
+#include "androidsdkpackage.h"
+
+#include <QMap>
+#include <QString>
+#include <QTest>
+#include <QVersionNumber>
+#include <QtGlobal>
+#include <qtestcase.h>
+#include <QVersionNumber>
+
+namespace Android::Internal {
+
+SdkManagerOutputParserTest::SdkManagerOutputParserTest(QObject *parent)
+ : QObject(parent)
+ , m_parser(std::make_unique<SdkManagerOutputParser>(m_packages))
+{}
+
+SdkManagerOutputParserTest::~SdkManagerOutputParserTest() = default;
+
+void SdkManagerOutputParserTest::testParseMarkers_data()
+{
+ QTest::addColumn<QString>("output");
+ QTest::addColumn<SdkManagerOutputParser::MarkerTag>("markerTag");
+
+ QMap<SdkManagerOutputParser::MarkerTag, QString> testData
+ = {{SdkManagerOutputParser::MarkerTag::InstalledPackagesMarker, "Installed packages:"},
+ {SdkManagerOutputParser::MarkerTag::AvailablePackagesMarkers, "Available Packages:"},
+ {SdkManagerOutputParser::MarkerTag::AvailableUpdatesMarker, "Available Updates:"},
+ {SdkManagerOutputParser::MarkerTag::EmptyMarker, ""},
+ {SdkManagerOutputParser::MarkerTag::PlatformMarker, "platforms"},
+ {SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"},
+ {SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"},
+ {SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"},
+ {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"},
+ {SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"},
+ {SdkManagerOutputParser::MarkerTag::NdkMarker, "ndk"},
+ {SdkManagerOutputParser::MarkerTag::ExtrasMarker, "extras"},
+ {SdkManagerOutputParser::MarkerTag::CmdlineSdkToolsMarker, "cmdline-tools"},
+ {SdkManagerOutputParser::MarkerTag::GenericToolMarker, "sources;android-32"}};
+
+ for (const SdkManagerOutputParser::MarkerTag data : testData.keys())
+ QTest::newRow(testData.value(data).toLatin1().constData()) << testData.value(data) << data;
+
+ QTest::newRow("Installed packages")
+ << "Installed packages:" << SdkManagerOutputParser::MarkerTag::InstalledPackagesMarker;
+}
+
+void SdkManagerOutputParserTest::testParseMarkers()
+{
+ QFETCH(QString, output);
+ QFETCH(SdkManagerOutputParser::MarkerTag, markerTag);
+
+ SdkManagerOutputParser::MarkerTag actualMarkerTag = m_parser->parseMarkers(output);
+
+ QCOMPARE(actualMarkerTag, markerTag);
+}
+
+// BuildTools
+void SdkManagerOutputParserTest::testParseBuildToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("build-tools;33.0.1")
+ << QStringList({"build-tools;33.0.1",
+ " Description: Android SDK Build-Tools 33.0.1",
+ " Version: 33.0.1"})
+ << "Android SDK Build-Tools 33.0.1"
+ << "Android SDK Build-Tools 33.0.1" << QVersionNumber({33, 0, 1});
+
+ QTest::newRow("build-tools;33.0.3")
+ << QStringList({"build-tools;33.0.3",
+ " Description: Android SDK Build-Tools 33.0.3",
+ " Version: 33.0.3"})
+ << "Android SDK Build-Tools 33.0.3"
+ << "Android SDK Build-Tools 33.0.3" << QVersionNumber({33, 0, 3});
+}
+
+void SdkManagerOutputParserTest::testParseBuildToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ BuildTools *actualBuildTools = m_parser->parseBuildToolsPackage(output);
+
+ QCOMPARE_NE(actualBuildTools, nullptr);
+ QCOMPARE(actualBuildTools->descriptionText(), description);
+ QCOMPARE(actualBuildTools->displayText(), displayText);
+ QCOMPARE(actualBuildTools->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseBuildToolsPackageEmpty()
+{
+ BuildTools *actualBuildTools = m_parser->parseBuildToolsPackage({""});
+
+ QCOMPARE_EQ(actualBuildTools, nullptr);
+}
+
+// SdkTools
+void SdkManagerOutputParserTest::testParseSdkToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("cmdline-tools;latest")
+ << QStringList({"cmdline-tools;latest",
+ " Description: Android SDK Command-line Tools (latest)",
+ " Version: 9.0"})
+ << "Android SDK Command-line Tools (latest)"
+ << "Android SDK Command-line Tools (latest)" << QVersionNumber({9, 0});
+
+ QTest::newRow("cmdline-tools;8.0")
+ << QStringList({"cmdline-tools;8.0",
+ " Description: Android SDK Command-line Tools",
+ " Version: 8.0"})
+ << "Android SDK Command-line Tools"
+ << "Android SDK Command-line Tools" << QVersionNumber({8, 0});
+}
+
+void SdkManagerOutputParserTest::testParseSdkToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<SdkTools> actualSdkTool(m_parser->parseSdkToolsPackage(output));
+
+ QCOMPARE_NE(actualSdkTool, nullptr);
+ QCOMPARE(actualSdkTool->descriptionText(), description);
+ QCOMPARE(actualSdkTool->displayText(), displayText);
+ QCOMPARE(actualSdkTool->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseSdkToolsPackageEmpty()
+{
+ std::unique_ptr<SdkTools> actualSdkTool(m_parser->parseSdkToolsPackage({""}));
+
+ QCOMPARE_EQ(actualSdkTool, nullptr);
+}
+
+// PlatformTools
+void SdkManagerOutputParserTest::testParsePlatformToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("platform-tools")
+ << QStringList({"platform-tools",
+ " Description: Android SDK Platform-Tools",
+ " Version: 33.0.3"})
+ << "Android SDK Platform-Tools"
+ << "Android SDK Platform-Tools" << QVersionNumber({33, 0, 3});
+}
+
+void SdkManagerOutputParserTest::testParsePlatformToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<PlatformTools> actualPlatformTool(
+ m_parser->parsePlatformToolsPackage(output));
+
+ QCOMPARE_NE(actualPlatformTool, nullptr);
+ QCOMPARE(actualPlatformTool->descriptionText(), description);
+ QCOMPARE(actualPlatformTool->displayText(), displayText);
+ QCOMPARE(actualPlatformTool->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParsePlatformToolsPackageEmpty()
+{
+ std::unique_ptr<PlatformTools> actualPlatformTool(
+ m_parser->parsePlatformToolsPackage({""}));
+
+ QCOMPARE_EQ(actualPlatformTool, nullptr);
+}
+
+// EmulatorTools
+void SdkManagerOutputParserTest::testParseEmulatorToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("emulator") << QStringList(
+ {"emulator", " Description: Android Emulator", " Version: 30.0.12"})
+ << "Android Emulator"
+ << "Android Emulator" << QVersionNumber({30, 0, 12});
+}
+
+void SdkManagerOutputParserTest::testParseEmulatorToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<EmulatorTools> actualEmulatorTools(
+ m_parser->parseEmulatorToolsPackage(output));
+
+ QCOMPARE_NE(actualEmulatorTools, nullptr);
+ QCOMPARE(actualEmulatorTools->descriptionText(), description);
+ QCOMPARE(actualEmulatorTools->displayText(), displayText);
+ QCOMPARE(actualEmulatorTools->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseEmulatorToolsPackageEmpty()
+{
+ std::unique_ptr<EmulatorTools> actualEmulatorTools(
+ m_parser->parseEmulatorToolsPackage({""}));
+
+ QCOMPARE_EQ(actualEmulatorTools, nullptr);
+}
+
+// NDK
+void SdkManagerOutputParserTest::testParseNdkPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("ndk;21.0.6113669") << QStringList({"ndk;21.0.6113669",
+ " Description: Android NDK",
+ " Version: 21.0.6113669"})
+ << "Android NDK"
+ << "Android NDK" << QVersionNumber({21, 0, 6113669});
+}
+
+void SdkManagerOutputParserTest::testParseNdkPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<Ndk> actualNdkPackage(m_parser->parseNdkPackage(output));
+
+ QCOMPARE_NE(actualNdkPackage, nullptr);
+ QCOMPARE(actualNdkPackage->descriptionText(), description);
+ QCOMPARE(actualNdkPackage->displayText(), displayText);
+ QCOMPARE(actualNdkPackage->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseNdkPackageEmpty()
+{
+ std::unique_ptr<Ndk> actualNdkPackage(m_parser->parseNdkPackage({""}));
+
+ QCOMPARE_EQ(actualNdkPackage, nullptr);
+}
+
+// ExtraTools
+void SdkManagerOutputParserTest::testParseExtraToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow(
+ "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta5")
+ << QStringList(
+ {"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1",
+ " Description: ConstraintLayout for Android 1.0.1",
+ " Version: 1",
+ " Dependencies:"})
+ << "ConstraintLayout for Android 1.0.1"
+ << "ConstraintLayout for Android 1.0.1" << QVersionNumber({1});
+}
+
+void SdkManagerOutputParserTest::testParseExtraToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<ExtraTools> actualExtraTools(
+ m_parser->parseExtraToolsPackage(output));
+
+ QCOMPARE_NE(actualExtraTools, nullptr);
+ QCOMPARE(actualExtraTools->descriptionText(), description);
+ QCOMPARE(actualExtraTools->displayText(), displayText);
+ QCOMPARE(actualExtraTools->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseExtraToolsPackageEmpty()
+{
+ std::unique_ptr<ExtraTools> actualExtraTools(
+ m_parser->parseExtraToolsPackage({""}));
+
+ QCOMPARE_EQ(actualExtraTools, nullptr);
+}
+
+// GenericTools
+void SdkManagerOutputParserTest::testParseGenericToolsPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("displayText");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("sources;android-33")
+ << QStringList({"sources;android-33",
+ " Description: Sources for Android 33",
+ " Version: 1"})
+ << "Sources for Android 33"
+ << "Sources for Android 33" << QVersionNumber({1});
+}
+
+void SdkManagerOutputParserTest::testParseGenericToolsPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, displayText);
+ QFETCH(QVersionNumber, revision);
+
+ std::unique_ptr<GenericSdkPackage> actualGenericTools(
+ m_parser->parseGenericTools(output));
+
+ QCOMPARE_NE(actualGenericTools, nullptr);
+ QCOMPARE(actualGenericTools->descriptionText(), description);
+ QCOMPARE(actualGenericTools->displayText(), displayText);
+ QCOMPARE(actualGenericTools->revision(), revision);
+}
+
+void SdkManagerOutputParserTest::testParseGenericToolsPackageEmpty()
+{
+ std::unique_ptr<GenericSdkPackage> actualGenericTools(
+ m_parser->parseGenericTools({""}));
+
+ QCOMPARE_EQ(actualGenericTools, nullptr);
+}
+
+// Platform
+void SdkManagerOutputParserTest::testParsePlatformPackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("installLocation");
+ QTest::addColumn<QVersionNumber>("revision");
+ QTest::addColumn<QString>("extension");
+
+ QTest::newRow("platforms;android-31")
+ << QStringList({"platforms;android-31",
+ " Description: Android SDK Platform 31",
+ " Version: 5",
+ " Installed Location: /home/name/Android/Sdk/platforms/android-31"})
+ << "Android SDK Platform 31"
+ << "/home/name/Android/Sdk/platforms/android-31" << QVersionNumber({5}) << "";
+
+ QTest::newRow("platforms;android-33-ext4")
+ << QStringList({"platforms;android-33-ext4",
+ " Description: Android SDK Platform 33",
+ " Version: 1",
+ " Installed Location: /home/name/Android/Sdk/platforms/android-33"})
+ << "Android SDK Platform 33"
+ << "/home/name/Android/Sdk/platforms/android-33" << QVersionNumber({1}) << " Extension 4";
+}
+
+void SdkManagerOutputParserTest::testParsePlatformPackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, installLocation);
+ QFETCH(QVersionNumber, revision);
+ QFETCH(QString, extension);
+
+ std::unique_ptr<AndroidSdkPackage> actualPlatform(m_parser->parsePlatform(output));
+
+ QCOMPARE_NE(actualPlatform, nullptr);
+ QCOMPARE(actualPlatform->descriptionText(), description);
+ QCOMPARE(actualPlatform->installedLocation().path(), installLocation);
+ QCOMPARE(actualPlatform->revision(), revision);
+ QCOMPARE(actualPlatform->extension(), extension);
+}
+
+void SdkManagerOutputParserTest::testParsePlatformPackageEmpty()
+{
+ std::unique_ptr<AndroidSdkPackage> actualPlatform(m_parser->parsePlatform({""}));
+
+ QCOMPARE_EQ(actualPlatform, nullptr);
+}
+
+// SystemImage
+void SdkManagerOutputParserTest::testParseSystemImagePackage_data()
+{
+ QTest::addColumn<QStringList>("output");
+
+ QTest::addColumn<QString>("description");
+ QTest::addColumn<QString>("installLocation");
+ QTest::addColumn<QVersionNumber>("revision");
+
+ QTest::newRow("system-images;android-31;google_apis;x86")
+ << QStringList({"system-images;android-31;google_apis;x86",
+ " Description: Google APIs Intel x86 Atom System Image",
+ " Version: 7",
+ " Installed Location: /home/name/Android/Sdk/system-images/android-31/"
+ "google_apis/x86"})
+ << "Google APIs Intel x86 Atom System Image"
+ << "/home/name/Android/Sdk/system-images/android-31/google_apis/x86"
+ << QVersionNumber({7});
+}
+
+void SdkManagerOutputParserTest::testParseSystemImagePackage()
+{
+ QFETCH(QStringList, output);
+ QFETCH(QString, description);
+ QFETCH(QString, installLocation);
+ QFETCH(QVersionNumber, revision);
+
+ QPair<SystemImage *, int> actualSystemImagePair(m_parser->parseSystemImage(output));
+
+ SystemImage *actualSystemImage = actualSystemImagePair.first;
+
+ QCOMPARE_NE(actualSystemImage, nullptr);
+ QCOMPARE(actualSystemImage->descriptionText(), description);
+ QCOMPARE(actualSystemImage->installedLocation().path(), installLocation);
+ QCOMPARE(actualSystemImage->revision(), revision);
+ delete actualSystemImage;
+}
+
+void SdkManagerOutputParserTest::testParseSystemImagePackageEmpty()
+{
+ QPair<SystemImage *, int> actualSystemImagePair(m_parser->parseSystemImage({""}));
+ SystemImage *actualSystemImage = actualSystemImagePair.first;
+
+ QCOMPARE_EQ(actualSystemImage, nullptr);
+ delete actualSystemImage;
+}
+void SdkManagerOutputParserTest::testParsePackageListing()
+{
+ QFETCH(QString, sdkManagerOutput);
+ QFETCH(QList<AndroidSdkPackage::PackageType>, packageTypes);
+ QFETCH(int, sdkManagerOutputPackagesNumber);
+
+ m_parser->parsePackageListing(sdkManagerOutput);
+
+ QCOMPARE(m_packages.length(), sdkManagerOutputPackagesNumber);
+
+ for (int i = 0; i < m_packages.length(); ++i)
+ QCOMPARE(m_packages.at(i)->type(), packageTypes.at(i));
+}
+
+void SdkManagerOutputParserTest::testParsePackageListing_data()
+{
+ QTest::addColumn<int>("sdkManagerOutputPackagesNumber");
+ QTest::addColumn<QList<AndroidSdkPackage::PackageType>>("packageTypes");
+ QTest::addColumn<QString>("sdkManagerOutput");
+
+ const QList<AndroidSdkPackage::PackageType> packageTypes = {
+ AndroidSdkPackage::PackageType::BuildToolsPackage,
+ AndroidSdkPackage::PackageType::SdkToolsPackage,
+ AndroidSdkPackage::PackageType::EmulatorToolsPackage,
+ AndroidSdkPackage::PackageType::NDKPackage,
+ AndroidSdkPackage::PackageType::GenericSdkPackage,
+ AndroidSdkPackage::PackageType::SdkPlatformPackage,
+ AndroidSdkPackage::PackageType::GenericSdkPackage,
+
+ AndroidSdkPackage::PackageType::BuildToolsPackage,
+ AndroidSdkPackage::PackageType::GenericSdkPackage,
+ AndroidSdkPackage::PackageType::SdkToolsPackage,
+ AndroidSdkPackage::PackageType::SdkToolsPackage,
+ AndroidSdkPackage::PackageType::ExtraToolsPackage,
+ AndroidSdkPackage::PackageType::NDKPackage,
+ AndroidSdkPackage::PackageType::NDKPackage,
+ AndroidSdkPackage::PackageType::PlatformToolsPackage,
+ AndroidSdkPackage::PackageType::SdkPlatformPackage,
+ AndroidSdkPackage::PackageType::SdkPlatformPackage,
+ AndroidSdkPackage::PackageType::SdkPlatformPackage,
+ AndroidSdkPackage::PackageType::SdkPlatformPackage,
+ AndroidSdkPackage::PackageType::GenericSdkPackage,
+ AndroidSdkPackage::PackageType::GenericSdkPackage,
+ };
+
+ QTest::newRow("sdkmanager --list --verbose") // version 8.0
+ << 21
+ << packageTypes
+ << QString(R"(
+Loading package information...
+Loading local repository...
+Info: Parsing /home/artem/Android/Sdk/build-tools/31.0.0/package.xml
+Info: Parsing /home/artem/Android/Sdk/cmdline-tools/latest/package.xml
+Info: Parsing /home/artem/Android/Sdk/emulator/package.xml
+Info: Parsing /home/artem/Android/Sdk/ndk/21.3.6528147/package.xml
+Info: Parsing /home/artem/Android/Sdk/ndk/23.1.7779620/package.xml
+Info: Parsing /home/artem/Android/Sdk/ndk/25.1.8937393/package.xml
+Info: Parsing /home/artem/Android/Sdk/patcher/v4/package.xml
+Info: Parsing /home/artem/Android/Sdk/platform-tools/package.xml
+Info: Parsing /home/artem/Android/Sdk/platforms/android-31/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-25/google_apis/armeabi-v7a
+package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-27/default/arm64-v8a/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-29/google_apis/x86/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-31/android-tv/arm64-v8a/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-31/android-tv/x86/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-31/default/x86_64/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-31/google_apis/x86_64/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-32/google_apis/arm64-v8a/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-32/google_apis/x86_64/package.xml
+Info: Parsing
+/home/artem/Android/Sdk/system-images/android-33/google_apis/arm64-v8a/package.xml
+[========= ] 25% Loading local repository...
+[========= ] 25% Fetch remote repository...
+[========== ] 26% Fetch remote repository...
+[============ ] 31% Fetch remote repository...
+[============= ] 33% Fetch remote repository...
+[============= ] 34% Fetch remote repository...
+[============== ] 36% Fetch remote repository...
+[============== ] 37% Fetch remote repository...
+[=============== ] 38% Fetch remote repository...
+[=============== ] 40% Fetch remote repository...
+[================ ] 41% Fetch remote repository...
+[================= ] 43% Fetch remote repository...
+[================= ] 44% Fetch remote repository...
+[================== ] 45% Fetch remote repository...
+[================== ] 47% Fetch remote repository...
+[=================== ] 48% Fetch remote repository...
+[=================== ] 50% Fetch remote repository...
+[==================== ] 51% Fetch remote repository...
+[==================== ] 53% Fetch remote repository...
+[===================== ] 54% Fetch remote repository...
+[====================== ] 55% Fetch remote repository...
+[====================== ] 57% Fetch remote repository...
+[======================= ] 58% Fetch remote repository...
+[======================= ] 60% Fetch remote repository...
+[======================== ] 61% Fetch remote repository...
+[======================== ] 62% Fetch remote repository...
+[========================= ] 64% Fetch remote repository...
+[========================== ] 65% Fetch remote repository...
+[========================== ] 67% Fetch remote repository...
+[=========================== ] 68% Fetch remote repository...
+[=========================== ] 69% Fetch remote repository...
+[============================ ] 71% Fetch remote repository...
+[============================ ] 72% Fetch remote repository...
+[============================= ] 74% Fetch remote repository...
+[============================= ] 75% Fetch remote repository...
+[============================= ] 75% Computing updates...
+[=======================================] 100% Computing updates...
+Installed packages:
+--------------------------------------
+build-tools;31.0.0
+ Description: Android SDK Build-Tools 31
+ Version: 31.0.0
+ Installed Location: /home/artem/Android/Sdk/build-tools/31.0.0
+
+cmdline-tools;latest
+ Description: Android SDK Command-line Tools (latest)
+ Version: 8.0
+ Installed Location: /home/artem/Android/Sdk/cmdline-tools/latest
+
+emulator
+ Description: Android Emulator
+ Version: 31.3.14
+ Installed Location: /home/artem/Android/Sdk/emulator
+
+ndk;25.1.8937393
+ Description: NDK (Side by side) 25.1.8937393
+ Version: 25.1.8937393
+ Installed Location: /home/artem/Android/Sdk/ndk/25.1.8937393
+
+patcher;v4
+ Description: SDK Patch Applier v4
+ Version: 1
+ Installed Location: /home/artem/Android/Sdk/patcher/v4
+
+platforms;android-31
+ Description: Android SDK Platform 31
+ Version: 1
+ Installed Location: /home/artem/Android/Sdk/platforms/android-31
+
+system-images;android-33;google_apis;arm64-v8a
+ Description: Google APIs ARM 64 v8a System Image
+ Version: 8
+ Installed Location:
+/home/artem/Android/Sdk/system-images/android-33/google_apis/arm64-v8a
+
+Available Packages:
+--------------------------------------
+add-ons;addon-google_apis-google-24
+ Description: Google APIs
+ Version: 1
+
+build-tools;33.0.1
+ Description: Android SDK Build-Tools 33.0.1
+ Version: 33.0.1
+
+cmake;3.22.1
+ Description: CMake 3.22.1
+ Version: 3.22.1
+
+cmdline-tools;9.0
+ Description: Android SDK Command-line Tools
+ Version: 9.0
+
+cmdline-tools;latest
+ Description: Android SDK Command-line Tools (latest)
+ Version: 9.0
+
+emulator
+ Description: Android Emulator
+ Version: 31.3.14
+ Dependencies:
+ patcher;v4
+
+extras;android;m2repository
+ Description: Android Support Repository
+ Version: 47.0.0
+
+ndk-bundle
+ Description: NDK
+ Version: 22.1.7171670
+ Dependencies:
+ patcher;v4
+
+ndk;25.0.8775105
+ Description: NDK (Side by side) 25.0.8775105
+ Version: 25.0.8775105
+ Dependencies:
+ patcher;v4
+
+ndk;25.1.8937393
+ Description: NDK (Side by side) 25.1.8937393
+ Version: 25.1.8937393
+ Dependencies:
+ patcher;v4
+
+patcher;v4
+ Description: SDK Patch Applier v4
+ Version: 1
+
+platform-tools
+ Description: Android SDK Platform-Tools
+ Version: 33.0.3
+
+platforms;android-33
+ Description: Android SDK Platform 33
+ Version: 2
+
+platforms;android-33-ext4
+ Description: Android SDK Platform 33
+ Version: 1
+
+platforms;android-9
+ Description: Android SDK Platform 9
+ Version: 2
+
+platforms;android-TiramisuPrivacySandbox
+ Description: Android SDK Platform TiramisuPrivacySandbox
+ Version: 8
+
+sources;android-32
+ Description: Sources for Android 32
+ Version: 1
+
+sources;android-33
+ Description: Sources for Android 33
+ Version: 1
+
+system-images;android-10;default;armeabi-v7a
+ Description: ARM EABI v7a System Image
+ Version: 5
+ Dependencies:
+ patcher;v4
+
+system-images;android-33-ext4;google_apis_playstore;arm64-v8a
+ Description: Google Play ARM 64 v8a System Image
+ Version: 1
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-33-ext4;google_apis_playstore;x86_64
+ Description: Google Play Intel x86 Atom_64 System Image
+ Version: 1
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-33;android-tv;arm64-v8a
+ Description: Android TV ARM 64 v8a System Image
+ Version: 5
+ Dependencies:
+ patcher;v4
+ emulator Revision 28.1.6
+
+system-images;android-33;android-tv;x86
+ Description: Android TV Intel x86 Atom System Image
+ Version: 5
+ Dependencies:
+ patcher;v4
+ emulator Revision 28.1.6
+
+system-images;android-33;google-tv;arm64-v8a
+ Description: Google TV ARM 64 v8a System Image
+ Version: 5
+ Dependencies:
+ patcher;v4
+ emulator Revision 28.1.6
+
+system-images;android-33;google-tv;x86
+ Description: Google TV Intel x86 Atom System Image
+ Version: 5
+ Dependencies:
+ patcher;v4
+ emulator Revision 28.1.6
+
+system-images;android-33;google_apis;arm64-v8a
+ Description: Google APIs ARM 64 v8a System Image
+ Version: 8
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-33;google_apis;x86_64
+ Description: Google APIs Intel x86 Atom_64 System Image
+ Version: 8
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-33;google_apis_playstore;arm64-v8a
+ Description: Google Play ARM 64 v8a System Image
+ Version: 7
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-33;google_apis_playstore;x86_64
+ Description: Google Play Intel x86 Atom_64 System Image
+ Version: 7
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-TiramisuPrivacySandbox;google_apis_playstore;arm64-v8a
+ Description: Google Play ARM 64 v8a System Image
+ Version: 8
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+system-images;android-TiramisuPrivacySandbox;google_apis_playstore;x86_64
+ Description: Google Play Intel x86 Atom_64 System Image
+ Version: 8
+ Dependencies:
+ patcher;v4
+ emulator Revision 30.7.3
+
+Available Updates:
+--------------------------------------
+cmdline-tools;latest
+ Installed Version: 8.0
+ Available Version: 9.)");
+
+}
+
+} // namespace Android::Internal
+
diff --git a/src/plugins/android/sdkmanageroutputparser_test.h b/src/plugins/android/sdkmanageroutputparser_test.h
new file mode 100644
index 00000000000..c2094e532a4
--- /dev/null
+++ b/src/plugins/android/sdkmanageroutputparser_test.h
@@ -0,0 +1,74 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#pragma once
+
+#include <QObject>
+
+#include "androidsdkpackage.h"
+
+QT_BEGIN_NAMESPACE
+class QString;
+QT_END_NAMESPACE
+
+namespace Android {
+namespace Internal {
+
+class SdkManagerOutputParser;
+
+class SdkManagerOutputParserTest : public QObject
+{
+ Q_OBJECT
+public:
+ SdkManagerOutputParserTest(QObject *parent = nullptr);
+ ~SdkManagerOutputParserTest();
+
+private:
+ AndroidSdkPackageList m_packages;
+ std::unique_ptr<SdkManagerOutputParser> m_parser;
+
+private slots:
+ void testParsePackageListing_data();
+ void testParsePackageListing();
+
+ void testParseMarkers_data();
+ void testParseMarkers();
+
+ void testParseBuildToolsPackage_data();
+ void testParseBuildToolsPackage();
+ void testParseBuildToolsPackageEmpty();
+
+ void testParseSdkToolsPackage_data();
+ void testParseSdkToolsPackage();
+ void testParseSdkToolsPackageEmpty();
+
+ void testParsePlatformToolsPackage_data();
+ void testParsePlatformToolsPackage();
+ void testParsePlatformToolsPackageEmpty();
+
+ void testParseEmulatorToolsPackage_data();
+ void testParseEmulatorToolsPackage();
+ void testParseEmulatorToolsPackageEmpty();
+
+ void testParseNdkPackage_data();
+ void testParseNdkPackage();
+ void testParseNdkPackageEmpty();
+
+ void testParseExtraToolsPackage_data();
+ void testParseExtraToolsPackage();
+ void testParseExtraToolsPackageEmpty();
+
+ void testParseGenericToolsPackage_data();
+ void testParseGenericToolsPackage();
+ void testParseGenericToolsPackageEmpty();
+
+ void testParsePlatformPackage_data();
+ void testParsePlatformPackage();
+ void testParsePlatformPackageEmpty();
+
+ void testParseSystemImagePackage_data();
+ void testParseSystemImagePackage();
+ void testParseSystemImagePackageEmpty();
+};
+} // namespace Internal
+} // namespace Android