File indexing completed on 2024-05-12 05:50:10
0001 /* 0002 SPDX-FileCopyrightText: 2016 Elvis Angelaccio <elvis.angelaccio@kde.org> 0003 0004 SPDX-License-Identifier: BSD-2-Clause 0005 */ 0006 0007 #include "addtoarchive.h" 0008 #include "jobs.h" 0009 #include "pluginmanager.h" 0010 #include "testhelper.h" 0011 0012 #include <QMimeDatabase> 0013 #include <QStandardPaths> 0014 #include <QTest> 0015 0016 using namespace Kerfuffle; 0017 0018 void initLocale() 0019 { 0020 qputenv("LANG", "en_US"); 0021 } 0022 0023 Q_CONSTRUCTOR_FUNCTION(initLocale) 0024 0025 class AddToArchiveTest : public QObject 0026 { 0027 Q_OBJECT 0028 0029 private Q_SLOTS: 0030 0031 void init(); 0032 void testCompressHere_data(); 0033 void testCompressHere(); 0034 }; 0035 0036 void AddToArchiveTest::init() 0037 { 0038 // The test needs an empty subfolder, but git doesn't support tracking of empty directories. 0039 QDir(QFINDTESTDATA("data/testdirwithemptysubdir")).mkdir(QStringLiteral("emptydir")); 0040 } 0041 0042 void AddToArchiveTest::testCompressHere_data() 0043 { 0044 QTest::addColumn<QString>("expectedSuffix"); 0045 QTest::addColumn<Archive::EncryptionType>("expectedEncryptionType"); 0046 QTest::addColumn<QStringList>("inputFiles"); 0047 QTest::addColumn<QString>("expectedArchiveName"); 0048 QTest::addColumn<qulonglong>("expectedNumberOfEntries"); 0049 0050 QTest::newRow("compress here (as TAR) - dir with files") 0051 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir")} << QStringLiteral("testdir.tar.gz") << 3ULL; 0052 0053 QTest::newRow("compress here (as TAR) - dir with subdirs") 0054 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithsubdirs")} 0055 << QStringLiteral("testdirwithsubdirs.tar.gz") << 8ULL; 0056 0057 QTest::newRow("compress here (as TAR) - dir with empty subdir") 0058 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithemptysubdir")} 0059 << QStringLiteral("testdirwithemptysubdir.tar.gz") << 4ULL; 0060 0061 QTest::newRow("compress here (as TAR) - single file") 0062 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testfile.txt")} << QStringLiteral("testfile.tar.gz") << 1ULL; 0063 0064 QTest::newRow("compress here (as TAR) - file + folder") 0065 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir"), QFINDTESTDATA("data/testfile.txt")} 0066 << QStringLiteral("Archive.tar.gz") << 4ULL; 0067 0068 QTest::newRow("compress here (as TAR) - files with same prefix") 0069 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/textfile1.txt"), QFINDTESTDATA("data/textfile2.txt")} 0070 << QStringLiteral("textfile.tar.gz") << 2ULL; 0071 0072 QTest::newRow("compress here (as TAR) - files with same base name") 0073 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testfile.txt"), QFINDTESTDATA("data/testfile.md")} 0074 << QStringLiteral("testfile.tar.gz") << 2ULL; 0075 0076 QTest::newRow("compress here (as TAR) - files with same prefix too short") 0077 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testfile.txt"), QFINDTESTDATA("data/textfile2.txt")} 0078 << QStringLiteral("Archive.tar.gz") << 2ULL; 0079 0080 QTest::newRow("compress here (as TAR) - bug #362690") 0081 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/test-3.4.0")} << QStringLiteral("test-3.4.0.tar.gz") << 2ULL; 0082 0083 QTest::newRow("compress here (as TAR) - files with mimetypes but no extension (no infinite loop)") 0084 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/Makefile"), QFINDTESTDATA("data/README")} 0085 << QStringLiteral("Archive.tar.gz") << 2ULL; 0086 0087 if (!PluginManager().preferredWritePluginsFor(QMimeDatabase().mimeTypeForName(QStringLiteral("application/zip"))).isEmpty()) { 0088 QTest::newRow("compress here (as ZIP) - dir with files") 0089 << QStringLiteral("zip") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir")} << QStringLiteral("testdir.zip") << 3ULL; 0090 0091 QTest::newRow("compress here (as ZIP) - dir with subdirs") 0092 << QStringLiteral("zip") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithsubdirs")} 0093 << QStringLiteral("testdirwithsubdirs.zip") << 8ULL; 0094 0095 QTest::newRow("compress here (as ZIP) - dir with empty subdir") 0096 << QStringLiteral("zip") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithemptysubdir")} 0097 << QStringLiteral("testdirwithemptysubdir.zip") << 4ULL; 0098 0099 QTest::newRow("compress here (as ZIP) - single file") 0100 << QStringLiteral("zip") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testfile.txt")} << QStringLiteral("testfile.zip") << 1ULL; 0101 0102 QTest::newRow("compress here (as ZIP) - file + folder") 0103 << QStringLiteral("zip") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir"), QFINDTESTDATA("data/testfile.txt")} 0104 << QStringLiteral("Archive.zip") << 4ULL; 0105 0106 QTest::newRow("compress here (as TAR) - dir with special name (see #365798)") 0107 << QStringLiteral("tar.gz") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/test%dir")} << QStringLiteral("test%dir.tar.gz") << 3ULL; 0108 0109 } else { 0110 qDebug() << "7z/zip executable not found in path. Skipping compress-here-(ZIP) tests."; 0111 } 0112 0113 if (!PluginManager().preferredWritePluginsFor(QMimeDatabase().mimeTypeForName(QStringLiteral("application/vnd.rar"))).isEmpty()) { 0114 QTest::newRow("compress here (as RAR) - dir with files") 0115 << QStringLiteral("rar") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir")} << QStringLiteral("testdir.rar") << 3ULL; 0116 0117 QTest::newRow("compress here (as RAR) - dir with subdirs") 0118 << QStringLiteral("rar") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithsubdirs")} 0119 << QStringLiteral("testdirwithsubdirs.rar") << 8ULL; 0120 0121 QTest::newRow("compress here (as RAR) - dir with empty subdir") 0122 << QStringLiteral("rar") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdirwithemptysubdir")} 0123 << QStringLiteral("testdirwithemptysubdir.rar") << 4ULL; 0124 0125 QTest::newRow("compress here (as RAR) - single file") 0126 << QStringLiteral("rar") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testfile.txt")} << QStringLiteral("testfile.rar") << 1ULL; 0127 0128 QTest::newRow("compress here (as RAR) - file + folder") 0129 << QStringLiteral("rar") << Archive::Unencrypted << QStringList{QFINDTESTDATA("data/testdir"), QFINDTESTDATA("data/testfile.txt")} 0130 << QStringLiteral("Archive.rar") << 4ULL; 0131 0132 QTest::newRow("compress to encrypted RAR - file + folder") 0133 << QStringLiteral("rar") << Archive::Encrypted << QStringList{QFINDTESTDATA("data/testdir"), QFINDTESTDATA("data/testfile.txt")} 0134 << QStringLiteral("Archive.rar") << 4ULL; 0135 } else { 0136 qDebug() << "rar executable not found in path. Skipping compress-here-(RAR) tests."; 0137 } 0138 } 0139 0140 void AddToArchiveTest::testCompressHere() 0141 { 0142 AddToArchive *addToArchiveJob = new AddToArchive(this); 0143 addToArchiveJob->setChangeToFirstPath(true); 0144 0145 QFETCH(QString, expectedSuffix); 0146 addToArchiveJob->setAutoFilenameSuffix(expectedSuffix); 0147 0148 QFETCH(Archive::EncryptionType, expectedEncryptionType); 0149 if (expectedEncryptionType == Archive::Encrypted) { 0150 addToArchiveJob->setPassword(QStringLiteral("1234")); 0151 } 0152 0153 QFETCH(QStringList, inputFiles); 0154 for (const QString &file : std::as_const(inputFiles)) { 0155 addToArchiveJob->addInput(QUrl::fromUserInput(file)); 0156 } 0157 0158 // Run the job. 0159 TestHelper::startAndWaitForResult(addToArchiveJob); 0160 0161 // Check the properties of the generated test archive, then remove it. 0162 QFETCH(QString, expectedArchiveName); 0163 QCOMPARE(addToArchiveJob->fileName().section(QLatin1Char('/'), -1), expectedArchiveName); 0164 0165 auto loadJob = Archive::load(QFINDTESTDATA(QStringLiteral("data/%1").arg(expectedArchiveName))); 0166 QVERIFY(loadJob); 0167 loadJob->setAutoDelete(false); 0168 0169 TestHelper::startAndWaitForResult(loadJob); 0170 auto archive = loadJob->archive(); 0171 0172 QVERIFY(archive); 0173 QVERIFY(archive->isValid()); 0174 QCOMPARE(QString(archive->completeBaseName() + QLatin1Char('.') + expectedSuffix), expectedArchiveName); 0175 0176 QCOMPARE(archive->encryptionType(), expectedEncryptionType); 0177 0178 QFETCH(qulonglong, expectedNumberOfEntries); 0179 QCOMPARE(archive->numberOfEntries(), expectedNumberOfEntries); 0180 0181 QVERIFY(QFile(archive->fileName()).remove()); 0182 0183 loadJob->deleteLater(); 0184 archive->deleteLater(); 0185 } 0186 0187 QTEST_MAIN(AddToArchiveTest) 0188 0189 #include "addtoarchivetest.moc"