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

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 MoveTest : public AbstractAddTest
0017 {
0018     Q_OBJECT
0019 
0020 public:
0021     MoveTest()
0022         : AbstractAddTest()
0023     {
0024     }
0025 
0026 private Q_SLOTS:
0027     void testMoving_data();
0028     void testMoving();
0029 };
0030 
0031 QTEST_GUILESS_MAIN(MoveTest)
0032 
0033 void MoveTest::testMoving_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("replace 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/a.txt")),
0048               QStringList{QStringLiteral("empty_dir/a.txt")},
0049               13);
0050 
0051     setupRows(QStringLiteral("replace several files"),
0052               QStringLiteral("test"),
0053               QVector<Archive::Entry *>{
0054                   new Archive::Entry(this, QStringLiteral("a.txt")),
0055                   new Archive::Entry(this, QStringLiteral("b.txt")),
0056               },
0057               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0058               QStringList{QStringLiteral("empty_dir/a.txt"), QStringLiteral("empty_dir/b.txt")},
0059               13);
0060 
0061     setupRows(QStringLiteral("replace a root directory"),
0062               QStringLiteral("test"),
0063               QVector<Archive::Entry *>{
0064                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0065                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0066                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0067                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0068                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0069               },
0070               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0071               QStringList{QStringLiteral("empty_dir/a.txt"),
0072                           QStringLiteral("empty_dir/b.txt"),
0073                           QStringLiteral("empty_dir/dir/"),
0074                           QStringLiteral("empty_dir/dir/a.txt"),
0075                           QStringLiteral("empty_dir/dir/b.txt")},
0076               13);
0077 
0078     setupRows(QStringLiteral("replace a root directory 2"),
0079               QStringLiteral("test"),
0080               QVector<Archive::Entry *>{
0081                   new Archive::Entry(this, QStringLiteral("dir2/dir/")),
0082                   new Archive::Entry(this, QStringLiteral("dir2/dir/a.txt")),
0083                   new Archive::Entry(this, QStringLiteral("dir2/dir/b.txt")),
0084               },
0085               new Archive::Entry(this, QStringLiteral("empty_dir/dir/")),
0086               QStringList{QStringLiteral("empty_dir/dir/"), QStringLiteral("empty_dir/dir/a.txt"), QStringLiteral("empty_dir/dir/b.txt")},
0087               13);
0088 
0089     setupRows(QStringLiteral("replace a directory"),
0090               QStringLiteral("test"),
0091               QVector<Archive::Entry *>{
0092                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0093                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0094                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0095               },
0096               new Archive::Entry(this, QStringLiteral("empty_dir/dir/")),
0097               QStringList{QStringLiteral("empty_dir/dir/"), QStringLiteral("empty_dir/dir/a.txt"), QStringLiteral("empty_dir/dir/b.txt")},
0098               13);
0099 
0100     setupRows(QStringLiteral("replace several directories"),
0101               QStringLiteral("test"),
0102               QVector<Archive::Entry *>{
0103                   new Archive::Entry(this, QStringLiteral("dir1/")),
0104                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0105                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0106                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0107                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0108                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0109                   new Archive::Entry(this, QStringLiteral("dir2/")),
0110                   new Archive::Entry(this, QStringLiteral("dir2/dir/")),
0111                   new Archive::Entry(this, QStringLiteral("dir2/dir/a.txt")),
0112                   new Archive::Entry(this, QStringLiteral("dir2/dir/b.txt")),
0113               },
0114               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0115               QStringList{
0116                   QStringLiteral("empty_dir/dir1/"),
0117                   QStringLiteral("empty_dir/dir1/a.txt"),
0118                   QStringLiteral("empty_dir/dir1/b.txt"),
0119                   QStringLiteral("empty_dir/dir1/dir/"),
0120                   QStringLiteral("empty_dir/dir1/dir/a.txt"),
0121                   QStringLiteral("empty_dir/dir1/dir/b.txt"),
0122                   QStringLiteral("empty_dir/dir2/"),
0123                   QStringLiteral("empty_dir/dir2/dir/"),
0124                   QStringLiteral("empty_dir/dir2/dir/a.txt"),
0125                   QStringLiteral("empty_dir/dir2/dir/b.txt"),
0126               },
0127               13);
0128 
0129     setupRows(QStringLiteral("replace several entries"),
0130               QStringLiteral("test"),
0131               QVector<Archive::Entry *>{
0132                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0133                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0134                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0135                   new Archive::Entry(this, QStringLiteral("dir1/a.txt")),
0136                   new Archive::Entry(this, QStringLiteral("dir1/b.txt")),
0137               },
0138               new Archive::Entry(this, QStringLiteral("empty_dir/")),
0139               QStringList{
0140                   QStringLiteral("empty_dir/dir/"),
0141                   QStringLiteral("empty_dir/dir/a.txt"),
0142                   QStringLiteral("empty_dir/dir/b.txt"),
0143                   QStringLiteral("empty_dir/a.txt"),
0144                   QStringLiteral("empty_dir/b.txt"),
0145               },
0146               13);
0147 
0148     setupRows(QStringLiteral("move a directory to the root"),
0149               QStringLiteral("test"),
0150               QVector<Archive::Entry *>{
0151                   new Archive::Entry(this, QStringLiteral("dir1/dir/")),
0152                   new Archive::Entry(this, QStringLiteral("dir1/dir/a.txt")),
0153                   new Archive::Entry(this, QStringLiteral("dir1/dir/b.txt")),
0154               },
0155               new Archive::Entry(this, QStringLiteral("dir/")),
0156               QStringList{QStringLiteral("dir/"), QStringLiteral("dir/a.txt"), QStringLiteral("dir/b.txt")},
0157               13);
0158 
0159     setupRows(QStringLiteral("rename a file in the root (bug #368530)"),
0160               QStringLiteral("test"),
0161               QVector<Archive::Entry *>{new Archive::Entry(this, QStringLiteral("a.txt"))},
0162               new Archive::Entry(this, QStringLiteral("new-name.txt")),
0163               QStringList{QStringLiteral("new-name.txt")},
0164               13);
0165 }
0166 
0167 void MoveTest::testMoving()
0168 {
0169     QTemporaryDir temporaryDir;
0170 
0171     QFETCH(QString, archiveName);
0172     const QString archivePath = temporaryDir.path() + QLatin1Char('/') + archiveName;
0173     QVERIFY(QFile::copy(QFINDTESTDATA(QStringLiteral("data/") + archiveName), archivePath));
0174 
0175     QFETCH(Plugin *, plugin);
0176     QVERIFY(plugin);
0177 
0178     auto loadJob = Archive::load(archivePath, plugin);
0179     QVERIFY(loadJob);
0180     loadJob->setAutoDelete(false);
0181 
0182     TestHelper::startAndWaitForResult(loadJob);
0183     auto archive = loadJob->archive();
0184     QVERIFY(archive);
0185 
0186     if (!archive->isValid()) {
0187         QSKIP("Could not find a plugin to handle the archive. Skipping test.", SkipSingle);
0188     }
0189 
0190     QFETCH(QVector<Archive::Entry *>, targetEntries);
0191     QFETCH(Archive::Entry *, destination);
0192     QFETCH(QStringList, expectedNewPaths);
0193 
0194     // Retrieve current paths in the archive.
0195     QStringList oldPaths = getEntryPaths(archive);
0196 
0197     // Check that the entries to be moved are in the archive.
0198     for (const auto entry : std::as_const(targetEntries)) {
0199         QVERIFY(oldPaths.contains(entry->fullPath()));
0200     }
0201 
0202     // Check that the expected paths (after the MoveJob) are not in the archive.
0203     for (const auto &expectedPath : std::as_const(expectedNewPaths)) {
0204         QVERIFY(!oldPaths.contains(expectedPath));
0205     }
0206 
0207     CompressionOptions options;
0208     options.setGlobalWorkDir(QFINDTESTDATA("data"));
0209     MoveJob *moveJob = archive->moveFiles(targetEntries, destination, options);
0210     TestHelper::startAndWaitForResult(moveJob);
0211 
0212     // Retrieve the resulting paths.
0213     QStringList newPaths = getEntryPaths(archive);
0214 
0215     // Check that the expected paths are now in the archive.
0216     for (const auto &path : std::as_const(expectedNewPaths)) {
0217         QVERIFY(newPaths.contains(path));
0218     }
0219 
0220     // Check that the target paths are no longer in the archive.
0221     for (const auto entry : std::as_const(targetEntries)) {
0222         QVERIFY(!newPaths.contains(entry->fullPath()));
0223     }
0224 
0225     QFETCH(uint, numberOfEntries);
0226     QCOMPARE(archive->numberOfEntries(), numberOfEntries);
0227 
0228     loadJob->deleteLater();
0229     archive->deleteLater();
0230 }
0231 
0232 #include "movetest.moc"