diff --git a/iceoryx_binding_c/test/moduletests/test_listener.cpp b/iceoryx_binding_c/test/moduletests/test_listener.cpp index f7d0dc25143..be1f0b9ac60 100644 --- a/iceoryx_binding_c/test/moduletests/test_listener.cpp +++ b/iceoryx_binding_c/test/moduletests/test_listener.cpp @@ -22,6 +22,7 @@ #include "iceoryx_posh/mepoo/mepoo_config.hpp" #include "iceoryx_posh/popo/listener.hpp" #include "iceoryx_posh/popo/user_trigger.hpp" +#include "iceoryx_posh/testing/mocks/posh_runtime_mock.hpp" using namespace iox; using namespace iox::popo; @@ -46,6 +47,7 @@ using namespace iox::mepoo; iox_user_trigger_t g_userTriggerCallbackArgument = nullptr; iox_sub_t g_subscriberCallbackArgument = nullptr; +iox_service_discovery_t g_serviceDiscoveryCallbackArgument = nullptr; void* g_contextData = nullptr; void userTriggerCallback(iox_user_trigger_t userTrigger) @@ -70,6 +72,17 @@ void subscriberCallbackWithContextData(iox_sub_t subscriber, void* const context g_contextData = contextData; } +void serviceDiscoveryCallback(iox_service_discovery_t serviceDiscovery) +{ + g_serviceDiscoveryCallbackArgument = serviceDiscovery; +} + +void serviceDiscoveryCallbackWithContextData(iox_service_discovery_t serviceDiscovery, void* const contextData) +{ + g_serviceDiscoveryCallbackArgument = serviceDiscovery; + g_contextData = contextData; +} + class iox_listener_test : public Test { public: @@ -146,6 +159,7 @@ class iox_listener_test : public Test ConditionVariableData m_condVar{"hypnotoadKnueppeltRetour"}; TestListener m_sut{m_condVar}; + std::unique_ptr runtimeMock = PoshRuntimeMock::create("long_live_lord_buckethead"); iox_user_trigger_storage_t m_userTriggerStorage[MAX_NUMBER_OF_EVENTS_PER_LISTENER + 1U]; cxx::vector m_userTrigger; @@ -362,4 +376,79 @@ TIMING_TEST_F(iox_listener_test, SubscriberCallbackWithContextDataIsCalledSample EXPECT_THAT(g_contextData, Eq(static_cast(&someContextData))); }); +TEST_F(iox_listener_test, AttachingServiceDiscoveryWorks) +{ + iox_service_discovery_storage_t serviceDiscoveryStorage; + EXPECT_CALL(*runtimeMock, getMiddlewareSubscriber(_, _, _)).WillOnce(Return(&m_subscriberPortData[0])); + + iox_service_discovery_t serviceDiscovery = iox_service_discovery_init(&serviceDiscoveryStorage); + + EXPECT_THAT(iox_listener_size(&m_sut), Eq(0)); + iox_listener_attach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED, &serviceDiscoveryCallback); + EXPECT_THAT(iox_listener_size(&m_sut), Eq(1)); + + iox_listener_detach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED); + EXPECT_THAT(iox_listener_size(&m_sut), Eq(0)); +} + +TEST_F(iox_listener_test, AttachingServiceDiscoveryWithContextDataWorks) +{ + iox_service_discovery_storage_t serviceDiscoveryStorage; + EXPECT_CALL(*runtimeMock, getMiddlewareSubscriber(_, _, _)).WillOnce(Return(&m_subscriberPortData[0])); + + iox_service_discovery_t serviceDiscovery = iox_service_discovery_init(&serviceDiscoveryStorage); + + EXPECT_THAT(iox_listener_size(&m_sut), Eq(0)); + iox_listener_attach_service_discovery_event_with_context_data(&m_sut, + serviceDiscovery, + ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED, + &serviceDiscoveryCallbackWithContextData, + &serviceDiscoveryStorage); + EXPECT_THAT(iox_listener_size(&m_sut), Eq(1)); + + iox_listener_detach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED); + EXPECT_THAT(iox_listener_size(&m_sut), Eq(0)); +} + +TIMING_TEST_F(iox_listener_test, NotifyingServiceDiscoveryEventWorks, Repeat(5), [&] { + iox_service_discovery_storage_t serviceDiscoveryStorage; + EXPECT_CALL(*runtimeMock, getMiddlewareSubscriber(_, _, _)).WillOnce(Return(&m_subscriberPortData[0])); + + iox_service_discovery_t serviceDiscovery = iox_service_discovery_init(&serviceDiscoveryStorage); + + iox_listener_attach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED, &serviceDiscoveryCallback); + + // notify + std::this_thread::sleep_for(TIMEOUT); + TIMING_TEST_EXPECT_TRUE(g_serviceDiscoveryCallbackArgument == serviceDiscovery); + + iox_listener_detach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED); +}); + +TIMING_TEST_F(iox_listener_test, NotifyingServiceDiscoveryEventWithContextDataWorks, Repeat(5), [&] { + iox_service_discovery_storage_t serviceDiscoveryStorage; + EXPECT_CALL(*runtimeMock, getMiddlewareSubscriber(_, _, _)).WillOnce(Return(&m_subscriberPortData[0])); + + iox_service_discovery_t serviceDiscovery = iox_service_discovery_init(&serviceDiscoveryStorage); + + iox_listener_attach_service_discovery_event_with_context_data(&m_sut, + serviceDiscovery, + ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED, + &serviceDiscoveryCallbackWithContextData, + &serviceDiscoveryStorage); + + // notify + std::this_thread::sleep_for(TIMEOUT); + TIMING_TEST_EXPECT_TRUE(g_serviceDiscoveryCallbackArgument == serviceDiscovery); + TIMING_TEST_EXPECT_TRUE(g_contextData == static_cast(&serviceDiscoveryStorage)); + + iox_listener_detach_service_discovery_event( + &m_sut, serviceDiscovery, ServiceDiscoveryEvent_SERVICE_REGISTRY_CHANGED); +}); + } // namespace diff --git a/iceoryx_posh/test/integrationtests/test_service_discovery.cpp b/iceoryx_posh/test/integrationtests/test_service_discovery.cpp index 63294dbe715..299d1cb450c 100644 --- a/iceoryx_posh/test/integrationtests/test_service_discovery.cpp +++ b/iceoryx_posh/test/integrationtests/test_service_discovery.cpp @@ -24,8 +24,8 @@ #include "iceoryx_posh/popo/wait_set.hpp" #include "iceoryx_posh/runtime/posh_runtime.hpp" #include "iceoryx_posh/runtime/service_discovery.hpp" +#include "iceoryx_posh/testing/mocks/posh_runtime_mock.hpp" #include "iceoryx_posh/testing/roudi_gtest.hpp" -#include "mocks/posh_runtime_mock.hpp" #include "test.hpp" #include diff --git a/iceoryx_posh/test/moduletests/test_posh_runtime.cpp b/iceoryx_posh/test/moduletests/test_posh_runtime.cpp index c200e20c399..c46cfd2f463 100644 --- a/iceoryx_posh/test/moduletests/test_posh_runtime.cpp +++ b/iceoryx_posh/test/moduletests/test_posh_runtime.cpp @@ -22,8 +22,8 @@ #include "iceoryx_posh/popo/publisher.hpp" #include "iceoryx_posh/popo/subscriber.hpp" #include "iceoryx_posh/runtime/posh_runtime.hpp" +#include "iceoryx_posh/testing/mocks/posh_runtime_mock.hpp" #include "iceoryx_posh/testing/roudi_environment/roudi_environment.hpp" -#include "mocks/posh_runtime_mock.hpp" #include "test.hpp" #include diff --git a/iceoryx_posh/test/mocks/posh_runtime_mock.hpp b/iceoryx_posh/testing/include/iceoryx_posh/testing/mocks/posh_runtime_mock.hpp similarity index 100% rename from iceoryx_posh/test/mocks/posh_runtime_mock.hpp rename to iceoryx_posh/testing/include/iceoryx_posh/testing/mocks/posh_runtime_mock.hpp