tests: fix blocking semantic in DBusProxyTest
[profile/ivi/common-api-dbus-runtime.git] / src / test / DBusServiceRegistryTest.cpp
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 <CommonAPI/Runtime.h>
8 #include <CommonAPI/Factory.h>
9 #include <CommonAPI/DBus/DBusServiceRegistry.h>
10 #include <CommonAPI/DBus/DBusConnection.h>
11
12 #include <commonapi/tests/TestInterfaceStub.h>
13 #include <commonapi/tests/TestInterfaceStubDefault.h>
14 #include <commonapi/tests/TestInterfaceDBusStubAdapter.h>
15
16 #include <gtest/gtest.h>
17
18 #include <iostream>
19
20
21 class DBusServiceRegistryTest: public ::testing::Test {
22  protected:
23     virtual void SetUp() {
24     }
25
26         virtual void TearDown() {
27         }
28 };
29
30
31 TEST_F(DBusServiceRegistryTest, CanBeConstructed) {
32     CommonAPI::DBus::DBusServiceRegistry* registry = new CommonAPI::DBus::DBusServiceRegistry();
33     ASSERT_TRUE(registry != NULL);
34 }
35
36
37 TEST_F(DBusServiceRegistryTest, DBusConnectionHasRegistry) {
38     auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
39     auto serviceRegistry = dbusConnection->getDBusServiceRegistry();
40     ASSERT_FALSE(!serviceRegistry);
41 }
42
43 TEST_F(DBusServiceRegistryTest, ServiceStatusEventCanBeFetched) {
44     auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
45     auto dbusServiceRegistry = dbusConnection->getDBusServiceRegistry();
46     dbusConnection->connect();
47     ASSERT_NO_FATAL_FAILURE(auto serviceStatusEvent = dbusServiceRegistry->getServiceStatusEvent());
48 }
49
50
51 TEST_F(DBusServiceRegistryTest, ServiceStatusEventCanBeSubscribedTo) {
52     auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
53     auto dbusServiceRegistry = dbusConnection->getDBusServiceRegistry();
54     dbusConnection->connect();
55     auto serviceStatusEvent = dbusServiceRegistry->getServiceStatusEvent();
56     std::string eventName_ = "local:some:address";
57     serviceStatusEvent.subscribe(eventName_,
58             [&] (const std::string& eventName, const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
59                 return CommonAPI::SubscriptionStatus::RETAIN;
60             }
61     );
62 }
63
64
65 TEST_F(DBusServiceRegistryTest, ServiceStatusEventGetsFirstCall) {
66     auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
67     auto dbusServiceRegistry = dbusConnection->getDBusServiceRegistry();
68     dbusConnection->connect();
69     auto serviceStatusEvent = dbusServiceRegistry->getServiceStatusEvent();
70     std::string eventName_ = "local:some:address";
71     bool called = false;
72     serviceStatusEvent.subscribe(eventName_,
73             [&] (const std::string& eventName, const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
74                 called = true;
75                 return CommonAPI::SubscriptionStatus::RETAIN;
76             }
77     );
78     while(!called) {
79         usleep(1);
80     }
81     ASSERT_TRUE(called);
82 }
83
84
85 TEST_F(DBusServiceRegistryTest, SubscriptionToServiceStatusEventCanBeCancelled) {
86     auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
87     auto dbusServiceRegistry = dbusConnection->getDBusServiceRegistry();
88     dbusConnection->connect();
89     auto serviceStatusEvent = dbusServiceRegistry->getServiceStatusEvent();
90     std::string eventName_ = "local:some:address";
91     serviceStatusEvent.subscribe(eventName_,
92             [&] (const std::string& eventName, const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
93                 return CommonAPI::SubscriptionStatus::CANCEL;
94             }
95     );
96     sleep(1);
97 }
98
99
100 class DBusServiceRegistryTestWithPredefinedRemote: public ::testing::Test {
101  protected:
102     virtual void SetUp() {
103         CommonAPI::DBus::DBusConnection::getSessionBus();
104         dbusServiceRegistry_ = dbusConnection_->getDBusServiceRegistry();
105         dbusConnection_->connect();
106
107         dbusStubConnection_ = CommonAPI::DBus::DBusConnection::getSessionBus();
108         dbusStubConnection_->connect();
109
110         auto stub = std::make_shared<commonapi::tests::TestInterfaceStubDefault>();
111
112         dbusStubConnection_->requestServiceNameAndBlock("test.instance.name");
113         auto stubAdapter = std::make_shared<commonapi::tests::TestInterfaceDBusStubAdapter>(
114                         "local:test.service.name:test.instance.name",
115                         "test.service.name",
116                         "test.instance.name",
117                         "/test/instance/name",
118                         dbusStubConnection_,
119                         stub);
120         stubAdapter->init();
121     }
122
123     virtual void TearDown() {
124     }
125
126     std::shared_ptr<CommonAPI::DBus::DBusConnection> dbusConnection_;
127     std::shared_ptr<CommonAPI::DBus::DBusConnection> dbusStubConnection_;
128     std::shared_ptr<CommonAPI::DBus::DBusServiceRegistry> dbusServiceRegistry_;
129 };
130
131
132 TEST_F(DBusServiceRegistryTestWithPredefinedRemote, RecognizesCommonAPIDBusServiceInstanceAsAlive) {
133     ASSERT_TRUE(dbusServiceRegistry_->isServiceInstanceAlive("test.service.name", "test.instance.name", "/test/instance/name"));
134 }
135
136
137 TEST_F(DBusServiceRegistryTestWithPredefinedRemote, FindsCommonAPIDBusServiceInstance) {
138     auto availableServices = dbusServiceRegistry_->getAvailableServiceInstances("test.service.name", "local");
139     ASSERT_EQ(1, availableServices.size());
140     bool serviceFound;
141     for(auto it = availableServices.begin(); it != availableServices.end(); ++it) {
142         if(*it == "local:test.service.name:test.instance.name") {
143             serviceFound = true;
144         }
145     }
146     ASSERT_TRUE(serviceFound);
147 }
148
149
150
151 int main(int argc, char** argv) {
152     ::testing::InitGoogleTest(&argc, argv);
153     return RUN_ALL_TESTS();
154 }