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 "testjlcompress.h"
|
---|
26 |
|
---|
27 | #include "qztest.h"
|
---|
28 |
|
---|
29 | #include <QDir>
|
---|
30 | #include <QFileInfo>
|
---|
31 |
|
---|
32 | #include <QtTest/QtTest>
|
---|
33 |
|
---|
34 | #include <quazip/JlCompress.h>
|
---|
35 |
|
---|
36 | #ifdef Q_OS_WIN
|
---|
37 | #include <Windows.h>
|
---|
38 | #endif
|
---|
39 |
|
---|
40 | void TestJlCompress::compressFile_data()
|
---|
41 | {
|
---|
42 | QTest::addColumn<QString>("zipName");
|
---|
43 | QTest::addColumn<QString>("fileName");
|
---|
44 | QTest::newRow("simple") << "jlsimplefile.zip" << "test0.txt";
|
---|
45 | }
|
---|
46 |
|
---|
47 | void TestJlCompress::compressFile()
|
---|
48 | {
|
---|
49 | QFETCH(QString, zipName);
|
---|
50 | QFETCH(QString, fileName);
|
---|
51 | QDir curDir;
|
---|
52 | if (curDir.exists(zipName)) {
|
---|
53 | if (!curDir.remove(zipName))
|
---|
54 | QFAIL("Can't remove zip file");
|
---|
55 | }
|
---|
56 | if (!createTestFiles(QStringList() << fileName)) {
|
---|
57 | QFAIL("Can't create test file");
|
---|
58 | }
|
---|
59 | QVERIFY(JlCompress::compressFile(zipName, "tmp/" + fileName));
|
---|
60 | // get the file list and check it
|
---|
61 | QStringList fileList = JlCompress::getFileList(zipName);
|
---|
62 | QCOMPARE(fileList.count(), 1);
|
---|
63 | QVERIFY(fileList[0] == fileName);
|
---|
64 | // now test the QIODevice* overload of getFileList()
|
---|
65 | QFile zipFile(zipName);
|
---|
66 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
67 | fileList = JlCompress::getFileList(zipName);
|
---|
68 | QCOMPARE(fileList.count(), 1);
|
---|
69 | QVERIFY(fileList[0] == fileName);
|
---|
70 | zipFile.close();
|
---|
71 | removeTestFiles(QStringList() << fileName);
|
---|
72 | curDir.remove(zipName);
|
---|
73 | }
|
---|
74 |
|
---|
75 | void TestJlCompress::compressFiles_data()
|
---|
76 | {
|
---|
77 | QTest::addColumn<QString>("zipName");
|
---|
78 | QTest::addColumn<QStringList>("fileNames");
|
---|
79 | QTest::newRow("simple") << "jlsimplefiles.zip" <<
|
---|
80 | (QStringList() << "test0.txt" << "test00.txt");
|
---|
81 | QTest::newRow("different subdirs") << "jlsubdirfiles.zip" <<
|
---|
82 | (QStringList() << "subdir1/test1.txt" << "subdir2/test2.txt");
|
---|
83 | }
|
---|
84 |
|
---|
85 | void TestJlCompress::compressFiles()
|
---|
86 | {
|
---|
87 | QFETCH(QString, zipName);
|
---|
88 | QFETCH(QStringList, fileNames);
|
---|
89 | QDir curDir;
|
---|
90 | if (curDir.exists(zipName)) {
|
---|
91 | if (!curDir.remove(zipName))
|
---|
92 | QFAIL("Can't remove zip file");
|
---|
93 | }
|
---|
94 | if (!createTestFiles(fileNames)) {
|
---|
95 | QFAIL("Can't create test files");
|
---|
96 | }
|
---|
97 | QStringList realNamesList, shortNamesList;
|
---|
98 | foreach (QString fileName, fileNames) {
|
---|
99 | QString realName = "tmp/" + fileName;
|
---|
100 | realNamesList += realName;
|
---|
101 | shortNamesList += QFileInfo(realName).fileName();
|
---|
102 | }
|
---|
103 | QVERIFY(JlCompress::compressFiles(zipName, realNamesList));
|
---|
104 | // get the file list and check it
|
---|
105 | QStringList fileList = JlCompress::getFileList(zipName);
|
---|
106 | QCOMPARE(fileList, shortNamesList);
|
---|
107 | removeTestFiles(fileNames);
|
---|
108 | curDir.remove(zipName);
|
---|
109 | }
|
---|
110 |
|
---|
111 | void TestJlCompress::compressDir_data()
|
---|
112 | {
|
---|
113 | QTest::addColumn<QString>("zipName");
|
---|
114 | QTest::addColumn<QStringList>("fileNames");
|
---|
115 | QTest::addColumn<QStringList>("expected");
|
---|
116 | QTest::newRow("simple") << "jldir.zip"
|
---|
117 | << (QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
118 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
|
---|
119 | << (QStringList() << "test0.txt"
|
---|
120 | << "testdir1/" << "testdir1/test1.txt"
|
---|
121 | << "testdir2/" << "testdir2/test2.txt"
|
---|
122 | << "testdir2/subdir/" << "testdir2/subdir/test2sub.txt");
|
---|
123 | QTest::newRow("empty dirs") << "jldir_empty.zip"
|
---|
124 | << (QStringList() << "testdir1/" << "testdir2/testdir3/")
|
---|
125 | << (QStringList() << "testdir1/" << "testdir2/"
|
---|
126 | << "testdir2/testdir3/");
|
---|
127 | QTest::newRow("hidden files") << "jldir_hidden.zip"
|
---|
128 | << (QStringList() << ".test0.txt" << "test1.txt")
|
---|
129 | << (QStringList() << ".test0.txt" << "test1.txt");
|
---|
130 | }
|
---|
131 |
|
---|
132 | void TestJlCompress::compressDir()
|
---|
133 | {
|
---|
134 | QFETCH(QString, zipName);
|
---|
135 | QFETCH(QStringList, fileNames);
|
---|
136 | QFETCH(QStringList, expected);
|
---|
137 | QDir curDir;
|
---|
138 | if (curDir.exists(zipName)) {
|
---|
139 | if (!curDir.remove(zipName))
|
---|
140 | QFAIL("Can't remove zip file");
|
---|
141 | }
|
---|
142 | if (!createTestFiles(fileNames, "compressDir_tmp")) {
|
---|
143 | QFAIL("Can't create test files");
|
---|
144 | }
|
---|
145 | #ifdef Q_OS_WIN
|
---|
146 | for (int i = 0; i < fileNames.size(); ++i) {
|
---|
147 | if (fileNames.at(i).startsWith(".")) {
|
---|
148 | QString fn = "compressDir_tmp\\" + fileNames.at(i);
|
---|
149 | SetFileAttributes(reinterpret_cast<LPCWSTR>(fn.utf16()),
|
---|
150 | FILE_ATTRIBUTE_HIDDEN);
|
---|
151 | }
|
---|
152 | }
|
---|
153 | #endif
|
---|
154 | QVERIFY(JlCompress::compressDir(zipName, "compressDir_tmp", true, QDir::Hidden));
|
---|
155 | // get the file list and check it
|
---|
156 | QStringList fileList = JlCompress::getFileList(zipName);
|
---|
157 | qSort(fileList);
|
---|
158 | qSort(expected);
|
---|
159 | QCOMPARE(fileList, expected);
|
---|
160 | removeTestFiles(fileNames, "compressDir_tmp");
|
---|
161 | curDir.remove(zipName);
|
---|
162 | }
|
---|
163 |
|
---|
164 | void TestJlCompress::extractFile_data()
|
---|
165 | {
|
---|
166 | QTest::addColumn<QString>("zipName");
|
---|
167 | QTest::addColumn<QStringList>("fileNames");
|
---|
168 | QTest::addColumn<QString>("fileToExtract");
|
---|
169 | QTest::addColumn<QString>("destName");
|
---|
170 | QTest::addColumn<QByteArray>("encoding");
|
---|
171 | QTest::newRow("simple") << "jlextfile.zip" << (
|
---|
172 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
173 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
|
---|
174 | << "testdir2/test2.txt" << "test2.txt" << QByteArray();
|
---|
175 | QTest::newRow("russian") << "jlextfilerus.zip" << (
|
---|
176 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
177 | << QString::fromUtf8("testdir2/тест2.txt")
|
---|
178 | << "testdir2/subdir/test2sub.txt")
|
---|
179 | << QString::fromUtf8("testdir2/тест2.txt")
|
---|
180 | << QString::fromUtf8("тест2.txt") << QByteArray("IBM866");
|
---|
181 | QTest::newRow("extract dir") << "jlextdir.zip" << (
|
---|
182 | QStringList() << "testdir1/")
|
---|
183 | << "testdir1/" << "testdir1/" << QByteArray();
|
---|
184 | }
|
---|
185 |
|
---|
186 | void TestJlCompress::extractFile()
|
---|
187 | {
|
---|
188 | QFETCH(QString, zipName);
|
---|
189 | QFETCH(QStringList, fileNames);
|
---|
190 | QFETCH(QString, fileToExtract);
|
---|
191 | QFETCH(QString, destName);
|
---|
192 | QFETCH(QByteArray, encoding);
|
---|
193 | QDir curDir;
|
---|
194 | if (!curDir.mkpath("jlext/jlfile")) {
|
---|
195 | QFAIL("Couldn't mkpath jlext/jlfile");
|
---|
196 | }
|
---|
197 | if (!createTestFiles(fileNames)) {
|
---|
198 | QFAIL("Couldn't create test files");
|
---|
199 | }
|
---|
200 | QFile srcFile("tmp/" + fileToExtract);
|
---|
201 | QFile::Permissions srcPerm = srcFile.permissions();
|
---|
202 | // Invert the "write other" flag so permissions
|
---|
203 | // are NOT default any more. Otherwise it's impossible
|
---|
204 | // to figure out whether the permissions were set correctly
|
---|
205 | // or JlCompress failed to set them completely,
|
---|
206 | // thus leaving them at the default setting.
|
---|
207 | srcPerm ^= QFile::WriteOther;
|
---|
208 | QVERIFY(srcFile.setPermissions(srcPerm));
|
---|
209 | if (!createTestArchive(zipName, fileNames,
|
---|
210 | QTextCodec::codecForName(encoding))) {
|
---|
211 | QFAIL("Can't create test archive");
|
---|
212 | }
|
---|
213 | QuaZip::setDefaultFileNameCodec(encoding);
|
---|
214 | QVERIFY(!JlCompress::extractFile(zipName, fileToExtract,
|
---|
215 | "jlext/jlfile/" + destName).isEmpty());
|
---|
216 | QFileInfo destInfo("jlext/jlfile/" + destName), srcInfo("tmp/" +
|
---|
217 | fileToExtract);
|
---|
218 | QCOMPARE(destInfo.size(), srcInfo.size());
|
---|
219 | QCOMPARE(destInfo.permissions(), srcInfo.permissions());
|
---|
220 | curDir.remove("jlext/jlfile/" + destName);
|
---|
221 | // now test the QIODevice* overload
|
---|
222 | QFile zipFile(zipName);
|
---|
223 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
224 | QVERIFY(!JlCompress::extractFile(&zipFile, fileToExtract,
|
---|
225 | "jlext/jlfile/" + destName).isEmpty());
|
---|
226 | destInfo = QFileInfo("jlext/jlfile/" + destName);
|
---|
227 | QCOMPARE(destInfo.size(), srcInfo.size());
|
---|
228 | QCOMPARE(destInfo.permissions(), srcInfo.permissions());
|
---|
229 | curDir.remove("jlext/jlfile/" + destName);
|
---|
230 | if (!fileToExtract.endsWith("/")) {
|
---|
231 | // If we aren't extracting a directory, we need to check
|
---|
232 | // that extractFile() fails if there is a directory
|
---|
233 | // with the same name as the file being extracted.
|
---|
234 | curDir.mkdir("jlext/jlfile/" + destName);
|
---|
235 | QVERIFY(JlCompress::extractFile(zipName, fileToExtract,
|
---|
236 | "jlext/jlfile/" + destName).isEmpty());
|
---|
237 | }
|
---|
238 | zipFile.close();
|
---|
239 | // Here we either delete the target dir or the dir created in the
|
---|
240 | // test above.
|
---|
241 | curDir.rmpath("jlext/jlfile/" + destName);
|
---|
242 | removeTestFiles(fileNames);
|
---|
243 | curDir.remove(zipName);
|
---|
244 | }
|
---|
245 |
|
---|
246 | void TestJlCompress::extractFiles_data()
|
---|
247 | {
|
---|
248 | QTest::addColumn<QString>("zipName");
|
---|
249 | QTest::addColumn<QStringList>("fileNames");
|
---|
250 | QTest::addColumn<QStringList>("filesToExtract");
|
---|
251 | QTest::newRow("simple") << "jlextfiles.zip" << (
|
---|
252 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
253 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
|
---|
254 | << (QStringList() << "testdir2/test2.txt" << "testdir1/test1.txt");
|
---|
255 | }
|
---|
256 |
|
---|
257 | void TestJlCompress::extractFiles()
|
---|
258 | {
|
---|
259 | QFETCH(QString, zipName);
|
---|
260 | QFETCH(QStringList, fileNames);
|
---|
261 | QFETCH(QStringList, filesToExtract);
|
---|
262 | QDir curDir;
|
---|
263 | if (!curDir.mkpath("jlext/jlfiles")) {
|
---|
264 | QFAIL("Couldn't mkpath jlext/jlfiles");
|
---|
265 | }
|
---|
266 | if (!createTestFiles(fileNames)) {
|
---|
267 | QFAIL("Couldn't create test files");
|
---|
268 | }
|
---|
269 | if (!JlCompress::compressDir(zipName, "tmp")) {
|
---|
270 | QFAIL("Couldn't create test archive");
|
---|
271 | }
|
---|
272 | QVERIFY(!JlCompress::extractFiles(zipName, filesToExtract,
|
---|
273 | "jlext/jlfiles").isEmpty());
|
---|
274 | foreach (QString fileName, filesToExtract) {
|
---|
275 | QFileInfo fileInfo("jlext/jlfiles/" + fileName);
|
---|
276 | QFileInfo extInfo("tmp/" + fileName);
|
---|
277 | QCOMPARE(fileInfo.size(), extInfo.size());
|
---|
278 | QCOMPARE(fileInfo.permissions(), extInfo.permissions());
|
---|
279 | curDir.remove("jlext/jlfiles/" + fileName);
|
---|
280 | curDir.rmpath(fileInfo.dir().path());
|
---|
281 | }
|
---|
282 | // now test the QIODevice* overload
|
---|
283 | QFile zipFile(zipName);
|
---|
284 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
285 | QVERIFY(!JlCompress::extractFiles(&zipFile, filesToExtract,
|
---|
286 | "jlext/jlfiles").isEmpty());
|
---|
287 | foreach (QString fileName, filesToExtract) {
|
---|
288 | QFileInfo fileInfo("jlext/jlfiles/" + fileName);
|
---|
289 | QFileInfo extInfo("tmp/" + fileName);
|
---|
290 | QCOMPARE(fileInfo.size(), extInfo.size());
|
---|
291 | QCOMPARE(fileInfo.permissions(), extInfo.permissions());
|
---|
292 | curDir.remove("jlext/jlfiles/" + fileName);
|
---|
293 | curDir.rmpath(fileInfo.dir().path());
|
---|
294 | }
|
---|
295 | zipFile.close();
|
---|
296 | curDir.rmpath("jlext/jlfiles");
|
---|
297 | removeTestFiles(fileNames);
|
---|
298 | curDir.remove(zipName);
|
---|
299 | }
|
---|
300 |
|
---|
301 | void TestJlCompress::extractDir_data()
|
---|
302 | {
|
---|
303 | QTest::addColumn<QString>("zipName");
|
---|
304 | QTest::addColumn<QStringList>("fileNames");
|
---|
305 | QTest::newRow("simple") << "jlextdir.zip" << (
|
---|
306 | QStringList() << "test0.txt" << "testdir1/test1.txt"
|
---|
307 | << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt");
|
---|
308 | QTest::newRow("separate dir") << "sepdir.zip" << (
|
---|
309 | QStringList() << "laj/" << "laj/lajfile.txt");
|
---|
310 | }
|
---|
311 |
|
---|
312 | void TestJlCompress::extractDir()
|
---|
313 | {
|
---|
314 | QFETCH(QString, zipName);
|
---|
315 | QFETCH(QStringList, fileNames);
|
---|
316 | QDir curDir;
|
---|
317 | if (!curDir.mkpath("jlext/jldir")) {
|
---|
318 | QFAIL("Couldn't mkpath jlext/jldir");
|
---|
319 | }
|
---|
320 | if (!createTestFiles(fileNames)) {
|
---|
321 | QFAIL("Couldn't create test files");
|
---|
322 | }
|
---|
323 | if (!createTestArchive(zipName, fileNames)) {
|
---|
324 | QFAIL("Couldn't create test archive");
|
---|
325 | }
|
---|
326 | QStringList extracted;
|
---|
327 | QCOMPARE((extracted = JlCompress::extractDir(zipName, "jlext/jldir"))
|
---|
328 | .count(), fileNames.count());
|
---|
329 | foreach (QString fileName, fileNames) {
|
---|
330 | QString fullName = "jlext/jldir/" + fileName;
|
---|
331 | QFileInfo fileInfo(fullName);
|
---|
332 | QFileInfo extInfo("tmp/" + fileName);
|
---|
333 | if (!fileInfo.isDir())
|
---|
334 | QCOMPARE(fileInfo.size(), extInfo.size());
|
---|
335 | QCOMPARE(fileInfo.permissions(), extInfo.permissions());
|
---|
336 | curDir.remove(fullName);
|
---|
337 | curDir.rmpath(fileInfo.dir().path());
|
---|
338 | QString absolutePath = fileInfo.absoluteFilePath();
|
---|
339 | if (fileInfo.isDir() && !absolutePath.endsWith('/'))
|
---|
340 | absolutePath += '/';
|
---|
341 | QVERIFY(extracted.contains(absolutePath));
|
---|
342 | }
|
---|
343 | // now test the QIODevice* overload
|
---|
344 | QFile zipFile(zipName);
|
---|
345 | QVERIFY(zipFile.open(QIODevice::ReadOnly));
|
---|
346 | QCOMPARE((extracted = JlCompress::extractDir(&zipFile, "jlext/jldir"))
|
---|
347 | .count(), fileNames.count());
|
---|
348 | foreach (QString fileName, fileNames) {
|
---|
349 | QString fullName = "jlext/jldir/" + fileName;
|
---|
350 | QFileInfo fileInfo(fullName);
|
---|
351 | QFileInfo extInfo("tmp/" + fileName);
|
---|
352 | if (!fileInfo.isDir())
|
---|
353 | QCOMPARE(fileInfo.size(), extInfo.size());
|
---|
354 | QCOMPARE(fileInfo.permissions(), extInfo.permissions());
|
---|
355 | curDir.remove(fullName);
|
---|
356 | curDir.rmpath(fileInfo.dir().path());
|
---|
357 | QString absolutePath = fileInfo.absoluteFilePath();
|
---|
358 | if (fileInfo.isDir() && !absolutePath.endsWith('/'))
|
---|
359 | absolutePath += '/';
|
---|
360 | QVERIFY(extracted.contains(absolutePath));
|
---|
361 | }
|
---|
362 | zipFile.close();
|
---|
363 | curDir.rmpath("jlext/jldir");
|
---|
364 | removeTestFiles(fileNames);
|
---|
365 | curDir.remove(zipName);
|
---|
366 | }
|
---|
367 |
|
---|
368 | void TestJlCompress::zeroPermissions()
|
---|
369 | {
|
---|
370 | QuaZip zipCreator("zero.zip");
|
---|
371 | QVERIFY(zipCreator.open(QuaZip::mdCreate));
|
---|
372 | QuaZipFile zeroFile(&zipCreator);
|
---|
373 | QuaZipNewInfo newInfo("zero.txt");
|
---|
374 | newInfo.externalAttr = 0; // should be zero anyway, but just in case
|
---|
375 | QVERIFY(zeroFile.open(QIODevice::WriteOnly, newInfo));
|
---|
376 | zeroFile.close();
|
---|
377 | zipCreator.close();
|
---|
378 | QVERIFY(!JlCompress::extractFile("zero.zip", "zero.txt").isEmpty());
|
---|
379 | QVERIFY(QFile("zero.txt").permissions() != 0);
|
---|
380 | QDir curDir;
|
---|
381 | curDir.remove("zero.zip");
|
---|
382 | curDir.remove("zero.txt");
|
---|
383 | }
|
---|