# HG changeset patch # User Andre Heinecke # Date 1395404129 0 # Node ID 8fa2737912423eb4e7fe7f5937fb4c7b28c36088 # Parent bc1e6732f43c5f6f3d914157821cff21ccc2efbf Add test for cinstprocess diff -r bc1e6732f43c -r 8fa273791242 ui/tests/CMakeLists.txt --- a/ui/tests/CMakeLists.txt Fri Mar 21 11:54:35 2014 +0000 +++ b/ui/tests/CMakeLists.txt Fri Mar 21 12:15:29 2014 +0000 @@ -1,6 +1,6 @@ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) -include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/../../common) find_package(Qt5Test) find_program(HIAWATHA_EXECUTABLE hiawatha) @@ -31,5 +31,8 @@ qt5_add_resources(DOWNLOADER_SOURCES_WITH_RESOURCES ${M13UI_RESOURCES}) add_m13_test(downloadertest.cpp "${DOWNLOADER_SOURCES_WITH_RESOURCES}") +# Cinstprocess +add_m13_test(cinstprocesstest.cpp "${CERTIFICATELIST_SOURCES}") + #add_m13_test(${CMAKE_SOURCE_DIR}/ui/main.cpp "${M13UI_SOURCES}") diff -r bc1e6732f43c -r 8fa273791242 ui/tests/cinstprocesstest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/tests/cinstprocesstest.cpp Fri Mar 21 12:15:29 2014 +0000 @@ -0,0 +1,122 @@ +#include "cinstprocesstest.h" +#include "certificatelist.h" +#include "errorcodes.h" + +#include +#include +#include +#include +#include + +#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); diff -r bc1e6732f43c -r 8fa273791242 ui/tests/cinstprocesstest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/tests/cinstprocesstest.h Fri Mar 21 12:15:29 2014 +0000 @@ -0,0 +1,33 @@ +#ifndef CINSTPROCESSTEST_H +#define CINSTPROCESSTEST_H + +/* @file Tests for the cinst process + * @brief Tests for the cinst process as well as the UI side + */ + +#include +#include +#include "certificatelist.h" + +class CinstProcessTest: public QObject +{ + Q_OBJECT + +private: + QProcess* startCinstProcess(); + CertificateList validList; + CertificateList otherList; + CertificateList invalidList; + +private Q_SLOTS: + void initTestCase(); + void testValidInput(); + void testInvalidInstruction(); + void testNoInput(); + void testNoList(); + void testGarbageInput(); + void testNoInstructions(); +}; +#endif + +