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"