source: Vago/quazip-0.7.2/qztest/testjlcompress.cpp@ 1087

Last change on this file since 1087 was 1049, checked in by s10k, 8 years ago
File size: 14.2 KB
Line 
1/*
2Copyright (C) 2005-2014 Sergey A. Tachenov
3
4This file is part of QuaZIP test suite.
5
6QuaZIP is free software: you can redistribute it and/or modify
7it under the terms of the GNU Lesser General Public License as published by
8the Free Software Foundation, either version 2.1 of the License, or
9(at your option) any later version.
10
11QuaZIP is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU Lesser General Public License for more details.
15
16You should have received a copy of the GNU Lesser General Public License
17along with QuaZIP. If not, see <http://www.gnu.org/licenses/>.
18
19See COPYING file for the full LGPL text.
20
21Original ZIP package is copyrighted by Gilles Vollant and contributors,
22see 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
40void TestJlCompress::compressFile_data()
41{
42 QTest::addColumn<QString>("zipName");
43 QTest::addColumn<QString>("fileName");
44 QTest::newRow("simple") << "jlsimplefile.zip" << "test0.txt";
45}
46
47void 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
75void 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
85void 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
111void 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
132void 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
164void 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
186void 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
246void 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
257void 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
301void 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
312void 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
368void 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}
Note: See TracBrowser for help on using the repository browser.