Skip to content

Commit

Permalink
Add qdbus-simple-test-runner binary
Browse files Browse the repository at this point in the history
Support running libqtdbustest inside a parent instance
  • Loading branch information
pete-woods committed Nov 12, 2013
1 parent 4d317c1 commit a3549e5
Show file tree
Hide file tree
Showing 14 changed files with 271 additions and 55 deletions.
33 changes: 33 additions & 0 deletions data/session.conf
Original file line number Diff line number Diff line change
@@ -1,9 +1,42 @@
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- If we fork, keep the user's original umask to avoid affecting
the behavior of child processes. -->
<keep_umask/>

<type>session</type>

<listen>unix:tmpdir=/tmp</listen>

<standard_session_servicedirs />

<policy context="default">
<!-- Allow everything to be sent -->
<allow send_destination="*" eavesdrop="true"/>
<!-- Allow everything to be received -->
<allow eavesdrop="true"/>
<!-- Allow anyone to own anything -->
<allow own="*"/>
</policy>

<!-- raise the service start timeout to 40 seconds as it can timeout
on the live cd on slow machines -->
<limit name="service_start_timeout">60000</limit>

<!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
<limit name="max_incoming_bytes">1000000000</limit>
<limit name="max_outgoing_bytes">1000000000</limit>
<limit name="max_message_size">1000000000</limit>
<limit name="service_start_timeout">120000</limit>
<limit name="auth_timeout">240000</limit>
<limit name="max_completed_connections">100000</limit>
<limit name="max_incomplete_connections">10000</limit>
<limit name="max_connections_per_user">100000</limit>
<limit name="max_pending_service_starts">10000</limit>
<limit name="max_names_per_connection">50000</limit>
<limit name="max_match_rules_per_connection">50000</limit>
<limit name="max_replies_per_connection">50000</limit>
<limit name="reply_timeout">300000</limit>

</busconfig>
33 changes: 33 additions & 0 deletions data/system.conf
Original file line number Diff line number Diff line change
@@ -1,9 +1,42 @@
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- If we fork, keep the user's original umask to avoid affecting
the behavior of child processes. -->
<keep_umask/>

<type>system</type>

<listen>unix:tmpdir=/tmp</listen>

<standard_session_servicedirs />

<policy context="default">
<!-- Allow everything to be sent -->
<allow send_destination="*" eavesdrop="true"/>
<!-- Allow everything to be received -->
<allow eavesdrop="true"/>
<!-- Allow anyone to own anything -->
<allow own="*"/>
</policy>

<!-- raise the service start timeout to 40 seconds as it can timeout
on the live cd on slow machines -->
<limit name="service_start_timeout">60000</limit>

<!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
<limit name="max_incoming_bytes">1000000000</limit>
<limit name="max_outgoing_bytes">1000000000</limit>
<limit name="max_message_size">1000000000</limit>
<limit name="service_start_timeout">120000</limit>
<limit name="auth_timeout">240000</limit>
<limit name="max_completed_connections">100000</limit>
<limit name="max_incomplete_connections">10000</limit>
<limit name="max_connections_per_user">100000</limit>
<limit name="max_pending_service_starts">10000</limit>
<limit name="max_names_per_connection">50000</limit>
<limit name="max_match_rules_per_connection">50000</limit>
<limit name="max_replies_per_connection">50000</limit>
<limit name="reply_timeout">300000</limit>

</busconfig>
16 changes: 13 additions & 3 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Pre-Depends: ${misc:Pre-Depends},
Depends: dbus,
${misc:Depends},
${shlibs:Depends},
Description: Library for testing DBus interations using Qt
Description: Library for testing DBus interactions using Qt
A simple library for testing Qt based DBus services and clients.
.
This package contains the shared libraries.
Expand All @@ -36,7 +36,17 @@ Architecture: any
Multi-Arch: same
Depends: libqtdbustest1 (= ${binary:Version}),
${misc:Depends},
Description: Library for testing DBus interations using Qt
Description: Library for testing DBus interactions using Qt
A simple library for testing Qt based DBus services and clients.
.
This package contains files that are needed to build.
This package contains files that are needed to build.

Package: qtdbustest-runner
Architecture: any
Depends: libqtdbustest1 (= ${binary:Version}),
${shlibs:Depends},
${misc:Depends},
gvfs-backends,
Description: Library for testing DBus interactions using Qt
Simple executable for running a test script under a private
DBus environment.
8 changes: 7 additions & 1 deletion debian/libqtdbustest1.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@ libqtdbustest.so.1 libqtdbustest1 #MINVER#
(c++)"QtDBusTest::SuicidalProcess::qt_metacast(char const*)@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::setSuicidal()@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::staticMetaObject@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::setWatchdogCommand(QString const&)@Base" 0.1+13.10.20130809-0ubuntu1
(c++)"QtDBusTest::SuicidalProcess::setWatchdogCommand(QString const&)@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::SuicidalProcess(QObject*)@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::SuicidalProcess(QObject*)@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::~SuicidalProcess()@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::~SuicidalProcess()@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::~SuicidalProcess()@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::qt_metacast(char const*)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::slotFinished(int)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::staticMetaObject@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::start(QDBusConnection const&)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::finished(int)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::QProcessDBusService(QString const&, QDBusConnection::BusType, QString const&, QStringList const&)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::QProcessDBusService(QString const&, QDBusConnection::BusType, QString const&, QStringList const&)@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::~QProcessDBusService()@Base" 0.1
Expand All @@ -34,6 +39,7 @@ libqtdbustest.so.1 libqtdbustest1 #MINVER#
(c++)"QtDBusTest::DBusTestRunner::sessionConnection() const@Base" 0.1
(c++)"QtDBusTest::DBusTestRunner::systemBus() const@Base" 0.1
(c++)"QtDBusTest::SuicidalProcess::metaObject() const@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::metaObject() const@Base" 0.1
(c++)"QtDBusTest::QProcessDBusService::pid() const@Base" 0.1
(c++)"typeinfo for QtDBusTest::DBusService@Base" 0.1
(c++)"typeinfo for QtDBusTest::DBusTestRunner@Base" 0.1
Expand Down
1 change: 1 addition & 0 deletions debian/qtdbustest-runner.install
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
usr/bin
3 changes: 2 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ include(GenerateExportHeader)
add_compiler_export_flags()

add_subdirectory(watchdog)
add_subdirectory(libqtdbustest)
add_subdirectory(libqtdbustest)
add_subdirectory(qdbus-test-runner)
2 changes: 1 addition & 1 deletion src/libqtdbustest/DBusService.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DBusServicePrivate;

typedef QSharedPointer<DBusService> DBusServicePtr;

class Q_DECL_EXPORT DBusService {
class Q_DECL_EXPORT DBusService: public QObject {
public:
DBusService(const QString &name, QDBusConnection::BusType busType);

Expand Down
71 changes: 44 additions & 27 deletions src/libqtdbustest/DBusTestRunner.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 Canonical, Ltd.
l * Copyright (C) 2013 Canonical, Ltd.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of version 3 of the GNU Lesser General Public License as published
Expand Down Expand Up @@ -47,47 +47,64 @@ DBusTestRunner::DBusTestRunner(const QString &dbusSessionConfigFile,
const QString &dbusSystemConfigFile) :
d(new DBusTestRunnerPrivate()) {

// session bus setup
// If we are already running inside a QDBus test environment
if (qEnvironmentVariableIsSet("QDBUS_TEST_RUNNER_PARENT")) {
// session bus setup
d->m_sessionBus = QString::fromUtf8(
qgetenv("DBUS_SESSION_BUS_ADDRESS"));
d->m_sessionConnection = QDBusConnection::sessionBus();

d->m_sessionDBus.setProcessChannelMode(QProcess::MergedChannels);
d->m_sessionDBus.start("dbus-daemon",
QStringList() << "--config-file" << dbusSessionConfigFile
<< "--print-address");
Q_ASSERT(d->m_sessionDBus.waitForStarted());
// system bus setup
d->m_systemBus = QString::fromUtf8(qgetenv("DBUS_SYSTEM_BUS_ADDRESS"));
d->m_systemConnection = QDBusConnection::systemBus();
} else {
// session bus setup

d->m_sessionDBus.waitForReadyRead();
d->m_sessionBus = d->m_sessionDBus.readAll().trimmed();
d->m_sessionDBus.setProcessChannelMode(QProcess::MergedChannels);
d->m_sessionDBus.start("dbus-daemon",
QStringList() << "--config-file" << dbusSessionConfigFile
<< "--print-address");
Q_ASSERT(d->m_sessionDBus.waitForStarted());

qputenv("DBUS_SESSION_BUS_ADDRESS", d->m_sessionBus.toUtf8());
d->m_sessionDBus.waitForReadyRead();
d->m_sessionBus = d->m_sessionDBus.readAll().trimmed();

d->m_sessionConnection = QDBusConnection::connectToBus(d->m_sessionBus,
d->m_sessionBus);
qputenv("DBUS_SESSION_BUS_ADDRESS", d->m_sessionBus.toUtf8());
qputenv("DBUS_STARTER_ADDRESS", d->m_sessionBus.toUtf8());
qputenv("DBUS_STARTER_BUS_TYPE", "session");

// system bus setup
d->m_sessionConnection = QDBusConnection::connectToBus(d->m_sessionBus,
d->m_sessionBus);

d->m_systemDBus.setProcessChannelMode(QProcess::MergedChannels);
d->m_systemDBus.start("dbus-daemon",
QStringList() << "--config-file" << dbusSystemConfigFile
<< "--print-address");
Q_ASSERT(d->m_systemDBus.waitForStarted());
// system bus setup

d->m_systemDBus.waitForReadyRead();
d->m_systemBus = d->m_systemDBus.readAll().trimmed();
d->m_systemDBus.setProcessChannelMode(QProcess::MergedChannels);
d->m_systemDBus.start("dbus-daemon",
QStringList() << "--config-file" << dbusSystemConfigFile
<< "--print-address");
Q_ASSERT(d->m_systemDBus.waitForStarted());

qputenv("DBUS_SYSTEM_BUS_ADDRESS", d->m_systemBus.toUtf8());
d->m_systemDBus.waitForReadyRead();
d->m_systemBus = d->m_systemDBus.readAll().trimmed();

d->m_systemConnection = QDBusConnection::connectToBus(d->m_systemBus,
d->m_systemBus);
qputenv("DBUS_SYSTEM_BUS_ADDRESS", d->m_systemBus.toUtf8());

d->m_systemConnection = QDBusConnection::connectToBus(d->m_systemBus,
d->m_systemBus);
}
}

DBusTestRunner::~DBusTestRunner() {
d->m_services.clear();

d->m_sessionDBus.terminate();
Q_ASSERT(d->m_sessionDBus.waitForFinished());
// If we aren't running inside a QDBus test environment
if (qEnvironmentVariableIsEmpty("QDBUS_TEST_RUNNER_PARENT")) {
d->m_sessionDBus.terminate();
Q_ASSERT(d->m_sessionDBus.waitForFinished());

d->m_systemDBus.terminate();
Q_ASSERT(d->m_systemDBus.waitForFinished());
d->m_systemDBus.terminate();
Q_ASSERT(d->m_systemDBus.waitForFinished());
}
}

void DBusTestRunner::registerService(DBusServicePtr service) {
Expand Down
35 changes: 23 additions & 12 deletions src/libqtdbustest/QProcessDBusService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,13 @@ QProcessDBusService::QProcessDBusService(const QString &name,
const QStringList &arguments) :
DBusService(name, busType), p(
new QProcessDBusServicePrivate(program, arguments)) {
connect(&p->m_process, SIGNAL(finished(int)), this,
SLOT(slotFinished(int)));
}

QProcessDBusService::~QProcessDBusService() {
p->m_process.terminate();
p->m_process.waitForFinished();

if(qEnvironmentVariableIsSet("QDBUS_TEST_RUNNER_PROCESS_OUTPUT")) {
qDebug() << p->m_process.readAll();
}
}

void QProcessDBusService::start(const QDBusConnection &connection) {
Expand All @@ -63,21 +61,34 @@ void QProcessDBusService::start(const QDBusConnection &connection) {
QSignalSpy spy(&watcher,
SIGNAL(serviceOwnerChanged(const QString &,const QString &,const QString &)));

p->m_process.setProcessChannelMode(QProcess::MergedChannels);
QProcessEnvironment environment(QProcessEnvironment::systemEnvironment());
environment.insert("QDBUS_TEST_RUNNER_PARENT", "1");
p->m_process.setProcessEnvironment(environment);
p->m_process.setProcessChannelMode(QProcess::ForwardedChannels);
p->m_process.start(p->m_program, p->m_arguments);

spy.wait(1000);
if (spy.empty()) {
p->m_process.waitForReadyRead(50);

QString error = "Process [" + p->m_program + "] for service [" + name()
+ "] failed to start:\n" + p->m_process.readAll();
throw std::logic_error(error.toStdString());
if (name().isEmpty()) {
if (!p->m_process.waitForStarted()) {
QString error = "Process [" + p->m_program + "] for service ["
+ name() + "] failed to start";
throw std::logic_error(error.toStdString());
}
} else {
spy.wait();
if (spy.empty()) {
QString error = "Process [" + p->m_program + "] for service ["
+ name() + "] failed to appear on bus";
throw std::logic_error(error.toStdString());
}
}
}

Q_PID QProcessDBusService::pid() const {
return p->m_process.pid();
}

void QProcessDBusService::slotFinished(int exitCode) {
finished(exitCode);
}

}
8 changes: 8 additions & 0 deletions src/libqtdbustest/QProcessDBusService.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ namespace QtDBusTest {
class QProcessDBusServicePrivate;

class Q_DECL_EXPORT QProcessDBusService: public DBusService {
Q_OBJECT

public:
explicit QProcessDBusService(const QString &name,
QDBusConnection::BusType busType, const QString &program,
Expand All @@ -41,6 +43,12 @@ class Q_DECL_EXPORT QProcessDBusService: public DBusService {

virtual Q_PID pid() const;

Q_SIGNALS:
void finished(int exitCode);

protected Q_SLOTS:
virtual void slotFinished(int exitCode);

private:
QScopedPointer<QProcessDBusServicePrivate> p;
};
Expand Down
20 changes: 20 additions & 0 deletions src/qdbus-test-runner/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

add_executable(
qdbus-simple-test-runner
qdbus-simple-test-runner.cpp
)

target_link_libraries(
qdbus-simple-test-runner
qtdbustest
)

qt5_use_modules(
qdbus-simple-test-runner
Core
)

install(
TARGETS qdbus-simple-test-runner
RUNTIME DESTINATION "bin"
)
Loading

0 comments on commit a3549e5

Please sign in to comment.