1 
2 #include "verifiertest.h"
3 #include "../settings.h"
4 #include "../core/verifier.h"
5 
6 #include <QtTest>
7 #include <QDebug>
8 #include <QTemporaryDir>
9 
10 typedef QPair<QString, QString> Checksum;
11 typedef QPair<QString, PartialChecksums> Checksums;
12 Q_DECLARE_METATYPE(Checksum)
Q_DECLARE_METATYPE(QList<Checksum>)13 Q_DECLARE_METATYPE(QList<Checksum>)
14 Q_DECLARE_METATYPE(Checksums)
15 Q_DECLARE_METATYPE(QList<Checksums>)
16 Q_DECLARE_METATYPE(Verifier::ChecksumStrength)
17 Q_DECLARE_METATYPE(QList<KIO::fileoffset_t>)
18 
19 VerfierTest::VerfierTest(QObject *parent)
20   : QObject(parent),
21     m_supported(Verifier::supportedVerficationTypes())
22 {
23     //create a file which will used in the test
24      m_tempDir.reset(new QTemporaryDir(QDir::tempPath() + QStringLiteral("/kget_test")));
25      QString path = m_tempDir->name();
26      path.append("test.txt");
27      QFile file(path);
28      if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
29          qCCritical(KGET_DEBUG) << "Creating file failed:" << path;
30          abort();
31      }
32      m_file = QUrl::fromLocalFile(path);
33 
34     const QByteArray data("This is a test for the KGet Verifier class.\n");
35     const qint64 size = data.size();
36     for (int i = 0; i < 50000; ++i) {
37         if (file.write(data) != size) {
38             qCCritical(KGET_DEBUG) << "Creating file failed:" << path;
39             abort();
40         }
41     }
42 
43     qCDebug(KGET_DEBUG) << "Supported types:" << m_supported;
44 }
45 
testChecksum()46 void VerfierTest::testChecksum()
47 {
48     QFETCH(QString, type);
49     QFETCH(QString, checksum);
50 
51     if (!m_supported.contains(type)) {
52         return;
53     }
54 
55     QCOMPARE(Verifier::checksum(m_file, type, nullptr), checksum);
56 }
57 
testChecksum_data()58 void VerfierTest::testChecksum_data()
59 {
60     QTest::addColumn<QString>("type");
61     QTest::addColumn<QString>("checksum");
62 
63     QTest::newRow("md5 checksum") << "md5" << "1c3b1b627e4f236fdac8f6ab3ee160d1";
64     QTest::newRow("sha1 checksum") << "sha1" << "0a4886f5c6e45c5a879b0093a43cb06fc5568bc5";
65     QTest::newRow("sha256 checksum") << "sha256" << "9cf2cfe941569d8627dc3ede2897dea1c3949eb6bd124d3bca06a888492f955b";
66     QTest::newRow("sha384 checksum") << "sha384" << "a27d95917b3d3ff9145fd9a66cc9852f3a15e7ebac9e7112d4260e2747d45c89a949fe53d110ecc260e246f959ca30e9";
67     QTest::newRow("sha512 checksum") << "sha512" << "4c6d2020482ddb1c6f7275f40fb35084805f06a23e433420e46b794ef7ad9770d527c4a7f5dc50bdf7acbd3f2e0a34f00a1b7283a1b222da6835f93505db6641";
68 }
69 
testPartialChecksums()70 void VerfierTest::testPartialChecksums()
71 {
72     QFETCH(QString, type);
73     QFETCH(KIO::filesize_t, length);
74     QFETCH(QStringList, checksums);
75     QFETCH(bool, result);
76 
77     const PartialChecksums partial = Verifier::partialChecksums(m_file, type, length, nullptr);
78     QCOMPARE((partial.checksums() == checksums), result);
79 }
80 
testPartialChecksums_data()81 void VerfierTest::testPartialChecksums_data()
82 {
83     QTest::addColumn<QString>("type");
84     QTest::addColumn<KIO::filesize_t>("length");
85     QTest::addColumn<QStringList>("checksums");
86     QTest::addColumn<bool>("result");
87 
88     QTest::newRow("md5, empty checksums") << "md5" << KIO::filesize_t(512 * 1000) << QStringList() << expectedResult(false, "md5");
89     QTest::newRow("md5, one checksum is too long, 500 KiB") << "md5" << KIO::filesize_t(500 * 1024) << (QStringList() << "AAAAA8c53d0109e5222e2c57d187eec33ab71" << "f13b7c9978ac7edac8b1c2b9be55abb0" <<"643086ed0d7e733629c848e94e29cdc4" << "6c349ee55737d9bc45ef1b1e75ec7bdf" << "40363ab59bbfa39f6faa4aa18ee75a6c") << expectedResult(false, "md5");
90     QTest::newRow("valid md5 checksums, 500 KiB") << "md5" << KIO::filesize_t(500 * 1024) << (QStringList() << "8c53d0109e5222e2c57d187eec33ab71" << "f13b7c9978ac7edac8b1c2b9be55abb0" <<"643086ed0d7e733629c848e94e29cdc4" << "6c349ee55737d9bc45ef1b1e75ec7bdf" << "40363ab59bbfa39f6faa4aa18ee75a6c") << expectedResult(true, "md5");
91     QTest::newRow("valid md5 checksums, 400 KiB") << "md5" << KIO::filesize_t(400 * 1024) << (QStringList() << "ce7d795bd0b1499f18d2ba8f338302d3" << "e6681cc0049c6cae347039578eaf1117" << "e66499f43f930fb013092a2d66ecdfaf" << "b2930c55fea65c11813dff09447fbe92" << "77b79bd53b62accec6367c7d7b2fc85b" << "40363ab59bbfa39f6faa4aa18ee75a6c") << expectedResult(true, "md5");
92     QTest::newRow("valid md5 checksums, one part with file size") << "md5" << KIO::filesize_t(2200000) << (QStringList() << "1c3b1b627e4f236fdac8f6ab3ee160d1") << expectedResult(true, "md5");
93     QTest::newRow("valid sha1 checksums, 1000 KiB") << "sha1" << KIO::filesize_t(1000 * 1024) << (QStringList() << "5d76447e7655fd1d4dfba458c33340757d81eb95" << "0bc9428e3b39fc34ab457d58d62f1973a1183ac2" << "48a313a958ea1c55eb9527b0141ae30742fedfdb") << expectedResult(true, "sha1");
94 }
95 
testIsChecksum()96 void VerfierTest::testIsChecksum()
97 {
98     QFETCH(QString, type);
99     QFETCH(QString, checksum);
100     QFETCH(bool, result);
101 
102     QCOMPARE(Verifier::isChecksum(type, checksum), result);
103 }
104 
testIsChecksum_data()105 void VerfierTest::testIsChecksum_data()
106 {
107     QTest::addColumn<QString>("type");
108     QTest::addColumn<QString>("checksum");
109     QTest::addColumn<bool>("result");
110 
111     const QStringList supported = Verifier::supportedVerficationTypes();
112 
113     QTest::newRow("md5, too many chars") << "md5" << "1c3b1b627e4f236fdac8f6ab3ee160d1a" << expectedResult(false, "md5");
114     QTest::newRow("md5, correct length, one wrong char") << "md5" << "1c b1b627e4f236fdac8f6ab3ee160d1" << expectedResult(false, "md5");
115     QTest::newRow("md5, correct length, many wrong chars") << "md5" << "1c[b1b627e4f236fd)c8f6ab3_e160d1" << expectedResult(false, "md5");
116     QTest::newRow("valid md5 checksum") << "md5" << "1C3B1b627e4F236fdac8f6ab3ee160d1" << expectedResult(true, "md5");
117     QTest::newRow("valid sha1 checksum") << "sha1" << "0a4886f5c6e45c5a879b0093a43cb06fc5568bc5" << expectedResult(true, "sha1");
118     QTest::newRow("valid sha256 checksum") << "sha256" << "9cf2cfe941569d8627dc3ede2897dea1c3949eb6bd124d3bca06a888492f955b" << expectedResult(true, "sha256");
119     QTest::newRow("valid sha384 checksum") << "sha384" << "a27d95917b3d3ff9145fd9a66cc9852f3a15e7ebac9e7112d4260e2747d45c89a949fe53d110ecc260e246f959ca30e9" << expectedResult(true, "sha384");
120     QTest::newRow("valid sha512 checksum") << "sha512" << "4c6d2020482ddb1c6f7275f40fb35084805f06a23e433420e46b794ef7ad9770d527c4a7f5dc50bdf7acbd3f2e0a34f00a1b7283a1b222da6835f93505db6641" << expectedResult(true, "sha512");
121 }
122 
testAvailableChecksum()123 void VerfierTest::testAvailableChecksum()
124 {
125     QFETCH(QList<Checksum>, checksums);
126     QFETCH(Verifier::ChecksumStrength, strength);
127     QFETCH(Checksum, result);
128 
129     Verifier verifier(m_file);
130     for (int i = 0; i < checksums.size(); ++i) {
131         verifier.addChecksum(checksums[i].first, checksums[i].second);
132     }
133 
134     const Checksum returned = verifier.availableChecksum(strength);
135     QCOMPARE(returned, result);
136 }
137 
testAvailableChecksum_data()138 void VerfierTest::testAvailableChecksum_data()
139 {
140     QTest::addColumn<QList<Checksum> >("checksums");
141     QTest::addColumn<Verifier::ChecksumStrength>("strength");
142     QTest::addColumn<Checksum>("result");
143 
144     const Checksum md5sum("md5", "1c3b1b627e4f236fdac8f6ab3ee160d1");
145     const Checksum md5sumInvalid("md5", "1c b1b627e4f236fdac8f6ab3ee160d1");
146     const Checksum sha1sum("sha1", "0a4886f5c6e45c5a879b0093a43cb06fc5568bc5");
147     const Checksum sha1sumInvalid("sha1", "0a4886f5c6e45c5a879b0093a43cb06fc5568bc");
148     const Checksum emptysum;
149 
150     QTest::newRow("weak (md5), md5 should be returned") << (QList<Checksum>() << md5sum) << Verifier::Weak << md5sum;
151     QTest::newRow("strong (md5), md5 should be returned") << (QList<Checksum>() << md5sum) << Verifier::Strong << md5sum;
152     QTest::newRow("strongest (md5), md5 should be returned") << (QList<Checksum>() << md5sum) << Verifier::Strongest << md5sum;
153     QTest::newRow("weak (md5), nothing should be returned (md5 invalid)") << (QList<Checksum>() << md5sumInvalid) << Verifier::Weak << emptysum;
154     QTest::newRow("strong (md5), nothing should be returned (md5 invalid)") << (QList<Checksum>() << md5sumInvalid) << Verifier::Strong << emptysum;
155     QTest::newRow("strongest (md5), nothing should be returned (md5 invalid)") << (QList<Checksum>() << md5sumInvalid) << Verifier::Strongest << emptysum;
156     if (m_supported.contains("sha1")) {
157         QTest::newRow("weak (md5, sha1), sha1 should be returned (md5 invalid)") << (QList<Checksum>() << md5sumInvalid << sha1sum) << Verifier::Weak << sha1sum;
158         QTest::newRow("strong (md5, sha1), md5 should be returned (sha1 invalid)") << (QList<Checksum>() << md5sum << sha1sumInvalid) << Verifier::Strong << md5sum;
159         QTest::newRow("strongest (md5, sha1), md5 should be returned (sha1 invalid)") << (QList<Checksum>() << md5sum << sha1sumInvalid) << Verifier::Strongest << md5sum;
160         QTest::newRow("strong (md5, sha1), sha1 should be returned") << (QList<Checksum>() << md5sum << sha1sum) << Verifier::Strong << sha1sum;
161         QTest::newRow("strong (md5, sha1), sha1 should be returned") << (QList<Checksum>() << md5sum << sha1sum) << Verifier::Strongest << sha1sum;
162         QTest::newRow("strongest (md5, sha1), nothing should be returned (md5, sha1 invalid)") << (QList<Checksum>() << md5sumInvalid << sha1sumInvalid) << Verifier::Strongest << emptysum;
163     }
164 }
165 
testAvailablePartialChecksum()166 void VerfierTest::testAvailablePartialChecksum()
167 {
168     QFETCH(QList<Checksums>, data);
169     QFETCH(Verifier::ChecksumStrength, strength);
170     QFETCH(Checksums, result);
171 
172     Verifier verifier(m_file);
173     for (int i = 0; i < data.size(); ++i) {
174         verifier.addPartialChecksums(data[i].first, data[i].second.length(), data[i].second.checksums());
175     }
176 
177     const QPair<QString, PartialChecksums*> returned = verifier.availablePartialChecksum(strength);
178     QVERIFY(!returned.first.isEmpty());
179     QVERIFY(returned.second);
180 
181     if (returned.second) {
182         QCOMPARE(returned.first, result.first);
183         QCOMPARE(returned.second->checksums(), result.second.checksums());
184         QCOMPARE(returned.second->length(), result.second.length());
185     }
186 }
187 
testAvailablePartialChecksum_data()188 void VerfierTest::testAvailablePartialChecksum_data()
189 {
190     QTest::addColumn<QList<Checksums> >("data");
191     QTest::addColumn<Verifier::ChecksumStrength>("strength");
192     QTest::addColumn<Checksums>("result");
193 
194     const Checksums md5Sums("md5", PartialChecksums(400 * 1024, (QStringList() << "ce7d795bd0b1499f18d2ba8f338302d3" << "e6681cc0049c6cae347039578eaf1117" << "e66499f43f930fb013092a2d66ecdfaf" << "b2930c55fea65c11813dff09447fbe92" << "77b79bd53b62accec6367c7d7b2fc85b" << "40363ab59bbfa39f6faa4aa18ee75a6c")));
195     const Checksums sha1Sums("sha1", PartialChecksums(1000 * 1024, (QStringList() << "5d76447e7655fd1d4dfba458c33340757d81eb95" << "0bc9428e3b39fc34ab457d58d62f1973a1183ac2" << "48a313a958ea1c55eb9527b0141ae30742fedfdb")));
196     const Checksums sha512Sums("sha512", PartialChecksums(2000 * 1024, (QStringList() << "ba9c09d26d7ec7ff60671bc72ec9fed10dee851ae951fbb9e41061490fc10019076982b4c25723870bb5ff17401fdd6d21db43f6018a0604177197db384122d3" << "a63af512c40951216f20c01f5d5623af4c24b907f9a78ded98c14ab550e23764cd131961cbf45df7dfcb17b3cca7443db12de1e0540ed421579d15ccfc7863d0")));
197 
198     QTest::newRow("weak (md5), md5 should be returned") << (QList<Checksums>() << md5Sums) << Verifier::Weak << md5Sums;
199     QTest::newRow("strong (md5), md5 should be returned") << (QList<Checksums>() << md5Sums) << Verifier::Strong << md5Sums;
200     QTest::newRow("strongest (md5), md5 should be returned") << (QList<Checksums>() << md5Sums) << Verifier::Strongest << md5Sums;
201     if (m_supported.contains("sha1")) {
202         QTest::newRow("weak (md5, sha1), md5 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums) << Verifier::Weak << md5Sums;
203         QTest::newRow("strong (md5, sha1), sha1 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums) << Verifier::Strong << sha1Sums;
204         QTest::newRow("strongest (md5, sha1), sha1 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums) << Verifier::Strongest << sha1Sums;
205         if (m_supported.contains("sha512")) {
206             QTest::newRow("weak (md5, sha1, sha512), md5 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums << sha512Sums) << Verifier::Weak << md5Sums;
207             QTest::newRow("strong (md5, sha1, sha512), sha1 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums << sha512Sums) << Verifier::Strong << sha1Sums;
208             QTest::newRow("strongest (md5, sha1, sha512), sha512 should be returned") << (QList<Checksums>() << md5Sums << sha1Sums << sha512Sums) << Verifier::Strongest << sha512Sums;
209         }
210     }
211 }
212 
expectedResult(bool expected,const QString & type)213 bool VerfierTest::expectedResult(bool expected, const QString& type)
214 {
215     return (expected && m_supported.contains(type));
216 }
217 
testVerify()218 void VerfierTest::testVerify()
219 {
220     QFETCH(QList<Checksum>, checksums);
221     QFETCH(Verifier::ChecksumStrength, strength);
222     QFETCH(bool, result);
223 
224     const Verifier::ChecksumStrength tempStrength = static_cast<Verifier::ChecksumStrength>(Settings::checksumStrength());
225     Settings::setChecksumStrength(strength);
226     Verifier verifier(m_file);
227     for (int i = 0; i < checksums.size(); ++i) {
228         verifier.addChecksum(checksums[i].first, checksums[i].second);
229     }
230 
231     QSignalSpy stateSpy(&verifier, SIGNAL(verified(bool)));
232     QVERIFY(stateSpy.isValid());
233     QCOMPARE(stateSpy.count(), 0);
234 
235     verifier.verify();
236 
237     //wait for a maximum of 5 seconds, the slowest computer should be done by then
238     for (int i = 0; !stateSpy.count() && (i < 50); ++i) {
239         QTest::qWait(100);
240     }
241 
242     QCOMPARE(stateSpy.count(), 1);
243     const QList<QVariant> argument = stateSpy.takeFirst();
244     QCOMPARE(argument.count(), 1);
245     QCOMPARE(argument.first().toBool(), result);
246 
247     Settings::setChecksumStrength(tempStrength);
248 }
249 
testVerify_data()250 void VerfierTest::testVerify_data()
251 {
252     QTest::addColumn<QList<Checksum> >("checksums");
253     QTest::addColumn<Verifier::ChecksumStrength>("strength");
254     QTest::addColumn<bool>("result");
255 
256     const Checksum md5sumCorrect("md5", "1c3b1b627e4f236fdac8f6ab3ee160d1");
257     const Checksum md5sumWrong("md5", "ac3b1b627e4f236fdac8f6ab3ee160d1");
258     const Checksum md5sumInvalid("md5", "1c b1b627e4f236fdac8f6ab3ee160d1");
259     const Checksum sha1sumCorrect("sha1", "0a4886f5c6e45c5a879b0093a43cb06fc5568bc5");
260     const Checksum sha1sumWrong("sha1", "aa4886f5c6e45c5a879b0093a43cb06fc5568bc5");
261     const Checksum sha1sumInvalid("sha1", "0a4886f5c6e45c5a879b0093a43cb0");
262 
263     QTest::newRow("weak (md5), should be verified") << (QList<Checksum>() << md5sumCorrect) << Verifier::Weak << true;
264     QTest::newRow("strong (md5), should be verified") << (QList<Checksum>() << md5sumCorrect) << Verifier::Strong << true;
265     QTest::newRow("strongest (md5), should be verified") << (QList<Checksum>() << md5sumCorrect) << Verifier::Strongest << true;
266     QTest::newRow("weak (md5), should not be verified (md5 wrong)") << (QList<Checksum>() << md5sumWrong) << Verifier::Weak << false;
267     if (m_supported.contains("sha1")) {
268         QTest::newRow("weak (md5, sha1), should not be verified (md5 wrong)") << (QList<Checksum>() << md5sumWrong << sha1sumCorrect) << Verifier::Weak << false;
269         QTest::newRow("weak (md5, sha1), should be verified (md5 invalid)") << (QList<Checksum>() << md5sumInvalid << sha1sumCorrect) << Verifier::Weak << true;
270         QTest::newRow("strong (md5, sha1), should not be verified (sha1 wrong)") << (QList<Checksum>() << md5sumCorrect << sha1sumWrong) << Verifier::Strong << false;
271         QTest::newRow("strong (md5, sha1), should be verified (sha1 invalid)") << (QList<Checksum>() << md5sumCorrect << sha1sumInvalid) << Verifier::Strong << true;
272         QTest::newRow("strong (md5, sha1), should be verified") << (QList<Checksum>() << md5sumCorrect << sha1sumCorrect) << Verifier::Strong << true;
273         QTest::newRow("strongest (md5, sha1), should be verified (sha1 invalid)") << (QList<Checksum>() << md5sumCorrect << sha1sumInvalid) << Verifier::Strongest << true;
274     }
275 }
276 
testBrokenPieces()277 void VerfierTest::testBrokenPieces()
278 {
279     QFETCH(QList<Checksums>, data);
280     QFETCH(Verifier::ChecksumStrength, strength);
281     QFETCH(QList<KIO::fileoffset_t>, offsets);
282     QFETCH(KIO::filesize_t, length);
283 
284     const Verifier::ChecksumStrength tempStrength = static_cast<Verifier::ChecksumStrength>(Settings::checksumStrength());
285     Settings::setChecksumStrength(strength);
286     Verifier verifier(m_file);
287     for (int i = 0; i < data.size(); ++i) {
288         verifier.addPartialChecksums(data[i].first, data[i].second.length(), data[i].second.checksums());
289     }
290 
291     QSignalSpy stateSpy(&verifier, SIGNAL(brokenPieces(QList<KIO::fileoffset_t>,KIO::filesize_t)));
292     QVERIFY(stateSpy.isValid());
293     QCOMPARE(stateSpy.count(), 0);
294 
295     verifier.brokenPieces();
296 
297     //wait for a maximum of 5 seconds, the slowest computer should be done by then
298     for (int i = 0; !stateSpy.count() && (i < 50); ++i) {
299         QTest::qWait(100);
300     }
301 
302     QCOMPARE(stateSpy.count(), 1);
303     const QList<QVariant> argument = stateSpy.takeFirst();
304     QCOMPARE(argument.count(), 2);
305     const QList<KIO::fileoffset_t> returnedOffsets = qvariant_cast<QList<KIO::fileoffset_t> >(argument[0]);
306     QCOMPARE(returnedOffsets, offsets);
307     const KIO::filesize_t returnedLength = qvariant_cast<KIO::filesize_t>(argument[1]);
308     QCOMPARE(returnedLength, length);
309 
310     Settings::setChecksumStrength(tempStrength);
311 }
312 
testBrokenPieces_data()313 void VerfierTest::testBrokenPieces_data()
314 {
315     QTest::addColumn<QList<Checksums> >("data");
316     QTest::addColumn<Verifier::ChecksumStrength>("strength");
317     QTest::addColumn<QList<KIO::fileoffset_t> >("offsets");
318     QTest::addColumn<KIO::filesize_t>("length");
319 
320     const QList<KIO::fileoffset_t> emptyOffsets;
321 
322     const KIO::filesize_t md5Length = 400 * 1024;
323     const Checksums md5sumsCorrect("md5", PartialChecksums(md5Length, (QStringList() << "ce7d795bd0b1499f18d2ba8f338302d3" << "e6681cc0049c6cae347039578eaf1117" << "e66499f43f930fb013092a2d66ecdfaf" << "b2930c55fea65c11813dff09447fbe92" << "77b79bd53b62accec6367c7d7b2fc85b" << "40363ab59bbfa39f6faa4aa18ee75a6c")));
324     const Checksums md5sumsWrong1("md5", PartialChecksums(md5Length, (QStringList() << "ae7d795bd0b1499f18d2ba8f338302d3" << "e6681cc0049c6cae347039578eaf1117" << "e66499f43f930fb013092a2d66ecdfaf" << "b2930c55fea65c11813dff09447fbe92" << "77b79bd53b62accec6367c7d7b2fc85b" << "40363ab59bbfa39f6faa4aa18ee75a6c")));
325     QList<KIO::fileoffset_t> md5sumsWrong1Offsets1 = (QList<KIO::fileoffset_t>() << 0);
326     const Checksums md5sumsWrong2("md5", PartialChecksums(md5Length, (QStringList() << "ce7d795bd0b1499f18d2ba8f338302d3" << "e6681cc0049c6cae347039578eaf1117" << "d66499f43f930fb013092a2d66ecdfaf" << "b2930c55fea65c11813dff09447fbe92" << "77b79bd53b62accec6367c7d7b2fc85b" << "d0363ab59bbfa39f6faa4aa18ee75a6c")));
327     QList<KIO::fileoffset_t> md5sumsWrong1Offsets2 = (QList<KIO::fileoffset_t>() << 2 * md5Length << 5 * md5Length);
328 
329     const KIO::filesize_t sha1Length = 1000 * 1024;
330     const Checksums sha1sumsCorrect("sha1", PartialChecksums(sha1Length, (QStringList() << "5d76447e7655fd1d4dfba458c33340757d81eb95" << "0bc9428e3b39fc34ab457d58d62f1973a1183ac2" << "48a313a958ea1c55eb9527b0141ae30742fedfdb")));
331     const Checksums sha1sumsWrong1("sha1", PartialChecksums(sha1Length, (QStringList() << "5d76447e7655fd1d4dfba458c33340757d81eb95" << "abc9428e3b39fc34ab457d58d62f1973a1183ac2" << "48a313a958ea1c55eb9527b0141ae30742fedfdb")));
332     QList<KIO::fileoffset_t> sha1sumsWrong1Offsets1 = (QList<KIO::fileoffset_t>() << sha1Length);
333     const Checksums sha1sumsWrong2("sha1", PartialChecksums(sha1Length, (QStringList() << "ad76447e7655fd1d4dfba458c33340757d81eb95" << "abc9428e3b39fc34ab457d58d62f1973a1183ac2" << "a8a313a958ea1c55eb9527b0141ae30742fedfdb")));
334     QList<KIO::fileoffset_t> sha1sumsWrong1Offsets2 = (QList<KIO::fileoffset_t>() << 0 << sha1Length << 2 * sha1Length);
335 
336     QTest::newRow("weak (md5), no broken pieces") << (QList<Checksums>() << md5sumsCorrect) << Verifier::Weak << emptyOffsets << md5Length;
337     QTest::newRow("weak (md5), 1 broken piece (first)") << (QList<Checksums>() << md5sumsWrong1) << Verifier::Weak << md5sumsWrong1Offsets1 << md5Length;
338     QTest::newRow("weak (md5), 2 broken piece (third, sixth)") << (QList<Checksums>() << md5sumsWrong2) << Verifier::Weak << md5sumsWrong1Offsets2 << md5Length;
339     if (m_supported.contains("sha1")) {
340         QTest::newRow("weak (md5, sha1), no broken pieces (sha1 wrong)") << (QList<Checksums>() << md5sumsCorrect << sha1sumsWrong1) << Verifier::Weak << emptyOffsets << md5Length;
341         QTest::newRow("strong (md5, sha1), no broken pieces (md5 wrong)") << (QList<Checksums>() << md5sumsWrong1 << sha1sumsCorrect) << Verifier::Strong << emptyOffsets << sha1Length;
342         QTest::newRow("strong (md5, sha1), 3 broken pieces (first, second, third)") << (QList<Checksums>() << md5sumsCorrect << sha1sumsWrong2) << Verifier::Strong << sha1sumsWrong1Offsets2 << sha1Length;
343         QTest::newRow("strongest (md5, sha1), 1 broken piece (second)") << (QList<Checksums>() << md5sumsCorrect << sha1sumsWrong1) << Verifier::Strongest << sha1sumsWrong1Offsets1 << sha1Length;
344     }
345 }
346 
347 QTEST_MAIN(VerfierTest)
348 
349 
350