// Copyright (C) 2013-2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef COMMONAPI_INTERNAL_COMPILATION #define COMMONAPI_INTERNAL_COMPILATION #endif #include #include #include #include #include #include namespace { class DBusDaemonProxyTest: public ::testing::Test { protected: virtual void SetUp() { dbusConnection_ = CommonAPI::DBus::DBusConnection::getBus(CommonAPI::DBus::DBusType_t::SESSION); ASSERT_TRUE(dbusConnection_->connect()); dbusDaemonProxy_ = std::make_shared(dbusConnection_); } virtual void TearDown() { } std::shared_ptr dbusConnection_; std::shared_ptr dbusDaemonProxy_; }; TEST_F(DBusDaemonProxyTest, ListNames) { std::vector busNames; CommonAPI::CallStatus callStatus; dbusDaemonProxy_->listNames(callStatus, busNames); ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS); ASSERT_GT(busNames.size(), 0); for (const std::string& busName : busNames) { ASSERT_FALSE(busName.empty()); ASSERT_GT(busName.length(), 1); } } TEST_F(DBusDaemonProxyTest, DISABLED_ListNamesAsync) { std::promise>>promise; auto future = promise.get_future(); auto callStatusFuture = dbusDaemonProxy_->listNamesAsync( [&](const CommonAPI::CallStatus& callStatus, std::vector busNames) { promise.set_value(std::tuple>(callStatus, std::move(busNames))); }); auto status = future.wait_for(std::chrono::milliseconds(500)); bool waitResult = CommonAPI::DBus::checkReady(status); ASSERT_EQ(waitResult, true); ASSERT_EQ(callStatusFuture.get(), CommonAPI::CallStatus::SUCCESS); auto futureResult = future.get(); const CommonAPI::CallStatus& callStatus = std::get<0>(futureResult); const std::vector& busNames = std::get<1>(futureResult); ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS); ASSERT_GT(busNames.size(), 0); for (const std::string& busName : busNames) { ASSERT_FALSE(busName.empty()); ASSERT_GT(busName.length(), 1); } } TEST_F(DBusDaemonProxyTest, DISABLED_NameHasOwner) { bool nameHasOwner; CommonAPI::CallStatus callStatus; dbusDaemonProxy_->nameHasOwner("org.freedesktop.DBus", callStatus, nameHasOwner); ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS); ASSERT_TRUE(nameHasOwner); dbusDaemonProxy_->nameHasOwner("org.freedesktop.DBus.InvalidName.XXYYZZ", callStatus, nameHasOwner); ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS); ASSERT_FALSE(nameHasOwner); } TEST_F(DBusDaemonProxyTest, NameHasOwnerAsync) { std::promise> promise; auto future = promise.get_future(); auto callStatusFuture = dbusDaemonProxy_->nameHasOwnerAsync( "org.freedesktop.DBus", [&](const CommonAPI::CallStatus& callStatus, bool nameHasOwner) { promise.set_value(std::tuple(callStatus, std::move(nameHasOwner))); }); auto status = future.wait_for(std::chrono::milliseconds(100)); const bool waitResult = CommonAPI::DBus::checkReady(status); ASSERT_EQ(waitResult, true); ASSERT_EQ(callStatusFuture.get(), CommonAPI::CallStatus::SUCCESS); auto futureResult = future.get(); const CommonAPI::CallStatus& callStatus = std::get<0>(futureResult); const bool& nameHasOwner = std::get<1>(futureResult); ASSERT_EQ(callStatus, CommonAPI::CallStatus::SUCCESS); ASSERT_TRUE(nameHasOwner); } TEST_F(DBusDaemonProxyTest, DISABLED_NameOwnerChangedEvent) { std::promise promise; auto future = promise.get_future(); auto subscription = dbusDaemonProxy_->getNameOwnerChangedEvent().subscribe( [&](const std::string& name, const std::string& oldOwner, const std::string& newOwner) { static bool promiseIsSet = false; if(!promiseIsSet) { promiseIsSet = true; promise.set_value(!name.empty() && (!oldOwner.empty() || !newOwner.empty())); } }); // Trigger NameOwnerChanged using a new DBusConnection ASSERT_TRUE(CommonAPI::DBus::DBusConnection::getBus(CommonAPI::DBus::DBusType_t::SESSION)->connect()); ASSERT_TRUE(future.get()); dbusDaemonProxy_->getNameOwnerChangedEvent().unsubscribe(subscription); } } // namespace #ifndef __NO_MAIN__ int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } #endif