| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /*
- * This software is in the public domain, furnished "as is", without technical
- * support, and with no warranty, express or implied, as to its usefulness for
- * any purpose.
- *
- */
- #include <QtTest>
- #include <QDir>
- #include <QString>
- #include "common/checksums.h"
- #include "networkjobs.h"
- #include "common/utility.h"
- #include "filesystem.h"
- #include "propagatorjobs.h"
- using namespace OCC;
- using namespace OCC::Utility;
- class TestChecksumValidator : public QObject
- {
- Q_OBJECT
- private:
- QTemporaryDir _root;
- QString _testfile;
- QString _expectedError;
- QByteArray _expected;
- QByteArray _expectedType;
- bool _successDown;
- bool _errorSeen;
- public slots:
- void slotUpValidated(const QByteArray& type, const QByteArray& checksum) {
- qDebug() << "Checksum: " << checksum;
- QVERIFY(_expected == checksum );
- QVERIFY(_expectedType == type );
- }
- void slotDownValidated() {
- _successDown = true;
- }
- void slotDownError(const QString &errMsg, ValidateChecksumHeader::FailureReason reason)
- {
- Q_UNUSED(reason);
- QCOMPARE(_expectedError, errMsg);
- _errorSeen = true;
- }
- static QByteArray shellSum( const QByteArray& cmd, const QString& file )
- {
- QProcess md5;
- QStringList args;
- args.append(file);
- md5.start(cmd, args);
- QByteArray sumShell;
- qDebug() << "File: "<< file;
- if( md5.waitForFinished() ) {
- sumShell = md5.readAll();
- sumShell = sumShell.left( sumShell.indexOf(' '));
- }
- return sumShell;
- }
- private slots:
- void initTestCase() {
- _testfile = _root.path()+"/csFile";
- Utility::writeRandomFile( _testfile);
- }
- void testMd5Calc()
- {
- QString file( _root.path() + "/file_a.bin");
- QVERIFY(writeRandomFile(file));
- QFileInfo fi(file);
- QVERIFY(fi.exists());
- QFile fileDevice(file);
- fileDevice.open(QIODevice::ReadOnly);
- QByteArray sum = calcMd5(&fileDevice);
- fileDevice.close();
- QByteArray sSum = shellSum("md5sum", file);
- if (sSum.isEmpty())
- QSKIP("Couldn't execute md5sum to calculate checksum, executable missing?", SkipSingle);
- QVERIFY(!sum.isEmpty());
- QCOMPARE(sSum, sum);
- }
- void testSha1Calc()
- {
- QString file( _root.path() + "/file_b.bin");
- writeRandomFile(file);
- QFileInfo fi(file);
- QVERIFY(fi.exists());
- QFile fileDevice(file);
- fileDevice.open(QIODevice::ReadOnly);
- QByteArray sum = calcSha1(&fileDevice);
- fileDevice.close();
- QByteArray sSum = shellSum("sha1sum", file);
- if (sSum.isEmpty())
- QSKIP("Couldn't execute sha1sum to calculate checksum, executable missing?", SkipSingle);
- QVERIFY(!sum.isEmpty());
- QCOMPARE(sSum, sum);
- }
- void testUploadChecksummingAdler() {
- #ifndef ZLIB_FOUND
- QSKIP("ZLIB not found.", SkipSingle);
- #else
- auto *vali = new ComputeChecksum(this);
- _expectedType = "Adler32";
- vali->setChecksumType(_expectedType);
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), SLOT(slotUpValidated(QByteArray,QByteArray)));
- auto file = new QFile(_testfile, vali);
- file->open(QIODevice::ReadOnly);
- _expected = calcAdler32(file);
- qDebug() << "XX Expected Checksum: " << _expected;
- vali->start(_testfile);
- QEventLoop loop;
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
- loop.exec();
- delete vali;
- #endif
- }
- void testUploadChecksummingMd5() {
- auto *vali = new ComputeChecksum(this);
- _expectedType = OCC::checkSumMD5C;
- vali->setChecksumType(_expectedType);
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
- auto file = new QFile(_testfile, vali);
- file->open(QIODevice::ReadOnly);
- _expected = calcMd5(file);
- vali->start(_testfile);
- QEventLoop loop;
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
- loop.exec();
- delete vali;
- }
- void testUploadChecksummingSha1() {
- auto *vali = new ComputeChecksum(this);
- _expectedType = OCC::checkSumSHA1C;
- vali->setChecksumType(_expectedType);
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), this, SLOT(slotUpValidated(QByteArray,QByteArray)));
- auto file = new QFile(_testfile, vali);
- file->open(QIODevice::ReadOnly);
- _expected = calcSha1(file);
- vali->start(_testfile);
- QEventLoop loop;
- connect(vali, SIGNAL(done(QByteArray,QByteArray)), &loop, SLOT(quit()), Qt::QueuedConnection);
- loop.exec();
- delete vali;
- }
- void testDownloadChecksummingAdler() {
- #ifndef ZLIB_FOUND
- QSKIP("ZLIB not found.", SkipSingle);
- #else
- auto *vali = new ValidateChecksumHeader(this);
- connect(vali, &ValidateChecksumHeader::validated, this, &TestChecksumValidator::slotDownValidated);
- connect(vali, &ValidateChecksumHeader::validationFailed, this, &TestChecksumValidator::slotDownError);
- auto file = new QFile(_testfile, vali);
- file->open(QIODevice::ReadOnly);
- _expected = calcAdler32(file);
- QByteArray adler = checkSumAdlerC;
- adler.append(":");
- adler.append(_expected);
- file->seek(0);
- _successDown = false;
- vali->start(_testfile, adler);
- QTRY_VERIFY(_successDown);
- _expectedError = QStringLiteral("The downloaded file does not match the checksum, it will be resumed. \"543345\" != \"%1\"").arg(QString::fromUtf8(_expected));
- _errorSeen = false;
- file->seek(0);
- vali->start(_testfile, "Adler32:543345");
- QTRY_VERIFY(_errorSeen);
- _expectedError = QLatin1String("The checksum header contained an unknown checksum type \"Klaas32\"");
- _errorSeen = false;
- file->seek(0);
- vali->start(_testfile, "Klaas32:543345");
- QTRY_VERIFY(_errorSeen);
- delete vali;
- #endif
- }
- void cleanupTestCase() {
- }
- };
- QTEST_GUILESS_MAIN(TestChecksumValidator)
- #include "testchecksumvalidator.moc"
|