Warning, file /frameworks/knewstuff/autotests/core/installationtest.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     This file is part of KNewStuff3
0003     SPDX-FileCopyrightText: 2021 Alexander Lohnau <alexander.lohnau@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include <KSharedConfig>
0009 #include <QDir>
0010 #include <QRegularExpression>
0011 #include <QSignalSpy>
0012 #include <QTest>
0013 #include <QtGlobal>
0014 
0015 #include "entryinternal.h"
0016 #include "installation.h"
0017 #include "itemsmodel.h"
0018 #include "questionmanager.h"
0019 
0020 using namespace KNSCore;
0021 
0022 class InstallationTest : public QObject
0023 {
0024     Q_OBJECT
0025 public:
0026     Installation *installation = nullptr;
0027     const QString dataDir = QStringLiteral(DATA_DIR);
0028 
0029 private Q_SLOTS:
0030     void initTestCase();
0031     void cleanupTestCase();
0032     void testConfigFileReading();
0033     void testInstallCommand();
0034     void testInstallCommandArchive();
0035     void testInstallCommandTopLevelFilesInArchive();
0036     void testUninstallCommand();
0037     void testUninstallCommandDirectory();
0038     void testCopyError();
0039 };
0040 
0041 void InstallationTest::initTestCase()
0042 {
0043     // Just in case a previous test crashed
0044     cleanupTestCase();
0045     qRegisterMetaType<EntryInternal>();
0046     QStandardPaths::setTestModeEnabled(true);
0047     installation = new Installation(this);
0048     KConfigGroup grp = KSharedConfig::openConfig(dataDir + "installationtest.knsrc")->group("KNewStuff3");
0049     QVERIFY(installation->readConfig(grp));
0050     connect(KNSCore::QuestionManager::instance(), &KNSCore::QuestionManager::askQuestion, this, [](KNSCore::Question *q) {
0051         q->setResponse(KNSCore::Question::YesResponse);
0052     });
0053 }
0054 
0055 void InstallationTest::cleanupTestCase()
0056 {
0057     QFile::remove("installed.txt");
0058     QFile::remove("uninstalled.txt");
0059     const QString dataPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "demo/", QStandardPaths::LocateDirectory);
0060     if (!dataPath.isEmpty()) {
0061         QDir(dataPath).removeRecursively();
0062     }
0063 }
0064 
0065 void InstallationTest::testConfigFileReading()
0066 {
0067     QCOMPARE(installation->uncompressionSetting(), Installation::UncompressIntoSubdirIfArchive);
0068     const QString actualPath = installation->targetInstallationPath();
0069     const QString expectedPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/demo/";
0070     QCOMPARE(actualPath, expectedPath);
0071 }
0072 
0073 void InstallationTest::testInstallCommand()
0074 {
0075     EntryInternal entry;
0076     entry.setUniqueId("0");
0077     entry.setPayload(QUrl::fromLocalFile(QFINDTESTDATA("data/testfile.txt")).toString());
0078     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0079     installation->install(entry);
0080     QVERIFY(spy.wait());
0081     QCOMPARE(entry.status(), KNS3::Entry::Installed);
0082     QVERIFY(QFileInfo::exists("installed.txt"));
0083 }
0084 
0085 void InstallationTest::testUninstallCommand()
0086 {
0087     EntryInternal entry;
0088     entry.setUniqueId("0");
0089     QFile file("testFile.txt");
0090     file.open(QIODevice::WriteOnly);
0091     file.close();
0092     entry.setStatus(KNS3::Entry::Installed);
0093     entry.setInstalledFiles(QStringList(file.fileName()));
0094     QVERIFY(QFileInfo(file).exists());
0095     QVERIFY(!QFileInfo::exists("uninstalled.txt"));
0096 
0097     installation->uninstall(entry);
0098     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0099     QVERIFY(spy.wait());
0100     QCOMPARE(entry.status(), KNS3::Entry::Deleted);
0101     QVERIFY(!QFileInfo(file).exists());
0102     QVERIFY(QFileInfo::exists("uninstalled.txt"));
0103 }
0104 
0105 void InstallationTest::testUninstallCommandDirectory()
0106 {
0107     static const QLatin1String testDir{"testDirectory"};
0108 
0109     // This will be left over from the previous test, so clean it up first
0110     QFile::remove("uninstalled.txt");
0111 
0112     EntryInternal entry;
0113     entry.setUniqueId("0");
0114     QDir().mkdir(testDir);
0115     entry.setStatus(KNS3::Entry::Installed);
0116     entry.setInstalledFiles(QStringList(testDir));
0117     QVERIFY(QFileInfo::exists(testDir));
0118     QVERIFY(!QFileInfo::exists("uninstalled.txt"));
0119 
0120     installation->uninstall(entry);
0121     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0122     QVERIFY(spy.wait());
0123     QCOMPARE(entry.status(), KNS3::Entry::Deleted);
0124     QVERIFY(!QFileInfo::exists(testDir));
0125     QVERIFY(QFileInfo::exists("uninstalled.txt"));
0126 }
0127 
0128 void InstallationTest::testInstallCommandArchive()
0129 {
0130     EntryInternal entry;
0131     entry.setUniqueId("0");
0132     entry.setStatus(KNS3::Entry::Downloadable);
0133     entry.setPayload(QUrl::fromLocalFile(QFINDTESTDATA("data/archive_dir.tar.gz")).toString());
0134 
0135     installation->install(entry);
0136     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0137     QVERIFY(spy.wait());
0138 
0139     QCOMPARE(entry.installedFiles().count(), 1);
0140     const QString file = entry.installedFiles().constFirst();
0141     const QFileInfo fileInfo(QStandardPaths::locate(QStandardPaths::GenericDataLocation, "demo/data", QStandardPaths::LocateDirectory));
0142     QCOMPARE(file, fileInfo.absoluteFilePath() + "/*");
0143     QVERIFY(fileInfo.exists());
0144     QVERIFY(fileInfo.isDir());
0145 
0146     // Check if the files that are in the archive exist
0147     const QStringList files = QDir(fileInfo.absoluteFilePath()).entryList(QDir::Filter::Files | QDir::Filter::NoDotAndDotDot);
0148     QCOMPARE(files, QStringList({"test1.txt", "test2.txt"}));
0149 }
0150 
0151 void InstallationTest::testInstallCommandTopLevelFilesInArchive()
0152 {
0153     EntryInternal entry;
0154     entry.setUniqueId("0");
0155     entry.setStatus(KNS3::Entry::Downloadable);
0156     entry.setPayload(QUrl::fromLocalFile(QFINDTESTDATA("data/archive_toplevel_files.tar.gz")).toString());
0157 
0158     installation->install(entry);
0159     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0160     QVERIFY(spy.wait());
0161 
0162     QCOMPARE(entry.installedFiles().count(), 1);
0163     const QString file = entry.installedFiles().constFirst();
0164     QVERIFY(file.endsWith("/*"));
0165 
0166     // The file is given a random name, so we can't easily check that
0167     const QFileInfo fileOnDisk(file.left(file.size() - 2));
0168     QVERIFY(fileOnDisk.exists());
0169     QVERIFY(fileOnDisk.isDir());
0170     // The by checking the parent dir we can check if it is properly in a subdir uncompressed
0171     QCOMPARE(fileOnDisk.absoluteDir().path(), QStandardPaths::locate(QStandardPaths::GenericDataLocation, "demo", QStandardPaths::LocateDirectory));
0172     // Check if the files that are in the archive exist
0173     const QStringList files = QDir(fileOnDisk.absoluteFilePath()).entryList(QDir::Filter::Files | QDir::Filter::NoDotAndDotDot);
0174     QCOMPARE(files, QStringList({"test1.txt", "test2.txt"}));
0175 }
0176 
0177 void InstallationTest::testCopyError()
0178 {
0179     EntryInternal entry;
0180     entry.setUniqueId("0");
0181     entry.setPayload(QUrl::fromLocalFile(QStringLiteral("data/does_not_exist.txt")).toString());
0182     QSignalSpy spy(installation, &Installation::signalEntryChanged);
0183     QSignalSpy errorSpy(installation, &Installation::signalInstallationFailed);
0184     QTest::ignoreMessage(QtWarningMsg, QRegularExpression("Download of .* failed, error: Could not open data/does_not_exist.txt for reading"));
0185     installation->install(entry);
0186     QVERIFY(errorSpy.wait());
0187     QCOMPARE(spy.count(), 0);
0188     QCOMPARE(int(entry.status()), int(KNS3::Entry::Invalid));
0189 }
0190 
0191 QTEST_MAIN(InstallationTest)
0192 
0193 #include "installationtest.moc"