testchecksumvalidator.cpp 7.3 KB

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