aheinecke@100: #include "cinstprocesstest.h" aheinecke@100: #include "certificatelist.h" aheinecke@100: #include "errorcodes.h" aheinecke@100: aheinecke@100: #include aheinecke@100: #include aheinecke@100: #include aheinecke@100: #include aheinecke@100: aheinecke@100: #define RELATIVE_CINST_PATH "../../cinst/cinst" aheinecke@100: aheinecke@100: QProcess *CinstProcessTest::startCinstProcess() { aheinecke@100: QProcess *installerProcess = new QProcess(); aheinecke@100: installerProcess->setProgram(RELATIVE_CINST_PATH); aheinecke@100: installerProcess->start(); aheinecke@100: installerProcess->waitForStarted(); aheinecke@100: return installerProcess; aheinecke@100: } aheinecke@100: aheinecke@100: void finishVerify(QProcess *proc, int exitCode) { aheinecke@100: proc->closeWriteChannel(); aheinecke@100: proc->waitForFinished(); aheinecke@100: QVERIFY(proc->exitStatus() == QProcess::NormalExit); aheinecke@100: QVERIFY(proc->exitCode() == exitCode); aheinecke@100: delete proc; aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::testValidInput() { aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: aheinecke@100: installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n"); aheinecke@100: installerProcess->write(validList.rawData().toLatin1()); aheinecke@100: installerProcess->write("-----END CERTIFICATE LIST-----\r\n"); aheinecke@100: aheinecke@100: foreach (const Certificate &cert, validList.getInstallCertificates()) { aheinecke@100: installerProcess->write(cert.base64Line().toLatin1()); aheinecke@100: installerProcess->write("\r\n"); aheinecke@100: } aheinecke@100: aheinecke@100: finishVerify(installerProcess, 0); aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::initTestCase() { aheinecke@100: QDir dataDir = QDir(SOURCE_DIR"/data/"); aheinecke@100: QString fileName = dataDir.absoluteFilePath("list-valid-signed.txt"); aheinecke@100: validList = CertificateList(fileName.toLocal8Bit().data()); aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::testNoList() { aheinecke@100: /* No list */ aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n"); aheinecke@100: installerProcess->write("-----END CERTIFICATE LIST-----\r\n"); aheinecke@100: aheinecke@100: foreach (const Certificate &cert, validList.getInstallCertificates()) { aheinecke@100: installerProcess->write(cert.base64Line().toLatin1()); aheinecke@100: installerProcess->write("\r\n"); aheinecke@100: } aheinecke@100: finishVerify(installerProcess, ERR_INVALID_INPUT_NO_LIST); aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::testGarbageInput() { aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: /* Garbage */ aheinecke@100: installerProcess = startCinstProcess(); aheinecke@100: installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n"); aheinecke@100: int retval=0; aheinecke@100: int bytesWritten=0; aheinecke@100: do { aheinecke@100: char garbage[1030]; aheinecke@100: for (int i = 0; i < 1030; i++) { aheinecke@100: garbage[i] = (char) qrand() % 255; aheinecke@100: } aheinecke@100: retval = installerProcess->write(garbage, 1030); aheinecke@100: bytesWritten += retval; aheinecke@115: } while (retval != -1 && bytesWritten < 15 *1024 *1024 ); aheinecke@100: aheinecke@115: finishVerify(installerProcess, ERR_INVALID_INPUT); aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::testNoInput() { aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: aheinecke@100: /* Nothing */ aheinecke@100: installerProcess = startCinstProcess(); aheinecke@100: finishVerify(installerProcess, ERR_INVALID_INPUT_NO_LIST); aheinecke@100: } aheinecke@100: aheinecke@100: aheinecke@100: void CinstProcessTest::testNoInstructions() { aheinecke@100: /* No instructions */ aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n"); aheinecke@100: installerProcess->write(validList.rawData().toLatin1()); aheinecke@100: installerProcess->write("-----END CERTIFICATE LIST-----\r\n"); aheinecke@100: aheinecke@100: finishVerify(installerProcess, ERR_NO_INSTRUCTIONS); aheinecke@100: } aheinecke@100: aheinecke@100: void CinstProcessTest::testInvalidInstruction() { aheinecke@100: QProcess* installerProcess = startCinstProcess(); aheinecke@100: QVERIFY(installerProcess->state() == QProcess::Running); aheinecke@100: aheinecke@115: /* I: as instruction */ aheinecke@100: installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n"); aheinecke@100: installerProcess->write(validList.rawData().toLatin1()); aheinecke@100: installerProcess->write("-----END CERTIFICATE LIST-----\r\n"); aheinecke@100: aheinecke@150: installerProcess->write("I:ABCDEF\r\n"); aheinecke@100: aheinecke@100: finishVerify(installerProcess, ERR_INVALID_INSTRUCTIONS); aheinecke@100: } aheinecke@100: aheinecke@100: QTEST_GUILESS_MAIN (CinstProcessTest);