view ui/tests/cinstprocesstest.cpp @ 214:aab742690bee

Fix check for selected items and wait for bytes written. According to the documentation closing the write channel should suffice. But in testing it did not sent over everything.
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 26 Mar 2014 17:17:19 +0100
parents 37c9653b8755
children 6a7eb102716d
line wrap: on
line source
#include "cinstprocesstest.h"
#include "certificatelist.h"
#include "errorcodes.h"

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

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

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

#define VERIFY_PROC_DEBUG(x) \
    if (! x ) { \
        qDebug() << "Stdout:" << proc->readAllStandardOutput(); \
        qDebug() << "Stderr:" << proc->readAllStandardError(); \
        qDebug() << "Exit code: " << proc->exitCode(); \
    } \
    QVERIFY(x)

void finishVerify(QProcess *proc, int exitCode) {
    proc->closeWriteChannel();
    proc->waitForFinished();
    VERIFY_PROC_DEBUG(proc->exitStatus() == QProcess::NormalExit);
    VERIFY_PROC_DEBUG(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, ERR_NO_ERROR);
}

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 < 15 *1024 *1024 );

    finishVerify(installerProcess, ERR_INVALID_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);

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

    installerProcess->write("I:ABCDEF\r\n");

    finishVerify(installerProcess, ERR_INVALID_INSTRUCTIONS);
}

void CinstProcessTest::testUninstall() {
    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");

    installerProcess->write("UNINSTALL\r\n");

    finishVerify(installerProcess, ERR_NO_ERROR);
}

QTEST_GUILESS_MAIN (CinstProcessTest);

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