diff options
author | Aleksandar Donchev <Aleksander.Donchev@partner.bmw.de> | 2017-05-19 11:55:01 +0200 |
---|---|---|
committer | Jacqueline Molz <Jacqueline.Molz@bmw.de> | 2017-07-10 12:35:05 +0200 |
commit | be63615585049aa4045f13e91291d64b0a9ed5a3 (patch) | |
tree | 9baabfbf751e85d0980f74e55e8332f6e20c379f /AudioManagerUtilities/test/AmSocketHandlerTest | |
parent | 375dc7b81795da9bfd8372f629d7fcef704a6d58 (diff) | |
download | audiomanager-be63615585049aa4045f13e91291d64b0a9ed5a3.tar.gz |
The primary signals SIGINT and SIGQUIT are handled on top level in
contrast to secondary signals SIGHUP, SIGTERM, SIGCHLD, which are
handled in the SocketHandler.
Signed-off-by: Christian Linke <christian.linke@bmw.de>
Change-Id: I8c5d3c436ac9fcd61c76a26145c731b427cab1e6
Diffstat (limited to 'AudioManagerUtilities/test/AmSocketHandlerTest')
3 files changed, 78 insertions, 41 deletions
diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp index af21f90..ecd38fe 100644 --- a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp @@ -48,6 +48,22 @@ static const char * TEST_SOCKET_DATA_FINAL = "finish!"; static const std::chrono::time_point<std::chrono::high_resolution_clock> TP_ZERO; + +MockIAmSignalHandler *pMockSignalHandler = NULL; +static void signalHandler(int sig, siginfo_t *siginfo, void *context) +{ + (void) sig; + (void) siginfo; + (void) context; + + if(pMockSignalHandler!=NULL) + pMockSignalHandler->signalHandler(sig, siginfo, context); + +#ifdef ENABLED_SOCKETHANDLER_TEST_OUTPUT + std::cout<<"signal handler was called with signal " << sig << std::endl; +#endif +} + CAmSocketHandlerTest::CAmSocketHandlerTest() { } @@ -227,7 +243,7 @@ TEST(CAmSocketHandlerTest, timersOneshot) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 1); #else - ASSERT_EQ(handle, 3); + ASSERT_EQ(handle, 2); #endif EXPECT_CALL(testCallback1,timerCallback(handle,&userData)).Times(1); @@ -240,7 +256,7 @@ TEST(CAmSocketHandlerTest, timersOneshot) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 2); #else - ASSERT_EQ(handle, 4); + ASSERT_EQ(handle, 3); #endif EXPECT_CALL(testCallback4,timerCallback(handle,NULL)).Times(1); myHandler.start_listenting(); @@ -269,7 +285,7 @@ TEST(CAmSocketHandlerTest, timersStop) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 1); #else - ASSERT_EQ(handle, 3); + ASSERT_EQ(handle, 2); #endif EXPECT_CALL(testCallback1,timerCallback(handle,&userData)).Times(4); @@ -282,7 +298,7 @@ TEST(CAmSocketHandlerTest, timersStop) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 2); #else - ASSERT_EQ(handle, 4); + ASSERT_EQ(handle, 3); #endif EXPECT_CALL(testCallback4,timerCallback(handle,NULL)).Times(1); myHandler.start_listenting(); @@ -312,7 +328,7 @@ TEST(CAmSocketHandlerTest, timersGeneral) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 1); #else - ASSERT_EQ(handle, 3); + ASSERT_EQ(handle, 2); #endif EXPECT_CALL(testCallback1,timerCallback(handle,&userData)).Times(4); //+1 because of measurment @@ -325,7 +341,7 @@ TEST(CAmSocketHandlerTest, timersGeneral) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 2); #else - ASSERT_EQ(handle, 4); + ASSERT_EQ(handle, 3); #endif EXPECT_CALL(testCallback4,timerCallback(handle,NULL)).Times(1); myHandler.start_listenting(); @@ -356,7 +372,7 @@ TEST(CAmSocketHandlerTest,playWithTimers) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 1); #else - ASSERT_EQ(handle, 3); + ASSERT_EQ(handle, 2); #endif EXPECT_CALL(testCallback1,timerCallback(handle,NULL)).Times(AnyNumber()); @@ -364,7 +380,7 @@ TEST(CAmSocketHandlerTest,playWithTimers) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 2); #else - ASSERT_EQ(handle, 4); + ASSERT_EQ(handle, 3); #endif EXPECT_CALL(testCallback2,timerCallback(handle,NULL)).Times(AnyNumber()); @@ -372,7 +388,7 @@ TEST(CAmSocketHandlerTest,playWithTimers) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 3); #else - ASSERT_EQ(handle, 5); + ASSERT_EQ(handle, 4); #endif EXPECT_CALL(testCallback3,timerCallback(handle,NULL)).Times(2); //+1 because of measurment @@ -380,64 +396,82 @@ TEST(CAmSocketHandlerTest,playWithTimers) #ifndef WITH_TIMERFD ASSERT_EQ(handle, 4); #else - ASSERT_EQ(handle, 6); + ASSERT_EQ(handle, 5); #endif EXPECT_CALL(testCallback4,timerCallback(handle,NULL)).Times(1); myHandler.start_listenting(); } -TEST(CAmSocketHandlerTest, signalHandler) + + +TEST(CAmSocketHandlerTest, signalHandlerPrimaryPlusSecondary) { + pMockSignalHandler = new MockIAmSignalHandler; CAmSocketHandler myHandler; ASSERT_FALSE(myHandler.fatalErrorOccurred()); + ASSERT_TRUE(myHandler.listenToSignals({SIGHUP})==E_OK); + ASSERT_TRUE(myHandler.listenToSignals({SIGHUP, SIGTERM, SIGCHLD})==E_OK); sh_pollHandle_t signalHandler1, signalHandler2; - MockIAmSignalHandler mock; + std::string userData = "User data"; - myHandler.addSignalHandler([&](const sh_pollHandle_t handle, const signalfd_siginfo & info, void* userData) - { - unsigned sig = info.ssi_signo; - mock.signalHandlerAction(handle, sig, userData); + +// critical signals are registered here: + struct sigaction signalAction; + memset(&signalAction, '\0', sizeof(signalAction)); + signalAction.sa_sigaction = &signalHandler; + signalAction.sa_flags = SA_RESETHAND | SA_NODEFER| SA_SIGINFO; + sigaction(SIGINT, &signalAction, NULL); + sigaction(SIGQUIT, &signalAction, NULL); + + myHandler.addSignalHandler([&](const sh_pollHandle_t handle, const signalfd_siginfo & info, void* userData) + { + unsigned sig = info.ssi_signo; + pMockSignalHandler->signalHandlerAction(handle, sig, userData); #ifdef ENABLED_SOCKETHANDLER_TEST_OUTPUT - unsigned user = info.ssi_uid; - std::cout<<"signal handler was called from user "<< user << " with signal " << sig << std::endl; + unsigned user = info.ssi_uid; + std::cout<<"signal handler was called from user "<< user << " with signal " << sig << std::endl; #endif - }, signalHandler1, &userData); - ASSERT_EQ(signalHandler1, 1); - myHandler.addSignalHandler([&](const sh_pollHandle_t handle, const signalfd_siginfo & info, void* userData) - { - unsigned sig = info.ssi_signo; - mock.signalHandlerAction(handle, sig, userData); - #ifdef ENABLED_SOCKETHANDLER_TEST_OUTPUT - unsigned user = info.ssi_uid; - std::cout<<"signal handler was called from user "<< user << " with signal " << sig << std::endl; - #endif - }, signalHandler2, &userData); - ASSERT_EQ(signalHandler2, 2); + }, signalHandler1, &userData); + ASSERT_EQ(signalHandler1, 1); + myHandler.addSignalHandler([&](const sh_pollHandle_t handle, const signalfd_siginfo & info, void* userData) + { + unsigned sig = info.ssi_signo; + pMockSignalHandler->signalHandlerAction(handle, sig, userData); +#ifdef ENABLED_SOCKETHANDLER_TEST_OUTPUT + unsigned user = info.ssi_uid; + std::cout<<"signal handler was called from user "<< user << " with signal " << sig << std::endl; +#endif + }, signalHandler2, &userData); + ASSERT_EQ(signalHandler2, 2); timespec timeout4; timeout4.tv_nsec = 200000000; timeout4.tv_sec = 0; - std::set<unsigned> signals; - signals.insert(SIGHUP); - signals.insert(SIGINT); - signals.insert(SIGTERM); - signals.insert(SIGQUIT); + std::set<unsigned> secondarySignals; + secondarySignals.insert({SIGHUP,SIGTERM, SIGCHLD}); + std::set<unsigned> primarySignals({SIGQUIT,SIGINT}); + std::set<unsigned> signals(primarySignals); + signals.insert(secondarySignals.begin(), secondarySignals.end()); CAmTimerSignalHandler testCallback4(&myHandler, timeout4, signals); sh_timerHandle_t handle; myHandler.addTimer(timeout4, &testCallback4.pTimerCallback, handle, NULL, true); #ifndef WITH_TIMERFD - ASSERT_EQ(handle, 1); + ASSERT_EQ(handle, 1); #else - ASSERT_EQ(handle, 3); + ASSERT_EQ(handle, 3); #endif EXPECT_CALL(testCallback4,timerCallback(handle,NULL)).Times(signals.size()+1); - for(auto it: signals) - EXPECT_CALL(mock,signalHandlerAction(signalHandler1,it,&userData)).Times(1); - for(auto it: signals) - EXPECT_CALL(mock,signalHandlerAction(signalHandler2,it,&userData)).Times(1); + for(auto it: secondarySignals) + EXPECT_CALL(*pMockSignalHandler,signalHandlerAction(signalHandler1,it,&userData)).Times(1); + for(auto it: secondarySignals) + EXPECT_CALL(*pMockSignalHandler,signalHandlerAction(signalHandler2,it,&userData)).Times(1); + for(auto it: primarySignals) + EXPECT_CALL(*pMockSignalHandler,signalHandler(it,_,_)).Times(1); + myHandler.start_listenting(); + delete pMockSignalHandler; } TEST(CAmSocketHandlerTest,playWithUNIXSockets) diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h index d38f8c1..ba2bf51 100644 --- a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h @@ -54,6 +54,7 @@ namespace am { } virtual void signalHandlerAction(const sh_pollHandle_t handle, const unsigned sig, void* userData)=0; + virtual void signalHandler(int sig, siginfo_t *siginfo, void *context)=0; }; class IAmSocketHandlerCb @@ -78,6 +79,7 @@ namespace am { public: MOCK_METHOD3(signalHandlerAction, void (const sh_pollHandle_t handle, const unsigned sig, void* userData)); + MOCK_METHOD3(signalHandler, void(int sig, siginfo_t *siginfo, void *context)); }; class MockSocketHandlerCb: public IAmSocketHandlerCb diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt index 8f0c9e6..5e5b9e1 100644 --- a/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt @@ -33,6 +33,7 @@ ADD_EXECUTABLE(AmSocketHandlerTest ${Socket_SRCS_CXX}) TARGET_LINK_LIBRARIES(AmSocketHandlerTest ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} AudioManagerUtilities ) |