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 
entryList_data()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 
entryList()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 
cd_data()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 
cd()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 
entryInfoList()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 
operators()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 
filePath()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 }
349