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"