aheinecke@7: #include "certlistparsertest.h" aheinecke@7: #include "certificatelist.h" aheinecke@87: #include "certificate.h" aheinecke@7: aheinecke@7: #include aheinecke@7: aheinecke@31: void CertListTest::testValidList() aheinecke@31: { aheinecke@31: const char *fname = "list-valid-signed.txt"; aheinecke@88: aheinecke@88: QDir dataDir = QDir(SOURCE_DIR"/data/"); aheinecke@88: QString fileName = dataDir.absoluteFilePath(fname); aheinecke@88: QFile validList(fileName); aheinecke@87: validList.open(QIODevice::ReadOnly); aheinecke@87: QString validData = QString::fromLatin1(validList.readAll()); aheinecke@87: QStringList instLines; aheinecke@87: QStringList remoLines; aheinecke@87: aheinecke@31: CertificateList *certList = testWithFile(fname); aheinecke@87: QCOMPARE(certList->getStatus(), Valid); aheinecke@87: QVERIFY(certList->isValid()); aheinecke@87: aheinecke@87: QVERIFY(certList->rawData() == validData.toLatin1()); aheinecke@87: aheinecke@87: const QList instList = certList->getInstallCertificates(); aheinecke@88: const QList remoList = certList->getRemoveCertificates(); aheinecke@87: aheinecke@87: foreach (QString act, validData.split("\r\n")) { aheinecke@87: if (act.startsWith("I:")) { aheinecke@87: instLines << act; aheinecke@87: continue; aheinecke@87: } aheinecke@87: if (act.startsWith("R:")) { aheinecke@87: remoLines << act; aheinecke@87: continue; aheinecke@87: } aheinecke@87: } aheinecke@87: aheinecke@87: foreach (const Certificate& cert, instList) { aheinecke@87: QVERIFY(cert.isValid()); aheinecke@87: QVERIFY(instLines.contains(cert.base64Line())); aheinecke@87: } aheinecke@87: foreach (const Certificate& cert, remoList) { aheinecke@87: QVERIFY(cert.isValid()); aheinecke@87: QVERIFY(remoLines.contains(cert.base64Line())); aheinecke@87: } aheinecke@87: aheinecke@87: /* Be variable if test data changes later */ aheinecke@87: QVERIFY(instList.size() >= 1); aheinecke@87: QVERIFY(remoList.size() >= 1); aheinecke@87: QVERIFY(instLines.size() == instList.size()); aheinecke@87: QVERIFY(remoLines.size() == remoList.size()); aheinecke@87: andre@204: /* Check that a default certificate is invalid */ aheinecke@95: Certificate cert; aheinecke@95: QVERIFY(!cert.isValid()); aheinecke@95: andre@203: certList->readList(fileName.toLocal8Bit().data()); andre@203: andre@203: const QList instList2 = certList->getInstallCertificates(); andre@203: const QList remoList2 = certList->getRemoveCertificates(); andre@202: QVERIFY(instLines.size() == instList2.size()); andre@202: QVERIFY(remoLines.size() == remoList2.size()); aheinecke@87: aheinecke@31: delete certList; aheinecke@31: } aheinecke@7: aheinecke@7: void CertListTest::testInvalidSig() aheinecke@7: { aheinecke@42: const char *fnames[] = {"list-invalid-signed.txt", aheinecke@42: "list-valid-other-signature.txt", aheinecke@42: "list-valid-sha1-signature.txt", aheinecke@42: NULL}; aheinecke@42: for (int i=0; fnames[i] != NULL; i++) { aheinecke@42: CertificateList *certList = testWithFile(fnames[i]); aheinecke@42: QCOMPARE (certList->getStatus(), InvalidSignature); aheinecke@42: delete certList; aheinecke@42: } aheinecke@7: } aheinecke@7: aheinecke@7: void verifyInvalidFile(const char *fName) { aheinecke@7: CertificateList *certList = new CertificateList(fName); aheinecke@7: QVERIFY (certList->getStatus() != Valid); aheinecke@7: delete certList; aheinecke@7: } aheinecke@7: aheinecke@7: void CertListTest::testInvalidFileNames() aheinecke@7: { aheinecke@7: verifyInvalidFile("/dev/random"); aheinecke@7: verifyInvalidFile("/tmp/"); aheinecke@7: verifyInvalidFile(NULL); aheinecke@7: verifyInvalidFile("ä"); aheinecke@7: verifyInvalidFile("💩 "); aheinecke@7: } aheinecke@7: aheinecke@42: void CertListTest::testEmptyFile() aheinecke@42: { aheinecke@42: const char *fname = "empty_file"; aheinecke@42: CertificateList *certList = testWithFile(fname); aheinecke@95: QCOMPARE (certList->getStatus(), SeekFailed); aheinecke@42: delete certList; aheinecke@42: } aheinecke@42: aheinecke@7: void CertListTest::testGarbage() aheinecke@7: { andre@202: const char *fname = "list-with-null.txt"; andre@202: QString fname2 = getRandomDataFile(200); andre@202: CertificateList *certList = testWithFile(fname); andre@202: QCOMPARE (certList->getStatus(), InvalidFormat); andre@202: delete certList; andre@202: certList = testWithFile(fname2.toLocal8Bit().constData()); andre@202: QVERIFY(QFile::remove(fname2)); andre@202: QCOMPARE (certList->getStatus(), InvalidFormat); andre@202: delete certList; andre@202: } andre@202: andre@202: QString CertListTest::getRandomDataFile(size_t size) andre@202: { andre@202: QTemporaryFile tmpfile; andre@202: tmpfile.setAutoRemove(false); andre@202: tmpfile.open(); andre@202: size_t bufsize = 1024 * 1024; andre@202: if (bufsize > size) { andre@202: bufsize = size; aheinecke@42: } andre@202: char buf[bufsize]; andre@202: andre@202: for (size_t i = 0; i < bufsize; i++) { andre@202: buf[i] = (char) qrand() % 255; andre@202: } andre@202: andre@202: size_t bytesWritten=0; andre@202: int retval = 0; andre@202: do { andre@202: size_t toWrite = size - bytesWritten; andre@202: if (toWrite < bufsize) { andre@202: retval = tmpfile.write(buf, toWrite); andre@202: } else { andre@202: retval = tmpfile.write(buf, bufsize); andre@202: } andre@202: bytesWritten += retval; andre@202: } while (retval != -1 && bytesWritten < size); andre@202: andre@202: tmpfile.close(); andre@202: return tmpfile.fileName(); aheinecke@7: } aheinecke@7: aheinecke@7: void CertListTest::testTooLarge() aheinecke@7: { andre@202: QString fname = getRandomDataFile(MAX_LINE_LENGTH * MAX_LINES + 1); andre@202: CertificateList *certList = testWithFile(fname.toLocal8Bit().constData()); andre@202: QVERIFY(QFile::remove(fname)); andre@202: QCOMPARE(certList->getStatus(), TooLarge); andre@202: QVERIFY(!certList->isValid()); aheinecke@7: delete certList; aheinecke@7: } aheinecke@7: aheinecke@7: void CertListTest::benchmarkValid() aheinecke@7: { aheinecke@7: const char *fname = "list-valid-signed.txt"; aheinecke@7: aheinecke@88: QBENCHMARK{ aheinecke@7: CertificateList *certList = testWithFile(fname); aheinecke@7: delete certList; aheinecke@7: } aheinecke@7: } aheinecke@7: aheinecke@7: CertificateList* CertListTest::testWithFile(const char *filename) aheinecke@7: { aheinecke@7: QDir dataDir = QDir(SOURCE_DIR"/data/"); aheinecke@7: QString fileName = dataDir.absoluteFilePath(filename); aheinecke@7: return new CertificateList(fileName.toLocal8Bit().data()); aheinecke@7: } aheinecke@7: aheinecke@7: int main( int argc, char **argv ) aheinecke@7: { aheinecke@7: CertListTest tc; aheinecke@7: return QTest::qExec( &tc, argc, argv ); aheinecke@7: } aheinecke@7: aheinecke@7: