diff options
Diffstat (limited to 'tests')
11 files changed, 420 insertions, 32 deletions
diff --git a/tests/auto/installer/commandlineinstall/tst_commandlineinstall.cpp b/tests/auto/installer/commandlineinstall/tst_commandlineinstall.cpp index 48b7bf35d..1da28865a 100644 --- a/tests/auto/installer/commandlineinstall/tst_commandlineinstall.cpp +++ b/tests/auto/installer/commandlineinstall/tst_commandlineinstall.cpp @@ -35,9 +35,6 @@ #include <QTest> #include <QRegularExpression> -#include <iostream> -#include <sstream> - using namespace QInstaller; typedef QList<QPair<QString, QString> > ComponentResourceHash; @@ -73,7 +70,7 @@ private slots: (m_installDir, ":///data/repository")); auto func = &PackageManagerCore::listAvailablePackages; - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"AB\" displayname=\"AB\" version=\"1.0.2-1\"/>\n" " <package name=\"A\" displayname=\"A\" version=\"1.0.2-1\"/>\n" @@ -81,29 +78,29 @@ private slots: " <package name=\"C\" displayname=\"C\" version=\"1.0.0-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("."), QHash<QString, QString>()); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"AB\" displayname=\"AB\" version=\"1.0.2-1\"/>\n" " <package name=\"A\" displayname=\"A\" version=\"1.0.2-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("A"), QHash<QString, QString>()); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"AB\" displayname=\"AB\" version=\"1.0.2-1\"/>\n" " <package name=\"A\" displayname=\"A\" version=\"1.0.2-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("A.*"), QHash<QString, QString>()); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"B\" displayname=\"B\" version=\"1.0.0-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("^B"), QHash<QString, QString>()); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"B\" displayname=\"B\" version=\"1.0.0-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("^B.*"), QHash<QString, QString>()); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"C\" displayname=\"C\" version=\"1.0.0-1\"/>\n" "</availablepackages>\n"), func, QLatin1String("^C"), QHash<QString, QString>()); @@ -113,7 +110,7 @@ private slots: { "Version", "1.0.2" }, { "DisplayName", "A" } }; - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"AB\" displayname=\"AB\" version=\"1.0.2-1\"/>\n" " <package name=\"A\" displayname=\"A\" version=\"1.0.2-1\"/>\n" @@ -121,7 +118,7 @@ private slots: searchHash.clear(); searchHash.insert("Default", "false"); - verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("<?xml version=\"1.0\"?>\n" "<availablepackages>\n" " <package name=\"B\" displayname=\"B\" version=\"1.0.0-1\"/>\n" "</availablepackages>\n"), func, QString(), searchHash); @@ -214,13 +211,13 @@ private slots: core.setValue(scTargetDir, testDirectory); - verifyListPackagesMessage(&core, QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(&core, QLatin1String("<?xml version=\"1.0\"?>\n" "<localpackages>\n" " <package name=\"A\" displayname=\"A Title\" version=\"1.0.2-1\"/>\n" " <package name=\"B\" displayname=\"B Title\" version=\"1.0.0-1\"/>\n" "</localpackages>\n"), func, QString()); - verifyListPackagesMessage(&core, QLatin1String("<?xml version=\"1.0\"?>\n" + VerifyInstaller::verifyListPackagesMessage(&core, QLatin1String("<?xml version=\"1.0\"?>\n" "<localpackages>\n" " <package name=\"A\" displayname=\"A Title\" version=\"1.0.2-1\"/>\n" "</localpackages>\n"), func, QLatin1String("A")); @@ -760,23 +757,6 @@ private slots: } private: - template <typename Func, typename... Args> - void verifyListPackagesMessage(PackageManagerCore *core, const QString &message, - Func func, Args... args) - { - std::ostringstream stream; - std::streambuf *buf = std::cout.rdbuf(); - std::cout.rdbuf(stream.rdbuf()); - - (core->*func)(std::forward<Args>(args)...); - - std::cout.rdbuf(buf); - QVERIFY(stream && stream.tellp() == message.size()); - for (const QString &line : message.split(QLatin1String("\n"))) - QVERIFY(stream.str().find(line.toStdString()) != std::string::npos); - } - -private: QString m_installDir; }; diff --git a/tests/auto/installer/componentalias/componentalias.pro b/tests/auto/installer/componentalias/componentalias.pro new file mode 100644 index 000000000..efbc0268f --- /dev/null +++ b/tests/auto/installer/componentalias/componentalias.pro @@ -0,0 +1,8 @@ +include(../../qttest.pri) + +QT -= gui +QT += testlib + +SOURCES = tst_componentalias.cpp + +RESOURCES += settings.qrc diff --git a/tests/auto/installer/componentalias/data/aliases-priority.xml b/tests/auto/installer/componentalias/data/aliases-priority.xml new file mode 100644 index 000000000..192ff9e44 --- /dev/null +++ b/tests/auto/installer/componentalias/data/aliases-priority.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<Aliases> + <Alias> + <Name>set-A</Name> + <DisplayName>Installation A (priority)</DisplayName> + <Description>Installs component A</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>A</RequiresComponent> + </Alias> + <Alias> + <Name>set-B</Name> + <DisplayName>Virtual installation B (priority)</DisplayName> + <Description>Installs component B</Description> + <Version>1.0.0</Version> + <Virtual>true</Virtual> + <RequiresComponent>B</RequiresComponent> + </Alias> + <Alias> + <Name>set-D</Name> + <DisplayName>Installation D (Unstable) (priority)</DisplayName> + <Description>Installs missing component D</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>D</RequiresComponent> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation (priority)</DisplayName> + <Description>Installs all components</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresAlias>set-A,set-B</RequiresAlias> + <RequiresComponent>C</RequiresComponent> + </Alias> +</Aliases> diff --git a/tests/auto/installer/componentalias/data/aliases-versions.xml b/tests/auto/installer/componentalias/data/aliases-versions.xml new file mode 100644 index 000000000..d460f3275 --- /dev/null +++ b/tests/auto/installer/componentalias/data/aliases-versions.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<Aliases> + <Alias> + <Name>set-A</Name> + <DisplayName>Installation A (updated)</DisplayName> + <Description>Installs component A</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>A</RequiresComponent> + </Alias> + <Alias> + <Name>set-B</Name> + <DisplayName>Virtual installation B (updated)</DisplayName> + <Description>Installs component B</Description> + <Version>1.1.0</Version> + <Virtual>true</Virtual> + <RequiresComponent>B</RequiresComponent> + </Alias> + <Alias> + <Name>set-D</Name> + <DisplayName>Installation D (Unstable) (updated)</DisplayName> + <Description>Installs missing component D</Description> + <Version>1.2.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>D</RequiresComponent> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation (updated)</DisplayName> + <Description>Installs all components</Description> + <Version>3.0.0</Version> + <Virtual>false</Virtual> + <RequiresAlias>set-A,set-B</RequiresAlias> + <RequiresComponent>C</RequiresComponent> + </Alias> +</Aliases> diff --git a/tests/auto/installer/componentalias/data/repository/Updates.xml b/tests/auto/installer/componentalias/data/repository/Updates.xml new file mode 100644 index 000000000..e128590dc --- /dev/null +++ b/tests/auto/installer/componentalias/data/repository/Updates.xml @@ -0,0 +1,43 @@ +<Updates> + <ApplicationName>{AnyApplication}</ApplicationName> + <ApplicationVersion>1.0.0</ApplicationVersion> + <Checksum>true</Checksum> + <PackageUpdate> + <Name>A</Name> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>1.0.2-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>false</Default> + </PackageUpdate> + <PackageUpdate> + <Name>B</Name> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>false</Default> + </PackageUpdate> + <PackageUpdate> + <Name>C</Name> + <DisplayName>C</DisplayName> + <Description>Example component C</Description> + <Version>1.0.0-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>false</Default> + </PackageUpdate> + <PackageUpdate> + <Name>C.subcomponent</Name> + <DisplayName>Subcomponent of C</DisplayName> + <Description>Example subcomponent</Description> + <Version>1.0.0-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + </PackageUpdate> + <PackageUpdate> + <Name>C.subcomponent.subcomponent</Name> + <DisplayName>Subcomponent of subcomponent component</DisplayName> + <Description>Example subcomponent of subcomponent</Description> + <Version>1.0.0-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + </PackageUpdate> +</Updates> diff --git a/tests/auto/installer/componentalias/metadata/installer-config/aliases.xml b/tests/auto/installer/componentalias/metadata/installer-config/aliases.xml new file mode 100644 index 000000000..60291d29a --- /dev/null +++ b/tests/auto/installer/componentalias/metadata/installer-config/aliases.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<Aliases> + <Alias> + <Name>set-A</Name> + <DisplayName>Installation A</DisplayName> + <Description>Installs component A</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>A</RequiresComponent> + </Alias> + <Alias> + <Name>set-B</Name> + <DisplayName>Virtual installation B</DisplayName> + <Description>Installs component B</Description> + <Version>1.0.0</Version> + <Virtual>true</Virtual> + <RequiresComponent>B</RequiresComponent> + </Alias> + <Alias> + <Name>set-D</Name> + <DisplayName>Installation D (Unstable)</DisplayName> + <Description>Installs missing component D</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresComponent>D</RequiresComponent> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation</DisplayName> + <Description>Installs all components</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiresAlias>set-A,set-B</RequiresAlias> + <RequiresComponent>C</RequiresComponent> + </Alias> +</Aliases> diff --git a/tests/auto/installer/componentalias/metadata/installer-config/config.xml b/tests/auto/installer/componentalias/metadata/installer-config/config.xml new file mode 100644 index 000000000..9e2b5af55 --- /dev/null +++ b/tests/auto/installer/componentalias/metadata/installer-config/config.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Installer> + <Name>test</Name> + <Version>1.0.0</Version> + <AliasDefinitionsFile>aliases.xml</AliasDefinitionsFile> +</Installer> diff --git a/tests/auto/installer/componentalias/settings.qrc b/tests/auto/installer/componentalias/settings.qrc new file mode 100644 index 000000000..bb45fd361 --- /dev/null +++ b/tests/auto/installer/componentalias/settings.qrc @@ -0,0 +1,9 @@ +<RCC> + <qresource prefix="/"> + <file>data/repository/Updates.xml</file> + <file>data/aliases-priority.xml</file> + <file>data/aliases-versions.xml</file> + <file>metadata/installer-config/config.xml</file> + <file>metadata/installer-config/aliases.xml</file> + </qresource> +</RCC> diff --git a/tests/auto/installer/componentalias/tst_componentalias.cpp b/tests/auto/installer/componentalias/tst_componentalias.cpp new file mode 100644 index 000000000..b30615080 --- /dev/null +++ b/tests/auto/installer/componentalias/tst_componentalias.cpp @@ -0,0 +1,212 @@ +/************************************************************************** +** +** Copyright (C) 2023 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Installer Framework. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +**************************************************************************/ + +#include "../shared/packagemanager.h" +#include "../shared/verifyinstaller.h" + +#include <packagemanagercore.h> +#include <componentalias.h> + +#include <QTest> +#include <QLoggingCategory> + +using namespace QInstaller; + +class tst_ComponentAlias : public QObject +{ + Q_OBJECT + +private slots: + void init() + { + m_installDir = QInstaller::generateTemporaryFileName(); + QVERIFY(QDir().mkpath(m_installDir)); + } + + void cleanup() + { + QDir dir(m_installDir); + QVERIFY(dir.removeRecursively()); + } + + void testSearchAlias() + { + QString loggingRules = (QLatin1String("ifw.* = false\n")); + + QLoggingCategory::setFilterRules(loggingRules); + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManager + (m_installDir, ":///data/repository")); + + auto listMethod = &PackageManagerCore::listAvailableAliases; + + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("\n" + "Name: set-A\n" + "Display name: Installation A\n" + "Description: Installs component A\n" + "Version: 1.0.0\n" + "Components: A\n" + "Required aliases: \n" + "========================================\n" + "Name: set-full\n" + "Display name: Full installation\n" + "Description: Installs all components\n" + "Version: 1.0.0\n" + "Components: C\n" + "Required aliases: set-A,set-B\n"), listMethod, QString()); + + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("\n" + "Name: set-A\n" + "Display name: Installation A\n" + "Description: Installs component A\n" + "Version: 1.0.0\n" + "Components: A\n" + "Required aliases: \n"), listMethod, QLatin1String("A")); + } + + void testAliasSourceWithPriority() + { + QString loggingRules = (QLatin1String("ifw.* = false\n")); + + QLoggingCategory::setFilterRules(loggingRules); + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManager + (m_installDir, ":///data/repository")); + + core->addAliasSource(AliasSource(AliasSource::SourceFileFormat::Xml, + ":///data/aliases-priority.xml", 1)); + + auto listMethod = &PackageManagerCore::listAvailableAliases; + + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("\n" + "Name: set-A\n" + "Display name: Installation A (priority)\n" + "Description: Installs component A\n" + "Version: 1.0.0\n" + "Components: A\n" + "Required aliases: \n" + "========================================\n" + "Name: set-full\n" + "Display name: Full installation (priority)\n" + "Description: Installs all components\n" + "Version: 1.0.0\n" + "Components: C\n" + "Required aliases: set-A,set-B\n"), listMethod, QString()); + } + + void testAliasSourceWithVersionCompare() + { + QString loggingRules = (QLatin1String("ifw.* = false\n")); + + QLoggingCategory::setFilterRules(loggingRules); + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManager + (m_installDir, ":///data/repository")); + + core->addAliasSource(AliasSource(AliasSource::SourceFileFormat::Xml, + ":///data/aliases-versions.xml", -1)); + + auto listMethod = &PackageManagerCore::listAvailableAliases; + + VerifyInstaller::verifyListPackagesMessage(core.get(), QLatin1String("\n" + "Name: set-A\n" + "Display name: Installation A (updated)\n" + "Description: Installs component A\n" + "Version: 2.0.0\n" + "Components: A\n" + "Required aliases: \n" + "========================================\n" + "Name: set-full\n" + "Display name: Full installation (updated)\n" + "Description: Installs all components\n" + "Version: 3.0.0\n" + "Components: C\n" + "Required aliases: set-A,set-B\n"), listMethod, QString()); + } + + void testInstallAlias_data() + { + QTest::addColumn<QStringList>("selectedAliases"); + QTest::addColumn<PackageManagerCore::Status>("status"); + QTest::addColumn<QStringList>("installedComponents"); + + QTest::newRow("Simple alias") + << (QStringList() << "set-A") + << PackageManagerCore::Success + << (QStringList() << "A"); + + QTest::newRow("Alias with dependencies") + << (QStringList() << "set-full") + << PackageManagerCore::Success + << (QStringList() << "A" << "B" << "C" << "C.subcomponent" << "C.subcomponent.subcomponent"); + } + + void testInstallAlias() + { + QFETCH(QStringList, selectedAliases); + QFETCH(PackageManagerCore::Status, status); + QFETCH(QStringList, installedComponents); + + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository")); + + QCOMPARE(status, core->installSelectedComponentsSilently(selectedAliases)); + + for (const QString &component : installedComponents) + QVERIFY(core->componentByName(component)->isInstalled()); + } + + void testInstallAliasFails_data() + { + QTest::addColumn<QStringList>("selectedAliases"); + QTest::addColumn<PackageManagerCore::Status>("status"); + + QTest::newRow("Virtual alias") + << (QStringList() << "set-B") + << PackageManagerCore::Canceled; + + QTest::newRow("Unstable alias") + << (QStringList() << "set-D") + << PackageManagerCore::Canceled; + } + + void testInstallAliasFails() + { + QFETCH(QStringList, selectedAliases); + QFETCH(PackageManagerCore::Status, status); + + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository")); + + QCOMPARE(status, core->installSelectedComponentsSilently(selectedAliases)); + } + +private: + QString m_installDir; +}; + +QTEST_GUILESS_MAIN(tst_ComponentAlias) + +#include "tst_componentalias.moc" diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro index ff070d143..a5f5b3a2e 100644 --- a/tests/auto/installer/installer.pro +++ b/tests/auto/installer/installer.pro @@ -43,7 +43,8 @@ SUBDIRS += \ contentshaupdate \ componentreplace \ metadatacache \ - contentsha1check + contentsha1check \ + componentalias CONFIG(libarchive) { SUBDIRS += libarchivearchive diff --git a/tests/auto/installer/shared/verifyinstaller.h b/tests/auto/installer/shared/verifyinstaller.h index 4d70c577b..e19d3fa0a 100644 --- a/tests/auto/installer/shared/verifyinstaller.h +++ b/tests/auto/installer/shared/verifyinstaller.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2022 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -29,6 +29,8 @@ #ifndef VERIFYINSTALLER_H #define VERIFYINSTALLER_H +#include <packagemanagercore.h> + #include <QString> #include <QStringList> #include <QCryptographicHash> @@ -36,6 +38,9 @@ #include <QDir> #include <QtTest/QTest> +#include <iostream> +#include <sstream> + struct VerifyInstaller { static void verifyInstallerResources(const QString &installDir, const QString &componentName, const QString &fileName) @@ -114,5 +119,21 @@ struct VerifyInstaller } } } + + template <typename Func, typename... Args> + static void verifyListPackagesMessage(QInstaller::PackageManagerCore *core, const QString &message, + Func func, Args... args) + { + std::ostringstream stream; + std::streambuf *buf = std::cout.rdbuf(); + std::cout.rdbuf(stream.rdbuf()); + + (core->*func)(std::forward<Args>(args)...); + + std::cout.rdbuf(buf); + QVERIFY(stream && stream.tellp() == message.size()); + for (const QString &line : message.split(QLatin1String("\n"))) + QVERIFY(stream.str().find(line.toStdString()) != std::string::npos); + } }; #endif |