| 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 | } |