[1096] | 1 | /*
|
---|
| 2 | Copyright (C) 2005-2014 Sergey A. Tachenov
|
---|
| 3 |
|
---|
| 4 | This file is part of QuaZIP test suite.
|
---|
| 5 |
|
---|
| 6 | QuaZIP is free software: you can redistribute it and/or modify
|
---|
| 7 | it under the terms of the GNU Lesser General Public License as published by
|
---|
| 8 | the Free Software Foundation, either version 2.1 of the License, or
|
---|
| 9 | (at your option) any later version.
|
---|
| 10 |
|
---|
| 11 | QuaZIP is distributed in the hope that it will be useful,
|
---|
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 14 | GNU Lesser General Public License for more details.
|
---|
| 15 |
|
---|
| 16 | You should have received a copy of the GNU Lesser General Public License
|
---|
| 17 | along with QuaZIP. If not, see <http://www.gnu.org/licenses/>.
|
---|
| 18 |
|
---|
| 19 | See COPYING file for the full LGPL text.
|
---|
| 20 |
|
---|
| 21 | Original ZIP package is copyrighted by Gilles Vollant and contributors,
|
---|
| 22 | see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
---|
| 23 | */
|
---|
| 24 |
|
---|
| 25 | #include "testquazipfile.h"
|
---|
| 26 |
|
---|
| 27 | #include "qztest.h"
|
---|
| 28 |
|
---|
| 29 | #include <quazip/JlCompress.h>
|
---|
| 30 | #include <quazip/quazipfile.h>
|
---|
| 31 | #include <quazip/quazip.h>
|
---|
| 32 |
|
---|
| 33 | #include <QFile>
|
---|
| 34 | #include <QString>
|
---|
| 35 | #include <QStringList>
|
---|
| 36 |
|
---|
| 37 | #include <QtTest/QtTest>
|
---|
| 38 |
|
---|
| 39 | void TestQuaZipFile::zipUnzip_data()
|
---|
| 40 | {
|
---|
| 41 | QTest::addColumn<QString>("zipName");
|
---|
| 42 | QTest::addColumn<QStringList>("fileNames");
|
---|
| 43 | QTest::addColumn<QByteArray>("fileNameCodec");
|
---|
| 44 | QTest::addColumn<QByteArray>("password");
|
---|
| 45 | QTest::addColumn<bool>("zip64");
|
---|
| 46 | QTest::newRow("simple") << "simple.zip" << (
|
---|
| 47 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
| 48 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
|
---|
| 49 | << QByteArray() << QByteArray() << false;
|
---|
| 50 | QTest::newRow("Cyrillic") << "cyrillic.zip" << (
|
---|
| 51 | QStringList()
|
---|
| 52 | << QString::fromUtf8("русское имя файла с пробелами.txt"))
|
---|
| 53 | << QByteArray("IBM866") << QByteArray() << false;
|
---|
| 54 | QTest::newRow("password") << "password.zip" << (
|
---|
| 55 | QStringList() << "test.txt")
|
---|
| 56 | << QByteArray() << QByteArray("PassPass") << false;
|
---|
| 57 | QTest::newRow("zip64") << "zip64.zip" << (
|
---|
| 58 | QStringList() << "test64.txt")
|
---|
| 59 | << QByteArray() << QByteArray() << true;
|
---|
| 60 | }
|
---|
| 61 |
|
---|
| 62 | void TestQuaZipFile::zipUnzip()
|
---|
| 63 | {
|
---|
| 64 | QFETCH(QString, zipName);
|
---|
| 65 | QFETCH(QStringList, fileNames);
|
---|
| 66 | QFETCH(QByteArray, fileNameCodec);
|
---|
| 67 | QFETCH(QByteArray, password);
|
---|
| 68 | QFETCH(bool, zip64);
|
---|
| 69 | QFile testFile(zipName);
|
---|
| 70 | if (testFile.exists()) {
|
---|
| 71 | if (!testFile.remove()) {
|
---|
| 72 | QFAIL("Couldn't remove existing archive to create a new one");
|
---|
| 73 | }
|
---|
| 74 | }
|
---|
| 75 | if (!createTestFiles(fileNames)) {
|
---|
| 76 | QFAIL("Couldn't create test files for zipping");
|
---|
| 77 | }
|
---|
| 78 | QuaZip testZip(&testFile);
|
---|
| 79 | testZip.setZip64Enabled(zip64);
|
---|
| 80 | if (!fileNameCodec.isEmpty())
|
---|
| 81 | testZip.setFileNameCodec(fileNameCodec);
|
---|
| 82 | QVERIFY(testZip.open(QuaZip::mdCreate));
|
---|
| 83 | QString comment = "Test comment";
|
---|
| 84 | testZip.setComment(comment);
|
---|
| 85 | foreach (QString fileName, fileNames) {
|
---|
| 86 | QFile inFile("tmp/" + fileName);
|
---|
| 87 | if (!inFile.open(QIODevice::ReadOnly)) {
|
---|
| 88 | qDebug("File name: %s", fileName.toUtf8().constData());
|
---|
| 89 | QFAIL("Couldn't open input file");
|
---|
| 90 | }
|
---|
| 91 | QuaZipFile outFile(&testZip);
|
---|
| 92 | QVERIFY(outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileName,
|
---|
| 93 | inFile.fileName()),
|
---|
| 94 | password.isEmpty() ? NULL : password.constData()));
|
---|
| 95 | for (qint64 pos = 0, len = inFile.size(); pos < len; ) {
|
---|
| 96 | char buf[4096];
|
---|
| 97 | qint64 readSize = qMin(static_cast<qint64>(4096), len - pos);
|
---|
| 98 | qint64 l;
|
---|
| 99 | if ((l = inFile.read(buf, readSize)) != readSize) {
|
---|
| 100 | qDebug("Reading %ld bytes from %s at %ld returned %ld",
|
---|
| 101 | static_cast<long>(readSize),
|
---|
| 102 | fileName.toUtf8().constData(),
|
---|
| 103 | static_cast<long>(pos),
|
---|
| 104 | static_cast<long>(l));
|
---|
| 105 | QFAIL("Read failure");
|
---|
| 106 | }
|
---|
| 107 | QVERIFY(outFile.write(buf, readSize));
|
---|
| 108 | pos += readSize;
|
---|
| 109 | }
|
---|
| 110 | inFile.close();
|
---|
| 111 | outFile.close();
|
---|
| 112 | QCOMPARE(outFile.getZipError(), ZIP_OK);
|
---|
| 113 | }
|
---|
| 114 | testZip.close();
|
---|
| 115 | QCOMPARE(testZip.getZipError(), ZIP_OK);
|
---|
| 116 | // now test unzip
|
---|
| 117 | QuaZip testUnzip(&testFile);
|
---|
| 118 | if (!fileNameCodec.isEmpty())
|
---|
| 119 | testUnzip.setFileNameCodec(fileNameCodec);
|
---|
| 120 | QVERIFY(testUnzip.open(QuaZip::mdUnzip));
|
---|
| 121 | QCOMPARE(testUnzip.getComment(), comment);
|
---|
| 122 | QVERIFY(testUnzip.goToFirstFile());
|
---|
| 123 | foreach (QString fileName, fileNames) {
|
---|
| 124 | QuaZipFileInfo64 info;
|
---|
| 125 | QVERIFY(testUnzip.getCurrentFileInfo(&info));
|
---|
| 126 | QCOMPARE(info.name, fileName);
|
---|
| 127 | QCOMPARE(info.isEncrypted(), !password.isEmpty());
|
---|
| 128 | QFile original("tmp/" + fileName);
|
---|
| 129 | QVERIFY(original.open(QIODevice::ReadOnly));
|
---|
| 130 | QuaZipFile archived(&testUnzip);
|
---|
| 131 | QVERIFY(archived.open(QIODevice::ReadOnly,
|
---|
| 132 | password.isEmpty() ? NULL : password.constData()));
|
---|
| 133 | QByteArray originalData = original.readAll();
|
---|
| 134 | QByteArray archivedData = archived.readAll();
|
---|
| 135 | QCOMPARE(archivedData, originalData);
|
---|
| 136 | testUnzip.goToNextFile();
|
---|
| 137 | }
|
---|
| 138 | if (!password.isEmpty()) {
|
---|
| 139 | QVERIFY(testUnzip.goToFirstFile());
|
---|
| 140 | QuaZipFileInfo64 info;
|
---|
| 141 | QVERIFY(testUnzip.getCurrentFileInfo(&info));
|
---|
| 142 | QFile original("tmp/" + info.name);
|
---|
| 143 | QVERIFY(original.open(QIODevice::ReadOnly));
|
---|
| 144 | QuaZipFile archived(&testUnzip);
|
---|
| 145 | QVERIFY(archived.open(QIODevice::ReadOnly, "WrongPassword"));
|
---|
| 146 | QByteArray originalData = original.readAll();
|
---|
| 147 | QByteArray archivedData = archived.readAll();
|
---|
| 148 | QVERIFY(archivedData != originalData);
|
---|
| 149 | }
|
---|
| 150 | testUnzip.close();
|
---|
| 151 | QCOMPARE(testUnzip.getZipError(), UNZ_OK);
|
---|
| 152 | // clean up
|
---|
| 153 | removeTestFiles(fileNames);
|
---|
| 154 | testFile.remove();
|
---|
| 155 | }
|
---|
| 156 |
|
---|
| 157 | void TestQuaZipFile::bytesAvailable_data()
|
---|
| 158 | {
|
---|
| 159 | QTest::addColumn<QString>("zipName");
|
---|
| 160 | QTest::addColumn<QStringList>("fileNames");
|
---|
| 161 | QTest::newRow("simple") << "test.zip" << (
|
---|
| 162 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
| 163 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt");
|
---|
| 164 | }
|
---|
| 165 |
|
---|
| 166 | void TestQuaZipFile::bytesAvailable()
|
---|
| 167 | {
|
---|
| 168 | QFETCH(QString, zipName);
|
---|
| 169 | QFETCH(QStringList, fileNames);
|
---|
| 170 | QDir curDir;
|
---|
| 171 | if (!createTestFiles(fileNames)) {
|
---|
| 172 | QFAIL("Couldn't create test files");
|
---|
| 173 | }
|
---|
| 174 | if (!JlCompress::compressDir(zipName, "tmp")) {
|
---|
| 175 | QFAIL("Couldn't create test archive");
|
---|
| 176 | }
|
---|
| 177 | QuaZip testZip(zipName);
|
---|
| 178 | QVERIFY(testZip.open(QuaZip::mdUnzip));
|
---|
| 179 | foreach (QString fileName, fileNames) {
|
---|
| 180 | QFileInfo fileInfo("tmp/" + fileName);
|
---|
| 181 | QVERIFY(testZip.setCurrentFile(fileName));
|
---|
| 182 | QuaZipFile zipFile(&testZip);
|
---|
| 183 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
| 184 | QCOMPARE(zipFile.bytesAvailable(), fileInfo.size());
|
---|
| 185 | QCOMPARE(zipFile.read(1).size(), 1);
|
---|
| 186 | QCOMPARE(zipFile.bytesAvailable(), fileInfo.size() - 1);
|
---|
| 187 | QCOMPARE(zipFile.read(fileInfo.size() - 1).size(),
|
---|
| 188 | static_cast<int>(fileInfo.size() - 1));
|
---|
| 189 | QCOMPARE(zipFile.bytesAvailable(), (qint64) 0);
|
---|
| 190 | }
|
---|
| 191 | removeTestFiles(fileNames);
|
---|
| 192 | testZip.close();
|
---|
| 193 | curDir.remove(zipName);
|
---|
| 194 | }
|
---|
| 195 |
|
---|
| 196 | void TestQuaZipFile::atEnd_data()
|
---|
| 197 | {
|
---|
| 198 | bytesAvailable_data();
|
---|
| 199 | }
|
---|
| 200 |
|
---|
| 201 | void TestQuaZipFile::atEnd()
|
---|
| 202 | {
|
---|
| 203 | QFETCH(QString, zipName);
|
---|
| 204 | QFETCH(QStringList, fileNames);
|
---|
| 205 | QDir curDir;
|
---|
| 206 | if (!createTestFiles(fileNames)) {
|
---|
| 207 | QFAIL("Couldn't create test files");
|
---|
| 208 | }
|
---|
| 209 | if (!JlCompress::compressDir(zipName, "tmp")) {
|
---|
| 210 | QFAIL("Couldn't create test archive");
|
---|
| 211 | }
|
---|
| 212 | QuaZip testZip(zipName);
|
---|
| 213 | QVERIFY(testZip.open(QuaZip::mdUnzip));
|
---|
| 214 | foreach (QString fileName, fileNames) {
|
---|
| 215 | QFileInfo fileInfo("tmp/" + fileName);
|
---|
| 216 | QVERIFY(testZip.setCurrentFile(fileName));
|
---|
| 217 | QuaZipFile zipFile(&testZip);
|
---|
| 218 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
| 219 | QCOMPARE(zipFile.atEnd(), false);
|
---|
| 220 | QCOMPARE(zipFile.read(1).size(), 1);
|
---|
| 221 | QCOMPARE(zipFile.atEnd(), false);
|
---|
| 222 | QCOMPARE(zipFile.read(fileInfo.size() - 1).size(),
|
---|
| 223 | static_cast<int>(fileInfo.size() - 1));
|
---|
| 224 | QCOMPARE(zipFile.atEnd(), true);
|
---|
| 225 | }
|
---|
| 226 | removeTestFiles(fileNames);
|
---|
| 227 | testZip.close();
|
---|
| 228 | curDir.remove(zipName);
|
---|
| 229 | }
|
---|
| 230 |
|
---|
| 231 | void TestQuaZipFile::pos_data()
|
---|
| 232 | {
|
---|
| 233 | bytesAvailable_data();
|
---|
| 234 | }
|
---|
| 235 |
|
---|
| 236 | void TestQuaZipFile::pos()
|
---|
| 237 | {
|
---|
| 238 | QFETCH(QString, zipName);
|
---|
| 239 | QFETCH(QStringList, fileNames);
|
---|
| 240 | QDir curDir;
|
---|
| 241 | if (!createTestFiles(fileNames)) {
|
---|
| 242 | QFAIL("Couldn't create test files");
|
---|
| 243 | }
|
---|
| 244 | if (!JlCompress::compressDir(zipName, "tmp")) {
|
---|
| 245 | QFAIL("Couldn't create test archive");
|
---|
| 246 | }
|
---|
| 247 | QuaZip testZip(zipName);
|
---|
| 248 | QVERIFY(testZip.open(QuaZip::mdUnzip));
|
---|
| 249 | foreach (QString fileName, fileNames) {
|
---|
| 250 | QFileInfo fileInfo("tmp/" + fileName);
|
---|
| 251 | QVERIFY(testZip.setCurrentFile(fileName));
|
---|
| 252 | QuaZipFile zipFile(&testZip);
|
---|
| 253 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
| 254 | QCOMPARE(zipFile.pos(), (qint64) 0);
|
---|
| 255 | QCOMPARE(zipFile.read(1).size(), 1);
|
---|
| 256 | QCOMPARE(zipFile.pos(), (qint64) 1);
|
---|
| 257 | QCOMPARE(zipFile.read(fileInfo.size() - 1).size(),
|
---|
| 258 | static_cast<int>(fileInfo.size() - 1));
|
---|
| 259 | QCOMPARE(zipFile.pos(), fileInfo.size());
|
---|
| 260 | }
|
---|
| 261 | removeTestFiles(fileNames);
|
---|
| 262 | testZip.close();
|
---|
| 263 | curDir.remove(zipName);
|
---|
| 264 | }
|
---|
| 265 |
|
---|
| 266 | void TestQuaZipFile::getZip()
|
---|
| 267 | {
|
---|
| 268 | QuaZip testZip;
|
---|
| 269 | QuaZipFile f1(&testZip);
|
---|
| 270 | QCOMPARE(f1.getZip(), &testZip);
|
---|
| 271 | QuaZipFile f2("doesntexist.zip", "someFile");
|
---|
| 272 | QCOMPARE(f2.getZip(), static_cast<QuaZip*>(NULL));
|
---|
| 273 | f2.setZip(&testZip);
|
---|
| 274 | QCOMPARE(f2.getZip(), &testZip);
|
---|
| 275 | }
|
---|
| 276 |
|
---|
| 277 | void TestQuaZipFile::setZipName()
|
---|
| 278 | {
|
---|
| 279 | QString testFileName = "testZipName.txt";
|
---|
| 280 | QString testZipName = "testZipName.zip";
|
---|
| 281 | QVERIFY(createTestFiles(QStringList() << testFileName));
|
---|
| 282 | QVERIFY(createTestArchive(testZipName, QStringList() << testFileName));
|
---|
| 283 | QuaZipFile testFile;
|
---|
| 284 | testFile.setZipName(testZipName);
|
---|
| 285 | QCOMPARE(testFile.getZipName(), testZipName);
|
---|
| 286 | testFile.setFileName(testFileName);
|
---|
| 287 | QVERIFY(testFile.open(QIODevice::ReadOnly));
|
---|
| 288 | testFile.close();
|
---|
| 289 | removeTestFiles(QStringList() << testFileName);
|
---|
| 290 | QDir curDir;
|
---|
| 291 | curDir.remove(testZipName);
|
---|
| 292 | }
|
---|
| 293 |
|
---|
| 294 | void TestQuaZipFile::getFileInfo()
|
---|
| 295 | {
|
---|
| 296 | QuaZipFileInfo info32;
|
---|
| 297 | QuaZipFileInfo64 info64;
|
---|
| 298 | QString testFileName = "testZipName.txt";
|
---|
| 299 | QStringList testFiles;
|
---|
| 300 | testFiles << testFileName;
|
---|
| 301 | QString testZipName = "testZipName.zip";
|
---|
| 302 | QVERIFY(createTestFiles(testFiles));
|
---|
| 303 | QVERIFY(createTestArchive(testZipName, testFiles));
|
---|
| 304 | QuaZipFile testFile;
|
---|
| 305 | testFile.setZipName(testZipName);
|
---|
| 306 | testFile.setFileName(testFileName);
|
---|
| 307 | QVERIFY(testFile.open(QIODevice::ReadOnly));
|
---|
| 308 | QVERIFY(testFile.getFileInfo(&info32));
|
---|
| 309 | QVERIFY(testFile.getFileInfo(&info64));
|
---|
| 310 | QCOMPARE(info32.name, info64.name);
|
---|
| 311 | QCOMPARE(info32.versionCreated, info64.versionCreated);
|
---|
| 312 | QCOMPARE(info32.versionNeeded, info64.versionNeeded);
|
---|
| 313 | QCOMPARE(info32.flags, info64.flags);
|
---|
| 314 | QCOMPARE(info32.method, info64.method);
|
---|
| 315 | QCOMPARE(info32.dateTime, info64.dateTime);
|
---|
| 316 | QCOMPARE(info32.crc, info64.crc);
|
---|
| 317 | QCOMPARE(info32.compressedSize,
|
---|
| 318 | static_cast<quint32>(info64.compressedSize));
|
---|
| 319 | QCOMPARE(info32.uncompressedSize,
|
---|
| 320 | static_cast<quint32>(info64.uncompressedSize));
|
---|
| 321 | QCOMPARE(info32.diskNumberStart, info64.diskNumberStart);
|
---|
| 322 | QCOMPARE(info32.internalAttr, info64.internalAttr);
|
---|
| 323 | QCOMPARE(info32.externalAttr, info64.externalAttr);
|
---|
| 324 | QCOMPARE(info32.comment, info64.comment);
|
---|
| 325 | QCOMPARE(info32.extra, info64.extra);
|
---|
| 326 | testFile.close();
|
---|
| 327 | removeTestFiles(testFiles);
|
---|
| 328 | QDir curDir;
|
---|
| 329 | curDir.remove(testZipName);
|
---|
| 330 | }
|
---|
| 331 |
|
---|
| 332 | void TestQuaZipFile::setFileName()
|
---|
| 333 | {
|
---|
| 334 | QString testFileName = "testZipName.txt";
|
---|
| 335 | QString testZipName = "testZipName.zip";
|
---|
| 336 | QVERIFY(createTestFiles(QStringList() << testFileName));
|
---|
| 337 | QVERIFY(createTestArchive(testZipName, QStringList() << testFileName));
|
---|
| 338 | QuaZipFile testFile(testZipName);
|
---|
| 339 | testFile.setFileName(testFileName.toUpper());
|
---|
| 340 | #ifdef Q_OS_WIN
|
---|
| 341 | QVERIFY(testFile.open(QIODevice::ReadOnly));
|
---|
| 342 | testFile.close();
|
---|
| 343 | #else
|
---|
| 344 | QVERIFY(!testFile.open(QIODevice::ReadOnly));
|
---|
| 345 | #endif
|
---|
| 346 | testFile.setFileName(testFileName.toUpper(), QuaZip::csInsensitive);
|
---|
| 347 | QCOMPARE(testFile.getCaseSensitivity(), QuaZip::csInsensitive);
|
---|
| 348 | QVERIFY(testFile.open(QIODevice::ReadOnly));
|
---|
| 349 | QCOMPARE(testFile.getActualFileName(), testFileName);
|
---|
| 350 | testFile.close();
|
---|
| 351 | testFile.setFileName(testFileName.toUpper(), QuaZip::csSensitive);
|
---|
| 352 | QCOMPARE(testFile.getFileName(), testFileName.toUpper());
|
---|
| 353 | QCOMPARE(testFile.getActualFileName(), QString());
|
---|
| 354 | QVERIFY(!testFile.open(QIODevice::ReadOnly));
|
---|
| 355 | testFile.setFileName(testFileName);
|
---|
| 356 | removeTestFiles(QStringList() << testFileName);
|
---|
| 357 | QDir curDir;
|
---|
| 358 | curDir.remove(testZipName);
|
---|
| 359 | }
|
---|
| 360 |
|
---|
| 361 | void TestQuaZipFile::constructorDestructor()
|
---|
| 362 | {
|
---|
| 363 | // Just test that all constructors and destructors are available.
|
---|
| 364 | // (So there are none that are declared but not defined.)
|
---|
| 365 | QuaZip testZip;
|
---|
| 366 | QuaZipFile *f1 = new QuaZipFile();
|
---|
| 367 | delete f1; // test D0 destructor
|
---|
| 368 | QObject parent;
|
---|
| 369 | QuaZipFile f2(&testZip, &parent);
|
---|
| 370 | QuaZipFile f3(&parent);
|
---|
| 371 | QuaZipFile f4("zipName.zip");
|
---|
| 372 | QuaZipFile f5("zipName.zip", "fileName.txt", QuaZip::csDefault, &parent);
|
---|
| 373 | }
|
---|
| 374 |
|
---|
| 375 | void TestQuaZipFile::setFileAttrs()
|
---|
| 376 | {
|
---|
| 377 | QuaZip testZip("setFileAttrs.zip");
|
---|
| 378 | QVERIFY(testZip.open(QuaZip::mdCreate));
|
---|
| 379 | QuaZipFile zipFile(&testZip);
|
---|
| 380 | QuaZipNewInfo newInfo("testPerm.txt");
|
---|
| 381 | newInfo.setPermissions(QFile::ReadOwner);
|
---|
| 382 | QVERIFY(zipFile.open(QIODevice::WriteOnly, newInfo));
|
---|
| 383 | zipFile.close();
|
---|
| 384 | QString fileTestAttr = "testAttr.txt";
|
---|
| 385 | QStringList fileNames;
|
---|
| 386 | fileNames << fileTestAttr;
|
---|
| 387 | QVERIFY(createTestFiles(fileNames));
|
---|
| 388 | newInfo.name = fileTestAttr;
|
---|
| 389 | newInfo.setFileDateTime("tmp/" + fileTestAttr);
|
---|
| 390 | newInfo.setFilePermissions("tmp/" + fileTestAttr);
|
---|
| 391 | QVERIFY(zipFile.open(QIODevice::WriteOnly, newInfo));
|
---|
| 392 | zipFile.close();
|
---|
| 393 | testZip.close();
|
---|
| 394 | QuaZipFileInfo64 info;
|
---|
| 395 | {
|
---|
| 396 | QuaZipFile readFilePerm("setFileAttrs.zip", "testPerm.txt");
|
---|
| 397 | QVERIFY(readFilePerm.open(QIODevice::ReadOnly));
|
---|
| 398 | QVERIFY(readFilePerm.getFileInfo(&info));
|
---|
| 399 | QCOMPARE(info.getPermissions(), QFile::ReadOwner);
|
---|
| 400 | readFilePerm.close();
|
---|
| 401 | }
|
---|
| 402 | {
|
---|
| 403 | QuaZipFile readFileAttrs("setFileAttrs.zip", "testAttr.txt");
|
---|
| 404 | QVERIFY(readFileAttrs.open(QIODevice::ReadOnly));
|
---|
| 405 | QVERIFY(readFileAttrs.getFileInfo(&info));
|
---|
| 406 | QFileInfo srcInfo("tmp/" + fileTestAttr);
|
---|
| 407 | QFile::Permissions usedPermissions =
|
---|
| 408 | QFile::WriteOwner | QFile::ReadOwner | QFile::ExeOwner |
|
---|
| 409 | QFile::WriteGroup | QFile::ReadGroup | QFile::ExeGroup |
|
---|
| 410 | QFile::WriteOther | QFile::ReadOther | QFile::ExeOther;
|
---|
| 411 | QCOMPARE(info.getPermissions() & usedPermissions,
|
---|
| 412 | srcInfo.permissions() & usedPermissions);
|
---|
| 413 | // I really hope Qt 6 will use quint64 for time_t!
|
---|
| 414 | quint64 newTime = info.dateTime.toTime_t();
|
---|
| 415 | quint64 oldTime = srcInfo.lastModified().toTime_t();
|
---|
| 416 | // ZIP uses weird format with 2 second precision
|
---|
| 417 | QCOMPARE(newTime / 2, oldTime / 2);
|
---|
| 418 | readFileAttrs.close();
|
---|
| 419 | }
|
---|
| 420 | removeTestFiles(fileNames);
|
---|
| 421 | QDir().remove(testZip.getZipName());
|
---|
| 422 | }
|
---|
| 423 |
|
---|
| 424 | void TestQuaZipFile::largeFile()
|
---|
| 425 | {
|
---|
| 426 | QDir curDir;
|
---|
| 427 | QVERIFY(curDir.mkpath("tmp"));
|
---|
| 428 | QFile fakeLargeFile("tmp/large.zip");
|
---|
| 429 | QVERIFY(fakeLargeFile.open(QIODevice::WriteOnly));
|
---|
| 430 | QDataStream ds(&fakeLargeFile);
|
---|
| 431 | ds.setByteOrder(QDataStream::LittleEndian);
|
---|
| 432 | QList<qint64> localOffsets;
|
---|
| 433 | const int numFiles = 2; // name fixed to 5 bytes, so MAX 10 FILES!!!
|
---|
| 434 | for (int i = 0; i < numFiles; ++i) {
|
---|
| 435 | localOffsets.append(fakeLargeFile.pos());
|
---|
| 436 | QBuffer extra;
|
---|
| 437 | extra.open(QIODevice::WriteOnly);
|
---|
| 438 | QDataStream es(&extra);
|
---|
| 439 | es.setByteOrder(QDataStream::LittleEndian);
|
---|
| 440 | // prepare extra
|
---|
| 441 | es << static_cast<quint16>(0x0001u); // zip64
|
---|
| 442 | es << static_cast<quint16>(16); // extra data size
|
---|
| 443 | es << static_cast<quint64>(0); // uncompressed size
|
---|
| 444 | es << static_cast<quint64>(0); // compressed size
|
---|
| 445 | // now the local header
|
---|
| 446 | ds << static_cast<quint32>(0x04034b50u); // local magic
|
---|
| 447 | ds << static_cast<quint16>(45); // version needed
|
---|
| 448 | ds << static_cast<quint16>(0); // flags
|
---|
| 449 | ds << static_cast<quint16>(0); // method
|
---|
| 450 | ds << static_cast<quint16>(0); // time 00:00:00
|
---|
| 451 | ds << static_cast<quint16>(0x21); // date 1980-01-01
|
---|
| 452 | ds << static_cast<quint32>(0); // CRC-32
|
---|
| 453 | ds << static_cast<quint32>(0xFFFFFFFFu); // compressed size
|
---|
| 454 | ds << static_cast<quint32>(0xFFFFFFFFu); // uncompressed size
|
---|
| 455 | ds << static_cast<quint16>(5); // name length
|
---|
| 456 | ds << static_cast<quint16>(extra.size()); // extra length
|
---|
| 457 | ds.writeRawData("file", 4); // name
|
---|
| 458 | ds << static_cast<qint8>('0' + i); // name (contd.)
|
---|
| 459 | ds.writeRawData(extra.buffer(), extra.size());
|
---|
| 460 | }
|
---|
| 461 | // central dir:
|
---|
| 462 | qint64 centralStart = fakeLargeFile.pos();
|
---|
| 463 | for (int i = 0; i < numFiles; ++i) {
|
---|
| 464 | QBuffer extra;
|
---|
| 465 | extra.open(QIODevice::WriteOnly);
|
---|
| 466 | QDataStream es(&extra);
|
---|
| 467 | es.setByteOrder(QDataStream::LittleEndian);
|
---|
| 468 | // prepare extra
|
---|
| 469 | es << static_cast<quint16>(0x0001u); // zip64
|
---|
| 470 | es << static_cast<quint16>(24); // extra data size
|
---|
| 471 | es << static_cast<quint64>(0); // uncompressed size
|
---|
| 472 | es << static_cast<quint64>(0); // compressed size
|
---|
| 473 | es << static_cast<quint64>(localOffsets[i]);
|
---|
| 474 | // now the central dir header
|
---|
| 475 | ds << static_cast<quint32>(0x02014b50u); // central magic
|
---|
| 476 | ds << static_cast<quint16>(45); // version made by
|
---|
| 477 | ds << static_cast<quint16>(45); // version needed
|
---|
| 478 | ds << static_cast<quint16>(0); // flags
|
---|
| 479 | ds << static_cast<quint16>(0); // method
|
---|
| 480 | ds << static_cast<quint16>(0); // time 00:00:00
|
---|
| 481 | ds << static_cast<quint16>(0x21); // date 1980-01-01
|
---|
| 482 | ds << static_cast<quint32>(0); // CRC-32
|
---|
| 483 | ds << static_cast<quint32>(0xFFFFFFFFu); // compressed size
|
---|
| 484 | ds << static_cast<quint32>(0xFFFFFFFFu); // uncompressed size
|
---|
| 485 | ds << static_cast<quint16>(5); // name length
|
---|
| 486 | ds << static_cast<quint16>(extra.size()); // extra length
|
---|
| 487 | ds << static_cast<quint16>(0); // comment length
|
---|
| 488 | ds << static_cast<quint16>(0); // disk number
|
---|
| 489 | ds << static_cast<quint16>(0); // internal attrs
|
---|
| 490 | ds << static_cast<quint32>(0); // external attrs
|
---|
| 491 | ds << static_cast<quint32>(0xFFFFFFFFu); // local offset
|
---|
| 492 | ds.writeRawData("file", 4); // name
|
---|
| 493 | ds << static_cast<qint8>('0' + i); // name (contd.)
|
---|
| 494 | ds.writeRawData(extra.buffer(), extra.size());
|
---|
| 495 | }
|
---|
| 496 | qint64 centralEnd = fakeLargeFile.pos();
|
---|
| 497 | // zip64 end
|
---|
| 498 | ds << static_cast<quint32>(0x06064b50); // zip64 end magic
|
---|
| 499 | ds << static_cast<quint64>(44); // size of the zip64 end
|
---|
| 500 | ds << static_cast<quint16>(45); // version made by
|
---|
| 501 | ds << static_cast<quint16>(45); // version needed
|
---|
| 502 | ds << static_cast<quint32>(0); // disk number
|
---|
| 503 | ds << static_cast<quint32>(0); // central dir disk number
|
---|
| 504 | ds << static_cast<quint64>(2); // number of entries on disk
|
---|
| 505 | ds << static_cast<quint64>(2); // total number of entries
|
---|
| 506 | ds << static_cast<quint64>(centralEnd - centralStart); // size
|
---|
| 507 | ds << static_cast<quint64>(centralStart); // offset
|
---|
| 508 | // zip64 locator
|
---|
| 509 | ds << static_cast<quint32>(0x07064b50); // zip64 locator magic
|
---|
| 510 | ds << static_cast<quint32>(0); // disk number
|
---|
| 511 | ds << static_cast<quint64>(centralEnd); // offset
|
---|
| 512 | ds << static_cast<quint32>(1); // number of disks
|
---|
| 513 | // zip32 end
|
---|
| 514 | ds << static_cast<quint32>(0x06054b50); // end magic
|
---|
| 515 | ds << static_cast<quint16>(0); // disk number
|
---|
| 516 | ds << static_cast<quint16>(0); // central dir disk number
|
---|
| 517 | ds << static_cast<quint16>(2); // number of entries
|
---|
| 518 | ds << static_cast<quint32>(0xFFFFFFFFu); // central dir size
|
---|
| 519 | ds << static_cast<quint32>(0xFFFFFFFFu); // central dir offset
|
---|
| 520 | ds << static_cast<quint16>(0); // comment length
|
---|
| 521 | fakeLargeFile.close();
|
---|
| 522 | QuaZip fakeLargeZip("tmp/large.zip");
|
---|
| 523 | QVERIFY(fakeLargeZip.open(QuaZip::mdUnzip));
|
---|
| 524 | QCOMPARE(fakeLargeZip.getFileInfoList().size(), numFiles);
|
---|
| 525 | QCOMPARE(fakeLargeZip.getFileInfoList()[0].uncompressedSize,
|
---|
| 526 | static_cast<quint32>(0));
|
---|
| 527 | fakeLargeZip.close();
|
---|
| 528 | curDir.remove("tmp/large.zip");
|
---|
| 529 | }
|
---|