summaryrefslogtreecommitdiff
path: root/src/test/DBusServiceRegistryTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/DBusServiceRegistryTest.cpp')
-rw-r--r--src/test/DBusServiceRegistryTest.cpp467
1 files changed, 365 insertions, 102 deletions
diff --git a/src/test/DBusServiceRegistryTest.cpp b/src/test/DBusServiceRegistryTest.cpp
index d5d2700..a429291 100644
--- a/src/test/DBusServiceRegistryTest.cpp
+++ b/src/test/DBusServiceRegistryTest.cpp
@@ -17,8 +17,10 @@
#endif
#include <CommonAPI/DBus/DBusServiceRegistry.h>
+#include <CommonAPI/DBus/DBusServicePublisher.h>
#include <CommonAPI/DBus/DBusConnection.h>
#include <CommonAPI/DBus/DBusUtils.h>
+#include <CommonAPI/DBus/DBusRuntime.h>
#include <commonapi/tests/TestInterfaceStub.h>
#include <commonapi/tests/TestInterfaceStubDefault.h>
@@ -28,6 +30,9 @@
#include "DemoMainLoop.h"
+#include <fstream>
+#include <chrono>
+
// all predefinedInstances will be added for this service
static const std::string dbusServiceName = "DBusServiceRegistryTest.Predefined.Service";
@@ -76,29 +81,244 @@ public:
};
+struct TestDBusServiceListener {
+ CommonAPI::AvailabilityStatus lastAvailabilityStatus;
+ size_t availabilityStatusCount;
+
+ std::condition_variable statusChanged;
+ std::mutex lock;
+
+ TestDBusServiceListener(const std::string& commonApiAddress,
+ const std::shared_ptr<CommonAPI::DBus::DBusProxyConnection>& dbusConnection):
+ commonApiAddress_(commonApiAddress),
+ dbusServiceRegistry_(dbusConnection->getDBusServiceRegistry()),
+ isSubscribed(false),
+ availabilityStatusCount(0) {
+ }
+
+ ~TestDBusServiceListener() {
+ if (isSubscribed) {
+ unsubscribe();
+ }
+ }
+
+ void subscribe() {
+ ASSERT_TRUE(!isSubscribed);
+
+ dbusServiceSubscription_= dbusServiceRegistry_->subscribeAvailabilityListener(
+ commonApiAddress_,
+ [&](const CommonAPI::AvailabilityStatus& availabilityStatus) {
+
+ std::lock_guard<std::mutex> lockGuard(lock);
+
+ lastAvailabilityStatus = availabilityStatus;
+ availabilityStatusCount++;
+
+ statusChanged.notify_all();
+
+ return CommonAPI::SubscriptionStatus::RETAIN;
+ });
+
+ isSubscribed = true;
+ }
+
+ void unsubscribe() {
+ ASSERT_TRUE(isSubscribed);
+
+ dbusServiceRegistry_->unsubscribeAvailabilityListener(
+ commonApiAddress_,
+ dbusServiceSubscription_);
+ }
+
+ private:
+ bool isSubscribed;
+ std::string commonApiAddress_;
+ std::shared_ptr<CommonAPI::DBus::DBusServiceRegistry> dbusServiceRegistry_;
+ CommonAPI::DBus::DBusServiceRegistry::DBusServiceSubscription dbusServiceSubscription_;
+};
+
+
+class TestDBusStubAdapter: public CommonAPI::DBus::DBusStubAdapter {
+ public:
+ TestDBusStubAdapter(const std::shared_ptr<CommonAPI::DBus::DBusFactory>& factory,
+ const std::string& commonApiAddress,
+ const std::string& dbusInterfaceName,
+ const std::string& dbusBusName,
+ const std::string& dbusObjectPath,
+ const std::shared_ptr<CommonAPI::DBus::DBusProxyConnection>& dbusConnection):
+ DBusStubAdapter(factory, commonApiAddress, dbusInterfaceName, dbusBusName, dbusObjectPath, dbusConnection),
+ introspectionCount(0) {
+ }
+
+ void deactivateManagedInstances() {
+
+ }
+
+ virtual const char* getMethodsDBusIntrospectionXmlData() const {
+ introspectionCount++;
+ return "";
+ }
+
+ virtual bool onInterfaceDBusMessage(const CommonAPI::DBus::DBusMessage& dbusMessage) {
+ return false;
+ }
+
+ mutable size_t introspectionCount;
+};
+
class DBusServiceRegistryTest: public ::testing::Test {
protected:
virtual void SetUp() {
+
+ auto runtime = std::dynamic_pointer_cast<CommonAPI::DBus::DBusRuntime>(CommonAPI::Runtime::load());
+
+ clientFactory = std::dynamic_pointer_cast<CommonAPI::DBus::DBusFactory>(runtime->createFactory());
+ serviceFactory = std::dynamic_pointer_cast<CommonAPI::DBus::DBusFactory>(runtime->createFactory());
+
+ clientDBusConnection = clientFactory->getDbusConnection();
+ clientConnectionRegistry = clientDBusConnection->getDBusServiceRegistry();
+ serviceDBusConnection = serviceFactory->getDbusConnection();
+ }
+
+ virtual void TearDown() {
+ if (clientDBusConnection && clientDBusConnection->isConnected()) {
+ clientDBusConnection->disconnect();
+ }
+
+ if (serviceDBusConnection && serviceDBusConnection->isConnected()) {
+ serviceDBusConnection->disconnect();
+ }
}
- virtual void TearDown() {
- }
+ bool waitForAvailabilityStatusChanged(TestDBusServiceListener& testDBusServiceListener,
+ const CommonAPI::AvailabilityStatus& availabilityStatus) {
+ std::unique_lock<std::mutex> lock(testDBusServiceListener.lock);
+ auto waitResult =
+ testDBusServiceListener.statusChanged.wait_for(
+ lock,
+ std::chrono::milliseconds(4000),
+ [&]() {return testDBusServiceListener.lastAvailabilityStatus == availabilityStatus;});
+ return waitResult;
+ }
+
+ std::shared_ptr<CommonAPI::DBus::DBusFactory> clientFactory;
+ std::shared_ptr<CommonAPI::DBus::DBusFactory> serviceFactory;
+
+ std::shared_ptr<CommonAPI::DBus::DBusConnection> clientDBusConnection;
+ std::shared_ptr<CommonAPI::DBus::DBusConnection> serviceDBusConnection;
+
+ std::shared_ptr<CommonAPI::DBus::DBusServiceRegistry> clientConnectionRegistry;
+ //std::shared_ptr<CommonAPI::DBus::DBusServiceRegistry> serviceConnectionRegistry;
};
-TEST_F(DBusServiceRegistryTest, CanBeConstructed) {
- std::shared_ptr<CommonAPI::DBus::DBusConnection> dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
- CommonAPI::DBus::DBusServiceRegistry* registry = new CommonAPI::DBus::DBusServiceRegistry(dbusConnection);
- ASSERT_TRUE(registry != NULL);
- delete registry;
+TEST_F(DBusServiceRegistryTest, DBusConnectionHasRegistry) {
+ clientDBusConnection->connect();
+
+ auto dbusServiceRegistry = clientDBusConnection->getDBusServiceRegistry();
+ EXPECT_FALSE(!dbusServiceRegistry);
}
+TEST_F(DBusServiceRegistryTest, SubscribeBeforeConnectWorks) {
+ TestDBusServiceListener testDBusServiceListener("local:Interface1:predefined.Instance1", clientDBusConnection);
+ testDBusServiceListener.subscribe();
+
+ ASSERT_TRUE(clientDBusConnection->connect());
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::NOT_AVAILABLE));
+ usleep(300 * 1000);
+ EXPECT_EQ(testDBusServiceListener.availabilityStatusCount, 1);
+
+ ASSERT_TRUE(serviceDBusConnection->connect());
+ ASSERT_TRUE(serviceDBusConnection->requestServiceNameAndBlock(dbusServiceName));
+ auto testDBusStubAdapter = std::make_shared<TestDBusStubAdapter>(
+ serviceFactory,
+ "local:Interface1:predefined.Instance1",
+ "tests.Interface1",
+ dbusServiceName,
+ "/tests/predefined/Object1",
+ serviceDBusConnection);
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->registerService(testDBusStubAdapter);
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::AVAILABLE));
+ sleep(2);
+ EXPECT_LE(testDBusServiceListener.availabilityStatusCount, 3);
+ EXPECT_EQ(testDBusStubAdapter->introspectionCount, 1);
+
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->unregisterService(testDBusStubAdapter->getAddress());
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::NOT_AVAILABLE));
+ EXPECT_LE(testDBusServiceListener.availabilityStatusCount, 4);
+}
-TEST_F(DBusServiceRegistryTest, DBusConnectionHasRegistry) {
- auto dbusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
- dbusConnection->connect();
- auto serviceRegistry = dbusConnection->getDBusServiceRegistry();
- ASSERT_FALSE(!serviceRegistry);
+TEST_F(DBusServiceRegistryTest, SubscribeBeforeConnectWithServiceWorks) {
+ ASSERT_TRUE(serviceDBusConnection->connect());
+ auto testDBusStubAdapter = std::make_shared<TestDBusStubAdapter>(
+ serviceFactory,
+ "local:Interface1:predefined.Instance1",
+ "tests.Interface1",
+ dbusServiceName,
+ "/tests/predefined/Object1",
+ serviceDBusConnection);
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->registerService(testDBusStubAdapter);
+
+ TestDBusServiceListener testDBusServiceListener("local:Interface1:predefined.Instance1", clientDBusConnection);
+ testDBusServiceListener.subscribe();
+ ASSERT_TRUE(clientDBusConnection->connect());
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::AVAILABLE));
+ usleep(300 * 1000);
+ EXPECT_EQ(testDBusServiceListener.availabilityStatusCount, 1);
+ EXPECT_EQ(testDBusStubAdapter->introspectionCount, 1);
+
+ serviceDBusConnection->disconnect();
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::NOT_AVAILABLE));
+ usleep(300 * 1000);
+ EXPECT_EQ(testDBusServiceListener.availabilityStatusCount, 2);
+
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->unregisterService(testDBusStubAdapter->getAddress());
+}
+
+TEST_F(DBusServiceRegistryTest, SubscribeAfterConnectWithServiceWorks) {
+ ASSERT_TRUE(serviceDBusConnection->connect());
+ auto testDBusStubAdapter = std::make_shared<TestDBusStubAdapter>(
+ serviceFactory,
+ "local:Interface1:predefined.Instance1",
+ "tests.Interface1",
+ dbusServiceName,
+ "/tests/predefined/Object1",
+ serviceDBusConnection);
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->registerService(testDBusStubAdapter);
+
+ ASSERT_TRUE(clientDBusConnection->connect());
+ TestDBusServiceListener testDBusServiceListener("local:Interface1:predefined.Instance1", clientDBusConnection);
+ EXPECT_EQ(testDBusStubAdapter->introspectionCount, 0);
+
+ testDBusServiceListener.subscribe();
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::AVAILABLE));
+ EXPECT_EQ(testDBusServiceListener.availabilityStatusCount, 1);
+ EXPECT_EQ(testDBusStubAdapter->introspectionCount, 1);
+
+ CommonAPI::DBus::DBusServicePublisher::getInstance()->unregisterService(testDBusStubAdapter->getAddress());
+
+ EXPECT_TRUE(waitForAvailabilityStatusChanged(
+ testDBusServiceListener,
+ CommonAPI::AvailabilityStatus::NOT_AVAILABLE));
+ EXPECT_EQ(testDBusServiceListener.availabilityStatusCount, 2);
+ EXPECT_EQ(testDBusStubAdapter->introspectionCount, 1);
}
TEST_F(DBusServiceRegistryTest, DBusAddressTranslatorPredefinedWorks) {
@@ -106,26 +326,26 @@ TEST_F(DBusServiceRegistryTest, DBusAddressTranslatorPredefinedWorks) {
CommonAPI::DBus::DBusAddressTranslator::getInstance().getPredefinedInstances(dbusServiceName, loadedPredefinedInstances);
- ASSERT_EQ(loadedPredefinedInstances.size(), predefinedInstancesMap.size());
+ EXPECT_EQ(loadedPredefinedInstances.size(), predefinedInstancesMap.size());
for (auto& dbusServiceAddress : loadedPredefinedInstances) {
const std::string& loadedDBusServiceName = std::get<0>(dbusServiceAddress);
const std::string& loadedDBusObjectPath = std::get<1>(dbusServiceAddress);
const std::string& loadedDBusInterfaceName = std::get<2>(dbusServiceAddress);
- ASSERT_EQ(loadedDBusServiceName, dbusServiceName);
+ EXPECT_EQ(loadedDBusServiceName, dbusServiceName);
auto predefinedInstanceIterator = predefinedInstancesMap.find({ loadedDBusInterfaceName, loadedDBusObjectPath });
const bool predefinedInstanceFound = (predefinedInstanceIterator != predefinedInstancesMap.end());
- ASSERT_TRUE(predefinedInstanceFound);
+ EXPECT_TRUE(predefinedInstanceFound);
const std::string& commonApiAddress = predefinedInstanceIterator->second;
const std::string& predefinedDBusInterfaceName = predefinedInstanceIterator->first.first;
const std::string& predefinedDBusObjectPath = predefinedInstanceIterator->first.second;
- ASSERT_EQ(loadedDBusInterfaceName, predefinedDBusInterfaceName);
- ASSERT_EQ(loadedDBusObjectPath, predefinedDBusObjectPath);
+ EXPECT_EQ(loadedDBusInterfaceName, predefinedDBusInterfaceName);
+ EXPECT_EQ(loadedDBusObjectPath, predefinedDBusObjectPath);
std::string foundDBusInterfaceName;
std::string foundDBusServiceName;
@@ -137,86 +357,86 @@ TEST_F(DBusServiceRegistryTest, DBusAddressTranslatorPredefinedWorks) {
foundDBusServiceName,
foundDBusObjectPath);
- ASSERT_EQ(foundDBusInterfaceName, predefinedDBusInterfaceName);
- ASSERT_EQ(foundDBusServiceName, dbusServiceName);
- ASSERT_EQ(foundDBusObjectPath, predefinedDBusObjectPath);
+ EXPECT_EQ(foundDBusInterfaceName, predefinedDBusInterfaceName);
+ EXPECT_EQ(foundDBusServiceName, dbusServiceName);
+ EXPECT_EQ(foundDBusObjectPath, predefinedDBusObjectPath);
}
}
TEST_F(DBusServiceRegistryTest, PredefinedInstances) {
- auto stubDBusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
-
- ASSERT_TRUE(stubDBusConnection->connect());
- ASSERT_TRUE(stubDBusConnection->requestServiceNameAndBlock(dbusServiceName));
-
- auto proxyDBusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
- auto dbusServiceRegistry = proxyDBusConnection->getDBusServiceRegistry();
- std::unordered_map<std::string, std::promise<CommonAPI::AvailabilityStatus> > instanceStatusPromises;
- std::unordered_map<std::string, CommonAPI::DBus::DBusServiceRegistry::Subscription> instanceSubscriptions;
-
- for (auto& predefinedInstance : predefinedInstancesMap) {
- const std::string& commonApiAddress = predefinedInstance.second;
-
- instanceSubscriptions[commonApiAddress] = dbusServiceRegistry->subscribeAvailabilityListener(
- commonApiAddress,
- [&] (const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
- instanceStatusPromises[commonApiAddress].set_value(availabilityStatus);
- return CommonAPI::SubscriptionStatus::RETAIN;
- });
- }
-
- ASSERT_TRUE(proxyDBusConnection->connect());
-
- for (auto& predefinedInstance : predefinedInstancesMap) {
- const std::string& dbusInterfaceName = predefinedInstance.first.first;
- const std::string& dbusObjectPath = predefinedInstance.first.second;
- const std::string& commonApiAddress = predefinedInstance.second;
-
- auto instanceStatusFuture = instanceStatusPromises[commonApiAddress].get_future();
- auto instanceStatusFutureStatus = instanceStatusFuture.wait_for(std::chrono::milliseconds(2000));
- const bool instanceReady = CommonAPI::DBus::checkReady(instanceStatusFutureStatus);
-
- ASSERT_TRUE(instanceReady);
-
- std::promise<CommonAPI::AvailabilityStatus> postInstanceStatusPromise;
- auto postInstanceSubscription = dbusServiceRegistry->subscribeAvailabilityListener(
- commonApiAddress,
- [&] (const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
- postInstanceStatusPromise.set_value(availabilityStatus);
- return CommonAPI::SubscriptionStatus::RETAIN;
- });
-
- auto postInstanceStatusFuture = postInstanceStatusPromise.get_future();
- auto postInstanceStatusFutureStatus = postInstanceStatusFuture.wait_for(std::chrono::milliseconds(2000));
- const bool postInstanceReady = CommonAPI::DBus::checkReady(postInstanceStatusFutureStatus);
-
- ASSERT_TRUE(postInstanceReady);
-
- dbusServiceRegistry->unsubscribeAvailabilityListener(commonApiAddress, postInstanceSubscription);
- dbusServiceRegistry->unsubscribeAvailabilityListener(commonApiAddress, instanceSubscriptions[commonApiAddress]);
-
-
- bool isInstanceAlive = dbusServiceRegistry->isServiceInstanceAlive(dbusInterfaceName, dbusServiceName, dbusObjectPath);
- for (int i = 0; !isInstanceAlive && i < 100; i++) {
- std::this_thread::sleep_for(std::chrono::milliseconds(10));
- isInstanceAlive = dbusServiceRegistry->isServiceInstanceAlive(dbusInterfaceName, dbusServiceName, dbusObjectPath);
- }
-
- ASSERT_TRUE(isInstanceAlive);
-
-
- std::vector<std::string> availableDBusServiceInstances = dbusServiceRegistry->getAvailableServiceInstances(dbusInterfaceName);
- bool availableInstanceFound = false;
-
- for (auto& availableInstance : availableDBusServiceInstances) {
- if (availableInstance == commonApiAddress) {
- availableInstanceFound = true;
- break;
- }
- }
-
- ASSERT_TRUE(availableInstanceFound);
- }
+// auto stubDBusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
+//
+// ASSERT_TRUE(stubDBusConnection->connect());
+// ASSERT_TRUE(stubDBusConnection->requestServiceNameAndBlock(dbusServiceName));
+//
+// auto proxyDBusConnection = CommonAPI::DBus::DBusConnection::getSessionBus();
+// auto dbusServiceRegistry = proxyDBusConnection->getDBusServiceRegistry();
+// std::unordered_map<std::string, std::promise<CommonAPI::AvailabilityStatus> > instanceStatusPromises;
+// std::unordered_map<std::string, CommonAPI::DBus::DBusServiceRegistry::Subscription> instanceSubscriptions;
+//
+// for (auto& predefinedInstance : predefinedInstancesMap) {
+// const std::string& commonApiAddress = predefinedInstance.second;
+//
+// instanceSubscriptions[commonApiAddress] = dbusServiceRegistry->subscribeAvailabilityListener(
+// commonApiAddress,
+// [&] (const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
+// instanceStatusPromises[commonApiAddress].set_value(availabilityStatus);
+// return CommonAPI::SubscriptionStatus::RETAIN;
+// });
+// }
+//
+// ASSERT_TRUE(proxyDBusConnection->connect());
+//
+// for (auto& predefinedInstance : predefinedInstancesMap) {
+// const std::string& dbusInterfaceName = predefinedInstance.first.first;
+// const std::string& dbusObjectPath = predefinedInstance.first.second;
+// const std::string& commonApiAddress = predefinedInstance.second;
+//
+// auto instanceStatusFuture = instanceStatusPromises[commonApiAddress].get_future();
+// auto instanceStatusFutureStatus = instanceStatusFuture.wait_for(std::chrono::milliseconds(2000));
+// const bool instanceReady = CommonAPI::DBus::checkReady(instanceStatusFutureStatus);
+//
+// ASSERT_TRUE(instanceReady);
+//
+// std::promise<CommonAPI::AvailabilityStatus> postInstanceStatusPromise;
+// auto postInstanceSubscription = dbusServiceRegistry->subscribeAvailabilityListener(
+// commonApiAddress,
+// [&] (const CommonAPI::AvailabilityStatus& availabilityStatus) -> CommonAPI::SubscriptionStatus {
+// postInstanceStatusPromise.set_value(availabilityStatus);
+// return CommonAPI::SubscriptionStatus::RETAIN;
+// });
+//
+// auto postInstanceStatusFuture = postInstanceStatusPromise.get_future();
+// auto postInstanceStatusFutureStatus = postInstanceStatusFuture.wait_for(std::chrono::milliseconds(2000));
+// const bool postInstanceReady = CommonAPI::DBus::checkReady(postInstanceStatusFutureStatus);
+//
+// ASSERT_TRUE(postInstanceReady);
+//
+// dbusServiceRegistry->unsubscribeAvailabilityListener(commonApiAddress, postInstanceSubscription);
+// dbusServiceRegistry->unsubscribeAvailabilityListener(commonApiAddress, instanceSubscriptions[commonApiAddress]);
+//
+//
+// bool isInstanceAlive = dbusServiceRegistry->isServiceInstanceAlive(dbusInterfaceName, dbusServiceName, dbusObjectPath);
+// for (int i = 0; !isInstanceAlive && i < 100; i++) {
+// std::this_thread::sleep_for(std::chrono::milliseconds(10));
+// isInstanceAlive = dbusServiceRegistry->isServiceInstanceAlive(dbusInterfaceName, dbusServiceName, dbusObjectPath);
+// }
+//
+// ASSERT_TRUE(isInstanceAlive);
+//
+//
+// std::vector<std::string> availableDBusServiceInstances = dbusServiceRegistry->getAvailableServiceInstances(dbusInterfaceName);
+// bool availableInstanceFound = false;
+//
+// for (auto& availableInstance : availableDBusServiceInstances) {
+// if (availableInstance == commonApiAddress) {
+// availableInstanceFound = true;
+// break;
+// }
+// }
+//
+// ASSERT_TRUE(availableInstanceFound);
+// }
}
@@ -225,6 +445,9 @@ const char serviceName_[] = "test.service.name";
const char nonexistingServiceAddress_[] = "local:nonexisting.service.name:nonexisting.instance.name";
const char nonexistingServiceName_[] = "nonexisting.service.name";
+
+
+
class DBusServiceDiscoveryTestWithPredefinedRemote: public ::testing::Test {
protected:
virtual void SetUp() {
@@ -249,15 +472,14 @@ class DBusServiceDiscoveryTestWithPredefinedRemote: public ::testing::Test {
std::shared_ptr<CommonAPI::ServicePublisher> servicePublisher_;
};
-
TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, RecognizesInstanceOfExistingServiceAsAlive) {
bool result = clientFactory_->isServiceInstanceAlive(serviceAddress_);
- ASSERT_TRUE(result);
+ EXPECT_TRUE(result);
}
TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, RecognizesInstanceOfNonexistingServiceAsDead) {
bool result = clientFactory_->isServiceInstanceAlive(nonexistingServiceAddress_);
- ASSERT_FALSE(result);
+ EXPECT_FALSE(result);
}
@@ -274,7 +496,7 @@ TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, RecognizesInstanceOfExistin
},
serviceAddress_);
- ASSERT_TRUE(futureResult.get());
+ EXPECT_TRUE(futureResult.get());
}
@@ -291,12 +513,12 @@ TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, RecognizesInstanceOfNonexis
},
nonexistingServiceAddress_);
- ASSERT_FALSE(futureResult.get());
+ EXPECT_FALSE(futureResult.get());
}
TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, FindsInstancesOfExistingTestService) {
- ASSERT_EQ(1, clientFactory_->getAvailableServiceInstances(serviceName_).size());
+ EXPECT_EQ(1, clientFactory_->getAvailableServiceInstances(serviceName_).size());
}
@@ -316,13 +538,13 @@ TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, FindsInstancesOfExistingTes
std::vector<std::string> result = futureResult.get();
- ASSERT_EQ(1, result.size());
+ EXPECT_EQ(1, result.size());
}
TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, FindsNoInstancesOfNonexistingTestService) {
std::vector<std::string> result = clientFactory_->getAvailableServiceInstances(nonexistingServiceName_);
- ASSERT_EQ(0, result.size());
+ EXPECT_EQ(0, result.size());
}
@@ -339,9 +561,50 @@ TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, FindsNoInstancesOfNonexisti
},
nonexistingServiceName_);
- ASSERT_EQ(0, futureResult.get().size());
+ EXPECT_EQ(0, futureResult.get().size());
}
+TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, ServiceRegistryUsesCacheForResolvingOneService) {
+ std::chrono::system_clock::time_point startTimeWithColdCache = std::chrono::system_clock::now();
+ ASSERT_TRUE(clientFactory_->isServiceInstanceAlive(serviceAddress_));
+ std::chrono::system_clock::time_point endTimeWithColdCache = std::chrono::system_clock::now();
+
+ long durationWithColdCache = std::chrono::duration_cast<std::chrono::microseconds>(endTimeWithColdCache - startTimeWithColdCache).count();
+
+ std::chrono::system_clock::time_point startTimeWithHotCache = std::chrono::system_clock::now();
+ ASSERT_TRUE(clientFactory_->isServiceInstanceAlive(serviceAddress_));
+ std::chrono::system_clock::time_point endTimeWithHotCache = std::chrono::system_clock::now();
+
+ long durationWithHotCache = std::chrono::duration_cast<std::chrono::microseconds>(endTimeWithHotCache - startTimeWithHotCache).count();
+
+ double speedRatio = durationWithColdCache / durationWithHotCache;
+
+ EXPECT_GE(speedRatio, 100);
+}
+
+
+TEST_F(DBusServiceDiscoveryTestWithPredefinedRemote, DISABLED_ServiceRegistryUsesCacheForResolvingWholeBus) {
+ std::chrono::system_clock::time_point startTimeWithColdCache = std::chrono::system_clock::now();
+ ASSERT_EQ(1, clientFactory_->getAvailableServiceInstances(serviceName_).size());
+ std::chrono::system_clock::time_point endTimeWithColdCache = std::chrono::system_clock::now();
+
+ long durationWithColdCache = std::chrono::duration_cast<std::chrono::microseconds>(endTimeWithColdCache - startTimeWithColdCache).count();
+
+ std::chrono::system_clock::time_point startTimeWithHotCache = std::chrono::system_clock::now();
+ ASSERT_EQ(1, clientFactory_->getAvailableServiceInstances(serviceName_).size());
+ std::chrono::system_clock::time_point endTimeWithHotCache = std::chrono::system_clock::now();
+
+ long durationWithHotCache = std::chrono::duration_cast<std::chrono::microseconds>(endTimeWithHotCache - startTimeWithHotCache).count();
+
+ double speedRatio = durationWithColdCache / durationWithHotCache;
+
+ std::cout << "cold " << durationWithColdCache << "\n";
+ std::cout << "hot " << durationWithHotCache << "\n";
+
+ EXPECT_GE(speedRatio, 100);
+}
+
+
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);