source: s10k/CommonLibs/quazip-0.7.2/qztest/testquazipnewinfo.cpp @ 1096

Last change on this file since 1096 was 1096, checked in by s10k, 19 months ago

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 size: 6.2 KB
Line 
1#include "testquazipnewinfo.h"
2
3#include "qztest.h"
4
5#include <QDir>
6#include <QFileInfo>
7#include <QtTest/QtTest>
8
9#include <quazip/quazip.h>
10#include <quazip/quazipfile.h>
11#include <quazip/quazipnewinfo.h>
12#include <quazip/quazipfileinfo.h>
13
14TestQuaZipNewInfo::TestQuaZipNewInfo(QObject *parent) :
15    QObject(parent)
16{
17}
18
19void TestQuaZipNewInfo::setFileNTFSTimes()
20{
21    QString zipName = "newtimes.zip";
22    QStringList testFiles;
23    testFiles << "test.txt";
24    QDir curDir;
25    if (curDir.exists(zipName)) {
26        if (!curDir.remove(zipName))
27            QFAIL("Can't remove zip file");
28    }
29    if (!createTestFiles(testFiles)) {
30        QFAIL("Can't create test file");
31    }
32    QDateTime base(QDate(1601, 1, 1), QTime(0, 0), Qt::UTC);
33    quint64 mTicks, aTicks, cTicks;
34    {
35        // create
36        QuaZip zip(zipName);
37        QVERIFY(zip.open(QuaZip::mdCreate));
38        QuaZipFile zipFile(&zip);
39        QFileInfo fileInfo("tmp/test.txt");
40        QDateTime lm = fileInfo.lastModified().toUTC();
41        QDateTime lr = fileInfo.lastRead().toUTC();
42        QDateTime cr = fileInfo.created().toUTC();
43        mTicks = (static_cast<qint64>(base.date().daysTo(lm.date()))
44                * Q_UINT64_C(86400000)
45                + static_cast<qint64>(base.time().msecsTo(lm.time())))
46            * Q_UINT64_C(10000);
47        aTicks = (static_cast<qint64>(base.date().daysTo(lr.date()))
48                * Q_UINT64_C(86400000)
49                + static_cast<qint64>(base.time().msecsTo(lr.time())))
50            * Q_UINT64_C(10000);
51        cTicks = (static_cast<qint64>(base.date().daysTo(cr.date()))
52                * Q_UINT64_C(86400000)
53                + static_cast<qint64>(base.time().msecsTo(cr.time())))
54            * Q_UINT64_C(10000);
55        QuaZipNewInfo newInfo("test.txt", "tmp/test.txt");
56        newInfo.setFileNTFSTimes("tmp/test.txt");
57        QVERIFY(zipFile.open(QIODevice::WriteOnly, newInfo));
58        zipFile.close();
59        zip.close();
60    }
61    {
62        // check
63        QuaZip zip(zipName);
64        QVERIFY(zip.open(QuaZip::mdUnzip));
65        zip.goToFirstFile();
66        QuaZipFileInfo64 fileInfo;
67        QVERIFY(zip.getCurrentFileInfo(&fileInfo));
68        zip.close();
69        QByteArray &extra = fileInfo.extra;
70        bool ntfsFound = false;
71        int timesFound = 0;
72        for (int i = 0; i <= extra.size() - 4; ) {
73            unsigned type = static_cast<unsigned>(static_cast<unsigned char>(
74                                                      extra.at(i)))
75                    | (static_cast<unsigned>(static_cast<unsigned char>(
76                                                 extra.at(i + 1))) << 8);
77            i += 2;
78            unsigned length = static_cast<unsigned>(static_cast<unsigned char>(
79                                                        extra.at(i)))
80                    | (static_cast<unsigned>(static_cast<unsigned char>(
81                                                 extra.at(i + 1))) << 8);
82            i += 2;
83            if (type == 0x000Au && length >= 32) {
84                ntfsFound = true;
85                i += 4; // reserved
86                while (i <= extra.size() - 4) {
87                    unsigned tag = static_cast<unsigned>(
88                                static_cast<unsigned char>(extra.at(i)))
89                            | (static_cast<unsigned>(
90                                   static_cast<unsigned char>(extra.at(i + 1)))
91                               << 8);
92                    i += 2;
93                    unsigned tagsize = static_cast<unsigned>(
94                                static_cast<unsigned char>(extra.at(i)))
95                            | (static_cast<unsigned>(
96                                   static_cast<unsigned char>(extra.at(i + 1)))
97                               << 8);
98                    i += 2;
99                    QCOMPARE(tagsize, static_cast<unsigned>(24));
100                    if (tag == 0x0001u && tagsize >= 24) {
101                        for (int timesPos = i;
102                             i < timesPos + 24;
103                             i += 8, tagsize -= 8) {
104                            quint64 time = static_cast<quint64>(
105                                static_cast<unsigned char>(extra.at(i)))
106                            | (static_cast<quint64>(static_cast<unsigned char>(
107                                                       extra.at(i + 1))) << 8)
108                            | (static_cast<quint64>(static_cast<unsigned char>(
109                                                       extra.at(i + 2))) << 16)
110                            | (static_cast<quint64>(static_cast<unsigned char>(
111                                                       extra.at(i + 3))) << 24)
112                            | (static_cast<quint64>(static_cast<unsigned char>(
113                                                       extra.at(i + 4))) << 32)
114                            | (static_cast<quint64>(static_cast<unsigned char>(
115                                                       extra.at(i + 5))) << 40)
116                            | (static_cast<quint64>(static_cast<unsigned char>(
117                                                       extra.at(i + 6))) << 48)
118                            | (static_cast<quint64>(static_cast<unsigned char>(
119                                                       extra.at(i + 7))) << 56);
120                            ++timesFound;
121                            if (i - timesPos == 0) {
122                                QCOMPARE(time, mTicks);
123                            } else if (i - timesPos == 8) {
124                                QCOMPARE(time, aTicks);
125                            } else if (i - timesPos == 16) {
126                                QCOMPARE(time, cTicks);
127                            } else {
128                                QFAIL("Wrong position");
129                            }
130                        }
131                        i += tagsize;
132                    } else {
133                        i += tagsize;
134                    }
135
136                }
137            } else {
138                i += length;
139            }
140        }
141        QVERIFY(ntfsFound);
142        QCOMPARE(timesFound, 3);
143    }
144    removeTestFiles(testFiles);
145    curDir.remove(zipName);
146}
Note: See TracBrowser for help on using the repository browser.