1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include "test.h"
#include <cstdlib>
#include <QtCore/QTimer>
#include <TelepathyQt/Types>
#include <TelepathyQt/Debug>
#include <TelepathyQt/DBus>
#include <TelepathyQt/PendingVoid>
#include <TelepathyQt/SharedPtr>
#include <TelepathyQt/RefCounted>
using Tp::PendingOperation;
using Tp::PendingVoid;
using Tp::Client::DBus::PeerInterface;
Test::Test(QObject *parent)
: QObject(parent), mLoop(new QEventLoop(this))
{
QTimer::singleShot(10 * 60 * 1000, this, SLOT(onWatchdog()));
}
Test::~Test()
{
delete mLoop;
}
void Test::initTestCaseImpl()
{
Tp::registerTypes();
Tp::enableDebug(true);
Tp::enableWarnings(true);
QVERIFY(QDBusConnection::sessionBus().isConnected());
}
void Test::initImpl()
{
}
void Test::cleanupImpl()
{
}
void Test::cleanupTestCaseImpl()
{
// To allow for cleanup code to run (e.g. PendingOperation cleanup after they finish)
mLoop->processEvents();
}
void Test::expectSuccessfulCall(PendingOperation *op)
{
if (op->isError()) {
qWarning().nospace() << op->errorName()
<< ": " << op->errorMessage();
mLoop->exit(1);
return;
}
mLoop->exit(0);
}
void Test::expectSuccessfulCall(QDBusPendingCallWatcher *watcher)
{
if (watcher->isError()) {
qWarning().nospace() << watcher->error().name()
<< ": " << watcher->error().message();
mLoop->exit(1);
return;
}
mLoop->exit(0);
}
void Test::expectFailure(PendingOperation *op)
{
if (!op->isError()) {
qWarning() << "expectFailure(): should have been an error, but wasn't";
mLoop->exit(1);
return;
}
mLoop->exit(0);
}
void Test::expectSuccessfulProperty(PendingOperation *op)
{
if (op->isError()) {
qWarning().nospace() << op->errorName()
<< ": " << op->errorMessage();
mPropertyValue = QVariant();
mLoop->exit(1);
} else {
Tp::PendingVariant *pv = qobject_cast<Tp::PendingVariant*>(op);
mPropertyValue = pv->result();
mLoop->exit(0);
}
}
void Test::processDBusQueue(Tp::DBusProxy *proxy)
{
// Call method Ping on the D-Bus Peer interface
PeerInterface peer(proxy);
PendingVoid *call = new PendingVoid(peer.Ping(), Tp::SharedPtr<Tp::RefCounted>());
// Wait for the reply to the Ping call
while (!call->isFinished()) {
mLoop->processEvents();
}
QVERIFY(call->isFinished());
QVERIFY(call->isValid());
// Do one more processEvents so the PendingVoid is always freed
mLoop->processEvents();
}
void Test::onWatchdog()
{
// We can't use QFAIL because the test would then go to cleanup() and/or cleanupTestCase(),
// which would often hang too - so let's just use abort
qWarning() << "Test took over 10 minutes to finish, it's probably hung up - aborting";
std::abort();
}
|