testchecksumvalidator.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * This software is in the public domain, furnished "as is", without technical
  3. * support, and with no warranty, express or implied, as to its usefulness for
  4. * any purpose.
  5. *
  6. */
  7. #include <QtTest>
  8. #include <QDir>
  9. #include <QString>
  10. #include "common/checksums.h"
  11. #include "networkjobs.h"
  12. #include "common/utility.h"
  13. #include "filesystem.h"
  14. #include "propagatorjobs.h"
  15. using namespace OCC;
  16. using namespace OCC::Utility;
  17. class TestChecksumValidator : public QObject
  18. {
  19. Q_OBJECT
  20. private:
  21. QTemporaryDir _root;
  22. QString _testfile;
  23. QString _expectedError;
  24. QByteArray _expected;
  25. QByteArray _expectedType;
  26. bool _successDown;
  27. bool _errorSeen;
  28. public slots:
  29. void slotUpValidated(const QByteArray& type, const QByteArray& checksum) {
  30. qDebug() << "Checksum: " << checksum;
  31. QVERIFY(_expected == checksum );
  32. QVERIFY(_expectedType == type );
  33. }
  34. void slotDownValidated() {
  35. _successDown = true;
  36. }
  37. void slotDownError( const QString& errMsg ) {
  38. QVERIFY(_expectedError == errMsg );
  39. _errorSeen = true;
  40. }
  41. static QByteArray shellSum( const QByteArray& cmd, const QString& file )
  42. {
  43. QProcess md5;
  44. QStringList args;
  45. args.append(file);
  46. md5.start(cmd, args);
  47. QByteArray sumShell;
  48. qDebug() << "File: "<< file;
  49. if( md5.waitForFinished() ) {
  50. sumShell = md5.readAll();
  51. sumShell = sumShell.left( sumShell.indexOf(' '));
  52. }
  53. return sumShell;
  54. }
  55. private slots:
  56. void initTestCase() {
  57. _testfile = _root.path()+"/csFile";
  58. Utility::writeRandomFile( _testfile);
  59. }
  60. void testMd5Calc()
  61. {
  62. QString file( _root.path() + "/file_a.bin");
  63. QVERIFY(writeRandomFile(file));
  64. QFileInfo fi(file);
  65. QVERIFY(fi.exists());
  66. QFile fileDevice(file);
  67. fileDevice.open(QIODevice::ReadOnly);
  68. QByteArray sum = calcMd5(&fileDevice);
  69. fileDevice.close();
  70. QByteArray sSum = shellSum("md5sum", file);
  71. if (sSum.isEmpty())
  72. QSKIP("Couldn't execute md5sum to calculate checksum, executable missing?", SkipSingle);
  73. QVERIFY(!sum.isEmpty());
  74. QCOMPARE(sSum, sum);
  75. }
  76. void testSha1Calc()
  77. {
  78. QString file( _root.path() + "/file_b.bin");
  79. writeRandomFile(file);
  80. QFileInfo fi(file);
  81. QVERIFY(fi.exists());
  82. QFile fileDevice(file);
  83. fileDevice.open(QIODevice::ReadOnly);
  84. QByteArray sum = calcSha1(&fileDevice);
  85. fileDevice.close();
  86. QByteArray sSum = shellSum("sha1sum", file);
  87. if (sSum.isEmpty())
  88. QSKIP("Couldn't execute sha1sum to calculate checksum, executable missing?", SkipSingle);
  89. QVERIFY(!sum.isEmpty());
  90. QCOMPARE(sSum, sum);
  91. }
  92. void testUploadChecksummingAdler() {
  93. #ifndef ZLIB_FOUND
  94. QSKIP("ZLIB not found.", SkipSingle);
  95. #else
  96. auto *vali = new ComputeChecksum(this);
  97. _expectedType = "Adler32";
  98. vali->setChecksumType(_expectedType);
  99. connect(vali, SIGNAL(done(QByteArray,QByteArray)), SLOT(slotUpValidated(QByteArray,QByteArray)));
  100. auto file = new QFile(_testfile, vali);
  101. file->open(QIODevice::ReadOnly);
  102. _expected = calcAdler32(file);
  103. qDebug() << "XX Expected Checksum: " << _expected;
  104. vali->start(_testfile);
  105. QEventLoop loop;
  106. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  107. loop.exec();
  108. delete vali;
  109. #endif
  110. }
  111. void testUploadChecksummingMd5() {
  112. auto *vali = new ComputeChecksum(this);
  113. _expectedType = OCC::checkSumMD5C;
  114. vali->setChecksumType(_expectedType);
  115. connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
  116. auto file = new QFile(_testfile, vali);
  117. file->open(QIODevice::ReadOnly);
  118. _expected = calcMd5(file);
  119. vali->start(_testfile);
  120. QEventLoop loop;
  121. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  122. loop.exec();
  123. delete vali;
  124. }
  125. void testUploadChecksummingSha1() {
  126. auto *vali = new ComputeChecksum(this);
  127. _expectedType = OCC::checkSumSHA1C;
  128. vali->setChecksumType(_expectedType);
  129. connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
  130. auto file = new QFile(_testfile, vali);
  131. file->open(QIODevice::ReadOnly);
  132. _expected = calcSha1(file);
  133. vali->start(_testfile);
  134. QEventLoop loop;
  135. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  136. loop.exec();
  137. delete vali;
  138. }
  139. void testDownloadChecksummingAdler() {
  140. #ifndef ZLIB_FOUND
  141. QSKIP("ZLIB not found.", SkipSingle);
  142. #else
  143. auto *vali = new ValidateChecksumHeader(this);
  144. connect(vali, SIGNAL(validated(QByteArray,QByteArray)), this, SLOT(slotDownValidated()));
  145. connect(vali, SIGNAL(validationFailed(QString)), this, SLOT(slotDownError(QString)));
  146. auto file = new QFile(_testfile, vali);
  147. file->open(QIODevice::ReadOnly);
  148. _expected = calcAdler32(file);
  149. QByteArray adler = checkSumAdlerC;
  150. adler.append(":");
  151. adler.append(_expected);
  152. file->seek(0);
  153. _successDown = false;
  154. vali->start(_testfile, adler);
  155. QTRY_VERIFY(_successDown);
  156. _expectedError = QLatin1String("The downloaded file does not match the checksum, it will be resumed.");
  157. _errorSeen = false;
  158. file->seek(0);
  159. vali->start(_testfile, "Adler32:543345");
  160. QTRY_VERIFY(_errorSeen);
  161. _expectedError = QLatin1String("The checksum header contained an unknown checksum type 'Klaas32'");
  162. _errorSeen = false;
  163. file->seek(0);
  164. vali->start(_testfile, "Klaas32:543345");
  165. QTRY_VERIFY(_errorSeen);
  166. delete vali;
  167. #endif
  168. }
  169. void cleanupTestCase() {
  170. }
  171. };
  172. QTEST_GUILESS_MAIN(TestChecksumValidator)
  173. #include "testchecksumvalidator.moc"