ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/s10k/CommonLibs/quazip-0.7.2/qztest/testjlcompress.cpp
Revision: 1096
Committed: Sat Dec 30 14:40:33 2017 UTC (7 years, 9 months ago) by s10k
Content type: text/x-c++src
File size: 14581 byte(s)
Log Message:
Added zlib, quazip, basicxmlsyntaxhighlighter, conditionalsemaphore and linenumberdisplay libraries. zlib and quazip are pre-compiled, but you can compile them yourself, just delete the dll files (or equivalent binary files to your OS)

File Contents

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