diff options
author | Andriy Byzhynar <abyzhynar@luxoft.com> | 2018-07-30 13:47:23 +0300 |
---|---|---|
committer | Alexander <akutsan@luxoft.com> | 2018-08-21 12:30:03 +0300 |
commit | 1b490070d28e94a008bfa69eeba2f4c60398a296 (patch) | |
tree | 26ba922453a677de892370c4126e57cde62582a0 | |
parent | 6829d454e3c8fa8b42a9c8a7dc824d38f4ad3dd6 (diff) | |
download | sdl_core-1b490070d28e94a008bfa69eeba2f4c60398a296.tar.gz |
Add new unit tests for Low Voltage Signals Handler
-rw-r--r-- | src/appMain/test/CMakeLists.txt | 46 | ||||
-rw-r--r-- | src/appMain/test/low_voltage_signals_handler_test.cc | 138 | ||||
-rw-r--r-- | src/components/utils/test/include/utils/mock_signals_posix.h | 59 | ||||
-rw-r--r-- | src/components/utils/test/mock_signals_posix.cc | 76 |
4 files changed, 319 insertions, 0 deletions
diff --git a/src/appMain/test/CMakeLists.txt b/src/appMain/test/CMakeLists.txt new file mode 100644 index 0000000000..057e1e9869 --- /dev/null +++ b/src/appMain/test/CMakeLists.txt @@ -0,0 +1,46 @@ +# Copyright (c) 2018, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +include_directories ( + ${GMOCK_INCLUDE_DIRECTORY} + ${COMPONENTS_DIR}/utils/test/include +) + +set(testSources + $<TARGET_OBJECTS:LowVoltageHandlerObjLibrary> + ${CMAKE_SOURCE_DIR}/src/appMain/test/low_voltage_signals_handler_test.cc + ${COMPONENTS_DIR}/utils/test/mock_signals_posix.cc +) + +set(LIBRARIES + gmock +) + +create_test(low_voltage_signals_handler_test "${testSources}" "${LIBRARIES}") diff --git a/src/appMain/test/low_voltage_signals_handler_test.cc b/src/appMain/test/low_voltage_signals_handler_test.cc new file mode 100644 index 0000000000..14210df71d --- /dev/null +++ b/src/appMain/test/low_voltage_signals_handler_test.cc @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2018, Ford Motor Company +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the Ford Motor Company nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "appMain/low_voltage_signals_handler.h" + +#include <memory> +#include "gtest/gtest.h" +#include "appMain/test/mock_life_cycle.h" +#include "utils/mock_signals_posix.h" +#include "config_profile/profile.h" +#include "utils/macro.h" + +namespace test { + +using ::testing::_; +using ::testing::Return; +using ::testing::InSequence; + +class LowVoltageSignalsHandlerTest : public ::testing::Test { + protected: + LowVoltageSignalsHandlerTest() + : mock_life_cycle_(std::make_shared<main_namespace::MockLifeCycle>()) + , mock_signals_posix_(*utils::MockSignalsPosix::signals_posix_mock()) {} + + void SetUp() OVERRIDE { + profile_.set_config_file_name("smartDeviceLink.ini"); + signals_offset_ = {profile_.low_voltage_signal_offset(), + profile_.wake_up_signal_offset(), + profile_.ignition_off_signal_offset()}; + + low_voltage_signals_handler_ = + std::unique_ptr<main_namespace::LowVoltageSignalsHandler>( + new main_namespace::LowVoltageSignalsHandler( + *mock_life_cycle_.get(), signals_offset_)); + } + + profile::Profile profile_; + main_namespace::LowVoltageSignalsOffset signals_offset_; + std::unique_ptr<main_namespace::LowVoltageSignalsHandler> + low_voltage_signals_handler_; + std::shared_ptr<main_namespace::MockLifeCycle> mock_life_cycle_; + utils::MockSignalsPosix& mock_signals_posix_; +}; + +TEST_F( + LowVoltageSignalsHandlerTest, + LowVoltageSignalReceived_CheckParentProcessBehavior_ExpectChildCreationAndtLowVoltageCall) { + // To guarantee strict call orders + InSequence guarantees_calls_sequence; + // Set expectation after LOW VOLTAGE signal + EXPECT_CALL(*mock_life_cycle_, LowVoltage()); + // Expect child process creation + const pid_t cpid = 111; + EXPECT_CALL(mock_signals_posix_, Fork()).WillOnce(Return(cpid)); + // Expect parent process sleep + EXPECT_CALL(mock_signals_posix_, WaitPid(_, nullptr, 0)); + // Expect parent process wakes up + EXPECT_CALL(*mock_life_cycle_, WakeUp()); + const int low_voltage_signo = + low_voltage_signals_handler_->low_voltage_signo(); + // Emulate LOW VOLTAGE signal receipt and handling + low_voltage_signals_handler_->HandleSignal(low_voltage_signo); +} + +TEST_F( + LowVoltageSignalsHandlerTest, + LowVoltageSignalReceived_CheckChildProcessBehavior_ExpectChildSendsStopToParentProcess) { + // To guarantee strict call orders + InSequence guarantees_calls_sequence; + // Set expectation after LOW VOLTAGE signal + EXPECT_CALL(*mock_life_cycle_, LowVoltage()); + // Expect child process creation + const pid_t cpid = 0; + EXPECT_CALL(mock_signals_posix_, Fork()).WillOnce(Return(cpid)); + // Expect SIGCONT signal to be sent to parent process + EXPECT_CALL(mock_signals_posix_, SendSignal(SIGSTOP, _)); + const int low_voltage_signo = + low_voltage_signals_handler_->low_voltage_signo(); + // Emulate LOW VOLTAGE signal receipt and handling + low_voltage_signals_handler_->HandleSignal(low_voltage_signo); +} + +TEST_F(LowVoltageSignalsHandlerTest, + WakeUpSignalReceived_ExpectParentProcessWakeUpAndChildProcessExit) { + // To guarantee strict call orders + InSequence guarantees_calls_sequence; + // Expect SIGCONT signal to be sent to parent process + EXPECT_CALL(mock_signals_posix_, SendSignal(SIGCONT, _)); + // Expect child process exit + EXPECT_CALL(mock_signals_posix_, ExitProcess(0)); + const int wake_up_signo = low_voltage_signals_handler_->wake_up_signo(); + // Emulate WAKE UP signal receipt and handling + low_voltage_signals_handler_->HandleSignal(wake_up_signo); +} + +TEST_F(LowVoltageSignalsHandlerTest, + IgnitionOffSignalReceived_ExpectAllProcessesStopped) { + // To guarantee strict call orders + InSequence guarantees_calls_sequence; + // Expect SIGKILL signal to be sent to parent process + EXPECT_CALL(mock_signals_posix_, SendSignal(SIGKILL, _)); + // Expect child process exit + EXPECT_CALL(mock_signals_posix_, ExitProcess(0)); + const int ign_off_signo = low_voltage_signals_handler_->ignition_off_signo(); + // Emulate IGN OFF signal receipt and handling + low_voltage_signals_handler_->HandleSignal(ign_off_signo); +} + +} // namespace test diff --git a/src/components/utils/test/include/utils/mock_signals_posix.h b/src/components/utils/test/include/utils/mock_signals_posix.h new file mode 100644 index 0000000000..1aad2d5873 --- /dev/null +++ b/src/components/utils/test/include/utils/mock_signals_posix.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_UTILS_TEST_INCLUDE_UTILS_MOCK_SIGNALS_POSIX_H_ +#define SRC_COMPONENTS_UTILS_TEST_INCLUDE_UTILS_MOCK_SIGNALS_POSIX_H_ + +#include "gmock/gmock.h" +#include "utils/signals.h" +#include <signal.h> +#include "appMain/low_voltage_signals_handler.h" + +namespace utils { + +class MockSignalsPosix { + public: + MOCK_METHOD0(UnsubscribeFromTermination, bool()); + MOCK_METHOD1(WaitTerminationSignals, bool(sighandler_t sig_handler)); + MOCK_METHOD1( + UnsubscribeFromLowVoltageSignals, + bool(const main_namespace::LowVoltageSignalsOffset& offset_data)); + MOCK_METHOD2(SendSignal, void(const int signo, const pid_t pid)); + MOCK_METHOD0(Fork, pid_t()); + MOCK_METHOD1(ExitProcess, void(const int status)); + MOCK_METHOD3(WaitPid, void(pid_t cpid, int* status, int options)); + + static MockSignalsPosix* signals_posix_mock(); +}; + +} // namespace utils +#endif // SRC_COMPONENTS_UTILS_TEST_INCLUDE_UTILS_MOCK_SIGNALS_POSIX_H_ diff --git a/src/components/utils/test/mock_signals_posix.cc b/src/components/utils/test/mock_signals_posix.cc new file mode 100644 index 0000000000..47531b4a9f --- /dev/null +++ b/src/components/utils/test/mock_signals_posix.cc @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "utils/mock_signals_posix.h" +#include "utils/signals.h" + +namespace utils { + +bool Signals::UnsubscribeFromTermination() { + return MockSignalsPosix::signals_posix_mock()->UnsubscribeFromTermination(); +} + +bool Signals::WaitTerminationSignals(sighandler_t sig_handler) { + return MockSignalsPosix::signals_posix_mock()->WaitTerminationSignals( + sig_handler); +} + +bool Signals::UnsubscribeFromLowVoltageSignals( + const main_namespace::LowVoltageSignalsOffset& offset_data) { + return MockSignalsPosix::signals_posix_mock() + ->UnsubscribeFromLowVoltageSignals(offset_data); +} + +void Signals::SendSignal(const int signo, const pid_t pid) { + MockSignalsPosix::signals_posix_mock()->SendSignal(signo, pid); +} + +void Signals::ExitProcess(const int status) { + MockSignalsPosix::signals_posix_mock()->ExitProcess(status); +} + +void Signals::WaitPid(pid_t cpid, int* status, int options) { + MockSignalsPosix::signals_posix_mock()->WaitPid(cpid, status, options); +} + +pid_t Signals::Fork() { + return MockSignalsPosix::signals_posix_mock()->Fork(); +} + +MockSignalsPosix* MockSignalsPosix::signals_posix_mock() { + static ::testing::NiceMock<MockSignalsPosix> signals_posix_mock; + return &signals_posix_mock; +} + +} // namespace utils |