File indexing completed on 2023-09-24 04:10:26
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"