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"