Commit 6213f19a authored by Martin Kampas's avatar Martin Kampas

ut_rndssucli: initial commit

parent b5f46111
......@@ -2,6 +2,7 @@ TEMPLATE = subdirs
CONFIG += qt ordered coverage debug
SUBDIRS = \
sandbox \
ut_rndssucli \
ut_settings \
ut_ssuurlresolver \
ut_urlresolver \
......
......@@ -3,6 +3,11 @@
<!-- Test suite, name mandatory - the same as test package name -->
<suite name="sync-app-tests" domain="ssu">
<!-- At least one set per suite, name and description mandatory -->
<set name="rndssucli" description="Test to determine if ssu command line tool works properly" feature="rndssucli">
<case name="ut_rndssucli" type="Functional" description="SSU command line utility test" timeout="1000" subfeature="">
<step expected_result="0">/opt/tests/ssu/ut_rndssucli</step>
</case>
</set>
<set name="settings" description="Test to determine if configuration files processing works properly" feature="settings">
<case name="ut_settings" type="Functional" description="Settings processing test" timeout="1000" subfeature="">
<step expected_result="0">/opt/tests/ssu/ut_settings</step>
......
/**
* @file main.cpp
* @copyright 2012 Jolla Ltd.
* @author Martin Kampas <martin.kampas@tieto.com>
* @date 2012
*/
#include <QtTest/QtTest>
#include "rndssuclitest.h"
int main(int argc, char **argv){
RndSsuCliTest rndSsuCliTest;
if (QTest::qExec(&rndSsuCliTest, argc, argv))
return 1;
return 0;
}
/**
* @file rndssuclitest.cpp
* @copyright 2013 Jolla Ltd.
* @author Martin Kampas <martin.kampas@tieto.com>
* @date 2013
*/
#include "rndssuclitest.h"
#include <stdlib.h>
#include <zypp/media/UrlResolverPlugin.h>
#include <QtTest/QtTest>
typedef QStringList Args; // improve readability
class RndSsuCliTest::Process {
public:
enum ExpectedResult {
ExpectSuccess,
ExpectFail
};
Process() : m_expectFail(false), m_timedOut(false) {}
QString execute(const QString &program, const QStringList &arguments,
bool expectedResult = ExpectSuccess){
Q_ASSERT(processStatus() == NotRunning);
m_program = program;
m_arguments = arguments;
m_expectFail = expectedResult == ExpectFail;
m_process.start(program, arguments);
m_timedOut = !m_process.waitForFinished();
return m_process.readAllStandardOutput();
}
bool hasError(){
return m_timedOut
|| m_process.error() != QProcess::UnknownError
|| m_process.exitStatus() != QProcess::NormalExit
|| (m_process.exitCode() != 0) != m_expectFail;
}
QString fmtErrorMessage(){
Q_ASSERT(hasError());
QStringList reasons;
if (m_timedOut){
reasons.append("Timed out");
}else if (m_process.exitStatus() != QProcess::NormalExit){
reasons.append("Process crashed");
}else if (m_expectFail && (m_process.exitCode() == 0)){
reasons.append("Did not fail while it was expected to");
}else{
if (m_process.error() != QProcess::UnknownError){
reasons.append(m_process.errorString());
}
const QString errorOut = m_process.readAllStandardError();
if (!errorOut.isEmpty()){
reasons.append(errorOut);
}
}
return QString("Failed to execute `%1 %2`: %3")
.arg(m_program)
.arg(QStringList(m_arguments).replaceInStrings(QRegExp("^|$"), "\"").join(" "))
.arg(reasons.join(": "));
}
private:
QProcess m_process;
QString m_program;
QStringList m_arguments;
bool m_expectFail;
bool m_timedOut;
};
void RndSsuCliTest::initTestCase(){
Process mktemp;
tempDir =
mktemp.execute("mktemp", Args() << "-t" << "-d" << "ut_rndssucli.XXX").trimmed();
QVERIFY2(!mktemp.hasError(), qPrintable(mktemp.fmtErrorMessage()));
QVERIFY2(QFileInfo(tempDir).isDir(), qPrintable(
QString("Temporary directory disappeared: '%1'").arg(tempDir)));
setenv("LD_PRELOAD", qPrintable(QString("%1/libsandboxhook.so").arg(TESTS_PATH)), 1);
setenv("SSU_TESTS_SANDBOX", qPrintable(QString("%1/configroot").arg(tempDir)), 1);
}
void RndSsuCliTest::cleanupTestCase(){
if (tempDir.isEmpty()){
return;
}
Process rm;
rm.execute("rm", Args() << "-rf" << tempDir);
QVERIFY2(!rm.hasError(), qPrintable(rm.fmtErrorMessage()));
}
void RndSsuCliTest::init(){
Q_ASSERT(!tempDir.isEmpty());
QVERIFY2(QFileInfo(tempDir).isDir(), qPrintable(
QString("Temporary directory disappeared: '%1'").arg(tempDir)));
QVERIFY2(QDir(tempDir).entryList(QDir::NoDotAndDotDot).count() == 0, qPrintable(
QString("Garbage in temporary directory: '%1'").arg(tempDir)));
Process cp;
cp.execute("cp", Args() << "-r" << QString("%1/configroot").arg(TESTS_DATA_PATH) << tempDir);
QVERIFY2(!cp.hasError(), qPrintable(cp.fmtErrorMessage()));
}
void RndSsuCliTest::cleanup(){
Q_ASSERT(!tempDir.isEmpty());
Process rm;
rm.execute("rm", Args() << "-rf" << QString("%1/configroot").arg(tempDir));
QVERIFY2(!rm.hasError(), qPrintable(rm.fmtErrorMessage()));
}
void RndSsuCliTest::testSubcommandFlavour(){
Process ssu;
QString output;
// set flavour to 'release'
ssu.execute("ssu", Args() << "flavour" << "release");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "flavour").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device flavour is currently: release"));
// set flavour to 'testing'
ssu.execute("ssu", Args() << "flavour" << "testing");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "flavour").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device flavour is currently: testing"));
}
void RndSsuCliTest::testSubcommandRelease(){
Process ssu;
QString output;
// set release to latest
ssu.execute("ssu", Args() << "release" << "latest");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "release").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device release is currently: latest"));
// set release to next
ssu.execute("ssu", Args() << "release" << "next");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "release").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device release is currently: next"));
// verify the mode is release
output = ssu.execute("ssu", Args() << "mode").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device mode is: 0 ()"));
// set RnD release to latest
ssu.execute("ssu", Args() << "release" << "-r" << "latest");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "release" << "-r").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device release (RnD) is currently: latest"));
// set RnD release to next
ssu.execute("ssu", Args() << "release" << "-r" << "next");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "release" << "-r").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device release (RnD) is currently: next"));
// verify the mode is RnD
output = ssu.execute("ssu", Args() << "mode").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device mode is: 2 (RndMode)"));
}
void RndSsuCliTest::testSubcommandMode(){
Process ssu;
QString output;
// set release mode
ssu.execute("ssu", Args() << "mode" << "0");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "mode").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device mode is: 0 ()"));
// set RnD mode
ssu.execute("ssu", Args() << "mode" << "2");
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
output = ssu.execute("ssu", Args() << "mode").trimmed();
QVERIFY2(!ssu.hasError(), qPrintable(ssu.fmtErrorMessage()));
QCOMPARE(output, QString("Device mode is: 2 (RndMode)"));
}
/**
* @file rndssuclitest.h
* @copyright 2013 Jolla Ltd.
* @author Martin Kampas <martin.kampas@tieto.com>
* @date 2013
*/
#ifndef _RNDSSUCLITEST_H
#define _RNDSSUCLITEST_H
#include <QObject>
class RndSsuCliTest: public QObject {
Q_OBJECT
class Process;
private slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
void testSubcommandFlavour();
void testSubcommandRelease();
void testSubcommandMode();
private:
QString tempDir;
};
#endif
[file.exists]
SDK=/mer-sdk-chroot
[systeminfo.equals]
[cpuinfo.contains]
N900=Nokia RX-51 board
N950=Nokia RM-680 board
N9=Nokia RM-696 board
[arch.equals]
generic-x86=i586
[variants]
N950=N9
[N9]
family=n950-n9
adaptation-repos=n9xx-common,n950-n9
[N900]
family=n900
adaptation-repos=n9xx-common,n900
[SDK]
[generic-x86]
family=x86
adaptation-repos=x86
[UNKNOWN]
family=UNKNOWN
[all]
credentials=jolla
credentials-url=https://%(ssuRegDomain)/%(ssuRegPath)/%1/credentials.xml
register-url=https://%(ssuRegDomain)/%(ssuRegPath)/%1/register.xml
[release]
mer-core=https://%(packagesDomain)/%(release)/mer/%(arch)/%(debugSplit)/
[rnd]
mer-core=https://%(packagesDomain)/mer/%(release)/builds/%(arch)/%(debugSplit)/
[devel-flavour]
flavour-pattern=
[release-flavour]
flavour-pattern=:/release
[testing-flavour]
flavour-pattern=:/testing
[example-domain]
dumpDomain=dump.example.com
packagesDomain=packages.example.com
ssuRegDomain=ssu.example.com
ssuRegPath=ssu/device
# fallback if domain is not matched or not set
[default-domain]
dumpDomain=dump.testing.com
packagesDomain=packages.testing.com
ssuRegDomain=ssu.testing.com
ssuRegPath=ssu/device
[General]
initialized=true
flavour=testing
registered=false
rndRelease=latest
release=
adaptation=
ca-certificate=
credentials-scope=example
[repository-urls]
[repository-url-variables]
HEADERS = \
rndssuclitest.h \
SOURCES = \
main.cpp \
rndssuclitest.cpp \
TEMPLATE = app
TARGET = ut_rndssucli
LIBS += \
-lssu \
CONFIG -= app_bundle
CONFIG += console qtestlib
QT -= gui
QT += network testlib
!include( ../tests.pri ) { error("Unable to find tests include") }
unix:target.path = $${PREFIX}/$$TESTS_PATH
INSTALLS += target
test_data_etc.path = $${TESTS_DATA_PATH}/configroot/etc/ssu
test_data_etc.files = \
$${PWD}/testdata/ssu.ini \
test_data_usr_share.path = $${TESTS_DATA_PATH}/configroot/usr/share/ssu
test_data_usr_share.files = \
$${PWD}/testdata/ssu-defaults.ini \
$${PWD}/testdata/repos.ini \
$${PWD}/testdata/board-mappings.ini \
INSTALLS += test_data_etc test_data_usr_share
!include( ../../buildpath.pri ) { error("Unable to find build path specification") }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment