testchecksumvalidator.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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 "checksums.h"
  11. #include "networkjobs.h"
  12. #include "utility.h"
  13. #include "filesystem.h"
  14. #include "propagatorjobs.h"
  15. #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
  16. // poor man QTRY_VERIFY when Qt5 is not available.
  17. #define QTRY_VERIFY(Cond) QTest::qWait(1000); QVERIFY(Cond)
  18. #endif
  19. using namespace OCC;
  20. class TestChecksumValidator : public QObject
  21. {
  22. Q_OBJECT
  23. private:
  24. QString _root;
  25. QString _testfile;
  26. QString _expectedError;
  27. QByteArray _expected;
  28. QByteArray _expectedType;
  29. bool _successDown;
  30. bool _errorSeen;
  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 ) {
  41. QVERIFY(_expectedError == errMsg );
  42. _errorSeen = true;
  43. }
  44. private slots:
  45. void initTestCase() {
  46. _root = QDir::tempPath() + "/" + "test_" + QString::number(qrand());
  47. QDir rootDir(_root);
  48. rootDir.mkpath(_root );
  49. _testfile = _root+"/csFile";
  50. Utility::writeRandomFile( _testfile);
  51. }
  52. void testUploadChecksummingAdler() {
  53. #ifndef ZLIB_FOUND
  54. QSKIP("ZLIB not found.", SkipSingle);
  55. #else
  56. ComputeChecksum *vali = new ComputeChecksum(this);
  57. _expectedType = "Adler32";
  58. vali->setChecksumType(_expectedType);
  59. connect(vali, SIGNAL(done(QByteArray,QByteArray)), SLOT(slotUpValidated(QByteArray,QByteArray)));
  60. _expected = FileSystem::calcAdler32( _testfile );
  61. qDebug() << "XX Expected Checksum: " << _expected;
  62. vali->start(_testfile);
  63. QEventLoop loop;
  64. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  65. loop.exec();
  66. delete vali;
  67. #endif
  68. }
  69. void testUploadChecksummingMd5() {
  70. ComputeChecksum *vali = new ComputeChecksum(this);
  71. _expectedType = OCC::checkSumMD5C;
  72. vali->setChecksumType(_expectedType);
  73. connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
  74. _expected = FileSystem::calcMd5( _testfile );
  75. vali->start(_testfile);
  76. QEventLoop loop;
  77. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  78. loop.exec();
  79. delete vali;
  80. }
  81. void testUploadChecksummingSha1() {
  82. ComputeChecksum *vali = new ComputeChecksum(this);
  83. _expectedType = OCC::checkSumSHA1C;
  84. vali->setChecksumType(_expectedType);
  85. connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
  86. _expected = FileSystem::calcSha1( _testfile );
  87. vali->start(_testfile);
  88. QEventLoop loop;
  89. connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
  90. loop.exec();
  91. delete vali;
  92. }
  93. void testDownloadChecksummingAdler() {
  94. #ifndef ZLIB_FOUND
  95. QSKIP("ZLIB not found.", SkipSingle);
  96. #else
  97. QByteArray adler = checkSumAdlerC;
  98. adler.append(":");
  99. adler.append(FileSystem::calcAdler32( _testfile ));
  100. _successDown = false;
  101. ValidateChecksumHeader *vali = new ValidateChecksumHeader(this);
  102. connect(vali, SIGNAL(validated(QByteArray,QByteArray)), this, SLOT(slotDownValidated()));
  103. connect(vali, SIGNAL(validationFailed(QString)), this, SLOT(slotDownError(QString)));
  104. vali->start(_testfile, adler);
  105. QTRY_VERIFY(_successDown);
  106. _expectedError = QLatin1String("The downloaded file does not match the checksum, it will be resumed.");
  107. _errorSeen = false;
  108. vali->start(_testfile, "Adler32:543345");
  109. QTRY_VERIFY(_errorSeen);
  110. _expectedError = QLatin1String("The checksum header contained an unknown checksum type 'Klaas32'");
  111. _errorSeen = false;
  112. vali->start(_testfile, "Klaas32:543345");
  113. QTRY_VERIFY(_errorSeen);
  114. delete vali;
  115. #endif
  116. }
  117. void cleanupTestCase() {
  118. }
  119. };
  120. #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
  121. // Qt4 does not have QTEST_GUILESS_MAIN, so we simulate it.
  122. int main(int argc, char *argv[])
  123. {
  124. QCoreApplication app(argc, argv);
  125. TestChecksumValidator tc;
  126. return QTest::qExec(&tc, argc, argv);
  127. }
  128. #else
  129. QTEST_GUILESS_MAIN(TestChecksumValidator)
  130. #endif
  131. #include "testchecksumvalidator.moc"