Mercurial > trustbridge
view ui/tests/certlistparsertest.cpp @ 237:6435e28ae753
Properly test for invalid input
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 28 Mar 2014 14:00:21 +0000 |
parents | 825b42da1855 |
children | c05e126b0b9e |
line wrap: on
line source
#include "certlistparsertest.h" #include "certificatelist.h" #include "certificate.h" #include <QDebug> void CertListTest::testValidList() { const char *fname = "list-valid-signed.txt"; QDir dataDir = QDir(SOURCE_DIR"/data/"); QString fileName = dataDir.absoluteFilePath(fname); QFile validList(fileName); validList.open(QIODevice::ReadOnly); QString validData = QString::fromLatin1(validList.readAll()); QStringList instLines; QStringList remoLines; CertificateList *certList = testWithFile(fname); QCOMPARE(certList->getStatus(), Valid); QVERIFY(certList->isValid()); QVERIFY(certList->rawData() == validData.toLatin1()); const QList<Certificate> instList = certList->getInstallCertificates(); const QList<Certificate> remoList = certList->getRemoveCertificates(); foreach (QString act, validData.split("\r\n")) { if (act.startsWith("I:")) { instLines << act; continue; } if (act.startsWith("R:")) { remoLines << act; continue; } } foreach (const Certificate& cert, instList) { QVERIFY(cert.isValid()); QVERIFY(instLines.contains(cert.base64Line())); } foreach (const Certificate& cert, remoList) { QVERIFY(cert.isValid()); QVERIFY(remoLines.contains(cert.base64Line())); } /* Be variable if test data changes later */ QVERIFY(instList.size() >= 1); QVERIFY(remoList.size() >= 1); QVERIFY(instLines.size() == instList.size()); QVERIFY(remoLines.size() == remoList.size()); /* Check that a default certificate is invalid */ Certificate cert; QVERIFY(!cert.isValid()); certList->readList(fileName.toLocal8Bit().data()); const QList<Certificate> instList2 = certList->getInstallCertificates(); const QList<Certificate> remoList2 = certList->getRemoveCertificates(); QVERIFY(instLines.size() == instList2.size()); QVERIFY(remoLines.size() == remoList2.size()); delete certList; } void CertListTest::testInvalidSig() { const char *fnames[] = {"list-invalid-signed.txt", "list-valid-other-signature.txt", "list-valid-sha1-signature.txt", NULL}; for (int i=0; fnames[i] != NULL; i++) { CertificateList *certList = testWithFile(fnames[i]); QCOMPARE (certList->getStatus(), InvalidSignature); delete certList; } } void verifyInvalidFile(const char *fName) { CertificateList *certList = new CertificateList(fName); QVERIFY (certList->getStatus() != Valid); delete certList; } void CertListTest::testInvalidFileNames() { verifyInvalidFile("/dev/random"); verifyInvalidFile("/tmp/"); verifyInvalidFile(NULL); verifyInvalidFile("ä"); verifyInvalidFile("💩 "); } void CertListTest::testEmptyFile() { const char *fname = "empty_file"; CertificateList *certList = testWithFile(fname); QCOMPARE (certList->getStatus(), SeekFailed); delete certList; } void CertListTest::testGarbage() { const char *fname = "list-with-null.txt"; QString fname2 = getRandomDataFile(200); CertificateList *certList = testWithFile(fname); QCOMPARE (certList->getStatus(), InvalidFormat); delete certList; certList = testWithFile(fname2.toLocal8Bit().constData()); QVERIFY(QFile::remove(fname2)); QCOMPARE (certList->getStatus(), InvalidFormat); delete certList; } QString CertListTest::getRandomDataFile(size_t size) { QTemporaryFile tmpfile; tmpfile.setAutoRemove(false); tmpfile.open(); size_t bufsize = 1024 * 1024; if (bufsize > size) { bufsize = size; } char buf[bufsize]; for (size_t i = 0; i < bufsize; i++) { buf[i] = (char) qrand() % 255; } size_t bytesWritten=0; int retval = 0; do { size_t toWrite = size - bytesWritten; if (toWrite < bufsize) { retval = tmpfile.write(buf, toWrite); } else { retval = tmpfile.write(buf, bufsize); } bytesWritten += retval; } while (retval != -1 && bytesWritten < size); tmpfile.close(); return tmpfile.fileName(); } void CertListTest::testTooLarge() { QString fname = getRandomDataFile(MAX_LINE_LENGTH * MAX_LINES + 1); CertificateList *certList = testWithFile(fname.toLocal8Bit().constData()); QVERIFY(QFile::remove(fname)); QCOMPARE(certList->getStatus(), TooLarge); QVERIFY(!certList->isValid()); delete certList; } void CertListTest::benchmarkValid() { const char *fname = "list-valid-signed.txt"; QBENCHMARK{ CertificateList *certList = testWithFile(fname); delete certList; } } CertificateList* CertListTest::testWithFile(const char *filename) { QDir dataDir = QDir(SOURCE_DIR"/data/"); QString fileName = dataDir.absoluteFilePath(filename); return new CertificateList(fileName.toLocal8Bit().data()); } int main( int argc, char **argv ) { CertListTest tc; return QTest::qExec( &tc, argc, argv ); }