diff options
author | Katja Marttila <katja.marttila@qt.io> | 2020-10-07 14:00:16 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2020-10-15 12:30:33 +0300 |
commit | b93105c9daf45bce31338e54d14e0869f3c5b669 (patch) | |
tree | d1ec0294bbe489b2ffac6bb4682b21f06b075f25 /tests | |
parent | 0a9427d03b174cf4a4f0fa41151688d0c227ba61 (diff) |
Repogen: Fix options to work with unite metadata
Fixed regogen 'update' and 'repository' options to work with unite
metadata.
--update-new-components with unify metadata is prevented.
Moved --update-new-components functionality from repogen.cpp to
QInstallerTools so it can be accessed from tests.
Created tests for repogen.
Task-number: QTIFW-1943
Change-Id: I12389f4747154a0f6f51b4f34f630103c2cfef04
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'tests')
37 files changed, 690 insertions, 1 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index aed5d01af..e79e6a5d7 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -1,4 +1,5 @@ TEMPLATE = subdirs SUBDIRS += \ - installer + installer \ + tools diff --git a/tests/auto/installer/shared/verifyinstaller.h b/tests/auto/installer/shared/verifyinstaller.h index 91ab2f3cd..4445743af 100644 --- a/tests/auto/installer/shared/verifyinstaller.h +++ b/tests/auto/installer/shared/verifyinstaller.h @@ -33,6 +33,8 @@ #include <QStringList> #include <QCryptographicHash> #include <QFile> +#include <QDir> +#include <QtTest/QTest> struct VerifyInstaller { @@ -68,6 +70,26 @@ struct VerifyInstaller QCOMPARE(dir.entryList(QStringList() << "*.*", QDir::Files).count(), fileList.count()); } + static QString fileContent(const QString &fileName) + { + QFile file(fileName); + QTextStream stream(&file); + file.open(QIODevice::ReadOnly); + QString str = stream.readAll(); + file.close(); + return str; + } + + static void verifyFileContent(const QString &fileName, const QString &content) + { + QVERIFY(fileContent(fileName).contains(content)); + } + + static void verifyFileHasNoContent(const QString &fileName, const QString &content) + { + QVERIFY(!fileContent(fileName).contains(content)); + } + static void addToFileMap(const QDir &baseDir, const QFileInfo &fileInfo, QMap<QString, QByteArray> &map) { QDir directory(fileInfo.absoluteFilePath()); diff --git a/tests/auto/tools/repotest/packages/A/data/A.txt b/tests/auto/tools/repotest/packages/A/data/A.txt new file mode 100644 index 000000000..98114dd6e --- /dev/null +++ b/tests/auto/tools/repotest/packages/A/data/A.txt @@ -0,0 +1,2 @@ +Example content for package A. + diff --git a/tests/auto/tools/repotest/packages/A/meta/package.xml b/tests/auto/tools/repotest/packages/A/meta/package.xml new file mode 100644 index 000000000..8383b10c7 --- /dev/null +++ b/tests/auto/tools/repotest/packages/A/meta/package.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Package> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script1.0.0.qs</Script> +</Package> diff --git a/tests/auto/tools/repotest/packages/A/meta/script1.0.0.qs b/tests/auto/tools/repotest/packages/A/meta/script1.0.0.qs new file mode 100644 index 000000000..addf3329a --- /dev/null +++ b/tests/auto/tools/repotest/packages/A/meta/script1.0.0.qs @@ -0,0 +1,3 @@ +function Component() +{ +} diff --git a/tests/auto/tools/repotest/packages/B/data/B.txt b/tests/auto/tools/repotest/packages/B/data/B.txt new file mode 100644 index 000000000..1ee864074 --- /dev/null +++ b/tests/auto/tools/repotest/packages/B/data/B.txt @@ -0,0 +1,2 @@ +Example content for package B. + diff --git a/tests/auto/tools/repotest/packages/B/meta/package.xml b/tests/auto/tools/repotest/packages/B/meta/package.xml new file mode 100644 index 000000000..99b723d50 --- /dev/null +++ b/tests/auto/tools/repotest/packages/B/meta/package.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Package> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> +</Package> diff --git a/tests/auto/tools/repotest/packages_update/A/data/A_update.txt b/tests/auto/tools/repotest/packages_update/A/data/A_update.txt new file mode 100644 index 000000000..98114dd6e --- /dev/null +++ b/tests/auto/tools/repotest/packages_update/A/data/A_update.txt @@ -0,0 +1,2 @@ +Example content for package A. + diff --git a/tests/auto/tools/repotest/packages_update/A/meta/package.xml b/tests/auto/tools/repotest/packages_update/A/meta/package.xml new file mode 100644 index 000000000..1763dc4d8 --- /dev/null +++ b/tests/auto/tools/repotest/packages_update/A/meta/package.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Package> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>2.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script2.0.0.qs</Script> +</Package> diff --git a/tests/auto/tools/repotest/packages_update/A/meta/script2.0.0.qs b/tests/auto/tools/repotest/packages_update/A/meta/script2.0.0.qs new file mode 100644 index 000000000..addf3329a --- /dev/null +++ b/tests/auto/tools/repotest/packages_update/A/meta/script2.0.0.qs @@ -0,0 +1,3 @@ +function Component() +{ +} diff --git a/tests/auto/tools/repotest/packages_update/B/data/B_update.txt b/tests/auto/tools/repotest/packages_update/B/data/B_update.txt new file mode 100644 index 000000000..1ee864074 --- /dev/null +++ b/tests/auto/tools/repotest/packages_update/B/data/B_update.txt @@ -0,0 +1,2 @@ +Example content for package B. + diff --git a/tests/auto/tools/repotest/packages_update/B/meta/package.xml b/tests/auto/tools/repotest/packages_update/B/meta/package.xml new file mode 100644 index 000000000..99b723d50 --- /dev/null +++ b/tests/auto/tools/repotest/packages_update/B/meta/package.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Package> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> +</Package> diff --git a/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z b/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/A/2.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_component/A/2.0.0meta.7z b/tests/auto/tools/repotest/repository_component/A/2.0.0meta.7z Binary files differnew file mode 100644 index 000000000..af0863696 --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/A/2.0.0meta.7z diff --git a/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z b/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/B/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_component/B/1.0.0meta.7z b/tests/auto/tools/repotest/repository_component/B/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e5be1148e --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/B/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/repository_component/Updates.xml b/tests/auto/tools/repotest/repository_component/Updates.xml new file mode 100644 index 000000000..dfae8c8bd --- /dev/null +++ b/tests/auto/tools/repotest/repository_component/Updates.xml @@ -0,0 +1,28 @@ +<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>2.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script2.0.0.qs</Script> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>da6dae55a8cc3fb9f012e33fa7b9c187a823aa9a</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>B</Name> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>d88b373458b4bbec38132692061bf1e7aa68e7f7</SHA1> + </PackageUpdate> +</Updates> diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/2020-10-13-0958_meta.7z b/tests/auto/tools/repotest/repository_componentAndUnite/2020-10-13-0958_meta.7z Binary files differnew file mode 100644 index 000000000..b8e560fed --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/2020-10-13-0958_meta.7z diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0meta.7z b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0meta.7z Binary files differnew file mode 100644 index 000000000..3cda3cdc4 --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/A/2.0.0meta.7z diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0meta.7z b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e2867c1ee --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/B/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/repository_componentAndUnite/Updates.xml b/tests/auto/tools/repotest/repository_componentAndUnite/Updates.xml new file mode 100644 index 000000000..653c0e91e --- /dev/null +++ b/tests/auto/tools/repotest/repository_componentAndUnite/Updates.xml @@ -0,0 +1,30 @@ +<Updates> + <ApplicationName>{AnyApplication}</ApplicationName> + <ApplicationVersion>1.0.0</ApplicationVersion> + <Checksum>true</Checksum> + <SHA1>815dc9afb48774335e468956fa2e1208a239dc06</SHA1> + <MetadataName>2020-10-13-0958_meta.7z</MetadataName> + <PackageUpdate> + <Name>A</Name> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>2.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script2.0.0.qs</Script> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>f02d025098d76673f3a848e5d5f0421ffa5ee82d</SHA1> + </PackageUpdate> + <PackageUpdate> + <Name>B</Name> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + <SHA1>c520ba1bbde7eb1adf4b274c869a8df0a5efa5b8</SHA1> + </PackageUpdate> +</Updates> diff --git a/tests/auto/tools/repotest/repository_unite/2020-10-13-0958_meta.7z b/tests/auto/tools/repotest/repository_unite/2020-10-13-0958_meta.7z Binary files differnew file mode 100644 index 000000000..4ff34ad9f --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/2020-10-13-0958_meta.7z diff --git a/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z b/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/A/2.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z b/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z diff --git a/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/B/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/repository_unite/Updates.xml b/tests/auto/tools/repotest/repository_unite/Updates.xml new file mode 100644 index 000000000..c9bcc93cd --- /dev/null +++ b/tests/auto/tools/repotest/repository_unite/Updates.xml @@ -0,0 +1,28 @@ +<Updates> + <ApplicationName>{AnyApplication}</ApplicationName> + <ApplicationVersion>1.0.0</ApplicationVersion> + <Checksum>true</Checksum> + <SHA1>4a494d033d3092b392ba775b17a7e4776ccf4777</SHA1> + <MetadataName>2020-10-13-0958_meta.7z</MetadataName> + <PackageUpdate> + <Name>A</Name> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>2.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script2.0.0.qs</Script> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + </PackageUpdate> + <PackageUpdate> + <Name>B</Name> + <DisplayName>B</DisplayName> + <Description>Example component B</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <UpdateFile UncompressedSize="40" CompressedSize="72" OS="Any"/> + <DownloadableArchives>content.7z</DownloadableArchives> + </PackageUpdate> +</Updates> diff --git a/tests/auto/tools/repotest/repotest.pro b/tests/auto/tools/repotest/repotest.pro new file mode 100644 index 000000000..73d482638 --- /dev/null +++ b/tests/auto/tools/repotest/repotest.pro @@ -0,0 +1,10 @@ +include(../../qttest.pri) +include(../../../../tools/repogen/repogen.pri) + +QT -= gui + +SOURCES += tst_repotest.cpp + +RESOURCES += \ + settings.qrc + diff --git a/tests/auto/tools/repotest/settings.qrc b/tests/auto/tools/repotest/settings.qrc new file mode 100644 index 000000000..77d250b20 --- /dev/null +++ b/tests/auto/tools/repotest/settings.qrc @@ -0,0 +1,35 @@ +<RCC> + <qresource prefix="/"> + <file>packages/A/data/A.txt</file> + <file>packages/A/meta/package.xml</file> + <file>packages/A/meta/script1.0.0.qs</file> + <file>packages/B/data/B.txt</file> + <file>packages/B/meta/package.xml</file> + <file>packages_update/A/data/A_update.txt</file> + <file>packages_update/A/meta/package.xml</file> + <file>packages_update/A/meta/script2.0.0.qs</file> + <file>packages_update/B/data/B_update.txt</file> + <file>packages_update/B/meta/package.xml</file> + <file>repository_component/A/2.0.0content.7z</file> + <file>repository_component/A/2.0.0content.7z.sha1</file> + <file>repository_component/A/2.0.0meta.7z</file> + <file>repository_component/B/1.0.0content.7z</file> + <file>repository_component/B/1.0.0content.7z.sha1</file> + <file>repository_component/B/1.0.0meta.7z</file> + <file>repository_component/Updates.xml</file> + <file>repository_componentAndUnite/A/2.0.0content.7z</file> + <file>repository_componentAndUnite/A/2.0.0content.7z.sha1</file> + <file>repository_componentAndUnite/A/2.0.0meta.7z</file> + <file>repository_componentAndUnite/B/1.0.0content.7z</file> + <file>repository_componentAndUnite/B/1.0.0content.7z.sha1</file> + <file>repository_componentAndUnite/B/1.0.0meta.7z</file> + <file>repository_componentAndUnite/2020-10-13-0958_meta.7z</file> + <file>repository_componentAndUnite/Updates.xml</file> + <file>repository_unite/A/2.0.0content.7z</file> + <file>repository_unite/A/2.0.0content.7z.sha1</file> + <file>repository_unite/B/1.0.0content.7z</file> + <file>repository_unite/B/1.0.0content.7z.sha1</file> + <file>repository_unite/2020-10-13-0958_meta.7z</file> + <file>repository_unite/Updates.xml</file> + </qresource> +</RCC> diff --git a/tests/auto/tools/repotest/tst_repotest.cpp b/tests/auto/tools/repotest/tst_repotest.cpp new file mode 100644 index 000000000..2f5ca2cbb --- /dev/null +++ b/tests/auto/tools/repotest/tst_repotest.cpp @@ -0,0 +1,477 @@ +/************************************************************************** +** +** Copyright (C) 2020 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 "../../installer/shared/verifyinstaller.h" + +#include <repositorygen.h> +#include <repositorygen.cpp> +#include <init.h> + +#include <QFile> +#include <QTest> +#include <QRegularExpression> + +class tst_repotest : public QObject +{ + Q_OBJECT +private: + // TODO generateRepo() is almost direct copy from repogen.cpp. + // Move the needed parts of repogen.cpp to a usable function for easier maintenance. + void generateRepo(bool createSplitMetadata, bool createUnifiedMetadata, bool updateNewComponents) + { + QStringList filteredPackages; + QInstallerTools::FilterType filterType = QInstallerTools::Exclude; + + QInstallerTools::PackageInfoVector precompressedPackages = QInstallerTools::createListOfRepositoryPackages + (m_repositoryDirectories, &filteredPackages, filterType); + m_packages.append(precompressedPackages); + + QInstallerTools::PackageInfoVector preparedPackages = QInstallerTools::createListOfPackages(m_packagesDirectories, + &filteredPackages, filterType); + m_packages.append(preparedPackages); + + if (updateNewComponents) + QInstallerTools::filterNewComponents(m_repositoryDir, m_packages); + QHash<QString, QString> pathToVersionMapping = QInstallerTools::buildPathToVersionMapping(m_packages); + + foreach (const QInstallerTools::PackageInfo &package, m_packages) { + const QFileInfo fi(m_repositoryDir, package.name); + if (fi.exists()) + removeDirectory(fi.absoluteFilePath()); + } + + if (updateNewComponents) { //Verify that component B exists as that is not updated + VerifyInstaller::verifyFileExistence(m_repositoryDir + "/B", QStringList() << "1.0.0content.7z" + << "1.0.0content.7z.sha1" << "1.0.0meta.7z"); + } else { + QDir dir(m_repositoryDir + "/B"); + QVERIFY(!dir.exists()); + } + QStringList directories; + directories.append(m_packagesDirectories); + directories.append(m_repositoryDirectories); + + QStringList unite7zFiles; + foreach (const QString &repositoryDirectory, m_repositoryDirectories) { + QDirIterator it(repositoryDirectory, QStringList(QLatin1String("*_meta.7z")) + , QDir::Files | QDir::CaseSensitive); + while (it.hasNext()) { + it.next(); + unite7zFiles.append(it.fileInfo().absoluteFilePath()); + } + } + + QInstallerTools::copyComponentData(directories, m_repositoryDir, &m_packages); + QInstallerTools::copyMetaData(m_tmpMetaDir, m_repositoryDir, m_packages, QLatin1String("{AnyApplication}"), + QLatin1String("1.0.0"), unite7zFiles); + QInstallerTools::compressMetaDirectories(m_tmpMetaDir, m_tmpMetaDir, pathToVersionMapping, + createSplitMetadata, createUnifiedMetadata); + QDirIterator it(m_repositoryDir, QStringList(QLatin1String("Updates*.xml")) + << QLatin1String("*_meta.7z"), QDir::Files | QDir::CaseSensitive); + while (it.hasNext()) { + it.next(); + QFile::remove(it.fileInfo().absoluteFilePath()); + } + QInstaller::moveDirectoryContents(m_tmpMetaDir, m_repositoryDir); + } + + void generateTempMetaDir() + { + if (!m_tmpMetaDir.isEmpty()) + m_tempDirDeleter.releaseAndDelete(m_tmpMetaDir); + QTemporaryDir tmp; + tmp.setAutoRemove(false); + m_tmpMetaDir = tmp.path(); + m_tempDirDeleter.add(m_tmpMetaDir); + } + + void clearData() + { + generateTempMetaDir(); + m_packagesDirectories.clear(); + m_repositoryDirectories.clear(); + m_packages.clear(); + } + + void initRepoUpdate() + { + clearData(); + m_packagesDirectories << ":///packages_update"; + } + + void initRepoUpdateFromRepository(const QString &repository) + { + clearData(); + m_repositoryDirectories << repository; + } + + void verifyUniteMetadata(const QString &scriptVersion) + { + QString fileContent = VerifyInstaller::fileContent(m_repositoryDir + QDir::separator() + + "Updates.xml"); + QRegularExpression re("<MetadataName>(.*)<.MetadataName>"); + QStringList matches = re.match(fileContent).capturedTexts(); + QCOMPARE(2, matches.count()); + QFile file(m_repositoryDir + QDir::separator() + matches.at(1)); + QVERIFY(file.open(QIODevice::ReadOnly)); + + //We have script<version>.qs for package A in the unite metadata + QVector<Lib7z::File>::const_iterator fileIt; + const QVector<Lib7z::File> files = Lib7z::listArchive(&file); + for (fileIt = files.begin(); fileIt != files.end(); ++fileIt) { + if (fileIt->isDirectory) + continue; + QString fileName = "A/script%1.qs"; + QCOMPARE(qPrintable(fileName.arg(scriptVersion)), fileIt->path); + } + + VerifyInstaller::verifyFileExistence(m_repositoryDir, QStringList() << "Updates.xml" + << matches.at(1)); + VerifyInstaller::verifyFileContent(m_repositoryDir + QDir::separator() + "Updates.xml", + "SHA1"); + VerifyInstaller::verifyFileContent(m_repositoryDir + QDir::separator() + "Updates.xml", + "MetadataName"); + } + + void verifyComponentRepository(const QString &componentAVersion, bool hasComponentMeta) + { + const QString content = "%1content.7z"; + const QString contentSha = "%1content.7z.sha1"; + const QString meta = "%1meta.7z"; + QStringList componentA; + QStringList componentB; + componentA << qPrintable(content.arg(componentAVersion)) << qPrintable(contentSha.arg(componentAVersion)); + componentB << "1.0.0content.7z" << "1.0.0content.7z.sha1"; + if (hasComponentMeta) { + componentA << qPrintable(meta.arg(componentAVersion)); + componentB << "1.0.0meta.7z"; + } + VerifyInstaller::verifyFileExistence(m_repositoryDir + "/A", componentA); + VerifyInstaller::verifyFileExistence(m_repositoryDir + "/B", componentB); + } + + void verifyComponentMetaUpdatesXml() + { + VerifyInstaller::verifyFileExistence(m_repositoryDir, QStringList() << "Updates.xml"); + VerifyInstaller::verifyFileHasNoContent(m_repositoryDir + QDir::separator() + "Updates.xml", + "MetadataName"); + } + + void ignoreMessagesForComponentHash(const QStringList &components, bool update) + { + foreach (const QString component, components) { + QString message = "Copying component data for \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + if (update) + message = "Compressing files found in data directory: (\":/packages_update/%1/data/%1_update.txt\")"; + else + message = "Compressing files found in data directory: (\":/packages/%1/data/%1.txt\")"; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Hash is stored in *")); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Creating hash of archive *")); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Generated sha1 hash: *")); + } + } + + void ignoreMessagesForCopyRepository(const QString &component, const QString &version, const QString &repository) + { + QStringList contentFiles; + contentFiles << "content.7z" << "content.7z.sha1"; + QString message = "Copying component data for \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + foreach (const QString &fileName, contentFiles) { + message = "Copying file from \":///%5/%1/%2%4\" to \"%3/%1/%2%4\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component).arg(version) + .arg(m_repositoryDir).arg(fileName).arg(repository))); + } + } + + void ignoreMessageForCollectingRepository(const QString &repository) + { + const QString message = "Process repository \"%2\""; + QTest::ignoreMessage(QtDebugMsg, "Collecting information about available repository packages..."); + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(repository))); + QTest::ignoreMessage(QtDebugMsg, "Collecting information about available packages..."); + QTest::ignoreMessage(QtDebugMsg, "No available packages found at the specified location."); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"B\" - \"1.0.0\""); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"A\" - \"2.0.0\""); + } + + void ignoreMessagesForCopyMetadata(const QString &component, bool hasMeta, bool update) + { + QString message; + if (update) + message = "Copy meta data for package \"%1\" using \":///packages_update/%1/meta/package.xml\""; + else + message = "Copy meta data for package \"%1\" using \":///packages/%1/meta/package.xml\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("calculate size of directory *")); + if (hasMeta) { + if (update) + message = "Copying associated \"script\" file \":///packages_update/%1/meta/script2.0.0.qs\""; + else + message = "Copying associated \"script\" file \":///packages/%1/meta/script1.0.0.qs\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + QTest::ignoreMessage(QtDebugMsg, "done."); + } + } + + void ignoreMessagesForComponentSha(const QStringList &components, bool clearOldChecksum) + { + foreach (const QString component, components) { + const QString message = "Searching sha1sum node for \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(component))); + if (clearOldChecksum) + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("- clearing the old sha1sum *")); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("- writing the sha1sum *")); + } + } + + void ignoreMessagesForUniteMeta(bool update) + { + QTest::ignoreMessage(QtDebugMsg, "Writing sha1sum node."); + if (update) + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("- clearing the old sha1sum *")); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("- writing the sha1sum")); + QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Updating the metadata node with name *")); + } + + void ignoreMessageForCollectingPackages(const QString &versionA, const QString &versionB) + { + QTest::ignoreMessage(QtDebugMsg, "Collecting information about available repository packages..."); + QTest::ignoreMessage(QtDebugMsg, "Collecting information about available packages..."); + QTest::ignoreMessage(QtDebugMsg, "Found subdirectory \"A\""); + QString message = "- it provides the package \"A\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionA))); + QTest::ignoreMessage(QtDebugMsg, "Found subdirectory \"B\""); + message = "- it provides the package \"B\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionB))); + } + + void ignoreMessageForCollectingPackagesFromRepository(const QString &versionA, const QString &versionB) + { + QString message = "- it provides the package \"B\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionB))); + message = "- it provides the package \"A\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionA))); + QTest::ignoreMessage(QtDebugMsg, "Collecting information about available packages..."); + QTest::ignoreMessage(QtDebugMsg, "No available packages found at the specified location."); + } + + void ignoreMessagesForUpdateComponents() + { + ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForComponentHash(QStringList() << "A" << "B", true); + ignoreMessagesForCopyMetadata("A", true, true); + ignoreMessagesForCopyMetadata("B", false, true); + } + +private slots: + void init() + { + ignoreMessageForCollectingPackages("1.0.0", "1.0.0"); + + m_repositoryDir = QInstallerTools::makePathAbsolute(QInstaller::generateTemporaryFileName()); + m_tempDirDeleter.add(m_repositoryDir); + generateTempMetaDir(); + + m_packagesDirectories << ":///packages"; + + ignoreMessagesForComponentHash(QStringList() << "A" << "B", false); + ignoreMessagesForCopyMetadata("A", true, false); //Only A has metadata + ignoreMessagesForCopyMetadata("B", false, false); + } + + void initTestCase() + { + Lib7z::initSevenZ(); + } + + void testWithComponentMeta() + { + ignoreMessagesForComponentSha(QStringList () << "A" << "B", false); + generateRepo(true, false, false); + + verifyComponentRepository("1.0.0", true); + verifyComponentMetaUpdatesXml(); + } + + void testWithComponentAndUniteMeta() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForUniteMeta(false); + generateRepo(true, true, false); + + verifyComponentRepository("1.0.0", true); + verifyUniteMetadata("1.0.0"); + } + + void testWithUniteMeta() + { + ignoreMessagesForUniteMeta(false); + generateRepo(false, true, false); + + verifyComponentRepository("1.0.0", false); + verifyUniteMetadata("1.0.0"); + } + + void testUpdateNewComponents() + { + // Create 'base' repository which will be updated + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + generateRepo(true, false, false); + verifyComponentRepository("1.0.0", true); + + // Update the 'base' repository + initRepoUpdate(); + ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); + ignoreMessagesForComponentSha(QStringList() << "A", false); //Only A has update + ignoreMessagesForComponentHash(QStringList() << "A", true); + ignoreMessagesForCopyMetadata("A", true, true); + const QString &message = "Update component \"A\" in \"%1\" ."; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repositoryDir))); + generateRepo(true, false, true); + verifyComponentRepository("2.0.0", true); + verifyComponentMetaUpdatesXml(); + } + + void testUpdateComponents() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + generateRepo(true, false, false); + verifyComponentRepository("1.0.0",true); + + initRepoUpdate(); + ignoreMessagesForUpdateComponents(); + generateRepo(true, false, false); + verifyComponentRepository("2.0.0", true); + verifyComponentMetaUpdatesXml(); + } + + void testUpdateComponentsWithUniteMetadata() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForUniteMeta(false); + generateRepo(true, true, false); + verifyComponentRepository("1.0.0", true); + + initRepoUpdate(); + ignoreMessagesForUpdateComponents(); + ignoreMessagesForUniteMeta(true); + generateRepo(true, true, false); + verifyComponentRepository("2.0.0", true); + verifyUniteMetadata("2.0.0"); + } + + void testUpdateComponentsWithOnlyUniteMetadata() + { + ignoreMessagesForUniteMeta(false); + generateRepo(false, true, false); + verifyComponentRepository("1.0.0", false); + + initRepoUpdate(); + ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); + ignoreMessagesForComponentHash(QStringList() << "A" << "B", true); + ignoreMessagesForCopyMetadata("A", true, true); + ignoreMessagesForCopyMetadata("B", false, true); + ignoreMessagesForUniteMeta(true); + generateRepo(false, true, false); + verifyComponentRepository("2.0.0", false); + verifyUniteMetadata("2.0.0"); + } + + void testUpdateComponentsFromRepository() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + generateRepo(true, false, false); + verifyComponentRepository("1.0.0", true); + + initRepoUpdateFromRepository(":///repository_component"); + ignoreMessageForCollectingRepository("repository_component"); + ignoreMessagesForCopyRepository("B", "1.0.0", "repository_component"); + ignoreMessagesForCopyRepository("A", "2.0.0", "repository_component"); + ignoreMessagesForComponentSha(QStringList() << "A" << "B", true); + generateRepo(true, false, false); + verifyComponentRepository("2.0.0", true); + verifyComponentMetaUpdatesXml(); + } + + void testUpdateComponentsFromRepositoryWithUniteMetadata() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForUniteMeta(false); + generateRepo(true, true, false); + verifyComponentRepository("1.0.0", true); + + initRepoUpdateFromRepository(":///repository_componentAndUnite"); + ignoreMessageForCollectingRepository("repository_componentAndUnite"); + ignoreMessagesForCopyRepository("A", "2.0.0", "repository_componentAndUnite"); + ignoreMessagesForCopyRepository("B", "1.0.0", "repository_componentAndUnite"); + ignoreMessagesForUniteMeta(true); + ignoreMessagesForComponentSha(QStringList() << "A" << "B", true); + generateRepo(true, true, false); + verifyComponentRepository("2.0.0", true); + verifyUniteMetadata("2.0.0"); + } + + void testUpdateComponentsFromRepositoryWithOnlyUniteMetadata() + { + ignoreMessagesForUniteMeta(false); + generateRepo(false, true, false); + verifyComponentRepository("1.0.0", false); + + initRepoUpdateFromRepository(":///repository_unite"); + ignoreMessageForCollectingRepository("repository_unite"); + ignoreMessagesForCopyRepository("A", "2.0.0", "repository_unite"); + ignoreMessagesForCopyRepository("B", "1.0.0", "repository_unite"); + ignoreMessagesForUniteMeta(true); + generateRepo(false, true, false); + verifyComponentRepository("2.0.0", false); + verifyUniteMetadata("2.0.0"); + } + + void cleanup() + { + m_tempDirDeleter.releaseAndDeleteAll(); + m_packagesDirectories.clear(); + m_packages.clear(); + m_repositoryDirectories.clear(); + } + +private: + QString m_tmpMetaDir; + QString m_repositoryDir; + QStringList m_packagesDirectories; + QStringList m_repositoryDirectories; + QInstallerTools::PackageInfoVector m_packages; + TempDirDeleter m_tempDirDeleter; +}; + +QTEST_MAIN(tst_repotest) + +#include "tst_repotest.moc" diff --git a/tests/auto/tools/tools.pro b/tests/auto/tools/tools.pro new file mode 100644 index 000000000..7e881ecee --- /dev/null +++ b/tests/auto/tools/tools.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs + +SUBDIRS += \ + repotest |