summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index baf769f..d84350b 100644
--- a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -103,6 +103,8 @@ private slots:
void getComplexSignal_data();
void getComplexSignal();
+ void followSignal();
+
void createErrors_data();
void createErrors();
@@ -432,6 +434,60 @@ void tst_QDBusAbstractInterface::getComplexSignal()
QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
}
+void tst_QDBusAbstractInterface::followSignal()
+{
+ const QString serviceToFollow = "com.trolltech.tst_qdbusabstractinterface.FollowMe";
+ Pinger p = getPinger(serviceToFollow);
+ QVERIFY2(p, "Not connected to D-Bus");
+
+ QDBusConnection con = p->connection();
+ QVERIFY(!con.interface()->isServiceRegistered(serviceToFollow));
+ Pinger control = getPinger("");
+
+ // we need to connect the signal somewhere in order for D-Bus to enable the rules
+ QTestEventLoop::instance().connect(p.data(), SIGNAL(voidSignal()), SLOT(exitLoop()));
+ QTestEventLoop::instance().connect(control.data(), SIGNAL(voidSignal()), SLOT(exitLoop()));
+ QSignalSpy s(p.data(), SIGNAL(voidSignal()));
+
+ emit targetObj.voidSignal();
+ QTestEventLoop::instance().enterLoop(200);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+
+ // signal must not have been received because the service isn't registered
+ QVERIFY(s.isEmpty());
+
+ // now register the service
+ QDBusReply<QDBusConnectionInterface::RegisterServiceReply> r =
+ con.interface()->registerService(serviceToFollow, QDBusConnectionInterface::DontQueueService,
+ QDBusConnectionInterface::DontAllowReplacement);
+ QVERIFY(r.isValid() && r.value() == QDBusConnectionInterface::ServiceRegistered);
+ QVERIFY(con.interface()->isServiceRegistered(serviceToFollow));
+
+ // emit the signal again:
+ emit targetObj.voidSignal();
+ QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+
+ // now the signal must have been received:
+ QVERIFY(s.size() == 1);
+ QVERIFY(s.at(0).size() == 0);
+ s.clear();
+
+ // disconnect the signal
+ disconnect(p.data(), SIGNAL(voidSignal()), &QTestEventLoop::instance(), 0);
+
+ // emit the signal again:
+ emit targetObj.voidSignal();
+ QTestEventLoop::instance().enterLoop(2);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+
+ // and now it mustn't have been received
+ QVERIFY(s.isEmpty());
+
+ // cleanup:
+ con.interface()->unregisterService(serviceToFollow);
+}
+
void tst_QDBusAbstractInterface::createErrors_data()
{
QTest::addColumn<QString>("service");