diff options
Diffstat (limited to 'tests/auto/installer/componentalias')
10 files changed, 747 insertions, 0 deletions
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-optional.xml b/tests/auto/installer/componentalias/data/aliases-optional.xml new file mode 100644 index 000000000..2016592c1 --- /dev/null +++ b/tests/auto/installer/componentalias/data/aliases-optional.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<Aliases> + <Alias> + <Name>set-A</Name> + <DisplayName>Installation A (optional component requirement)</DisplayName> + <Description>Installs component A</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <RequiredComponents>A</RequiredComponents> + <OptionalComponents>component-nonexistent,B</OptionalComponents> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation (optional alias requirement)</DisplayName> + <Description>Installs all components</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <OptionalAliases>set-A,set-nonexistent</OptionalAliases> + </Alias> + <Alias> + <Name>set-optional-broken</Name> + <DisplayName>Optionally requires broken alias</DisplayName> + <Description>Optionally requires broken alias</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <OptionalAliases>set-broken</OptionalAliases> + </Alias> + <Alias> + <Name>set-broken</Name> + <DisplayName>Requires non-existent alias</DisplayName> + <Description>Requires non-existent alias</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-nonexistent</RequiredAliases> + </Alias> + <Alias> + <Name>set-optional-broken-component</Name> + <DisplayName>Dependency to optional unstable component</DisplayName> + <Description>Dependency to optional unstable component</Description> + <Version>2.0.0</Version> + <Virtual>false</Virtual> + <OptionalComponents>UnstableComponent</OptionalComponents> + </Alias> +</Aliases> 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..f90d006b2 --- /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> + <RequiredComponents>A</RequiredComponents> + </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> + <RequiredComponents>B</RequiredComponents> + </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> + <RequiredComponents>D</RequiredComponents> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation (priority)</DisplayName> + <Description>Installs all components</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-A,set-B</RequiredAliases> + <RequiredComponents>C</RequiredComponents> + </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..993e14673 --- /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> + <RequiredComponents>A</RequiredComponents> + </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> + <RequiredComponents>B</RequiredComponents> + </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> + <RequiredComponents>D</RequiredComponents> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation (updated)</DisplayName> + <Description>Installs all components</Description> + <Version>3.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-A,set-B</RequiredAliases> + <RequiredComponents>C</RequiredComponents> + </Alias> +</Aliases> diff --git a/tests/auto/installer/componentalias/data/aliases.json b/tests/auto/installer/componentalias/data/aliases.json new file mode 100644 index 000000000..4c78e20d2 --- /dev/null +++ b/tests/auto/installer/componentalias/data/aliases.json @@ -0,0 +1,38 @@ +{ + "alias-packages": [ + { + "Description": "Installs component A", + "DisplayName": "Installation A (JSON)", + "Name": "set-A-json", + "RequiredComponents": [ + "A" + ], + "Version": "1.0.0", + "Virtual": false + }, + { + "Description": "Installs component B", + "DisplayName": "Virtual installation B (JSON)", + "Name": "set-B-json", + "RequiredComponents": [ + "B" + ], + "Version": "1.0.0", + "Virtual": true + }, + { + "Description": "Installs all components", + "DisplayName": "Full installation (JSON)", + "Name": "set-full-json", + "RequiredAliases": [ + "set-A-json", + "set-B-json" + ], + "RequiredComponents": [ + "C" + ], + "Version": "1.0.0", + "Virtual": false + } + ] +} 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..64950244f --- /dev/null +++ b/tests/auto/installer/componentalias/data/repository/Updates.xml @@ -0,0 +1,51 @@ +<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> + <PackageUpdate> + <Name>UnstableComponent</Name> + <DisplayName>Subcomponent of subcomponent component</DisplayName> + <Description>Example subcomponent of subcomponent</Description> + <Version>1.0.0-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Dependencies>missing.component</Dependencies> + </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..2362e51c7 --- /dev/null +++ b/tests/auto/installer/componentalias/metadata/installer-config/aliases.xml @@ -0,0 +1,84 @@ +<?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> + <RequiredComponents>A</RequiredComponents> + </Alias> + <Alias> + <Name>set-B</Name> + <DisplayName>Virtual installation B</DisplayName> + <Description>Installs component B</Description> + <Version>1.0.0</Version> + <Virtual>true</Virtual> + <RequiredComponents>B</RequiredComponents> + </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> + <RequiredComponents>D</RequiredComponents> + </Alias> + <Alias> + <Name>set-E</Name> + <DisplayName>Installation E (Requires unstable)</DisplayName> + <Description>Installs set E</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-D</RequiredAliases> + </Alias> + <Alias> + <Name>set-F</Name> + <DisplayName>Installation F (Requires alias that refers another unstable)</DisplayName> + <Description>Installs set F</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-E</RequiredAliases> + </Alias> + <Alias> + <Name>set-full</Name> + <DisplayName>Full installation</DisplayName> + <Description>Installs all components</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredAliases>set-A,set-B</RequiredAliases> + <RequiredComponents>C</RequiredComponents> + </Alias> + <Alias> + <Name>set-required-component-from-fallback</Name> + <DisplayName>Installation (fetches component from fallback repository)</DisplayName> + <Description>Installs component</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredComponents>A</RequiredComponents> + </Alias> + <Alias> + <Name>set-optional-component-from-fallback</Name> + <DisplayName>Installation (fetches optional component from fallback repository)</DisplayName> + <Description>Installs component</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <OptionalComponents>A</OptionalComponents> + </Alias> + <Alias> + <Name>set-optional-broken-component-from-fallback</Name> + <DisplayName>Installation (fetches optional component from fallback repository)</DisplayName> + <Description>Installs component</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <OptionalComponents>UnstableComponent</OptionalComponents> + </Alias> + <Alias> + <Name>set-required-broken-component-from-fallback</Name> + <DisplayName>Installation (fetches optional component from fallback repository)</DisplayName> + <Description>Installs component</Description> + <Version>1.0.0</Version> + <Virtual>false</Virtual> + <RequiredComponents>UnstableComponent</RequiredComponents> + </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..771586edd --- /dev/null +++ b/tests/auto/installer/componentalias/settings.qrc @@ -0,0 +1,11 @@ +<RCC> + <qresource prefix="/"> + <file>data/repository/Updates.xml</file> + <file>data/aliases.json</file> + <file>data/aliases-priority.xml</file> + <file>data/aliases-versions.xml</file> + <file>data/aliases-optional.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..51f6ca635 --- /dev/null +++ b/tests/auto/installer/componentalias/tst_componentalias.cpp @@ -0,0 +1,433 @@ +/************************************************************************** +** +** 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)); + m_fallbackRepositoryData = QLatin1String("========================================\n" + "Name: set-optional-broken-component-from-fallback\n" + "Display name: Installation (fetches optional component from fallback repository)\n" + "Description: Installs component\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: \n" + "Optional components: UnstableComponent\n" + "Optional aliases: \n" + "========================================\n" + "Name: set-optional-component-from-fallback\n" + "Display name: Installation (fetches optional component from fallback repository)\n" + "Description: Installs component\n" + "Version: 1.0.0\nComponents: \n" + "Required aliases: \n" + "Optional components: A\n" + "Optional aliases: \n" + "========================================\n" + "Name: set-required-broken-component-from-fallback\n" + "Display name: Installation (fetches optional component from fallback repository)\n" + "Description: Installs component\n" + "Version: 1.0.0\n" + "Components: UnstableComponent\n" + "Required aliases: \n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-required-component-from-fallback\n" + "Display name: Installation (fetches component from fallback repository)\n" + "Description: Installs component\n" + "Version: 1.0.0\nComponents: A\n" + "Required aliases: \n" + "Optional components: \n" + "Optional aliases: \n"); + } + + 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")); + + core->setCommandLineInstance(true); + + 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" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-D\n" + "Display name: Installation D (Unstable)\n" + "Description: Installs missing component D\n" + "Version: 1.0.0\nComponents: D\n" + "Required aliases: \n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-E\n" + "Display name: Installation E (Requires unstable)\n" + "Description: Installs set E\nVersion: 1.0.0\nComponents: \n" + "Required aliases: set-D\n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-F\n" + "Display name: Installation F (Requires alias that refers another unstable)\n" + "Description: Installs set F\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: set-E\nOptional components: \n" + "Optional 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" + "Optional components: \n" + "Optional aliases: \n") + m_fallbackRepositoryData, 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" + "Optional components: \n" + "Optional 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->setCommandLineInstance(true); + 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" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-D\n" + "Display name: Installation D (Unstable) (priority)\n" + "Description: Installs missing component D\n" + "Version: 1.0.0\n" + "Components: D\n" + "Required aliases: \n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-E\n" + "Display name: Installation E (Requires unstable)\n" + "Description: Installs set E\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: set-D\n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-F\n" + "Display name: Installation F (Requires alias that refers another unstable)\n" + "Description: Installs set F\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: set-E\n" + "Optional components: \n" + "Optional 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" + "Optional components: \n" + "Optional aliases: \n") + m_fallbackRepositoryData, listMethod, QString()); + } + + void testAliasSourceWithVersionCompare() + { + QString loggingRules = (QLatin1String("ifw.* = false\n")); + + QLoggingCategory::setFilterRules(loggingRules); + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManager + (m_installDir, ":///data/repository")); + + core->setCommandLineInstance(true); + 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" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-D\n" + "Display name: Installation D (Unstable) (updated)\n" + "Description: Installs missing component D\n" + "Version: 1.2.0\n" + "Components: D\n" + "Required aliases: \n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-E\n" + "Display name: Installation E (Requires unstable)\n" + "Description: Installs set E\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: set-D\n" + "Optional components: \n" + "Optional aliases: \n" + "========================================\n" + "Name: set-F\n" + "Display name: Installation F (Requires alias that refers another unstable)\n" + "Description: Installs set F\n" + "Version: 1.0.0\n" + "Components: \n" + "Required aliases: set-E\n" + "Optional components: \n" + "Optional 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" + "Optional components: \n" + "Optional aliases: \n") + m_fallbackRepositoryData, listMethod, QString()); + } + + void testInstallAlias_data() + { + QTest::addColumn<AliasSource>("additionalSource"); + QTest::addColumn<QStringList>("selectedAliases"); + QTest::addColumn<PackageManagerCore::Status>("status"); + QTest::addColumn<QStringList>("installedComponents"); + + QTest::newRow("Simple alias") + << AliasSource() + << (QStringList() << "set-A") + << PackageManagerCore::Success + << (QStringList() << "A"); + + QTest::newRow("Alias with dependencies") + << AliasSource() + << (QStringList() << "set-full") + << PackageManagerCore::Success + << (QStringList() << "A" << "B" << "C" << "C.subcomponent" << "C.subcomponent.subcomponent"); + + QTest::newRow("Alias with dependencies (JSON source)") + << AliasSource(AliasSource::SourceFileFormat::Json, ":///data/aliases.json", -1) + << (QStringList() << "set-full-json") + << PackageManagerCore::Success + << (QStringList() << "A" << "B" << "C" << "C.subcomponent" << "C.subcomponent.subcomponent"); + + QTest::newRow("Alias with optional components (existent and non-existent)") + << AliasSource(AliasSource::SourceFileFormat::Xml, ":///data/aliases-optional.xml", -1) + << (QStringList() << "set-A") + << PackageManagerCore::Success + << (QStringList() << "A" << "B"); + + QTest::newRow("Alias with optional aliases (existent and non-existent)") + << AliasSource(AliasSource::SourceFileFormat::Xml, ":///data/aliases-optional.xml", -1) + << (QStringList() << "set-full") + << PackageManagerCore::Success + << (QStringList() << "A" << "B"); + + QTest::newRow("Alias with optional broken alias (will install)") + << AliasSource(AliasSource::SourceFileFormat::Xml, ":///data/aliases-optional.xml", -1) + << (QStringList() << "set-optional-broken") + << PackageManagerCore::Success + << QStringList(); + + QTest::newRow("Alias with optional broken component (will install)") + << AliasSource(AliasSource::SourceFileFormat::Xml, ":///data/aliases-optional.xml", -1) + << (QStringList() << "set-optional-broken-component") + << PackageManagerCore::Success + << QStringList(); + } + + void testInstallAlias() + { + QFETCH(AliasSource, additionalSource); + QFETCH(QStringList, selectedAliases); + QFETCH(PackageManagerCore::Status, status); + QFETCH(QStringList, installedComponents); + + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository")); + + core->setCommandLineInstance(true); + + if (!additionalSource.filename.isEmpty()) + core->addAliasSource(additionalSource); + core->settings().setAllowUnstableComponents(true); + QCOMPARE(core->installSelectedComponentsSilently(selectedAliases), status); + + 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; + + QTest::newRow("Nested reference to unstable alias") + << (QStringList() << "set-F") + << PackageManagerCore::Canceled; + } + + void testInstallAliasFails() + { + QFETCH(QStringList, selectedAliases); + QFETCH(PackageManagerCore::Status, status); + + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit + (m_installDir, ":///data/repository")); + + core->setCommandLineInstance(true); + + QCOMPARE(core->installSelectedComponentsSilently(selectedAliases), status); + } + + void testInstallAliasWithFallbackRepositories_data() + { + QTest::addColumn<QStringList>("selectedAliases"); + QTest::addColumn<PackageManagerCore::Status>("status"); + QTest::addColumn<QStringList>("installedComponents"); + + QTest::newRow("Component from fallback") + << (QStringList() << "set-required-component-from-fallback") + << PackageManagerCore::Success + << (QStringList() << "A"); + QTest::newRow("Optional component from fallback") + << (QStringList() << "set-optional-component-from-fallback") + << PackageManagerCore::Success + << (QStringList() << "A"); + QTest::newRow("Optional broken component from fallback") + << (QStringList() << "set-optional-broken-component-from-fallback") + << PackageManagerCore::Success + << (QStringList()); + QTest::newRow("Required broke component from fallback") + << (QStringList() << "set-required-broken-component-from-fallback") + << PackageManagerCore::Canceled + << (QStringList()); + } + + void testInstallAliasWithFallbackRepositories() + { + QFETCH(QStringList, selectedAliases); + QFETCH(PackageManagerCore::Status, status); + QFETCH(QStringList, installedComponents); + + QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit(m_installDir)); + + core->setCommandLineInstance(true); + core->settings().setAllowUnstableComponents(true); + QSet<RepositoryCategory> repositoryCategories; + RepositoryCategory repositoryCategory; + repositoryCategory.setEnabled(false); + repositoryCategory.addRepository(Repository::fromUserInput(":///data/repository")); + repositoryCategories.insert(repositoryCategory); + core->settings().addRepositoryCategories(repositoryCategories); + QCOMPARE(core->installSelectedComponentsSilently(selectedAliases), status); + + for (const QString &component : installedComponents) + QVERIFY(core->componentByName(component)->isInstalled()); + } + +private: + QString m_installDir; + QString m_fallbackRepositoryData; +}; + +QTEST_GUILESS_MAIN(tst_ComponentAlias) + +#include "tst_componentalias.moc" |