1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #include <CommonAPI/DBus/DBusConnection.h>
5 #include <CommonAPI/DBus/DBusDaemonProxy.h>
7 #include <gtest/gtest.h>
14 void dispatch(std::shared_ptr<CommonAPI::DBus::DBusConnection> dbusConnection) {
15 while (dbusConnection->readWriteDispatch(10)) {}
18 class DBusDaemonProxyTest: public ::testing::Test {
23 virtual void SetUp() {
24 dbusConnection_ = CommonAPI::DBus::DBusConnection::getSessionBus();
25 ASSERT_TRUE(dbusConnection_->connect());
26 thread = new std::thread(dispatch, dbusConnection_);
28 //readWriteDispatchCount_ = 0;
31 virtual void TearDown() {
33 if (dbusConnection_ && dbusConnection_->isConnected()) {
34 //dbusConnection_->disconnect();
38 /*bool doReadWriteDispatch(int timeoutMilliseconds = 100) {
39 readWriteDispatchCount_++;
40 return dbusConnection_->readWriteDispatch(timeoutMilliseconds);
43 std::shared_ptr<CommonAPI::DBus::DBusConnection> dbusConnection_;
44 //size_t readWriteDispatchCount_;
47 TEST_F(DBusDaemonProxyTest, ListNames) {
48 std::vector<std::string> busNames;
49 CommonAPI::CallStatus callStatus;
51 dbusConnection_->getDBusDaemonProxy()->listNames(callStatus, busNames);
52 ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS);
54 ASSERT_GT(busNames.size(), 0);
55 for (const std::string& busName : busNames) {
56 ASSERT_FALSE(busName.empty());
57 ASSERT_GT(busName.length(), 1);
61 TEST_F(DBusDaemonProxyTest, ListNamesAsync) {
62 std::promise<std::tuple<CommonAPI::CallStatus, std::vector<std::string>>> promise;
63 auto future = promise.get_future();
65 auto callStatusFuture = dbusConnection_->getDBusDaemonProxy()->listNamesAsync(
66 [&](const CommonAPI::CallStatus& callStatus, std::vector<std::string> busNames) {
67 promise.set_value(std::tuple<CommonAPI::CallStatus, std::vector<std::string>>(callStatus, std::move(busNames)));
70 ASSERT_EQ(future.wait_for(std::chrono::milliseconds(200)), std::future_status::ready);
72 ASSERT_EQ(callStatusFuture.get(), CommonAPI::CallStatus::SUCCESS);
74 auto futureResult = future.get();
75 const CommonAPI::CallStatus& callStatus = std::get<0>(futureResult);
76 const std::vector<std::string>& busNames = std::get<1>(futureResult);
78 ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS);
80 ASSERT_GT(busNames.size(), 0);
81 for (const std::string& busName : busNames) {
82 ASSERT_FALSE(busName.empty());
83 ASSERT_GT(busName.length(), 1);
87 TEST_F(DBusDaemonProxyTest, NameHasOwner) {
89 CommonAPI::CallStatus callStatus;
91 dbusConnection_->getDBusDaemonProxy()->nameHasOwner("org.freedesktop.DBus", callStatus, nameHasOwner);
92 ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS);
93 ASSERT_TRUE(nameHasOwner);
95 dbusConnection_->getDBusDaemonProxy()->nameHasOwner("org.freedesktop.DBus.InvalidName.XXYYZZ", callStatus, nameHasOwner);
96 ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS);
97 ASSERT_FALSE(nameHasOwner);
100 TEST_F(DBusDaemonProxyTest, NameHasOwnerAsync) {
101 std::promise<std::tuple<CommonAPI::CallStatus, bool>> promise;
102 auto future = promise.get_future();
104 auto callStatusFuture = dbusConnection_->getDBusDaemonProxy()->nameHasOwnerAsync(
105 "org.freedesktop.DBus",
106 [&](const CommonAPI::CallStatus& callStatus, bool nameHasOwner) {
107 promise.set_value(std::tuple<CommonAPI::CallStatus, bool>(callStatus, std::move(nameHasOwner)));
110 //while (readWriteDispatchCount_ < 5) {
111 // ASSERT_TRUE(doReadWriteDispatch());
112 //if (callStatusFuture.wait_for(std::chrono::milliseconds(100)) == std::future_status::ready)
115 //ASSERT_NE(readWriteDispatchCount_, 5);
116 ASSERT_EQ(future.wait_for(std::chrono::milliseconds(100)), std::future_status::ready);
118 ASSERT_EQ(callStatusFuture.get(), CommonAPI::CallStatus::SUCCESS);
120 auto futureResult = future.get();
121 const CommonAPI::CallStatus& callStatus = std::get<0>(futureResult);
122 const bool& nameHasOwner = std::get<1>(futureResult);
124 ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS);
125 ASSERT_TRUE(nameHasOwner);
128 TEST_F(DBusDaemonProxyTest, NameOwnerChangedEvent) {
129 std::promise<bool> promise;
130 auto future = promise.get_future();
132 dbusConnection_->getDBusDaemonProxy()->getNameOwnerChangedEvent().subscribe(
133 [&](const std::string& name, const std::string& oldOwner, const std::string& newOwner) {
134 static bool promiseIsSet = false;
137 promise.set_value(!name.empty() && (!oldOwner.empty() || !newOwner.empty()));
141 // Trigger NameOwnerChanged using a new DBusConnection
142 ASSERT_TRUE(CommonAPI::DBus::DBusConnection::getSessionBus()->connect());
144 //while (readWriteDispatchCount_ < 5) {
145 // ASSERT_TRUE(doReadWriteDispatch());
146 //if (future.wait_for(std::chrono::milliseconds(100)) == std::future_status::ready)
150 //ASSERT_NE(readWriteDispatchCount_, 5);
151 ASSERT_TRUE(future.get());
156 int main(int argc, char** argv) {
157 ::testing::InitGoogleTest(&argc, argv);
158 return RUN_ALL_TESTS();