diff options
Diffstat (limited to 'tests/auto/tools')
26 files changed, 336 insertions, 196 deletions
diff --git a/tests/auto/tools/repotest/packages_new/C/data/C.txt b/tests/auto/tools/repotest/packages_new/C/data/C.txt new file mode 100644 index 000000000..b45c73606 --- /dev/null +++ b/tests/auto/tools/repotest/packages_new/C/data/C.txt @@ -0,0 +1,2 @@ +Example content for package C. + diff --git a/tests/auto/tools/repotest/packages_new/C/meta/package.xml b/tests/auto/tools/repotest/packages_new/C/meta/package.xml new file mode 100644 index 000000000..676f088be --- /dev/null +++ b/tests/auto/tools/repotest/packages_new/C/meta/package.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Package> + <DisplayName>C</DisplayName> + <Description>Example component C</Description> + <Version>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> +</Package> diff --git a/tests/auto/tools/repotest/repotest.pro b/tests/auto/tools/repotest/repotest.pro index 930abafd6..c0ff8caa6 100644 --- a/tests/auto/tools/repotest/repotest.pro +++ b/tests/auto/tools/repotest/repotest.pro @@ -4,6 +4,3 @@ 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 deleted file mode 100644 index e731af222..000000000 --- a/tests/auto/tools/repotest/settings.qrc +++ /dev/null @@ -1,35 +0,0 @@ -<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/C/1.0.0content.7z</file> - <file>repository_componentAndUnite/C/1.0.0content.7z.sha1</file> - <file>repository_componentAndUnite/C/1.0.0meta.7z</file> - <file>repository_componentAndUnite/2020-11-10-0816_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/C/1.0.0content.7z</file> - <file>repository_unite/C/1.0.0content.7z.sha1</file> - <file>repository_unite/2020-11-10-0931_meta.7z</file> - <file>repository_unite/Updates.xml</file> - </qresource> -</RCC> diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0meta.7z Binary files differnew file mode 100644 index 000000000..af0863696 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/A/2.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e5be1148e --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/B/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_1/Updates.xml b/tests/auto/tools/repotest/test_package_versions/repository_1/Updates.xml new file mode 100644 index 000000000..edb6515bd --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_1/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>Test 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>Test 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/test_package_versions/repository_2/A/1.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..c4da482bf --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/A/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e5be1148e --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/B/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_2/Updates.xml b/tests/auto/tools/repotest/test_package_versions/repository_2/Updates.xml new file mode 100644 index 000000000..ac12fba4b --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_2/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>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script1.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/test_package_versions/repository_3/A/1.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0meta.7z Binary files differnew file mode 100644 index 000000000..3706e8dd8 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/A/1.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z Binary files differnew file mode 100644 index 000000000..46e2c9124 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z.sha1 b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z.sha1 new file mode 100644 index 000000000..53010cea2 --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0content.7z.sha1 @@ -0,0 +1 @@ +059e5ed8cd3a1fbca08cccfa4075265192603e3f
\ No newline at end of file diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0meta.7z b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0meta.7z Binary files differnew file mode 100644 index 000000000..e5be1148e --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/B/3.0.0meta.7z diff --git a/tests/auto/tools/repotest/test_package_versions/repository_3/Updates.xml b/tests/auto/tools/repotest/test_package_versions/repository_3/Updates.xml new file mode 100644 index 000000000..40d86538c --- /dev/null +++ b/tests/auto/tools/repotest/test_package_versions/repository_3/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>1.0.0</Version> + <ReleaseDate>2020-01-01</ReleaseDate> + <Default>true</Default> + <Script>script1.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>3.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/tst_repotest.cpp b/tests/auto/tools/repotest/tst_repotest.cpp index 5aa614454..f1c0ae9dd 100644 --- a/tests/auto/tools/repotest/tst_repotest.cpp +++ b/tests/auto/tools/repotest/tst_repotest.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -30,6 +30,11 @@ #include <repositorygen.h> #include <repositorygen.cpp> #include <init.h> +#include <archivefactory.h> + +#ifdef IFW_LIB7Z +#include <lib7z_facade.h> +#endif #include <QFile> #include <QTest> @@ -39,119 +44,66 @@ 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) + void generateRepo(bool createSplitMetadata, bool createUnifiedMetadata, bool updateNewComponents, + QStringList packagesUpdatedWithSha = QStringList()) { 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()); - } + m_packages = QInstallerTools::collectPackages(m_repoInfo, + &filteredPackages, QInstallerTools::Exclude, updateNewComponents, packagesUpdatedWithSha); if (updateNewComponents) { //Verify that component B exists as that is not updated if (createSplitMetadata) { - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/B", QStringList() << "1.0.0content.7z" + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/B", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1" << "1.0.0meta.7z"); } else { - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/B", QStringList() << "1.0.0content.7z" + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/B", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1"); } - } 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); - QString existing7z = QInstallerTools::existingUniteMeta7z(m_repositoryDir); - if (!existing7z.isEmpty()) - existing7z = m_repositoryDir + QDir::separator() + existing7z; - QInstallerTools::compressMetaDirectories(m_tmpMetaDir, existing7z, 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); + const QString tmpMetaDir = tmp.path(); + QInstallerTools::createRepository(m_repoInfo, &m_packages, tmpMetaDir, createSplitMetadata, + createUnifiedMetadata, QLatin1String("7z")); + QInstaller::removeDirectory(tmpMetaDir, true); } void clearData() { - generateTempMetaDir(); - m_packagesDirectories.clear(); - m_repositoryDirectories.clear(); + m_repoInfo.packages.clear(); + m_repoInfo.repositoryPackages.clear(); m_packages.clear(); } void initRepoUpdate() { clearData(); - m_packagesDirectories << ":///packages_update"; + m_repoInfo.packages << "packages_update"; } - void initRepoUpdateFromRepository(const QString &repository) + void initRepoUpdateFromRepositories(const QStringList &repositories) { clearData(); - m_repositoryDirectories << repository; + m_repoInfo.repositoryPackages << repositories; } void verifyUniteMetadata(const QString &scriptVersion) { - QString fileContent = VerifyInstaller::fileContent(m_repositoryDir + QDir::separator() + QString fileContent = VerifyInstaller::fileContent(m_repoInfo.repositoryDir + QDir::separator() + "Updates.xml"); QRegularExpression re("<MetadataName>(.*)<.MetadataName>"); QStringList matches = re.match(fileContent).capturedTexts(); - QString existingUniteMeta7z = QInstallerTools::existingUniteMeta7z(m_repositoryDir); + QString existingUniteMeta7z = QInstallerTools::existingUniteMeta7z(m_repoInfo.repositoryDir); QCOMPARE(2, matches.count()); QCOMPARE(existingUniteMeta7z, matches.at(1)); - QFile file(m_repositoryDir + QDir::separator() + matches.at(1)); - QVERIFY(file.open(QIODevice::ReadOnly)); + QScopedPointer<AbstractArchive> file(ArchiveFactory::instance() + .create(m_repoInfo.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); + QVector<ArchiveEntry>::const_iterator fileIt; + const QVector<ArchiveEntry> files = file->list(); for (fileIt = files.begin(); fileIt != files.end(); ++fileIt) { if (fileIt->isDirectory) continue; @@ -159,48 +111,45 @@ private: QCOMPARE(qPrintable(fileName.arg(scriptVersion)), fileIt->path); } - VerifyInstaller::verifyFileExistence(m_repositoryDir, QStringList() << "Updates.xml" + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir, QStringList() << "Updates.xml" << matches.at(1)); - VerifyInstaller::verifyFileContent(m_repositoryDir + QDir::separator() + "Updates.xml", + VerifyInstaller::verifyFileContent(m_repoInfo.repositoryDir + QDir::separator() + "Updates.xml", "SHA1"); - VerifyInstaller::verifyFileContent(m_repositoryDir + QDir::separator() + "Updates.xml", + VerifyInstaller::verifyFileContent(m_repoInfo.repositoryDir + QDir::separator() + "Updates.xml", "MetadataName"); } - void verifyComponentRepository(const QString &componentAVersion, bool hasComponentMeta) + void verifyComponentRepository(const QString &componentAVersion, const QString &componentBVersion, bool hasComponentMeta) { const QString content = "%1content.7z"; - const QString contentSha = "%1content.7z.sha1"; + const QString contentSha1 = "%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"; + componentA << qPrintable(content.arg(componentAVersion)) << qPrintable(contentSha1.arg(componentAVersion)); + componentB << qPrintable(content.arg(componentBVersion)) << qPrintable(contentSha1.arg(componentBVersion)); if (hasComponentMeta) { componentA << qPrintable(meta.arg(componentAVersion)); - componentB << "1.0.0meta.7z"; + componentB << qPrintable(meta.arg(componentBVersion)); } - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/A", componentA); - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/B", componentB); + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/A", componentA); + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/B", componentB); } void verifyComponentMetaUpdatesXml() { - VerifyInstaller::verifyFileExistence(m_repositoryDir, QStringList() << "Updates.xml"); - VerifyInstaller::verifyFileHasNoContent(m_repositoryDir + QDir::separator() + "Updates.xml", + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir, QStringList() << "Updates.xml"); + VerifyInstaller::verifyFileHasNoContent(m_repoInfo.repositoryDir + QDir::separator() + "Updates.xml", "MetadataName"); } - void ignoreMessagesForComponentHash(const QStringList &components, bool update) + void ignoreMessagesForComponentHash(const QStringList &components) { + QString packageDir = m_repoInfo.packages.first(); 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("Compressing files found in data directory: *")); QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Hash is stored in *")); QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Creating hash of archive *")); QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Generated sha1 hash: *")); @@ -214,37 +163,33 @@ private: 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\""; + 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))); + .arg(m_repoInfo.repositoryDir).arg(fileName).arg(repository))); } } - void ignoreMessageForCollectingRepository(const QString &repository) + void ignoreMessageForCollectingRepository(const QStringList &repositories) { const QString message = "Process repository \"%2\""; QTest::ignoreMessage(QtDebugMsg, "Collecting information about available repository packages..."); - QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(repository))); + for (auto &repo : repositories) + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(repo))); 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 \"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))); + QString message = "Copy meta data for package \"%2\" using \"%1/%2/meta/package.xml\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.packages.first(), 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\""; + message = "Copying associated \"script\" file \"%1/%2/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))); + message = "Copying associated \"script\" file \"%1/%2/meta/script1.0.0.qs\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.packages.first(), component))); QTest::ignoreMessage(QtDebugMsg, "done."); } } @@ -269,16 +214,26 @@ private: QTest::ignoreMessage(QtDebugMsg, QRegularExpression("Updating the metadata node with name *")); } - void ignoreMessageForCollectingPackages(const QString &versionA, const QString &versionB) + void ignoreMessageForCollectingPackages(const QString &versionA = QString(), + const QString &versionB = QString(), const QString &versionC = QString()) { 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))); + if (!versionA.isEmpty()) { + QTest::ignoreMessage(QtDebugMsg, "Found subdirectory \"A\""); + const QString message = "- it provides the package \"A\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionA))); + } + if (!versionB.isEmpty()) { + QTest::ignoreMessage(QtDebugMsg, "Found subdirectory \"B\""); + const QString message = "- it provides the package \"B\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionB))); + } + if (!versionC.isEmpty()) { + QTest::ignoreMessage(QtDebugMsg, "Found subdirectory \"C\""); + const QString message = "- it provides the package \"C\" - \"%1\""; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(versionC))); + } } void ignoreMessageForCollectingPackagesFromRepository(const QString &versionA, const QString &versionB) @@ -295,7 +250,7 @@ private: { ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); - ignoreMessagesForComponentHash(QStringList() << "A" << "B", true); + ignoreMessagesForComponentHash(QStringList() << "A" << "B"); ignoreMessagesForCopyMetadata("A", true, true); ignoreMessagesForCopyMetadata("B", false, true); } @@ -303,9 +258,21 @@ private: void ignoreMessageForUpdateComponent() { QString message = "Update component \"A\" in \"%1\" ."; - QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repositoryDir))); + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.repositoryDir))); message = "Update component \"C\" in \"%1\" ."; - QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repositoryDir))); + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.repositoryDir))); + } + + void verifyComponentShaUpdate(int shaUpdateComponents) + { + QString updatesXmlFile(m_repoInfo.repositoryDir + QDir::separator() + "Updates.xml"); + QFile file(updatesXmlFile); + QDomDocument dom; + + QVERIFY(file.open(QIODevice::ReadOnly)); + QVERIFY(dom.setContent(&file)); + file.close(); + QCOMPARE(dom.elementsByTagName("ContentSha1").count(), shaUpdateComponents); } private slots: @@ -313,20 +280,21 @@ private slots: { ignoreMessageForCollectingPackages("1.0.0", "1.0.0"); - m_repositoryDir = QInstallerTools::makePathAbsolute(QInstaller::generateTemporaryFileName()); - m_tempDirDeleter.add(m_repositoryDir); - generateTempMetaDir(); + m_repoInfo.repositoryDir = QInstallerTools::makePathAbsolute(QInstaller::generateTemporaryFileName()); + m_tempDirDeleter.add(m_repoInfo.repositoryDir); - m_packagesDirectories << ":///packages"; + m_repoInfo.packages << "packages"; - ignoreMessagesForComponentHash(QStringList() << "A" << "B", false); + ignoreMessagesForComponentHash(QStringList() << "A" << "B"); ignoreMessagesForCopyMetadata("A", true, false); //Only A has metadata ignoreMessagesForCopyMetadata("B", false, false); } void initTestCase() { +#ifdef IFW_LIB7Z Lib7z::initSevenZ(); +#endif } void testWithComponentMeta() @@ -334,7 +302,7 @@ private slots: ignoreMessagesForComponentSha(QStringList () << "A" << "B", false); generateRepo(true, false, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "1.0.0", true); verifyComponentMetaUpdatesXml(); } @@ -344,7 +312,7 @@ private slots: ignoreMessagesForUniteMeta(false); generateRepo(true, true, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "1.0.0", true); verifyUniteMetadata("1.0.0"); } @@ -353,55 +321,136 @@ private slots: ignoreMessagesForUniteMeta(false); generateRepo(false, true, false); - verifyComponentRepository("1.0.0", false); + verifyComponentRepository("1.0.0", "1.0.0", false); verifyUniteMetadata("1.0.0"); } + void testWithComponentShaUpdate() + { + ignoreMessagesForComponentSha(QStringList () << "A" << "B", false); + generateRepo(true, false, false, QStringList () << "A"); + + verifyComponentRepository("1.0.0", "1.0.0", true); + verifyComponentMetaUpdatesXml(); + verifyComponentShaUpdate(1); + } + + void testWithTwoComponentsShaUpdate() + { + ignoreMessagesForComponentSha(QStringList () << "A" << "B", false); + generateRepo(true, false, false, QStringList () << "A" << "B"); + + verifyComponentRepository("1.0.0", "1.0.0", true); + verifyComponentMetaUpdatesXml(); + verifyComponentShaUpdate(2); + } + void testUpdateNewComponents() { // Create 'base' repository which will be updated ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); generateRepo(true, false, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "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); + ignoreMessagesForComponentHash(QStringList() << "A"); ignoreMessagesForCopyMetadata("A", true, true); const QString &message = "Update component \"A\" in \"%1\" ."; - QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repositoryDir))); + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.repositoryDir))); generateRepo(true, false, true); - verifyComponentRepository("2.0.0", true); + verifyComponentRepository("2.0.0", "1.0.0", true); verifyComponentMetaUpdatesXml(); } + void testUpdateNewComponentsWithUniteMetadata() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForUniteMeta(false); + generateRepo(true, true, false); + verifyComponentRepository("1.0.0", "1.0.0", true); + + initRepoUpdate(); + ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); + ignoreMessagesForComponentSha(QStringList() << "A", false); //Only A has update + ignoreMessagesForComponentHash(QStringList() << "A"); + ignoreMessagesForCopyMetadata("A", true, true); + ignoreMessagesForUniteMeta(true); + const QString &message = "Update component \"A\" in \"%1\" ."; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.repositoryDir))); + generateRepo(true, true, true); + verifyComponentRepository("2.0.0", "1.0.0", true); + verifyUniteMetadata("2.0.0"); + } + + void testUpdateNewComponentsWithOnlyUniteMetadata() + { + ignoreMessagesForUniteMeta(false); + generateRepo(false, true, false); + verifyComponentRepository("1.0.0", "1.0.0", false); + + initRepoUpdate(); + ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); + ignoreMessagesForComponentHash(QStringList() << "A"); + ignoreMessagesForCopyMetadata("A", true, true); + ignoreMessagesForUniteMeta(true); + const QString &message = "Update component \"A\" in \"%1\" ."; + QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(m_repoInfo.repositoryDir))); + generateRepo(false, true, true); + verifyComponentRepository("2.0.0", "1.0.0", false); + verifyUniteMetadata("2.0.0"); + } + void testUpdateComponents() { ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); generateRepo(true, false, false); - verifyComponentRepository("1.0.0",true); + verifyComponentRepository("1.0.0", "1.0.0", true); initRepoUpdate(); ignoreMessagesForUpdateComponents(); generateRepo(true, false, false); - verifyComponentRepository("2.0.0", true); + verifyComponentRepository("2.0.0", "1.0.0", true); verifyComponentMetaUpdatesXml(); } + void testUpdateComponentsFromPartialPackageDir() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + ignoreMessagesForUniteMeta(false); + generateRepo(true, true, false); + verifyComponentRepository("1.0.0", "1.0.0", true); + + clearData(); + m_repoInfo.packages << "packages_new"; + { // ignore messages + ignoreMessagesForUniteMeta(false); + ignoreMessageForCollectingPackages(QString(), QString(), "1.0.0"); + ignoreMessagesForComponentSha(QStringList() << "C", true); + ignoreMessagesForCopyMetadata("C", false, false); + ignoreMessagesForComponentHash(QStringList() << "C"); + } + generateRepo(true, true, false); + verifyComponentRepository("1.0.0", "1.0.0", true); + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/C", + QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1" << "1.0.0meta.7z"); + verifyUniteMetadata("1.0.0"); + } + void testUpdateComponentsWithUniteMetadata() { ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); ignoreMessagesForUniteMeta(false); generateRepo(true, true, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "1.0.0", true); initRepoUpdate(); ignoreMessagesForUpdateComponents(); ignoreMessagesForUniteMeta(true); generateRepo(true, true, false); - verifyComponentRepository("2.0.0", true); + verifyComponentRepository("2.0.0", "1.0.0", true); verifyUniteMetadata("2.0.0"); } @@ -409,16 +458,16 @@ private slots: { ignoreMessagesForUniteMeta(false); generateRepo(false, true, false); - verifyComponentRepository("1.0.0", false); + verifyComponentRepository("1.0.0", "1.0.0", false); initRepoUpdate(); ignoreMessageForCollectingPackages("2.0.0", "1.0.0"); - ignoreMessagesForComponentHash(QStringList() << "A" << "B", true); + ignoreMessagesForComponentHash(QStringList() << "A" << "B"); ignoreMessagesForCopyMetadata("A", true, true); ignoreMessagesForCopyMetadata("B", false, true); ignoreMessagesForUniteMeta(true); generateRepo(false, true, false); - verifyComponentRepository("2.0.0", false); + verifyComponentRepository("2.0.0", "1.0.0", false); verifyUniteMetadata("2.0.0"); } @@ -426,17 +475,47 @@ private slots: { ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); generateRepo(true, false, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "1.0.0", true); - initRepoUpdateFromRepository(":///repository_component"); - ignoreMessageForCollectingRepository("repository_component"); + initRepoUpdateFromRepositories(QStringList() << "repository_component"); + ignoreMessageForCollectingRepository(QStringList() << "repository_component"); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"A\" - \"2.0.0\""); QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"B\" - \"1.0.0\""); 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); + verifyComponentRepository("2.0.0", "1.0.0", true); + verifyComponentMetaUpdatesXml(); + } + + void testUpdateComponentsFromMultipleRepositories() + { + ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); + generateRepo(true, false, false); + verifyComponentRepository("1.0.0", "1.0.0", true); + + initRepoUpdateFromRepositories(QStringList() << "test_package_versions/repository_1" + << "test_package_versions/repository_2" << "test_package_versions/repository_3"); + + ignoreMessageForCollectingRepository(QStringList() + << "repository_1" << "repository_2" << "repository_3"); + + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"A\" - \"2.0.0\""); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"B\" - \"1.0.0\""); + + QTest::ignoreMessage(QtDebugMsg, "- it provides an old version of the package \"A\" - \"1.0.0\" - ignored"); + QTest::ignoreMessage(QtDebugMsg, "- it provides an old version of the package \"B\" - \"1.0.0\" - ignored"); + + QTest::ignoreMessage(QtDebugMsg, "- it provides an old version of the package \"A\" - \"1.0.0\" - ignored"); + QTest::ignoreMessage(QtDebugMsg, "- it provides a new version of the package \"B\" - \"3.0.0\" - replaced"); + + ignoreMessagesForCopyRepository("B", "3.0.0", "test_package_versions/repository_3"); + ignoreMessagesForCopyRepository("A", "2.0.0", "test_package_versions/repository_1"); + ignoreMessagesForComponentSha(QStringList() << "A" << "B", true); + generateRepo(true, false, false); + verifyComponentRepository("2.0.0", "3.0.0", true); verifyComponentMetaUpdatesXml(); } @@ -445,10 +524,11 @@ private slots: ignoreMessagesForComponentSha(QStringList() << "A" << "B", false); ignoreMessagesForUniteMeta(false); generateRepo(true, true, false); - verifyComponentRepository("1.0.0", true); + verifyComponentRepository("1.0.0", "1.0.0", true); - initRepoUpdateFromRepository(":///repository_componentAndUnite"); - ignoreMessageForCollectingRepository("repository_componentAndUnite"); + initRepoUpdateFromRepositories(QStringList() << "repository_componentAndUnite"); + ignoreMessageForCollectingRepository(QStringList() << "repository_componentAndUnite"); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"A\" - \"2.0.0\""); QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"C\" - \"1.0.0\""); ignoreMessageForUpdateComponent(); ignoreMessagesForCopyRepository("A", "2.0.0", "repository_componentAndUnite"); @@ -457,8 +537,8 @@ private slots: ignoreMessagesForComponentSha(QStringList() << "A" << "C", true); generateRepo(true, true, true); - verifyComponentRepository("2.0.0", true); - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/C", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1" << "1.0.0meta.7z"); + verifyComponentRepository("2.0.0", "1.0.0", true); + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/C", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1" << "1.0.0meta.7z"); verifyUniteMetadata("2.0.0"); } @@ -466,10 +546,11 @@ private slots: { ignoreMessagesForUniteMeta(false); generateRepo(false, true, false); - verifyComponentRepository("1.0.0", false); + verifyComponentRepository("1.0.0", "1.0.0", false); - initRepoUpdateFromRepository(":///repository_unite"); - ignoreMessageForCollectingRepository("repository_unite"); + initRepoUpdateFromRepositories(QStringList() << "repository_unite"); + ignoreMessageForCollectingRepository(QStringList() << "repository_unite"); + QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"A\" - \"2.0.0\""); QTest::ignoreMessage(QtDebugMsg, "- it provides the package \"C\" - \"1.0.0\""); ignoreMessageForUpdateComponent(); ignoreMessagesForCopyRepository("A", "2.0.0", "repository_unite"); @@ -477,26 +558,23 @@ private slots: ignoreMessagesForUniteMeta(true); generateRepo(false, true, true); - verifyComponentRepository("2.0.0", false); - VerifyInstaller::verifyFileExistence(m_repositoryDir + "/C", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1"); + verifyComponentRepository("2.0.0", "1.0.0", false); + VerifyInstaller::verifyFileExistence(m_repoInfo.repositoryDir + "/C", QStringList() << "1.0.0content.7z" << "1.0.0content.7z.sha1"); verifyUniteMetadata("2.0.0"); } void cleanup() { m_tempDirDeleter.releaseAndDeleteAll(); - m_packagesDirectories.clear(); + m_repoInfo.packages.clear(); m_packages.clear(); - m_repositoryDirectories.clear(); + m_repoInfo.repositoryPackages.clear(); } private: - QString m_tmpMetaDir; - QString m_repositoryDir; - QStringList m_packagesDirectories; - QStringList m_repositoryDirectories; + QInstallerTools::RepositoryInfo m_repoInfo; QInstallerTools::PackageInfoVector m_packages; - TempDirDeleter m_tempDirDeleter; + TempPathDeleter m_tempDirDeleter; }; QTEST_MAIN(tst_repotest) |