1 /* Copyright (C) 2013 BMW Group
2 * Author: Manfred Bathelt (manfred.bathelt@bmw.de)
3 * Author: Juergen Gehring (juergen.gehring@bmw.de)
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include <common-api-dbus/dbus-connection.h>
8 #include <common-api-dbus/dbus-output-message-stream.h>
10 #include <gtest/gtest.h>
15 #define ASSERT_DBUSMESSAGE_EQ(_dbusMessage1, _dbusMessage2) \
16 ASSERT_FALSE(_dbusMessage1.getSignatureString() == NULL); \
17 ASSERT_FALSE(_dbusMessage2.getSignatureString() == NULL); \
18 ASSERT_STREQ(_dbusMessage1.getSignatureString(), _dbusMessage2.getSignatureString()); \
19 ASSERT_EQ(_dbusMessage1.getBodyLength(), _dbusMessage2.getBodyLength()); \
20 ASSERT_FALSE(_dbusMessage1.getBodyData() == NULL); \
21 ASSERT_FALSE(_dbusMessage2.getBodyData() == NULL); \
22 ASSERT_EQ(memcmp(_dbusMessage1.getBodyData(), _dbusMessage2.getBodyData(), _dbusMessage1.getBodyLength()), 0)
27 class DBusConnectionTest: public ::testing::Test {
29 void onConnectionStatusEvent(const common::api::AvailabilityStatus& newConnectionStatus) {
30 connectionStatusEventCount_++;
31 connectionStatus_ = newConnectionStatus;
34 bool onInterfaceHandlerDBusMessageReply(const common::api::dbus::DBusMessage& dbusMessage,
35 const std::shared_ptr<common::api::dbus::DBusConnection>& dbusConnection) {
36 interfaceHandlerDBusMessageCount_++;
37 interfaceHandlerDBusMessage_ = dbusMessage;
38 interfaceHandlerDBusMessageReply_ = dbusMessage.createMethodReturn("si");
40 common::api::dbus::DBusOutputMessageStream dbusOutputMessageStream(interfaceHandlerDBusMessageReply_);
41 dbusOutputMessageStream << "This is a default message reply!" << interfaceHandlerDBusMessageCount_;
42 dbusOutputMessageStream.flush();
44 dbusConnection->sendDBusMessage(interfaceHandlerDBusMessageReply_);
49 void onDBusMessageHandler(const common::api::dbus::DBusMessage& dbusMessage) {
50 dbusMessageHandlerCount_++;
51 dbusMessageHandlerDBusMessage_ = dbusMessage;
55 virtual void SetUp() {
56 dbusConnection_ = common::api::dbus::DBusConnection::getSessionBus();
57 connectionStatusEventCount_ = 0;
58 interfaceHandlerDBusMessageCount_ = 0;
59 dbusMessageHandlerCount_ = 0;
62 virtual void TearDown() {
63 if (dbusConnection_ && dbusConnection_->isConnected())
64 dbusConnection_->disconnect();
67 interfaceHandlerDBusMessage_ = common::api::dbus::DBusMessage();
68 interfaceHandlerDBusMessageReply_ = common::api::dbus::DBusMessage();
70 dbusMessageHandlerDBusMessage_ = common::api::dbus::DBusMessage();
74 std::shared_ptr<common::api::dbus::DBusConnection> dbusConnection_;
76 uint32_t connectionStatusEventCount_;
77 common::api::AvailabilityStatus connectionStatus_;
79 uint32_t interfaceHandlerDBusMessageCount_;
80 common::api::dbus::DBusMessage interfaceHandlerDBusMessage_;
81 common::api::dbus::DBusMessage interfaceHandlerDBusMessageReply_;
83 uint32_t dbusMessageHandlerCount_;
84 common::api::dbus::DBusMessage dbusMessageHandlerDBusMessage_;
88 TEST_F(DBusConnectionTest, IsInitiallyDisconnected) {
89 ASSERT_FALSE(dbusConnection_->isConnected());
92 TEST_F(DBusConnectionTest, ConnectAndDisconnectWork) {
93 ASSERT_TRUE(dbusConnection_->connect());
94 ASSERT_TRUE(dbusConnection_->isConnected());
96 dbusConnection_->disconnect();
97 ASSERT_FALSE(dbusConnection_->isConnected());
100 TEST_F(DBusConnectionTest, ConnectionStatusEventWorks) {
101 ASSERT_EQ(connectionStatusEventCount_, 0);
103 auto connectionStatusSubscription = dbusConnection_->getConnectionStatusEvent().subscribe(std::bind(
104 &DBusConnectionTest::onConnectionStatusEvent,
106 std::placeholders::_1));
108 ASSERT_FALSE(dbusConnection_->isConnected());
109 ASSERT_EQ(connectionStatusEventCount_, 0);
111 uint32_t expectedEventCount = 0;
112 while (expectedEventCount < 10) {
113 ASSERT_TRUE(dbusConnection_->connect());
114 ASSERT_TRUE(dbusConnection_->isConnected());
115 ASSERT_EQ(connectionStatusEventCount_, ++expectedEventCount);
116 ASSERT_EQ(connectionStatus_, common::api::AvailabilityStatus::AVAILABLE);
118 dbusConnection_->disconnect();
119 ASSERT_FALSE(dbusConnection_->isConnected());
120 ASSERT_EQ(connectionStatusEventCount_, ++expectedEventCount);
121 ASSERT_EQ(connectionStatus_, common::api::AvailabilityStatus::NOT_AVAILABLE);
124 dbusConnection_->getConnectionStatusEvent().unsubscribe(connectionStatusSubscription);
125 ASSERT_EQ(connectionStatusEventCount_, expectedEventCount);
127 ASSERT_TRUE(dbusConnection_->connect());
128 ASSERT_TRUE(dbusConnection_->isConnected());
129 ASSERT_EQ(connectionStatusEventCount_, expectedEventCount);
131 dbusConnection_->disconnect();
132 ASSERT_FALSE(dbusConnection_->isConnected());
133 ASSERT_EQ(connectionStatusEventCount_, expectedEventCount);
136 TEST_F(DBusConnectionTest, SendingAsyncDBusMessagesWorks) {
137 const char* busName = "common.api.dbus.test.TestInterfaceHandler";
138 const char* objectPath = "/common/api/dbus/test/TestObject";
139 const char* interfaceName = "common.api.dbus.test.TestInterface";
140 const char* methodName = "TestMethod";
142 auto interfaceHandlerDBusConnection = common::api::dbus::DBusConnection::getSessionBus();
144 ASSERT_TRUE(interfaceHandlerDBusConnection->connect());
145 ASSERT_TRUE(interfaceHandlerDBusConnection->requestServiceNameAndBlock(busName));
147 auto interfaceHandlerToken = interfaceHandlerDBusConnection->registerInterfaceHandler(
150 std::bind(&DBusConnectionTest::onInterfaceHandlerDBusMessageReply,
152 std::placeholders::_1,
153 interfaceHandlerDBusConnection));
156 ASSERT_TRUE(dbusConnection_->connect());
158 for (uint32_t expectedDBusMessageCount = 1; expectedDBusMessageCount <= 10; expectedDBusMessageCount++) {
159 auto dbusMessageCall = common::api::dbus::DBusMessage::createMethodCall(
165 ASSERT_TRUE(dbusMessageCall);
167 common::api::dbus::DBusOutputMessageStream dbusOutputMessageStream(dbusMessageCall);
168 dbusOutputMessageStream << "This is a test async call"
169 << expectedDBusMessageCount;
170 dbusOutputMessageStream.flush();
172 dbusConnection_->sendDBusMessageWithReplyAsync(
174 std::bind(&DBusConnectionTest::onDBusMessageHandler, this, std::placeholders::_1));
176 for (int i = 0; i < 10 && interfaceHandlerDBusMessageCount_ < expectedDBusMessageCount; i++)
177 interfaceHandlerDBusConnection->readWriteDispatch(100);
179 ASSERT_EQ(interfaceHandlerDBusMessageCount_, expectedDBusMessageCount);
180 ASSERT_DBUSMESSAGE_EQ(dbusMessageCall, interfaceHandlerDBusMessage_);
182 for (int i = 0; i < 10 && dbusMessageHandlerCount_ < expectedDBusMessageCount; i++)
183 dbusConnection_->readWriteDispatch(100);
185 ASSERT_EQ(dbusMessageHandlerCount_, expectedDBusMessageCount);
186 ASSERT_DBUSMESSAGE_EQ(dbusMessageHandlerDBusMessage_, interfaceHandlerDBusMessageReply_);
189 dbusConnection_->disconnect();
192 interfaceHandlerDBusConnection->unregisterInterfaceHandler(interfaceHandlerToken);
194 ASSERT_TRUE(interfaceHandlerDBusConnection->releaseServiceName(busName));
195 interfaceHandlerDBusConnection->disconnect();