File indexing completed on 2024-05-12 05:50:10

0001 /*
0002     SPDX-FileCopyrightText: 2016 Vladyslav Batyrenko <mvlabat@gmail.com>
0003 
0004     SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 
0007 #include "abstractaddtest.h"
0008 #include "archiveentry.h"
0009 #include "jobs.h"
0010 #include "testhelper.h"
0011 
0012 #include <QTest>
0013 
0014 using namespace Kerfuffle;
0015 
0016 class CopyTest : public AbstractAddTest
0017 {
0018     Q_OBJECT
0019 
0020 public:
0021     CopyTest()
0022         : AbstractAddTest()
0023     {
0024     }
0025 
0026 private Q_SLOTS:
0027     void testCopying_data();
0028     void testCopying();
0029 };
0030 
0031 QTEST_GUILESS_MAIN(CopyTest)
0032 
0033 void CopyTest::testCopying_data()
0034 {
0035     QTest::addColumn<QString>("archiveName");
0036     QTest::addColumn<Plugin *>("plugin");
0037     QTest::addColumn<QVector<Archive::Entry *>>("targetEntries");
0038     QTest::addColumn<Archive::Entry *>("destination");
0039     QTest::addColumn<QStringList>("expectedNewPaths");
0040     QTest::addColumn<uint>("numberOfEntries");
0041 
0042     setupRows(QStringLiteral("copy a single file"),
0043               QStringLiteral("test"),
0044               QVector<Archive::Entry *>{
0045                   new Archive::Entry(this, QStringLiteral("a.txt")),
0046               },
0047               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0048               QStringList{QStringLiteral("empty_dir/a.txt")},
0049               14);
0050 
0051     setupRows(QStringLiteral("copy several files"),
0052               QStringLiteral("test"),
0053               QVector<Archive::Entry *>{new Archive::Entry(this, QStringLiteral("a.txt")), new Archive::Entry(this, QStringLiteral("b.txt"))},
0054               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0055               QStringList{
0056                   QStringLiteral("empty_dir/a.txt"),
0057                   QStringLiteral("empty_dir/b.txt"),
0058               },
0059               15);
0060 
0061     setupRows(QStringLiteral("copy a root directory"),
0062               QStringLiteral("test"),
0063               QVector<Archive::Entry *>{
0064                   new Archive::Entry(this, QStringLiteral("dir1/")),
0065                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0066                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0067                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0068                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0069                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0070               },
0071               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0072               QStringList{
0073                   QStringLiteral("empty_dir/dir1/"),
0074                   QStringLiteral("empty_dir/dir1/dir/"),
0075                   QStringLiteral("empty_dir/dir1/dir/a.txt"),
0076                   QStringLiteral("empty_dir/dir1/dir/b.txt"),
0077                   QStringLiteral("empty_dir/dir1/a.txt"),
0078                   QStringLiteral("empty_dir/dir1/b.txt"),
0079               },
0080               19);
0081 
0082     setupRows(QStringLiteral("copy a root directory 2"),
0083               QStringLiteral("test"),
0084               QVector<Archive::Entry *>{
0085                   new Archive::Entry(this, QStringLiteral("dir2/")),
0086                   new Archive::Entry(this, QStringLiteral("dir2/dir/")),
0087                   new Archive::Entry(this, QStringLiteral("dir2/dir/a.txt")),
0088                   new Archive::Entry(this, QStringLiteral("dir2/dir/b.txt")),
0089               },
0090               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0091               QStringList{
0092                   QStringLiteral("empty_dir/dir2/"),
0093                   QStringLiteral("empty_dir/dir2/dir/"),
0094                   QStringLiteral("empty_dir/dir2/dir/a.txt"),
0095                   QStringLiteral("empty_dir/dir2/dir/b.txt"),
0096               },
0097               17);
0098 
0099     setupRows(QStringLiteral("copy a root directory 3"),
0100               QStringLiteral("test"),
0101               QVector<Archive::Entry *>{
0102                   new Archive::Entry(this, QStringLiteral("dir2/")),
0103                   new Archive::Entry(this, QStringLiteral("dir2/dir/")),
0104                   new Archive::Entry(this, QStringLiteral("dir2/dir/a.txt")),
0105                   new Archive::Entry(this, QStringLiteral("dir2/dir/b.txt")),
0106               },
0107               new Archive::Entry(this, QStringLiteral("dir1/")),
0108               QStringList{
0109                   QStringLiteral("dir1/dir2/"),
0110                   QStringLiteral("dir1/dir2/dir/"),
0111                   QStringLiteral("dir1/dir2/dir/a.txt"),
0112                   QStringLiteral("dir1/dir2/dir/b.txt"),
0113               },
0114               17);
0115 
0116     setupRows(QStringLiteral("copy a directory"),
0117               QStringLiteral("test"),
0118               QVector<Archive::Entry *>{
0119                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0120                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0121                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0122               },
0123               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0124               QStringList{QStringLiteral("empty_dir/dir/"), QStringLiteral("empty_dir/dir/a.txt"), QStringLiteral("empty_dir/dir/b.txt")},
0125               16);
0126 
0127     setupRows(QStringLiteral("copy several directories"),
0128               QStringLiteral("test"),
0129               QVector<Archive::Entry *>{
0130                   new Archive::Entry(this, QStringLiteral("dir1/")),
0131                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0132                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0133                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0134                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0135                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0136                   new Archive::Entry(this, QStringLiteral("dir2/")),
0137                   new Archive::Entry(this, QStringLiteral("dir2/dir/")),
0138                   new Archive::Entry(this, QStringLiteral("dir2/dir/a.txt")),
0139                   new Archive::Entry(this, QStringLiteral("dir2/dir/b.txt")),
0140               },
0141               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0142               QStringList{
0143                   QStringLiteral("empty_dir/dir1/"),
0144                   QStringLiteral("empty_dir/dir1/dir/"),
0145                   QStringLiteral("empty_dir/dir1/dir/a.txt"),
0146                   QStringLiteral("empty_dir/dir1/dir/b.txt"),
0147                   QStringLiteral("empty_dir/dir1/a.txt"),
0148                   QStringLiteral("empty_dir/dir1/b.txt"),
0149                   QStringLiteral("empty_dir/dir2/"),
0150                   QStringLiteral("empty_dir/dir2/dir/"),
0151                   QStringLiteral("empty_dir/dir2/dir/a.txt"),
0152                   QStringLiteral("empty_dir/dir2/dir/b.txt"),
0153               },
0154               23);
0155 
0156     setupRows(QStringLiteral("copy several entries"),
0157               QStringLiteral("test"),
0158               QVector<Archive::Entry *>{
0159                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0160                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0161                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0162                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0163                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0164               },
0165               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0166               QStringList{
0167                   QStringLiteral("empty_dir/dir/"),
0168                   QStringLiteral("empty_dir/dir/a.txt"),
0169                   QStringLiteral("empty_dir/dir/b.txt"),
0170                   QStringLiteral("empty_dir/a.txt"),
0171                   QStringLiteral("empty_dir/b.txt"),
0172               },
0173               18);
0174 
0175     setupRows(QStringLiteral("copy a directory inside itself"),
0176               QStringLiteral("test"),
0177               QVector<Archive::Entry *>{
0178                   new Archive::Entry(this, QStringLiteral("dir1/")),
0179                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0180                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0181                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0182                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0183                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0184               },
0185               new Archive::Entry(this, QStringLiteral("dir1/")),
0186               QStringList{
0187                   QStringLiteral("dir1/dir1/"),
0188                   QStringLiteral("dir1/dir1/dir/"),
0189                   QStringLiteral("dir1/dir1/dir/a.txt"),
0190                   QStringLiteral("dir1/dir1/dir/b.txt"),
0191                   QStringLiteral("dir1/dir1/a.txt"),
0192                   QStringLiteral("dir1/dir1/b.txt"),
0193               },
0194               19);
0195 
0196     setupRows(QStringLiteral("copy a directory to the root"),
0197               QStringLiteral("test"),
0198               QVector<Archive::Entry *>{
0199                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0200                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0201                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0202               },
0203               new Archive::Entry(this, QString()),
0204               QStringList{
0205                   QStringLiteral("dir/"),
0206                   QStringLiteral("dir/a.txt"),
0207                   QStringLiteral("dir/b.txt"),
0208               },
0209               16);
0210 }
0211 
0212 void CopyTest::testCopying()
0213 {
0214     QTemporaryDir temporaryDir;
0215 
0216     QFETCH(QString, archiveName);
0217     const QString archivePath = temporaryDir.path() + QLatin1Char('/') + archiveName;
0218     QVERIFY(QFile::copy(QFINDTESTDATA(QStringLiteral("data/") + archiveName), archivePath));
0219 
0220     QFETCH(Plugin *, plugin);
0221     QVERIFY(plugin);
0222 
0223     auto loadJob = Archive::load(archivePath, plugin);
0224     QVERIFY(loadJob);
0225     loadJob->setAutoDelete(false);
0226 
0227     TestHelper::startAndWaitForResult(loadJob);
0228     auto archive = loadJob->archive();
0229     QVERIFY(archive);
0230     // This job needs to be delete before the CopyJob starts.
0231     delete loadJob;
0232 
0233     if (!archive->isValid()) {
0234         QSKIP("Could not find a plugin to handle the archive. Skipping test.", SkipSingle);
0235     }
0236 
0237     QFETCH(QVector<Archive::Entry *>, targetEntries);
0238     QFETCH(Archive::Entry *, destination);
0239     QFETCH(QStringList, expectedNewPaths);
0240 
0241     // Retrieve current paths in the archive.
0242     QStringList oldPaths = getEntryPaths(archive);
0243 
0244     // Check that the entries to be copied are in the archive.
0245     for (const auto entry : std::as_const(targetEntries)) {
0246         QVERIFY(oldPaths.contains(entry->fullPath()));
0247     }
0248 
0249     // Check that the expected paths (after the CopyJob) are not in the archive.
0250     for (const auto &expectedPath : std::as_const(expectedNewPaths)) {
0251         QVERIFY(!oldPaths.contains(expectedPath));
0252     }
0253 
0254     CompressionOptions options;
0255     options.setGlobalWorkDir(QFINDTESTDATA("data"));
0256     CopyJob *copyJob = archive->copyFiles(targetEntries, destination, options);
0257     TestHelper::startAndWaitForResult(copyJob);
0258 
0259     // Retrieve the resulting paths.
0260     QStringList newPaths = getEntryPaths(archive);
0261 
0262     // Check that the expected paths are now in the archive.
0263     for (const auto &path : std::as_const(expectedNewPaths)) {
0264         QVERIFY(newPaths.contains(path));
0265     }
0266 
0267     // Check also that the target paths are still in the archive.
0268     for (const auto entry : std::as_const(targetEntries)) {
0269         QVERIFY(newPaths.contains(entry->fullPath()));
0270     }
0271 
0272     QFETCH(uint, numberOfEntries);
0273     QCOMPARE(archive->numberOfEntries(), numberOfEntries);
0274 
0275     archive->deleteLater();
0276 }
0277 
0278 #include "copytest.moc"