view ui/tests/cinstprocesstest.cpp @ 100:8fa273791242

Add test for cinstprocess
author Andre Heinecke <aheinecke@intevation.de>
date Fri, 21 Mar 2014 12:15:29 +0000
parents
children 5ed770c41a73
line wrap: on
line source
#include "cinstprocesstest.h"
#include "certificatelist.h"
#include "errorcodes.h"

#include <QDebug>
#include <QDir>
#include <QFile>
#include <QProcess>
#include <QTest>

#define RELATIVE_CINST_PATH "../../cinst/cinst"

QProcess *CinstProcessTest::startCinstProcess() {
    QProcess *installerProcess = new QProcess();
    installerProcess->setProgram(RELATIVE_CINST_PATH);
    installerProcess->start();
    installerProcess->waitForStarted();
    return installerProcess;
}

void finishVerify(QProcess *proc, int exitCode) {
    proc->closeWriteChannel();
    proc->waitForFinished();
    QVERIFY(proc->exitStatus() == QProcess::NormalExit);
    QVERIFY(proc->exitCode() == exitCode);
    delete proc;
}

void CinstProcessTest::testValidInput() {
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);

    installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n");
    installerProcess->write(validList.rawData().toLatin1());
    installerProcess->write("-----END CERTIFICATE LIST-----\r\n");

    foreach (const Certificate &cert, validList.getInstallCertificates()) {
        installerProcess->write(cert.base64Line().toLatin1());
        installerProcess->write("\r\n");
    }

    finishVerify(installerProcess, 0);
}

void CinstProcessTest::initTestCase() {
    QDir dataDir = QDir(SOURCE_DIR"/data/");
    QString fileName = dataDir.absoluteFilePath("list-valid-signed.txt");
    validList = CertificateList(fileName.toLocal8Bit().data());
}

void CinstProcessTest::testNoList() {
    /* No list */
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);
    installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n");
    installerProcess->write("-----END CERTIFICATE LIST-----\r\n");

    foreach (const Certificate &cert, validList.getInstallCertificates()) {
        installerProcess->write(cert.base64Line().toLatin1());
        installerProcess->write("\r\n");
    }
    finishVerify(installerProcess, ERR_INVALID_INPUT_NO_LIST);
}

void CinstProcessTest::testGarbageInput() {
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);
    /* Garbage */
    installerProcess = startCinstProcess();
    installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n");
    int retval=0;
    int bytesWritten=0;
    do {
        char garbage[1030];
        for (int i = 0; i < 1030; i++) {
            garbage[i] = (char) qrand() % 255;
        }
        retval = installerProcess->write(garbage, 1030);
        bytesWritten += retval;
    } while (retval != -1 && bytesWritten < 100 *1024 *1024 );

    QVERIFY (bytesWritten  < 100 *1024 *1024);

    finishVerify(installerProcess, ERR_TOO_MUCH_INPUT);
}

void CinstProcessTest::testNoInput() {
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);

    /* Nothing */
    installerProcess = startCinstProcess();
    finishVerify(installerProcess, ERR_INVALID_INPUT_NO_LIST);
}


void CinstProcessTest::testNoInstructions() {
    /* No instructions */
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);
    installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n");
    installerProcess->write(validList.rawData().toLatin1());
    installerProcess->write("-----END CERTIFICATE LIST-----\r\n");

    finishVerify(installerProcess, ERR_NO_INSTRUCTIONS);
}

void CinstProcessTest::testInvalidInstruction() {
    QProcess* installerProcess = startCinstProcess();
    QVERIFY(installerProcess->state() == QProcess::Running);

    /* foobar as instruction */
    installerProcess->write("-----BEGIN CERTIFICATE LIST-----\r\n");
    installerProcess->write(validList.rawData().toLatin1());
    installerProcess->write("-----END CERTIFICATE LIST-----\r\n");

    installerProcess->write("foobar");

    finishVerify(installerProcess, ERR_INVALID_INSTRUCTIONS);
}

QTEST_GUILESS_MAIN (CinstProcessTest);

http://wald.intevation.org/projects/trustbridge/