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 "testquazipdir.h" |
26 |
#include "qztest.h" |
27 |
#include <QtTest/QtTest> |
28 |
#include <quazip/quazip.h> |
29 |
#include <quazip/quazipdir.h> |
30 |
|
31 |
void TestQuaZipDir::entryList_data() |
32 |
{ |
33 |
QTest::addColumn<QString>("zipName"); |
34 |
QTest::addColumn<QStringList>("fileNames"); |
35 |
QTest::addColumn<QString>("dirName"); |
36 |
QTest::addColumn<QStringList>("nameFilters"); |
37 |
// QDir::Filters type breaks Qt meta type system on MSVC |
38 |
QTest::addColumn<int>("filter"); |
39 |
QTest::addColumn<int>("sort"); |
40 |
QTest::addColumn<QStringList>("entries"); |
41 |
QTest::addColumn<int>("caseSensitivity"); |
42 |
QTest::newRow("simple") << "simple.zip" << ( |
43 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
44 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
45 |
<< "testdir2" << QStringList() |
46 |
<< static_cast<int>(QDir::NoFilter) |
47 |
<< static_cast<int>(QDir::Unsorted) |
48 |
<< (QStringList() << "test2.txt" << "subdir/") << -1; |
49 |
QTest::newRow("separate dir") << "sepdir.zip" << ( |
50 |
QStringList() << "laj/" << "laj/lajfile.txt") |
51 |
<< "" << QStringList() |
52 |
<< static_cast<int>(QDir::NoFilter) |
53 |
<< static_cast<int>(QDir::Unsorted) |
54 |
<< (QStringList() << "laj/") << -1; |
55 |
QTest::newRow("separate dir (subdir listing)") << "sepdirsub.zip" << ( |
56 |
QStringList() << "laj/" << "laj/lajfile.txt") |
57 |
<< "laj" << QStringList() |
58 |
<< static_cast<int>(QDir::NoFilter) |
59 |
<< static_cast<int>(QDir::Unsorted) |
60 |
<< (QStringList() << "lajfile.txt") << -1; |
61 |
QTest::newRow("dirs only") << "dirsonly.zip" << ( |
62 |
QStringList() << "file" << "dir/") |
63 |
<< "" << QStringList() |
64 |
<< static_cast<int>(QDir::Dirs) |
65 |
<< static_cast<int>(QDir::Unsorted) |
66 |
<< (QStringList() << "dir/") << -1; |
67 |
QTest::newRow("files only") << "filesonly.zip" << ( |
68 |
QStringList() << "file1" << "parent/dir/" << "parent/file2") |
69 |
<< "parent" << QStringList() |
70 |
<< static_cast<int>(QDir::Files) |
71 |
<< static_cast<int>(QDir::Unsorted) |
72 |
<< (QStringList() << "file2") << -1; |
73 |
QTest::newRow("sorted") << "sorted.zip" << ( |
74 |
QStringList() << "file1" << "parent/subdir/" << "parent/subdir2/file3" << "parent/file2" << "parent/file0") |
75 |
<< "parent" << QStringList() |
76 |
<< static_cast<int>(QDir::NoFilter) |
77 |
<< static_cast<int>(QDir::Name) |
78 |
<< (QStringList() << "file0" << "file2" << "subdir/" << "subdir2/") |
79 |
<< -1; |
80 |
QTest::newRow("sorted dirs first") << "sorted-dirs.zip" << ( |
81 |
QStringList() << "file1" << "parent/subdir/" << "parent/subdir2/file3" << "parent/file2" << "parent/file0") |
82 |
<< "parent" << QStringList() |
83 |
<< static_cast<int>(QDir::NoFilter) |
84 |
<< static_cast<int>(QDir::Name | QDir::DirsFirst) |
85 |
<< (QStringList() << "subdir/" << "subdir2/" << "file0" << "file2") |
86 |
<< -1; |
87 |
QTest::newRow("sorted dirs first reversed") << "sorted-reverse.zip" << ( |
88 |
QStringList() << "file1" << "parent/subdir/" << "parent/subdir2/file3" << "parent/file2" << "parent/file0") |
89 |
<< "parent" << QStringList() |
90 |
<< static_cast<int>(QDir::NoFilter) |
91 |
<< static_cast<int>(QDir::Name | QDir::DirsFirst | QDir::Reversed) |
92 |
<< (QStringList() << "subdir2/" << "subdir/" << "file2" << "file0") |
93 |
<< -1; |
94 |
QTest::newRow("sorted by size") << "sorted-size.zip" << ( |
95 |
QStringList() << "file000" << "file10") |
96 |
<< "/" << QStringList() |
97 |
<< static_cast<int>(QDir::NoFilter) |
98 |
<< static_cast<int>(QDir::Size) |
99 |
<< (QStringList() << "file10" << "file000") << -1; |
100 |
QTest::newRow("sorted by time") << "sorted-time.zip" << ( |
101 |
QStringList() << "file04" << "file03" << "file02" << "subdir/subfile") |
102 |
<< "/" << QStringList() |
103 |
<< static_cast<int>(QDir::NoFilter) |
104 |
<< static_cast<int>(QDir::Time) |
105 |
<< (QStringList() << "subdir/" << "file04" << "file02" << "file03") |
106 |
<< -1; |
107 |
QTest::newRow("sorted by type") << "sorted-type.zip" << ( |
108 |
QStringList() << "file1.txt" << "file2.dat") |
109 |
<< "/" << QStringList() |
110 |
<< static_cast<int>(QDir::NoFilter) |
111 |
<< static_cast<int>(QDir::Type) |
112 |
<< (QStringList() << "file2.dat" << "file1.txt") << -1; |
113 |
QTest::newRow("name filter") << "name-filter.zip" << ( |
114 |
QStringList() << "file01" << "file02" << "laj") |
115 |
<< "/" << QStringList("file*") |
116 |
<< static_cast<int>(QDir::NoFilter) |
117 |
<< static_cast<int>(QDir::Name) |
118 |
<< (QStringList() << "file01" << "file02") << -1; |
119 |
QTest::newRow("case sensitive") << "case-sensitive.zip" << ( |
120 |
QStringList() << "a" << "B") |
121 |
<< "/" << QStringList() |
122 |
<< static_cast<int>(QDir::NoFilter) |
123 |
<< static_cast<int>(QDir::Name) |
124 |
<< (QStringList() << "B" << "a") |
125 |
<< static_cast<int>(QuaZip::csSensitive); |
126 |
QTest::newRow("case insensitive") << "case-insensitive.zip" << ( |
127 |
QStringList() << "B" << "a") |
128 |
<< "/" << QStringList() |
129 |
<< static_cast<int>(QDir::NoFilter) |
130 |
<< static_cast<int>(QDir::Name) |
131 |
<< (QStringList() << "a" << "B") |
132 |
<< static_cast<int>(QuaZip::csInsensitive); |
133 |
} |
134 |
|
135 |
void TestQuaZipDir::entryList() |
136 |
{ |
137 |
QFETCH(QString, zipName); |
138 |
QFETCH(QStringList, fileNames); |
139 |
QFETCH(QString, dirName); |
140 |
QFETCH(QStringList, nameFilters); |
141 |
QFETCH(int, filter); |
142 |
QFETCH(int, sort); |
143 |
QDir::Filters filters = static_cast<QDir::Filters>(filter); |
144 |
QDir::SortFlags sorting = static_cast<QDir::SortFlags>(sort); |
145 |
QFETCH(QStringList, entries); |
146 |
QFETCH(int, caseSensitivity); |
147 |
QDir curDir; |
148 |
if (!createTestFiles(fileNames)) { |
149 |
QFAIL("Couldn't create test files"); |
150 |
} |
151 |
if (!createTestArchive(zipName, fileNames)) { |
152 |
QFAIL("Couldn't create test archive"); |
153 |
} |
154 |
removeTestFiles(fileNames); |
155 |
QuaZip zip(zipName); |
156 |
QVERIFY(zip.open(QuaZip::mdUnzip)); |
157 |
QuaZipDir dir(&zip, dirName); |
158 |
QVERIFY(dir.exists()); |
159 |
if (caseSensitivity != -1) { |
160 |
dir.setCaseSensitivity(static_cast<QuaZip::CaseSensitivity>( |
161 |
caseSensitivity)); |
162 |
QCOMPARE(dir.caseSensitivity(), static_cast<QuaZip::CaseSensitivity>( |
163 |
caseSensitivity)); |
164 |
} |
165 |
QCOMPARE(dir.entryList(nameFilters, filters, sorting), entries); |
166 |
// Test default sorting setting. |
167 |
dir.setSorting(sorting); |
168 |
QCOMPARE(dir.sorting(), sorting); |
169 |
QCOMPARE(dir.entryList(nameFilters, filters), entries); |
170 |
// Test default name filter setting. |
171 |
dir.setNameFilters(nameFilters); |
172 |
QCOMPARE(dir.nameFilters(), nameFilters); |
173 |
QCOMPARE(dir.entryList(filters), entries); |
174 |
// Test default filters. |
175 |
dir.setFilter(filters); |
176 |
QCOMPARE(dir.filter(), filters); |
177 |
QCOMPARE(dir.entryList(), entries); |
178 |
QCOMPARE(dir.entryList().count(), static_cast<int>(dir.count())); |
179 |
zip.close(); |
180 |
curDir.remove(zipName); |
181 |
} |
182 |
|
183 |
void TestQuaZipDir::cd_data() |
184 |
{ |
185 |
QTest::addColumn<QString>("zipName"); |
186 |
QTest::addColumn<QStringList>("fileNames"); |
187 |
QTest::addColumn<QString>("dirName"); |
188 |
QTest::addColumn<QString>("targetDirName"); |
189 |
QTest::addColumn<QString>("result"); |
190 |
QTest::newRow("cdDown") << "simple.zip" << ( |
191 |
QStringList() << "cddown.txt" << "testdir1/test1.txt" |
192 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
193 |
<< "" << "testdir1" << "testdir1"; |
194 |
QTest::newRow("cdUp") << "cdup.zip" << ( |
195 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
196 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
197 |
<< "testdir1" << ".." << ""; |
198 |
QTest::newRow("cdSide") << "cdside.zip" << ( |
199 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
200 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
201 |
<< "testdir1" << "../testdir2" << "testdir2"; |
202 |
QTest::newRow("cdDownUp") << "cdside.zip" << ( |
203 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
204 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
205 |
<< "" << "testdir1/.." << ""; |
206 |
QTest::newRow("cdDeep") << "cdside.zip" << ( |
207 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
208 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
209 |
<< "" << "testdir2/subdir" << "testdir2/subdir"; |
210 |
QTest::newRow("cdDeeper") << "cdside.zip" << ( |
211 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
212 |
<< "testdir2/test2.txt" << "testdir2/subdir/subdir2/subdir3/test2sub.txt") |
213 |
<< "testdir2/subdir" << "subdir2/subdir3" << "testdir2/subdir/subdir2/subdir3"; |
214 |
QTest::newRow("cdRoot") << "cdup.zip" << ( |
215 |
QStringList() << "test0.txt" << "testdir1/test1.txt" |
216 |
<< "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt") |
217 |
<< "testdir1" << "/" << ""; |
218 |
} |
219 |
|
220 |
void TestQuaZipDir::cd() |
221 |
{ |
222 |
QFETCH(QString, zipName); |
223 |
QFETCH(QStringList, fileNames); |
224 |
QFETCH(QString, dirName); |
225 |
QFETCH(QString, targetDirName); |
226 |
QFETCH(QString, result); |
227 |
QDir curDir; |
228 |
if (!createTestFiles(fileNames)) { |
229 |
QFAIL("Couldn't create test files"); |
230 |
} |
231 |
if (!createTestArchive(zipName, fileNames)) { |
232 |
QFAIL("Couldn't create test archive"); |
233 |
} |
234 |
removeTestFiles(fileNames); |
235 |
QuaZip zip(zipName); |
236 |
QVERIFY(zip.open(QuaZip::mdUnzip)); |
237 |
QuaZipDir dir(&zip, dirName); |
238 |
if (dirName.startsWith('/')) { |
239 |
dirName = dirName.mid(1); |
240 |
} |
241 |
if (dirName.endsWith('/')) { |
242 |
dirName.chop(1); |
243 |
} |
244 |
QCOMPARE(dir.path(), dirName); |
245 |
{ |
246 |
int lastSlash = dirName.lastIndexOf('/'); |
247 |
if (lastSlash == -1) { |
248 |
// dirName is just a single name |
249 |
if (dirName.isEmpty()) { |
250 |
QCOMPARE(dir.dirName(), QString::fromLatin1(".")); |
251 |
} else { |
252 |
QCOMPARE(dir.dirName(), dirName); |
253 |
} |
254 |
} else { |
255 |
// dirName is a sequence |
256 |
QCOMPARE(dir.dirName(), dirName.mid(lastSlash + 1)); |
257 |
} |
258 |
} |
259 |
if (targetDirName == "..") { |
260 |
QVERIFY(dir.cdUp()); |
261 |
} else { |
262 |
QVERIFY(dir.cd(targetDirName)); |
263 |
} |
264 |
QCOMPARE(dir.path(), result); |
265 |
// Try to go back |
266 |
dir.setPath(dirName); |
267 |
QCOMPARE(dir.path(), dirName); |
268 |
zip.close(); |
269 |
curDir.remove(zipName); |
270 |
} |
271 |
|
272 |
void TestQuaZipDir::entryInfoList() |
273 |
{ |
274 |
QString zipName = "entryInfoList.zip"; |
275 |
QStringList fileNames; |
276 |
fileNames << "test.txt"; |
277 |
if (!createTestFiles(fileNames)) { |
278 |
QFAIL("Couldn't create test files"); |
279 |
} |
280 |
if (!createTestArchive(zipName, fileNames)) { |
281 |
QFAIL("Couldn't create test archive"); |
282 |
} |
283 |
removeTestFiles(fileNames); |
284 |
QuaZip zip(zipName); |
285 |
QDir curDir; |
286 |
QVERIFY(zip.open(QuaZip::mdUnzip)); |
287 |
QuaZipDir dir(&zip, "/"); |
288 |
QCOMPARE(dir.entryInfoList().size(), 1); |
289 |
QCOMPARE(dir.entryInfoList64().size(), 1); |
290 |
zip.close(); |
291 |
curDir.remove(zipName); |
292 |
} |
293 |
|
294 |
void TestQuaZipDir::operators() |
295 |
{ |
296 |
QString zipName = "zipDirOperators.zip"; |
297 |
QStringList fileNames; |
298 |
fileNames << "dir/test.txt" << "root.txt"; |
299 |
if (!createTestFiles(fileNames)) { |
300 |
QFAIL("Couldn't create test files"); |
301 |
} |
302 |
if (!createTestArchive(zipName, fileNames)) { |
303 |
QFAIL("Couldn't create test archive"); |
304 |
} |
305 |
removeTestFiles(fileNames); |
306 |
QuaZip zip(zipName); |
307 |
QDir curDir; |
308 |
QVERIFY(zip.open(QuaZip::mdUnzip)); |
309 |
QuaZipDir dir(&zip, "dir"); |
310 |
QuaZipDir dir2 = dir; // Copy constructor |
311 |
QCOMPARE(dir2.path(), QString::fromLatin1("dir")); |
312 |
dir2.cdUp(); |
313 |
QCOMPARE(dir2.path(), QString::fromLatin1("")); |
314 |
QCOMPARE(dir.path(), QString::fromLatin1("dir")); |
315 |
dir2 = dir; // operator=() |
316 |
QCOMPARE(dir2.path(), QString::fromLatin1("dir")); |
317 |
QVERIFY(dir2 == dir); // opertor== |
318 |
dir.cd("/"); |
319 |
QCOMPARE(dir[0], QString::fromLatin1("dir/")); |
320 |
QCOMPARE(dir[1], QString::fromLatin1("root.txt")); |
321 |
zip.close(); |
322 |
curDir.remove(zipName); |
323 |
} |
324 |
|
325 |
void TestQuaZipDir::filePath() |
326 |
{ |
327 |
QString zipName = "entryInfoList.zip"; |
328 |
QStringList fileNames; |
329 |
fileNames << "root.txt" << "dir/test.txt"; |
330 |
if (!createTestFiles(fileNames)) { |
331 |
QFAIL("Couldn't create test files"); |
332 |
} |
333 |
if (!createTestArchive(zipName, fileNames)) { |
334 |
QFAIL("Couldn't create test archive"); |
335 |
} |
336 |
removeTestFiles(fileNames); |
337 |
QuaZip zip(zipName); |
338 |
QDir curDir; |
339 |
QVERIFY(zip.open(QuaZip::mdUnzip)); |
340 |
QuaZipDir dir(&zip); |
341 |
QVERIFY(dir.cd("dir")); |
342 |
QCOMPARE(dir.relativeFilePath("/root.txt"), |
343 |
QString::fromLatin1("../root.txt")); |
344 |
QCOMPARE(dir.filePath("test.txt"), |
345 |
QString::fromLatin1("dir/test.txt")); |
346 |
zip.close(); |
347 |
curDir.remove(zipName); |
348 |
} |