From cddc9d49f09dc8e455800d8e5982144d9bd7c44a Mon Sep 17 00:00:00 2001 From: Stefan Laner Date: Wed, 9 Apr 2014 10:13:41 +0200 Subject: Bugfix: DBusEvent does only remove its own subscriptions on unsubscribe / destroy and not all subscriptions for that signal anymore --- src/CommonAPI/DBus/DBusEvent.h | 4 +- src/CommonAPI/DBus/DBusProxyBase.cpp | 4 +- src/CommonAPI/DBus/DBusProxyBase.h | 2 +- src/test/DBusBroadcastTest.cpp | 84 ++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/CommonAPI/DBus/DBusEvent.h b/src/CommonAPI/DBus/DBusEvent.h index 7b43ba2..df21e24 100644 --- a/src/CommonAPI/DBus/DBusEvent.h +++ b/src/CommonAPI/DBus/DBusEvent.h @@ -58,7 +58,7 @@ class DBusEvent: public _EventType, public DBusProxyConnection::DBusSignalHandle virtual ~DBusEvent() { if (this->hasListeners()) - dbusProxy_.removeSignalMemberHandler(subscription_); + dbusProxy_.removeSignalMemberHandler(subscription_, this); } virtual SubscriptionStatus onSignalDBusMessage(const DBusMessage& dbusMessage) { @@ -74,7 +74,7 @@ class DBusEvent: public _EventType, public DBusProxyConnection::DBusSignalHandle } virtual void onLastListenerRemoved(const CancellableListener&) { - dbusProxy_.removeSignalMemberHandler(subscription_); + dbusProxy_.removeSignalMemberHandler(subscription_, this); } template diff --git a/src/CommonAPI/DBus/DBusProxyBase.cpp b/src/CommonAPI/DBus/DBusProxyBase.cpp index f796cfb..a493606 100644 --- a/src/CommonAPI/DBus/DBusProxyBase.cpp +++ b/src/CommonAPI/DBus/DBusProxyBase.cpp @@ -59,8 +59,8 @@ DBusProxyConnection::DBusSignalHandlerToken DBusProxyBase::addSignalMemberHandle justAddFilter); } -bool DBusProxyBase::removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken) { - return dbusConnection_->removeSignalMemberHandler(dbusSignalHandlerToken); +bool DBusProxyBase::removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken, const DBusProxyConnection::DBusSignalHandler* dbusSignalHandler) { + return dbusConnection_->removeSignalMemberHandler(dbusSignalHandlerToken, dbusSignalHandler); } } // namespace DBus diff --git a/src/CommonAPI/DBus/DBusProxyBase.h b/src/CommonAPI/DBus/DBusProxyBase.h index 2896d83..d1a3a51 100644 --- a/src/CommonAPI/DBus/DBusProxyBase.h +++ b/src/CommonAPI/DBus/DBusProxyBase.h @@ -55,7 +55,7 @@ class DBusProxyBase: public virtual CommonAPI::Proxy { DBusProxyConnection::DBusSignalHandler* dbusSignalHandler, const bool justAddFilter = false); - bool removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken); + bool removeSignalMemberHandler(const DBusProxyConnection::DBusSignalHandlerToken& dbusSignalHandlerToken, const DBusProxyConnection::DBusSignalHandler* dbusSignalHandler = NULL); virtual void init() = 0; diff --git a/src/test/DBusBroadcastTest.cpp b/src/test/DBusBroadcastTest.cpp index 491baab..b4eb77e 100644 --- a/src/test/DBusBroadcastTest.cpp +++ b/src/test/DBusBroadcastTest.cpp @@ -387,6 +387,90 @@ TEST_F(DBusBroadcastTest, ProxysCanCancelSubscriptionAndSubscribeAgainWithOtherP broadcastEvent2.unsubscribe(broadcastSubscription2); } +TEST_F(DBusBroadcastTest, ProxysCanUnsubscribeFromBroadcastAndSubscribeAgainWhileOtherProxyIsStillSubscribed) { + // register service + auto stub = std::make_shared(); + + bool serviceRegistered = servicePublisher_->registerService(stub, serviceAddress_, stubFactory_); + for (unsigned int i = 0; !serviceRegistered && i < 100; ++i) { + serviceRegistered = servicePublisher_->registerService(stub, serviceAddress_, stubFactory_); + usleep(10000); + } + ASSERT_TRUE(serviceRegistered); + + // build 2 proxies from same factory + auto proxy = proxyFactory_->buildProxy(serviceAddress_); + auto proxy2 = proxyFactory_->buildProxy(serviceAddress_); + + commonapi::tests::TestInterfaceProxyDefault::TestPredefinedTypeBroadcastEvent& broadcastEvent = + proxy->getTestPredefinedTypeBroadcastEvent(); + + commonapi::tests::TestInterfaceProxyDefault::TestPredefinedTypeBroadcastEvent& broadcastEvent2 = + proxy2->getTestPredefinedTypeBroadcastEvent(); + + bool callback1Arrived = false; + bool callback2Arrived = false; + + // subscribe for each proxy's broadcast event + auto broadcastSubscription = broadcastEvent.subscribeCancellableListener([&](uint32_t intParam, std::string stringParam) -> CommonAPI::SubscriptionStatus { + callback1Arrived = true; + return CommonAPI::SubscriptionStatus::RETAIN; + }); + + auto broadcastSubscription2 = broadcastEvent2.subscribeCancellableListener([&](uint32_t intParam, std::string stringParam) -> CommonAPI::SubscriptionStatus { + callback2Arrived = true; + return CommonAPI::SubscriptionStatus::RETAIN; + }); + + // fire broadcast and wait for results + stub->fireTestPredefinedTypeBroadcastEvent(1, "xyz"); + + for(unsigned int i=0; i<100 && !(callback1Arrived && callback2Arrived); i++) { + usleep(10000); + } + + const bool callbackOnBothSubscriptionsArrived = callback1Arrived && callback2Arrived; + + EXPECT_TRUE(callbackOnBothSubscriptionsArrived); + + // unsubscribe from one proxy's broadcast + broadcastEvent.unsubscribe(broadcastSubscription); + + // fire broadcast again + callback1Arrived = false; + callback2Arrived = false; + + stub->fireTestPredefinedTypeBroadcastEvent(2, "xyz"); + + for(unsigned int i=0; i<100; i++) { + usleep(10000); + } + + const bool onlyCallback2Arrived = !callback1Arrived && callback2Arrived; + + EXPECT_TRUE(onlyCallback2Arrived); + + // subscribe first proxy again + broadcastSubscription = broadcastEvent.subscribeCancellableListener([&](uint32_t intParam, std::string stringParam) -> CommonAPI::SubscriptionStatus { + callback1Arrived = true; + return CommonAPI::SubscriptionStatus::RETAIN; + }); + + // fire broadcast another time + callback1Arrived = false; + callback2Arrived = false; + + stub->fireTestPredefinedTypeBroadcastEvent(1, "xyz"); + + for(unsigned int i=0; i<100 && !(callback1Arrived && callback2Arrived); i++) { + usleep(10000); + } + + const bool callbackOnBothSubscriptionsArrivedAgain = callback1Arrived && callback2Arrived; + + EXPECT_TRUE(callbackOnBothSubscriptionsArrivedAgain); +} + TEST_F(DBusBroadcastTest, ProxysCanSubscribeForSelectiveBroadcast) -- cgit v1.2.1 From c35cdcc6e360e2f11c5ca6137099c4318fd04f1f Mon Sep 17 00:00:00 2001 From: Stefan Laner Date: Wed, 9 Apr 2014 10:36:46 +0200 Subject: removed compile warnings in DBusBraodcastTest --- src/test/DBusBroadcastTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/DBusBroadcastTest.cpp b/src/test/DBusBroadcastTest.cpp index b4eb77e..ea184ef 100644 --- a/src/test/DBusBroadcastTest.cpp +++ b/src/test/DBusBroadcastTest.cpp @@ -469,6 +469,9 @@ TEST_F(DBusBroadcastTest, ProxysCanUnsubscribeFromBroadcastAndSubscribeAgainWhil const bool callbackOnBothSubscriptionsArrivedAgain = callback1Arrived && callback2Arrived; EXPECT_TRUE(callbackOnBothSubscriptionsArrivedAgain); + + broadcastEvent.unsubscribe(broadcastSubscription); + broadcastEvent2.unsubscribe(broadcastSubscription2); } -- cgit v1.2.1 From 3a18da1a04e6b7860fde158966138c9e0bd5c7a6 Mon Sep 17 00:00:00 2001 From: Stefan Laner Date: Tue, 22 Apr 2014 15:15:05 +0200 Subject: fixed unsubscribe mechanism in DBusEvent and added additional tests for Broadcasts --- src/test/DBusBroadcastTest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/DBusBroadcastTest.cpp b/src/test/DBusBroadcastTest.cpp index ea184ef..b07571a 100644 --- a/src/test/DBusBroadcastTest.cpp +++ b/src/test/DBusBroadcastTest.cpp @@ -348,7 +348,7 @@ TEST_F(DBusBroadcastTest, ProxysCanCancelSubscriptionAndSubscribeAgainWithOtherP bool callbackArrived = false; - auto broadcastSubscription = broadcastEvent.subscribeCancellableListener([&](uint32_t intParam, std::string stringParam) -> CommonAPI::SubscriptionStatus { + broadcastEvent.subscribeCancellableListener([&](uint32_t intParam, std::string stringParam) -> CommonAPI::SubscriptionStatus { EXPECT_EQ(intParam, 1); callbackArrived = true; return CommonAPI::SubscriptionStatus::CANCEL; @@ -383,7 +383,6 @@ TEST_F(DBusBroadcastTest, ProxysCanCancelSubscriptionAndSubscribeAgainWithOtherP ASSERT_TRUE(callbackArrived); - broadcastEvent.unsubscribe(broadcastSubscription); broadcastEvent2.unsubscribe(broadcastSubscription2); } -- cgit v1.2.1