summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt103
-rwxr-xr-xtest/big_payload_tests/big_payload_test_external_starter.sh6
-rw-r--r--test/big_payload_tests/big_payload_test_service.cpp7
-rw-r--r--test/big_payload_tests/big_payload_test_service.hpp1
-rw-r--r--test/client_id_tests/client_id_test_globals.hpp15
-rwxr-xr-xtest/client_id_tests/client_id_test_master_starter.sh3
-rw-r--r--test/client_id_tests/client_id_test_service.cpp42
-rw-r--r--test/cpu_load_tests/cpu_load_test_client.cpp2
-rwxr-xr-xtest/cpu_load_tests/cpu_load_test_master_starter.sh3
-rw-r--r--test/cpu_load_tests/cpu_load_test_service.cpp2
-rw-r--r--test/debounce_tests/debounce_test_client.json52
-rw-r--r--test/debounce_tests/debounce_test_service.json19
-rwxr-xr-xtest/e2e_tests/e2e_profile_04_test_external_master_start.sh10
-rwxr-xr-xtest/e2e_tests/e2e_profile_04_test_external_slave_start.sh5
-rwxr-xr-xtest/e2e_tests/e2e_test_external_master_start.sh10
-rwxr-xr-xtest/e2e_tests/e2e_test_external_slave_start.sh5
-rwxr-xr-xtest/event_tests/event_test_master_starter.sh10
-rw-r--r--test/initial_event_tests/initial_event_test_client.cpp161
-rwxr-xr-xtest/initial_event_tests/initial_event_test_master_starter.sh11
-rw-r--r--test/initial_event_tests/initial_event_test_service.cpp5
-rwxr-xr-xtest/initial_event_tests/initial_event_test_slave_starter.sh4
-rw-r--r--test/initial_event_tests/initial_event_test_stop_service.cpp10
-rwxr-xr-xtest/magic_cookies_tests/magic_cookies_test_starter.sh3
-rwxr-xr-xtest/malicious_data_tests/conf/malicious_data_test_master_starter.sh.in4
-rwxr-xr-xtest/npdu_tests/npdu_test_starter.sh4
-rwxr-xr-xtest/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in4
-rwxr-xr-xtest/offer_tests/conf/offer_test_external_master_starter.sh.in34
-rw-r--r--test/offer_tests/offer_test_external_sd_msg_sender.cpp24
-rwxr-xr-xtest/offer_tests/offer_test_external_slave_sd_starter.sh38
-rw-r--r--test/offer_tests/offer_test_service_availability_checker.cpp118
-rwxr-xr-xtest/payload_tests/external_local_payload_test_client_external_starter.sh3
-rwxr-xr-xtest/payload_tests/external_local_payload_test_client_local_and_external_starter.sh3
-rwxr-xr-xtest/pending_subscription_tests/conf/pending_subscription_test_master_starter.sh.in3
-rwxr-xr-xtest/routing_tests/external_local_routing_test_starter.sh3
-rwxr-xr-xtest/second_address_tests/second_address_test_master_starter.sh3
-rwxr-xr-xtest/security_tests/security_test_external_master_start.sh10
-rwxr-xr-xtest/security_tests/security_test_external_slave_start.sh5
-rwxr-xr-xtest/someip_tp_tests/conf/someip_tp_test_master_starter.sh.in4
-rwxr-xr-xtest/subscribe_notify_one_tests/subscribe_notify_one_test_master_starter.sh5
-rwxr-xr-xtest/subscribe_notify_one_tests/subscribe_notify_one_test_slave_starter.sh4
-rw-r--r--test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_master.json.in2
-rw-r--r--test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_tcp_slave.json.in2
-rw-r--r--test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_udp_slave.json.in2
-rwxr-xr-xtest/subscribe_notify_tests/subscribe_notify_test_master_starter.sh5
-rwxr-xr-xtest/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_master_starter.sh4
-rwxr-xr-xtest/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh2
-rwxr-xr-xtest/subscribe_notify_tests/subscribe_notify_test_slave_starter.sh4
-rw-r--r--test/suspend_resume_tests/conf/suspend_resume_test_client.json.in32
-rw-r--r--test/suspend_resume_tests/conf/suspend_resume_test_service.json.in40
-rw-r--r--test/suspend_resume_tests/suspend_resume_test.hpp22
-rw-r--r--test/suspend_resume_tests/suspend_resume_test_client.cpp239
-rwxr-xr-xtest/suspend_resume_tests/suspend_resume_test_master_starter.sh72
-rw-r--r--test/suspend_resume_tests/suspend_resume_test_service.cpp213
-rwxr-xr-xtest/suspend_resume_tests/suspend_resume_test_slave_starter.sh29
54 files changed, 1307 insertions, 119 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 23a62aa..b4f63c7 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -2214,6 +2214,15 @@ if(NOT ${TESTS_BAT})
${TEST_LINK_LIBRARIES}
)
+ set(TEST_OFFER_SERVICE_AVAILABILITY_CHECKER ${TEST_OFFER_NAME}_service_availability_checker)
+ add_executable(${TEST_OFFER_SERVICE_AVAILABILITY_CHECKER} offer_tests/${TEST_OFFER_NAME}_service_availability_checker.cpp)
+ target_link_libraries(${TEST_OFFER_SERVICE_AVAILABILITY_CHECKER}
+ vsomeip3
+ ${Boost_LIBRARIES}
+ ${DL_LIBRARY}
+ ${TEST_LINK_LIBRARIES}
+ )
+
set(TEST_OFFER_EXTERNAL_SD_MESSAGE_SENDER ${TEST_OFFER_NAME}_external_sd_msg_sender)
add_executable(${TEST_OFFER_EXTERNAL_SD_MESSAGE_SENDER} offer_tests/${TEST_OFFER_NAME}_external_sd_msg_sender.cpp)
target_link_libraries(${TEST_OFFER_EXTERNAL_SD_MESSAGE_SENDER}
@@ -2318,7 +2327,11 @@ if(NOT ${TESTS_BAT})
${PROJECT_BINARY_DIR}/test/${TEST_OFFER_EXTERNAL_SLAVE_STARTER}
${TEST_OFFER_SERVICE}
)
-
+ set(TEST_OFFER_EXTERNAL_SLAVE_SD_STARTER ${TEST_OFFER_NAME}_external_slave_sd_starter.sh)
+ copy_to_builddir(${PROJECT_SOURCE_DIR}/test/offer_tests/${TEST_OFFER_EXTERNAL_SLAVE_SD_STARTER}
+ ${PROJECT_BINARY_DIR}/test/${TEST_OFFER_EXTERNAL_SLAVE_SD_STARTER}
+ ${TEST_OFFER_SERVICE}
+ )
# Copy starter scripts for external test to $BUILDDIR/test
set(TEST_OFFER_BIG_MASTER_STARTER ${TEST_OFFER_BIG_NAME}_master_starter.sh)
configure_file(
@@ -3073,6 +3086,73 @@ if(NOT ${TESTS_BAT} AND ${TEST_SECOND_ADDRESS})
endif()
##############################################################################
+# suspend resume tests
+##############################################################################
+if(NOT ${TESTS_BAT})
+
+ set(TEST_SUSPEND_RESUME_NAME suspend_resume_test)
+ set(TEST_SUSPEND_RESUME_SERVICE ${TEST_SUSPEND_RESUME_NAME}_service)
+ set(TEST_SUSPEND_RESUME_CLIENT ${TEST_SUSPEND_RESUME_NAME}_client)
+
+ add_executable(${TEST_SUSPEND_RESUME_SERVICE}
+ suspend_resume_tests/${TEST_SUSPEND_RESUME_SERVICE}.cpp
+ )
+ target_link_libraries(${TEST_SUSPEND_RESUME_SERVICE}
+ vsomeip3
+ ${Boost_LIBRARIES}
+ ${DL_LIBRARY}
+ ${TEST_LINK_LIBRARIES}
+ )
+
+ add_executable(${TEST_SUSPEND_RESUME_CLIENT}
+ suspend_resume_tests/${TEST_SUSPEND_RESUME_CLIENT}.cpp
+ )
+ target_link_libraries(${TEST_SUSPEND_RESUME_CLIENT}
+ vsomeip3
+ ${Boost_LIBRARIES}
+ ${DL_LIBRARY}
+ ${TEST_LINK_LIBRARIES}
+ )
+
+ set(TEST_SUSPEND_RESUME_SERVICE_CONFIG_FILE ${TEST_SUSPEND_RESUME_SERVICE}.json)
+ configure_file(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/conf/${TEST_SUSPEND_RESUME_SERVICE_CONFIG_FILE}.in
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_SERVICE_CONFIG_FILE}
+ @ONLY)
+ copy_to_builddir(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_SERVICE_CONFIG_FILE}
+ ${PROJECT_BINARY_DIR}/test/${TEST_SUSPEND_RESUME_SERVICE_CONFIG_FILE}
+ ${TEST_SUSPEND_RESUME_CLIENT}
+ )
+
+ set(TEST_SUSPEND_RESUME_CLIENT_CONFIG_FILE ${TEST_SUSPEND_RESUME_CLIENT}.json)
+ configure_file(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/conf/${TEST_SUSPEND_RESUME_CLIENT_CONFIG_FILE}.in
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_CLIENT_CONFIG_FILE}
+ @ONLY)
+ copy_to_builddir(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_CLIENT_CONFIG_FILE}
+ ${PROJECT_BINARY_DIR}/test/${TEST_SUSPEND_RESUME_CLIENT_CONFIG_FILE}
+ ${TEST_SUSPEND_RESUME_CLIENT}
+ )
+
+ set(TEST_SUSPEND_RESUME_MASTER_START_SCRIPT ${TEST_SUSPEND_RESUME_NAME}_master_starter.sh)
+ copy_to_builddir(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_MASTER_START_SCRIPT}
+ ${PROJECT_BINARY_DIR}/test/${TEST_SUSPEND_RESUME_MASTER_START_SCRIPT}
+ ${TEST_SUSPEND_RESUME_CLIENT}
+ )
+
+ set(TEST_SUSPEND_RESUME_SLAVE_START_SCRIPT ${TEST_SUSPEND_RESUME_NAME}_slave_starter.sh)
+ copy_to_builddir(
+ ${PROJECT_SOURCE_DIR}/test/suspend_resume_tests/${TEST_SUSPEND_RESUME_SLAVE_START_SCRIPT}
+ ${PROJECT_BINARY_DIR}/test/${TEST_SUSPEND_RESUME_SLAVE_START_SCRIPT}
+ ${TEST_SUSPEND_RESUME_CLIENT}
+ )
+
+endif()
+
+##############################################################################
# Add for every test a dependency to gtest
##############################################################################
@@ -3109,6 +3189,7 @@ if(NOT ${TESTS_BAT})
add_dependencies(${TEST_OFFER_CLIENT} gtest)
add_dependencies(${TEST_OFFER_SERVICE_EXTERNAL} gtest)
add_dependencies(${TEST_OFFER_EXTERNAL_SD_MESSAGE_SENDER} gtest)
+ add_dependencies(${TEST_OFFER_SERVICE_AVAILABILITY_CHECKER} gtest)
add_dependencies(${TEST_OFFERED_SERVICES_INFO_CLIENT} gtest)
add_dependencies(${TEST_OFFERED_SERVICES_INFO_SERVICE} gtest)
add_dependencies(${TEST_PENDING_SUBSCRIPTION_SERVICE} gtest)
@@ -3143,6 +3224,8 @@ if(NOT ${TESTS_BAT})
add_dependencies(${TEST_SECOND_ADDRESS_CLIENT} gtest)
add_dependencies(${TEST_SECOND_ADDRESS_SERVICE} gtest)
endif()
+ add_dependencies(${TEST_SUSPEND_RESUME_CLIENT} gtest)
+ add_dependencies(${TEST_SUSPEND_RESUME_SERVICE} gtest)
else()
add_dependencies(${TEST_LOCAL_ROUTING_SERVICE} gtest)
add_dependencies(${TEST_LOCAL_ROUTING_CLIENT} gtest)
@@ -3185,6 +3268,7 @@ if(NOT ${TESTS_BAT})
add_dependencies(build_tests ${TEST_OFFER_CLIENT})
add_dependencies(build_tests ${TEST_OFFER_SERVICE_EXTERNAL})
add_dependencies(build_tests ${TEST_OFFER_EXTERNAL_SD_MESSAGE_SENDER})
+ add_dependencies(build_tests ${TEST_OFFER_SERVICE_AVAILABILITY_CHECKER})
add_dependencies(build_tests ${TEST_OFFER_BIG_SERVICE})
add_dependencies(build_tests ${TEST_OFFER_BIG_CLIENT})
add_dependencies(build_tests ${TEST_RESTART_ROUTING_SERVICE})
@@ -3202,8 +3286,8 @@ if(NOT ${TESTS_BAT})
add_dependencies(build_tests ${TEST_E2E_SERVICE})
add_dependencies(build_tests ${TEST_E2E_CLIENT})
if (${TEST_E2E_PROFILE_04})
- add_dependencies(build_tests ${TEST_E2E_PROFILE_04_SERVICE})
- add_dependencies(build_tests ${TEST_E2E_PROFILE_04_CLIENT})
+ add_dependencies(build_tests ${TEST_E2E_PROFILE_04_SERVICE})
+ add_dependencies(build_tests ${TEST_E2E_PROFILE_04_CLIENT})
endif()
add_dependencies(build_tests ${TEST_EVENT_SERVICE})
add_dependencies(build_tests ${TEST_EVENT_CLIENT})
@@ -3223,6 +3307,8 @@ if(NOT ${TESTS_BAT})
add_dependencies(build_tests ${TEST_SECOND_ADDRESS_CLIENT})
add_dependencies(build_tests ${TEST_SECOND_ADDRESS_SERVICE})
endif()
+ add_dependencies(build_tests ${TEST_SUSPEND_RESUME_CLIENT})
+ add_dependencies(build_tests ${TEST_SUSPEND_RESUME_SERVICE})
else()
add_dependencies(build_tests ${TEST_LOCAL_ROUTING_SERVICE})
add_dependencies(build_tests ${TEST_LOCAL_ROUTING_CLIENT})
@@ -3574,6 +3660,10 @@ if(NOT ${TESTS_BAT})
COMMAND ${PROJECT_BINARY_DIR}/test/${TEST_INITIAL_EVENT_MASTER_STARTER} ${TEST_INITIAL_EVENT_DIFF_IDS_DIFF_PORTS_MASTER_CONFIG_FILE} TCP_AND_UDP MULTIPLE_EVENTS SUBSCRIBE_ONLY_ONE)
set_tests_properties(${TEST_INITIAL_EVENT_NAME}_multiple_events_diff_client_ids_diff_ports_partial_subscription_both_tcp_and_udp PROPERTIES TIMEOUT 120)
+ add_test(NAME ${TEST_INITIAL_EVENT_NAME}_diff_client_ids_same_ports_udp_client_subscribes_twice
+ COMMAND ${PROJECT_BINARY_DIR}/test/${TEST_INITIAL_EVENT_MASTER_STARTER} ${TEST_INITIAL_EVENT_DIFF_IDS_SAME_PORTS_MASTER_UDP_CONFIG_FILE} UDP CLIENT_SUBSCRIBES_TWICE)
+ set_tests_properties(${TEST_INITIAL_EVENT_NAME}_diff_client_ids_same_ports_udp_client_subscribes_twice PROPERTIES TIMEOUT 120)
+
# offer tests
add_test(NAME ${TEST_OFFER_NAME}_local
COMMAND ${PROJECT_BINARY_DIR}/test/${TEST_OFFER_LOCAL_STARTER})
@@ -3734,6 +3824,13 @@ if(NOT ${TESTS_BAT})
)
set_tests_properties(${TEST_SECOND_ADDRESS_NAME}_second_ip_address_client_udp PROPERTIES TIMEOUT 180)
endif()
+
+ # suspend resume test
+ add_test(NAME ${TEST_SUSPEND_RESUME_NAME}_initial
+ COMMAND ${PROJECT_BINARY_DIR}/test/${TEST_SUSPEND_RESUME_MASTER_START_SCRIPT} SERVICE
+ )
+ set_tests_properties(${TEST_SUSPEND_RESUME_NAME}_initial PROPERTIES TIMEOUT 80)
+
else()
# Routing tests
add_test(NAME ${TEST_LOCAL_ROUTING_NAME}
diff --git a/test/big_payload_tests/big_payload_test_external_starter.sh b/test/big_payload_tests/big_payload_test_external_starter.sh
index aa2f1a5..9db425d 100755
--- a/test/big_payload_tests/big_payload_test_external_starter.sh
+++ b/test/big_payload_tests/big_payload_test_external_starter.sh
@@ -49,6 +49,12 @@ elif [ ! -z "$USE_DOCKER" ]; then
else
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./big_payload_test_service_external_start.sh" &
fi
+elif [ ! -z "$JENKINS" ]; then
+ if [[ $# -gt 0 ]]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./big_payload_test_service_external_start.sh $1\" >> $WS_ROOT/slave_test_output 2>&1" &
+ else
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./big_payload_test_service_external_start.sh \" >> $WS_ROOT/slave_test_output 2>&1" &
+ fi
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/big_payload_tests/big_payload_test_service.cpp b/test/big_payload_tests/big_payload_test_service.cpp
index 89fe838..ab70046 100644
--- a/test/big_payload_tests/big_payload_test_service.cpp
+++ b/test/big_payload_tests/big_payload_test_service.cpp
@@ -86,6 +86,11 @@ void big_payload_test_service::join_offer_thread()
offer_thread_.join();
}
+void big_payload_test_service::detach_offer_thread()
+{
+ offer_thread_.detach();
+}
+
void big_payload_test_service::offer() {
app_->offer_service(service_id_,
big_payload_test::TEST_SERVICE_INSTANCE_ID);
@@ -241,6 +246,8 @@ TEST(someip_big_payload_test, receive_ten_messages_and_send_reply)
if (test_service.init()) {
test_service.start();
test_service.join_offer_thread();
+ } else {
+ test_service.detach_offer_thread();
}
}
diff --git a/test/big_payload_tests/big_payload_test_service.hpp b/test/big_payload_tests/big_payload_test_service.hpp
index fcb5e9e..44af28a 100644
--- a/test/big_payload_tests/big_payload_test_service.hpp
+++ b/test/big_payload_tests/big_payload_test_service.hpp
@@ -29,6 +29,7 @@ public:
void offer();
void stop_offer();
void join_offer_thread();
+ void detach_offer_thread();
void on_state(vsomeip::state_type_e _state);
void on_message(const std::shared_ptr<vsomeip::message> &_request);
void run();
diff --git a/test/client_id_tests/client_id_test_globals.hpp b/test/client_id_tests/client_id_test_globals.hpp
index 52dd069..e4b2cb8 100644
--- a/test/client_id_tests/client_id_test_globals.hpp
+++ b/test/client_id_tests/client_id_test_globals.hpp
@@ -12,19 +12,20 @@ struct service_info {
vsomeip::service_t service_id;
vsomeip::instance_t instance_id;
vsomeip::method_t method_id;
+ vsomeip::client_t offering_client;
};
static constexpr std::array<service_info, 7> service_infos = {{
// placeholder to be consistent w/ client ids, service ids, app names
- { 0xFFFF, 0xFFFF, 0xFFFF },
+ { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF },
// node 1
- { 0x1000, 0x1, 0x1111 },
- { 0x2000, 0x1, 0x2222 },
- { 0x3000, 0x1, 0x3333 },
+ { 0x1000, 0x1, 0x1111, 0x1111 },
+ { 0x2000, 0x1, 0x2222, 0x2222},
+ { 0x3000, 0x1, 0x3333, 0x3333},
// node 2
- { 0x4000, 0x1, 0x4444 },
- { 0x5000, 0x1, 0x5555 },
- { 0x6000, 0x1, 0x6666 }
+ { 0x4000, 0x1, 0x4444, 0x4444 },
+ { 0x5000, 0x1, 0x5555, 0x5555 },
+ { 0x6000, 0x1, 0x6666, 0x6666 }
}};
static constexpr int messages_to_send = 10;
diff --git a/test/client_id_tests/client_id_test_master_starter.sh b/test/client_id_tests/client_id_test_master_starter.sh
index eea65af..1351fb1 100755
--- a/test/client_id_tests/client_id_test_master_starter.sh
+++ b/test/client_id_tests/client_id_test_master_starter.sh
@@ -45,6 +45,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./client_id_test_slave_starter.sh $CLIENT_JSON_FILE\"" &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./client_id_test_slave_starter.sh $CLIENT_JSON_FILE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./client_id_test_slave_starter.sh $CLIENT_JSON_FILE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/client_id_tests/client_id_test_service.cpp b/test/client_id_tests/client_id_test_service.cpp
index b9bb0a1..ca2dc57 100644
--- a/test/client_id_tests/client_id_test_service.cpp
+++ b/test/client_id_tests/client_id_test_service.cpp
@@ -30,6 +30,8 @@ public:
stopped_(false),
stop_thread_(std::bind(&client_id_test_service::wait_for_stop, this)) {
if (!app_->init()) {
+ offer_thread_.detach();
+ stop_thread_.detach();
ADD_FAILURE() << "Couldn't initialize application";
return;
}
@@ -59,14 +61,19 @@ public:
other_services_available_[std::make_pair(i.service_id, i.instance_id)] = false;
other_services_received_response_[std::make_pair(i.service_id, i.method_id)] = 0;
+ other_services_received_request_[i.offering_client] = 0;
}
app_->start();
}
~client_id_test_service() {
- offer_thread_.join();
- stop_thread_.join();
+ if (offer_thread_.joinable()) {
+ offer_thread_.join();
+ }
+ if (stop_thread_.joinable()) {
+ stop_thread_.join();
+ }
}
void offer() {
@@ -128,6 +135,13 @@ public:
std::shared_ptr<vsomeip::message> its_response = vsomeip::runtime::get()
->create_response(_message);
app_->send(its_response);
+
+ other_services_received_request_[_message->get_client()]++;
+ if(all_responses_and_requests_received()) {
+ std::lock_guard<std::mutex> its_lock(stop_mutex_);
+ stopped_ = true;
+ stop_condition_.notify_one();
+ }
}
}
@@ -146,11 +160,7 @@ public:
other_services_received_response_[std::make_pair(_message->get_service(),
_message->get_method())]++;
- if(std::all_of(other_services_received_response_.cbegin(),
- other_services_received_response_.cend(),
- [](const std::map<std::pair<vsomeip::service_t,
- vsomeip::method_t>, std::uint32_t>::value_type& v)
- { return v.second == client_id_test::messages_to_send;})) {
+ if(all_responses_and_requests_received()) {
std::lock_guard<std::mutex> its_lock(stop_mutex_);
stopped_ = true;
stop_condition_.notify_one();
@@ -158,6 +168,21 @@ public:
}
}
+ bool all_responses_and_requests_received() {
+ const bool responses = std::all_of(
+ other_services_received_response_.cbegin(),
+ other_services_received_response_.cend(),
+ [](const std::map<std::pair<vsomeip::service_t,
+ vsomeip::method_t>, std::uint32_t>::value_type& v)
+ { return v.second == client_id_test::messages_to_send;});
+ const bool requests = std::all_of(
+ other_services_received_request_.cbegin(),
+ other_services_received_request_.cend(),
+ [](const std::map<vsomeip::client_t, std::uint32_t>::value_type& v)
+ { return v.second == client_id_test::messages_to_send;});
+ return (responses && requests);
+ }
+
void run() {
std::unique_lock<std::mutex> its_lock(mutex_);
while (!blocked_) {
@@ -212,7 +237,7 @@ public:
}
VSOMEIP_INFO << "[" << std::setw(4) << std::setfill('0') << std::hex
<< service_info_.service_id
- << "] Received responses from all other services, going down";
+ << "] Received responses and requests from all other services, going down";
// let offer thread exit
{
@@ -231,6 +256,7 @@ private:
std::shared_ptr<vsomeip::application> app_;
std::map<std::pair<vsomeip::service_t, vsomeip::instance_t>, bool> other_services_available_;
std::map<std::pair<vsomeip::service_t, vsomeip::method_t>, std::uint32_t> other_services_received_response_;
+ std::map<vsomeip::client_t, std::uint32_t> other_services_received_request_;
bool blocked_;
std::mutex mutex_;
diff --git a/test/cpu_load_tests/cpu_load_test_client.cpp b/test/cpu_load_tests/cpu_load_test_client.cpp
index 6cc0571..05c8cf1 100644
--- a/test/cpu_load_tests/cpu_load_test_client.cpp
+++ b/test/cpu_load_tests/cpu_load_test_client.cpp
@@ -314,7 +314,7 @@ static bool call_service_sync(true);
static bool shutdown_service(true);
-TEST(someip_load_test, send_messages_and_measure_cpu_load)
+TEST(someip_load_test, DISABLED_send_messages_and_measure_cpu_load)
{
cpu_load_test_client test_client_(protocol, number_of_calls, payload_size, call_service_sync, shutdown_service);
}
diff --git a/test/cpu_load_tests/cpu_load_test_master_starter.sh b/test/cpu_load_tests/cpu_load_test_master_starter.sh
index d4c96be..138d00e 100755
--- a/test/cpu_load_tests/cpu_load_test_master_starter.sh
+++ b/test/cpu_load_tests/cpu_load_test_master_starter.sh
@@ -22,6 +22,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP 'bash -ci "set -m; cd \$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./cpu_load_test_slave_starter.sh"' &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./cpu_load_test_slave_starter.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./cpu_load_test_slave_starter.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/cpu_load_tests/cpu_load_test_service.cpp b/test/cpu_load_tests/cpu_load_test_service.cpp
index 35e6c1e..6cc7714 100644
--- a/test/cpu_load_tests/cpu_load_test_service.cpp
+++ b/test/cpu_load_tests/cpu_load_test_service.cpp
@@ -192,7 +192,7 @@ private:
};
-TEST(someip_payload_test, send_response_for_every_request)
+TEST(someip_payload_test, DISABLED_send_response_for_every_request)
{
cpu_load_test_service test_service;
if (test_service.init()) {
diff --git a/test/debounce_tests/debounce_test_client.json b/test/debounce_tests/debounce_test_client.json
new file mode 100644
index 0000000..a19c85b
--- /dev/null
+++ b/test/debounce_tests/debounce_test_client.json
@@ -0,0 +1,52 @@
+{
+ "unicast" : "10.0.3.1",
+ "debounce" :
+ [
+ {
+ "service" : "0xb657",
+ "instance" : "0x0003",
+ "events" :
+ [
+ {
+ "event" : "0x8001",
+ "on_change" : "true",
+ "ignore" :
+ [
+ 0, 5
+ ]
+ },
+ {
+ "event" : "0x8002",
+ "on_change" : "true",
+ "ignore" :
+ [
+ 0, 5, 7, 8, 9, 10
+ ]
+ },
+ {
+ "event" : "0x8004",
+ "on_change" : "true",
+ "ignore" :
+ [
+ {
+ "index" : "0",
+ "mask" : "0x0f"
+ },
+ {
+ "index" : "5",
+ "mask" : "0xfe"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "service-discovery" :
+ {
+ "enable" : "true",
+ "multicast" : "224.251.192.252",
+ "port" : "30490",
+ "protocol" : "udp",
+ "cyclic_offer_delay" : "1000"
+ }
+}
diff --git a/test/debounce_tests/debounce_test_service.json b/test/debounce_tests/debounce_test_service.json
new file mode 100644
index 0000000..4aeff9c
--- /dev/null
+++ b/test/debounce_tests/debounce_test_service.json
@@ -0,0 +1,19 @@
+{
+ "unicast" : "10.0.3.188",
+ "services" :
+ [
+ {
+ "service" : "0xb657",
+ "instance" : "0x0003",
+ "unreliable" : "30503"
+ }
+ ],
+ "service-discovery" :
+ {
+ "enable" : "true",
+ "multicast" : "224.251.192.252",
+ "port" : "30490",
+ "protocol" : "udp",
+ "cyclic_offer_delay" : "1000"
+ }
+}
diff --git a/test/e2e_tests/e2e_profile_04_test_external_master_start.sh b/test/e2e_tests/e2e_profile_04_test_external_master_start.sh
index ce16d71..f3d6e34 100755
--- a/test/e2e_tests/e2e_profile_04_test_external_master_start.sh
+++ b/test/e2e_tests/e2e_profile_04_test_external_master_start.sh
@@ -33,7 +33,10 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting external e2e profile 04 test on slave LXC"
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./e2e_profile_04_test_external_slave_start.sh $SERVICE_JSON_FILE\"" &
elif [ ! -z "$USE_DOCKER" ]; then
- docker run --name citms --cap-add NET_ADMIN $DOCKER_IMAGE sh -c "route add -net 224.0.0.0/4 dev eth0 && cd $DOCKER_TESTS && ./e2e_profile_04_test_external_slave_start.sh $SERVICE_JSON_FILE" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./e2e_profile_04_test_external_slave_start.sh $SERVICE_JSON_FILE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./e2e_profile_04_test_external_slave_start.sh $SERVICE_JSON_FILE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
@@ -60,11 +63,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_CLIENT
# Check if both exited successfully
diff --git a/test/e2e_tests/e2e_profile_04_test_external_slave_start.sh b/test/e2e_tests/e2e_profile_04_test_external_slave_start.sh
index afd692b..17104b8 100755
--- a/test/e2e_tests/e2e_profile_04_test_external_slave_start.sh
+++ b/test/e2e_tests/e2e_profile_04_test_external_slave_start.sh
@@ -34,11 +34,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_SERVICE
# Check if both exited successfully
diff --git a/test/e2e_tests/e2e_test_external_master_start.sh b/test/e2e_tests/e2e_test_external_master_start.sh
index 3e54d9b..e787fcb 100755
--- a/test/e2e_tests/e2e_test_external_master_start.sh
+++ b/test/e2e_tests/e2e_test_external_master_start.sh
@@ -33,7 +33,10 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting external e2e test on slave LXC"
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./e2e_test_external_slave_start.sh $SERVICE_JSON_FILE\"" &
elif [ ! -z "$USE_DOCKER" ]; then
- docker run --name citms --cap-add NET_ADMIN $DOCKER_IMAGE sh -c "route add -net 224.0.0.0/4 dev eth0 && cd $DOCKER_TESTS && ./e2e_test_external_slave_start.sh $SERVICE_JSON_FILE" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./e2e_test_external_slave_start.sh $SERVICE_JSON_FILE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./e2e_test_external_slave_start.sh $SERVICE_JSON_FILE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
@@ -60,11 +63,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_CLIENT
# Check if both exited successfully
diff --git a/test/e2e_tests/e2e_test_external_slave_start.sh b/test/e2e_tests/e2e_test_external_slave_start.sh
index ccf6fd5..a6855b1 100755
--- a/test/e2e_tests/e2e_test_external_slave_start.sh
+++ b/test/e2e_tests/e2e_test_external_slave_start.sh
@@ -34,11 +34,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_SERVICE
# Check if both exited successfully
diff --git a/test/event_tests/event_test_master_starter.sh b/test/event_tests/event_test_master_starter.sh
index 7c2aec0..e00639f 100755
--- a/test/event_tests/event_test_master_starter.sh
+++ b/test/event_tests/event_test_master_starter.sh
@@ -30,7 +30,10 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting offer test on slave LXC offer_test_external_slave_starter.sh"
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./event_test_slave_starter.sh $COMMUNICATIONMODE\"" &
elif [ ! -z "$USE_DOCKER" ]; then
- docker run --name otems --cap-add NET_ADMIN $DOCKER_IMAGE sh -c "route add -net 224.0.0.0/4 dev eth0 && cd $DOCKER_TESTS && sleep 10; ./event_test_slave_starter.sh $COMMUNICATIONMODE" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./event_test_slave_starter.sh $COMMUNICATIONMODE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./event_test_slave_starter.sh $COMMUNICATIONMODE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
@@ -57,10 +60,5 @@ done
kill $PID_VSOMEIPD
sleep 1
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop otems
- docker rm otems
-fi
-
# Check if everything went well
exit $FAIL
diff --git a/test/initial_event_tests/initial_event_test_client.cpp b/test/initial_event_tests/initial_event_test_client.cpp
index bc9d46a..ef215f1 100644
--- a/test/initial_event_tests/initial_event_test_client.cpp
+++ b/test/initial_event_tests/initial_event_test_client.cpp
@@ -36,13 +36,15 @@ public:
bool _subscribe_on_available, std::uint32_t _events_to_subscribe,
bool _initial_event_strict_checking,
bool _dont_exit, bool _subscribe_only_one,
- vsomeip::reliability_type_e _reliability_type) :
+ vsomeip::reliability_type_e _reliability_type,
+ bool _client_subscribes_twice) :
client_number_(_client_number),
service_infos_(_service_infos),
service_offered_tcp_and_udp_(_service_offered_tcp_and_udp),
app_(vsomeip::runtime::get()->create_application()),
wait_until_registered_(true),
wait_for_stop_(true),
+ is_first(true),
subscribe_on_available_(_subscribe_on_available),
events_to_subscribe_(_events_to_subscribe),
initial_event_strict_checking_(_initial_event_strict_checking),
@@ -50,9 +52,11 @@ public:
subscribe_only_one_(_subscribe_only_one),
stop_thread_(&initial_event_test_client::wait_for_stop, this),
wait_for_signal_handler_registration_(true),
- reliability_type_(_reliability_type)
+ reliability_type_(_reliability_type),
+ client_subscribes_twice_(_client_subscribes_twice)
{
if (!app_->init()) {
+ stop_thread_.detach();
ADD_FAILURE() << "Couldn't initialize application";
return;
}
@@ -92,6 +96,8 @@ public:
if (events_to_subscribe_ == 1) {
app_->subscribe(i.service_id, i.instance_id, i.eventgroup_id,
vsomeip::DEFAULT_MAJOR);
+
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
other_services_received_notification_[std::make_pair(i.service_id, i.event_id)] = 0;
} else if (events_to_subscribe_ > 1) {
if (!subscribe_only_one_) {
@@ -99,6 +105,7 @@ public:
app_->subscribe(i.service_id, i.instance_id, i.eventgroup_id,
vsomeip::DEFAULT_MAJOR,
static_cast<vsomeip::event_t>(i.event_id + j));
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
other_services_received_notification_[std::make_pair(i.service_id, i.event_id + j)] = 0;
}
} else {
@@ -134,8 +141,12 @@ public:
}
~initial_event_test_client() {
- stop_thread_.join();
- signal_thread_.join();
+ if (stop_thread_.joinable()) {
+ stop_thread_.join();
+ }
+ if (signal_thread_.joinable()) {
+ signal_thread_.join();
+ }
}
void on_state(vsomeip::state_type_e _state) {
@@ -196,33 +207,79 @@ public:
void on_message(const std::shared_ptr<vsomeip::message> &_message) {
if(_message->get_message_type() == vsomeip::message_type_e::MT_NOTIFICATION) {
- other_services_received_notification_[std::make_pair(_message->get_service(),
- _message->get_method())]++;
-
- VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
- << client_number_ << "] "
- << "Received a notification with Client/Session [" << std::setw(4)
- << std::setfill('0') << std::hex << _message->get_client() << "/"
- << std::setw(4) << std::setfill('0') << std::hex
- << _message->get_session() << "] from Service/Method ["
- << std::setw(4) << std::setfill('0') << std::hex
- << _message->get_service() << "/" << std::setw(4) << std::setfill('0')
- << std::hex << _message->get_method() <<"] (now have: "
- << std::dec << other_services_received_notification_[std::make_pair(_message->get_service(),
- _message->get_method())] << ")";
+ {
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
+ other_services_received_notification_[std::make_pair(_message->get_service(),
+ _message->get_method())]++;
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << client_number_ << "] "
+ << "Received a notification with Client/Session [" << std::setw(4)
+ << std::setfill('0') << std::hex << _message->get_client() << "/"
+ << std::setw(4) << std::setfill('0') << std::hex
+ << _message->get_session() << "] from Service/Method ["
+ << std::setw(4) << std::setfill('0') << std::hex
+ << _message->get_service() << "/" << std::setw(4) << std::setfill('0')
+ << std::hex << _message->get_method() <<"] (now have: "
+ << std::dec << other_services_received_notification_[std::make_pair(_message->get_service(),
+ _message->get_method())] << ")";
+ }
std::shared_ptr<vsomeip::payload> its_payload(_message->get_payload());
EXPECT_EQ(2u, its_payload->get_length());
EXPECT_EQ((_message->get_service() & 0xFF00 ) >> 8, its_payload->get_data()[0]);
EXPECT_EQ((_message->get_service() & 0xFF), its_payload->get_data()[1]);
bool notify(false);
- if (!service_offered_tcp_and_udp_) {
- if (all_notifications_received()) {
- notify = true;
+ if (client_subscribes_twice_) {
+ // only relevant for testcase:
+ // initial_event_test_diff_client_ids_same_ports_udp_client_subscribes_twice
+ // check that a second subscribe triggers another initial event
+ // expect notifications_to_send_after_double_subscribe == 2;
+ if (is_first) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(2000));
+ for(const auto& i : service_infos_) {
+ // subscribe again and expect initial events cached at rm::proxy to be received
+ // as configured routing manager only fires the event once after first susbcribe.
+ if (i.service_id == 0xFFFF && i.instance_id == 0xFFFF) {
+ continue;
+ }
+ if (!subscribe_on_available_) {
+ if (events_to_subscribe_ == 1) {
+ app_->subscribe(i.service_id, i.instance_id, i.eventgroup_id,
+ vsomeip::DEFAULT_MAJOR);
+ } else if (events_to_subscribe_ > 1) {
+ if (!subscribe_only_one_) {
+ for (std::uint32_t j = 0; j < events_to_subscribe_; j++ ) {
+ app_->subscribe(i.service_id, i.instance_id, i.eventgroup_id,
+ vsomeip::DEFAULT_MAJOR,
+ static_cast<vsomeip::event_t>(i.event_id + j));
+ }
+ } else {
+ app_->subscribe(i.service_id, i.instance_id, i.eventgroup_id,
+ vsomeip::DEFAULT_MAJOR,
+ static_cast<vsomeip::event_t>(i.event_id));
+ }
+ }
+ }
+ }
+ is_first = false;
+ } else {
+ bool received_initial_event_twice(false);
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
+ received_initial_event_twice = all_notifications_received_twice();
+ if (received_initial_event_twice) {
+ notify = true;
+ }
}
} else {
- if (all_notifications_received_tcp_and_udp()) {
- notify = true;
+ if (!service_offered_tcp_and_udp_) {
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
+ if (all_notifications_received()) {
+ notify = true;
+ }
+ } else {
+ if (all_notifications_received_tcp_and_udp()) {
+ notify = true;
+ }
}
}
@@ -277,7 +334,50 @@ public:
);
}
+ bool all_notifications_received_twice() {
+ return std::all_of(
+ other_services_received_notification_.cbegin(),
+ other_services_received_notification_.cend(),
+ [&](const std::map<std::pair<vsomeip::service_t,
+ vsomeip::method_t>, std::uint32_t>::value_type& v)
+ {
+ bool result;
+ if (v.second == initial_event_test::notifications_to_send * 2) {
+ result = true;
+ } else {
+ if (v.second >= initial_event_test::notifications_to_send * 2) {
+ VSOMEIP_WARNING
+ << __func__ << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << client_number_ << "] "
+ << " Received multiple initial events from service/instance: "
+ << std::setw(4) << std::setfill('0') << std::hex << v.first.first
+ << "."
+ << std::setw(4) << std::setfill('0') << std::hex << v.first.second
+ << " number of received events: " << v.second
+ << ". This is caused by StopSubscribe/Subscribe messages and/or"
+ << " service offered via UDP and TCP";
+ if (initial_event_strict_checking_) {
+ ADD_FAILURE() << __func__ << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << client_number_ << "] "
+ << " Received multiple initial events from service/instance: "
+ << std::setw(4) << std::setfill('0') << std::hex << v.first.first
+ << "."
+ << std::setw(4) << std::setfill('0') << std::hex << v.first.second
+ << " number of received events: " << v.second;
+ }
+ result = initial_event_strict_checking_ ? false : true;
+
+ } else {
+ result = false;
+ }
+ }
+ return result;
+ }
+ );
+ }
+
bool all_notifications_received_tcp_and_udp() {
+ std::lock_guard<std::mutex> its_lock(received_notifications_mutex_);
std::uint32_t received_twice(0);
std::uint32_t received_normal(0);
for(const auto &v : other_services_received_notification_) {
@@ -402,6 +502,7 @@ private:
bool service_offered_tcp_and_udp_;
std::shared_ptr<vsomeip::application> app_;
std::map<std::pair<vsomeip::service_t, vsomeip::instance_t>, bool> other_services_available_;
+ std::mutex received_notifications_mutex_;
std::map<std::pair<vsomeip::service_t, vsomeip::method_t>, std::uint32_t> other_services_received_notification_;
bool wait_until_registered_;
@@ -409,6 +510,7 @@ private:
std::condition_variable condition_;
std::atomic<bool> wait_for_stop_;
+ std::atomic<bool> is_first;
bool subscribe_on_available_;
std::uint32_t events_to_subscribe_;
@@ -424,6 +526,7 @@ private:
std::condition_variable signal_condition_;
std::thread signal_thread_;
vsomeip::reliability_type_e reliability_type_;
+ bool client_subscribes_twice_;
};
static int client_number;
@@ -434,6 +537,8 @@ static std::uint32_t subscribe_multiple_events;
static bool initial_event_strict_checking;
static bool dont_exit;
static bool subscribe_only_one;
+static bool client_subscribes_twice;
+
vsomeip::reliability_type_e reliability_type = vsomeip::reliability_type_e::RT_UNKNOWN;
@@ -450,13 +555,15 @@ TEST(someip_initial_event_test, wait_for_initial_events_of_all_services)
subscribe_on_available, subscribe_multiple_events,
initial_event_strict_checking, dont_exit,
subscribe_only_one,
- reliability_type);
+ reliability_type,
+ client_subscribes_twice);
} else {
initial_event_test_client its_sample(client_number, service_offered_tcp_and_udp,
initial_event_test::service_infos, subscribe_on_available,
subscribe_multiple_events, initial_event_strict_checking, dont_exit,
subscribe_only_one,
- reliability_type);
+ reliability_type,
+ client_subscribes_twice);
}
}
@@ -492,6 +599,7 @@ int main(int argc, char** argv)
subscribe_multiple_events = 1;
dont_exit = false;
subscribe_only_one = false;
+ client_subscribes_twice = false;
if (argc > 2) {
for (int i = 2; i < argc; i++) {
if (std::string("SUBSCRIBE_ON_AVAILABILITY") == std::string(argv[i])) {
@@ -518,6 +626,9 @@ int main(int argc, char** argv)
} else if (std::string("TCP_AND_UDP")== std::string(argv[i])) {
reliability_type = vsomeip::reliability_type_e::RT_BOTH;
std::cout << "Using reliability type RT_BOTH" << std::endl;
+ } else if (std::string("CLIENT_SUBSCRIBES_TWICE")== std::string(argv[i])) {
+ client_subscribes_twice = true;
+ std::cout << "Testing for initial event after a second subscribe from same client CLIENT_SUBSCRIBES_TWICE" << std::endl;
}
}
}
diff --git a/test/initial_event_tests/initial_event_test_master_starter.sh b/test/initial_event_tests/initial_event_test_master_starter.sh
index 8848f62..85607c4 100755
--- a/test/initial_event_tests/initial_event_test_master_starter.sh
+++ b/test/initial_event_tests/initial_event_test_master_starter.sh
@@ -31,6 +31,8 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./initial_event_test_slave_starter.sh $CLIENT_JSON_FILE $REMAINING_OPTIONS\"" &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./initial_event_test_slave_starter.sh $CLIENT_JSON_FILE $REMAINING_OPTIONS" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./initial_event_test_slave_starter.sh $CLIENT_JSON_FILE $REMAINING_OPTIONS\" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
@@ -70,6 +72,8 @@ export VSOMEIP_APPLICATION_NAME=initial_event_test_service_three
./initial_event_test_service 3 $REMAINING_OPTIONS &
PID_SERVICE_THREE=$!
+sleep 3
+
unset VSOMEIP_APPLICATION_NAME
# Array for client pids
@@ -125,9 +129,10 @@ kill $FIRST_PID
wait $FIRST_PID || FAIL=$(($FAIL+1))
# shutdown the services
-kill $PID_SERVICE_THREE
-kill $PID_SERVICE_TWO
-kill $PID_SERVICE_ONE
+kill $PID_SERVICE_THREE $PID_SERVICE_TWO $PID_SERVICE_ONE
+wait $PID_SERVICE_THREE $PID_SERVICE_TWO $PID_SERVICE_ONE
+
+
sleep 1
echo ""
diff --git a/test/initial_event_tests/initial_event_test_service.cpp b/test/initial_event_tests/initial_event_test_service.cpp
index f075ed6..b7d8281 100644
--- a/test/initial_event_tests/initial_event_test_service.cpp
+++ b/test/initial_event_tests/initial_event_test_service.cpp
@@ -31,6 +31,7 @@ public:
offer_thread_(std::bind(&initial_event_test_service::run, this)),
reliability_type_(_reliability_type) {
if (!app_->init()) {
+ offer_thread_.detach();
ADD_FAILURE() << "Couldn't initialize application";
return;
}
@@ -64,7 +65,9 @@ public:
}
~initial_event_test_service() {
- offer_thread_.join();
+ if (offer_thread_.joinable()) {
+ offer_thread_.join();
+ }
}
void offer() {
diff --git a/test/initial_event_tests/initial_event_test_slave_starter.sh b/test/initial_event_tests/initial_event_test_slave_starter.sh
index e240f5a..6f6bd40 100755
--- a/test/initial_event_tests/initial_event_test_slave_starter.sh
+++ b/test/initial_event_tests/initial_event_test_slave_starter.sh
@@ -41,6 +41,8 @@ export VSOMEIP_APPLICATION_NAME=initial_event_test_service_six
./initial_event_test_service 6 $REMAINING_OPTIONS &
PID_SERVICE_SIX=$!
+sleep 3
+
unset VSOMEIP_APPLICATION_NAME
# Array for client pids
@@ -93,7 +95,7 @@ kill $PID_SERVICE_FOUR
sleep 1
echo ""
-# Check if both exited successfully
+# Check if both exited successfully
if [ $FAIL -eq 0 ]
then
exit 0
diff --git a/test/initial_event_tests/initial_event_test_stop_service.cpp b/test/initial_event_tests/initial_event_test_stop_service.cpp
index 83cd34c..465c837 100644
--- a/test/initial_event_tests/initial_event_test_stop_service.cpp
+++ b/test/initial_event_tests/initial_event_test_stop_service.cpp
@@ -35,6 +35,8 @@ public:
stop_thread_(std::bind(&initial_event_test_stop_service::wait_for_stop, this)),
called_other_node_(false) {
if (!app_->init()) {
+ offer_thread_.detach();
+ stop_thread_.detach();
ADD_FAILURE() << "Couldn't initialize application";
return;
}
@@ -72,8 +74,12 @@ public:
}
~initial_event_test_stop_service() {
- offer_thread_.join();
- stop_thread_.join();
+ if (offer_thread_.joinable()) {
+ offer_thread_.join();
+ }
+ if (stop_thread_.joinable()) {
+ stop_thread_.join();
+ }
}
void offer() {
diff --git a/test/magic_cookies_tests/magic_cookies_test_starter.sh b/test/magic_cookies_tests/magic_cookies_test_starter.sh
index c5342fc..d05a371 100755
--- a/test/magic_cookies_tests/magic_cookies_test_starter.sh
+++ b/test/magic_cookies_tests/magic_cookies_test_starter.sh
@@ -20,6 +20,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./magic_cookies_test_client_start.sh\"" &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./magic_cookies_test_client_start.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./magic_cookies_test_client_start.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/malicious_data_tests/conf/malicious_data_test_master_starter.sh.in b/test/malicious_data_tests/conf/malicious_data_test_master_starter.sh.in
index 87bb0d4..2b3c59b 100755
--- a/test/malicious_data_tests/conf/malicious_data_test_master_starter.sh.in
+++ b/test/malicious_data_tests/conf/malicious_data_test_master_starter.sh.in
@@ -42,6 +42,10 @@ elif [ ! -z "$USE_DOCKER" ]; then
echo "Waiting for 5s"
sleep 5
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./malicious_data_test_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE" &
+elif [ ! -z "$JENKINS" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./malicious_data_test_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE\" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/npdu_tests/npdu_test_starter.sh b/test/npdu_tests/npdu_test_starter.sh
index 2e88be6..c405adc 100755
--- a/test/npdu_tests/npdu_test_starter.sh
+++ b/test/npdu_tests/npdu_test_starter.sh
@@ -74,6 +74,10 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./npdu_test_client_npdu_start.sh $*\"" &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./npdu_test_client_npdu_start.sh $*" &
+elif [ ! -z "$JENKINS" ]; then
+ echo "starting npdu_test on slave Docker"
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./npdu_test_client_npdu_start.sh $*\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
sleep 1
cat <<End-of-message
diff --git a/test/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in b/test/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in
index 07d4079..53f6a2c 100755
--- a/test/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in
+++ b/test/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in
@@ -33,6 +33,10 @@ elif [ ! -z "$USE_DOCKER" ]; then
echo "Waiting for 5s"
sleep 5
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_big_sd_msg_slave_starter.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./offer_test_big_sd_msg_slave_starter.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/offer_tests/conf/offer_test_external_master_starter.sh.in b/test/offer_tests/conf/offer_test_external_master_starter.sh.in
index 272689a..2a27a3f 100755
--- a/test/offer_tests/conf/offer_test_external_master_starter.sh.in
+++ b/test/offer_tests/conf/offer_test_external_master_starter.sh.in
@@ -34,18 +34,20 @@ echo "SERVICE_TWO pid $PID_SERVICE_TWO"
CLIENT_PIDS+=($!)
echo "client pid ${CLIENT_PIDS[0]}"
-sleep 1
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
if [ ! -z "$USE_LXC_TEST" ]; then
- echo "Waiting for 5s"
- sleep 5
echo "starting offer test on slave LXC offer_test_external_slave_starter.sh"
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./offer_test_external_slave_starter.sh\"" &
- echo "remote ssh pid: $!"
elif [ ! -z "$USE_DOCKER" ]; then
- echo "Waiting for 5s"
- sleep 5
- docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_external_slave_starter.sh" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS; ./offer_test_external_slave_starter.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test ; ./offer_test_external_slave_starter.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
@@ -101,19 +103,22 @@ PID_SERVICE_TWO=$!
./offer_test_client SUBSCRIBE &
CLIENT_PIDS+=($!)
echo "client pid ${CLIENT_PIDS[0]}"
+# Wait until all clients and services are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
-sleep 1
if [ ! -z "$USE_LXC_TEST" ]; then
- echo "Waiting for 5s"
- sleep 5
echo "starting offer test on slave LXC offer_test_external_sd_msg_sender"
- ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./offer_test_external_sd_msg_sender $LXC_TEST_MASTER_IP\"" &
+ ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./offer_test_external_slave_sd_starter.sh $LXC_TEST_MASTER_IP\"" &
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
- echo "Waiting for 5s"
- sleep 5
- docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_external_sd_msg_sender $DOCKER_IP" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS; ./offer_test_external_slave_sd_starter.sh $DOCKER_IP" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./offer_test_external_slave_sd_starter.sh @TEST_IP_MASTER@ \" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
@@ -138,7 +143,6 @@ done
# kill the services
kill $PID_VSOMEIPD
-sleep 1
# wait for slave to finish
for job in $(jobs -p)
diff --git a/test/offer_tests/offer_test_external_sd_msg_sender.cpp b/test/offer_tests/offer_test_external_sd_msg_sender.cpp
index 6849b95..cc75b8d 100644
--- a/test/offer_tests/offer_test_external_sd_msg_sender.cpp
+++ b/test/offer_tests/offer_test_external_sd_msg_sender.cpp
@@ -15,11 +15,26 @@ TEST(someip_offer_test, send_offer_service_sd_message)
{
try {
boost::asio::io_service io;
+ boost::system::error_code ec;
boost::asio::ip::udp::socket::endpoint_type target_sd(
boost::asio::ip::address::from_string(std::string(passed_address)),
30490);
- boost::asio::ip::udp::socket udp_socket(io,
- boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 30490));
+
+ boost::asio::ip::udp::socket udp_socket(io);
+
+ boost::asio::ip::udp::endpoint rx_endpoint_(boost::asio::ip::udp::v4(), 30490);
+ udp_socket.open(rx_endpoint_.protocol(), ec);
+
+ if(ec)
+ std::cout <<" udp_socket open create error "<<std::endl;
+
+ boost::asio::socket_base::reuse_address optionReuseAddress(true);
+ udp_socket.set_option(optionReuseAddress, ec);
+ udp_socket.bind(boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 30490), ec);
+ if(ec)
+ std::cout <<" udp_socket BIND error "<<std::endl;
+
+ boost::asio::detail::throw_error(ec);
std::uint8_t its_offer_service_message[] = {
0xff, 0xff, 0x81, 0x00,
0x00, 0x00, 0x00, 0x3c,
@@ -39,6 +54,7 @@ TEST(someip_offer_test, send_offer_service_sd_message)
0x0a, 0x00, 0x03, 0x7D, // slave address
0x00, 0x11, 0x75, 0x31
};
+
for (int var = 0; var < 15; ++var) {
udp_socket.send_to(boost::asio::buffer(its_offer_service_message), target_sd);
++its_offer_service_message[11];
@@ -53,8 +69,10 @@ TEST(someip_offer_test, send_offer_service_sd_message)
boost::asio::ip::udp::socket::endpoint_type target_service(
boost::asio::ip::address::from_string(std::string(passed_address)),
30001);
+
udp_socket.send_to(boost::asio::buffer(shutdown_call), target_service);
- } catch (...) {
+ } catch (const std::exception& e) {
+ std::cout << e.what() << std::endl;
ASSERT_FALSE(true);
}
}
diff --git a/test/offer_tests/offer_test_external_slave_sd_starter.sh b/test/offer_tests/offer_test_external_slave_sd_starter.sh
new file mode 100755
index 0000000..8e30086
--- /dev/null
+++ b/test/offer_tests/offer_test_external_slave_sd_starter.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 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/.
+
+FAIL=0
+# Rejecting offer for which there is already a remote offer:
+# * start daemon
+# * start application which offers service
+# * start daemon remotely
+# * start same application which offers the same service again remotely
+# -> should be rejected as there is already a service instance
+# running in the network
+
+export VSOMEIP_CONFIGURATION=offer_test_external_slave.json
+# start daemon
+../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+
+echo "calling availabiliy checker"
+
+./offer_test_service_availability_checker &
+
+PID_AVAILABILITY_CHECKER=$!
+
+echo "waiting for offer_test_service_availability_checker"
+
+# wait until the services on the remote node were started as well
+wait $PID_AVAILABILITY_CHECKER
+
+# kill the routing manager services
+kill $PID_VSOMEIPD
+
+./offer_test_external_sd_msg_sender $1 &
+
+
+
diff --git a/test/offer_tests/offer_test_service_availability_checker.cpp b/test/offer_tests/offer_test_service_availability_checker.cpp
new file mode 100644
index 0000000..3cef64f
--- /dev/null
+++ b/test/offer_tests/offer_test_service_availability_checker.cpp
@@ -0,0 +1,118 @@
+// Copyright (C) 2014-2017 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/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "offer_test_globals.hpp"
+
+
+class offer_test_service_availability_checker {
+public:
+ offer_test_service_availability_checker(struct offer_test::service_info _service_info) :
+ service_info_(_service_info),
+ app_(vsomeip::runtime::get()->create_application()),
+ wait_until_registered_(true),
+ wait_for_stop_(true),
+ stop_thread_(std::bind(&offer_test_service_availability_checker::wait_for_stop, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_service_availability_checker::on_state, this,
+ std::placeholders::_1));
+
+ // register availability for all other services and request their event.
+ app_->register_availability_handler(service_info_.service_id,
+ service_info_.instance_id,
+ std::bind(&offer_test_service_availability_checker::on_availability, this,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3));
+ app_->request_service(service_info_.service_id,
+ service_info_.instance_id);
+
+ app_->start();
+ }
+
+ ~offer_test_service_availability_checker() {
+ stop_thread_.join();
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_INFO << "MY Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ void on_availability(vsomeip::service_t _service,
+ vsomeip::instance_t _instance, bool _is_available) {
+ VSOMEIP_INFO << "MY Service [" << std::setw(4)
+ << std::setfill('0') << std::hex << _service << "." << _instance
+ << "] is " << (_is_available ? "available":"not available") << ".";
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ if(_is_available) {
+ wait_for_stop_ = false;
+ stop_condition_.notify_one();
+ }
+ }
+
+ void wait_for_stop() {
+ VSOMEIP_INFO << " MY offer_test_service_availability_check wait_for_stop() ";
+ std::unique_lock<std::mutex> its_lock(stop_mutex_);
+ while (wait_for_stop_) {
+ stop_condition_.wait(its_lock);
+ }
+ //VSOMEIP_INFO << "[" << std::setw(4) << std::setfill('0') << std::hex
+ // << client_number_ << "] all services are available. Going down";
+ VSOMEIP_INFO << " MY offer_test_service_availability_check is going down ";
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ std::shared_ptr<vsomeip::application> app_;
+
+ bool wait_until_registered_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+
+ bool wait_for_stop_;
+ std::mutex stop_mutex_;
+ std::condition_variable stop_condition_;
+ std::thread stop_thread_;
+};
+
+TEST(someip_offer_test_external, wait_for_availability_and_exit)
+{
+ offer_test_service_availability_checker its_sample(
+ offer_test::service);
+}
+
+#ifndef _WIN32
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/payload_tests/external_local_payload_test_client_external_starter.sh b/test/payload_tests/external_local_payload_test_client_external_starter.sh
index 97d195a..f6c2744 100755
--- a/test/payload_tests/external_local_payload_test_client_external_starter.sh
+++ b/test/payload_tests/external_local_payload_test_client_external_starter.sh
@@ -62,6 +62,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./external_local_payload_test_client_external_start.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./external_local_payload_test_client_external_start.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/payload_tests/external_local_payload_test_client_local_and_external_starter.sh b/test/payload_tests/external_local_payload_test_client_local_and_external_starter.sh
index b1dd78d..dda58ce 100755
--- a/test/payload_tests/external_local_payload_test_client_local_and_external_starter.sh
+++ b/test/payload_tests/external_local_payload_test_client_local_and_external_starter.sh
@@ -79,6 +79,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./external_local_payload_test_client_external_start.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./external_local_payload_test_client_external_start.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/pending_subscription_tests/conf/pending_subscription_test_master_starter.sh.in b/test/pending_subscription_tests/conf/pending_subscription_test_master_starter.sh.in
index a43e3c4..298a3ea 100755
--- a/test/pending_subscription_tests/conf/pending_subscription_test_master_starter.sh.in
+++ b/test/pending_subscription_tests/conf/pending_subscription_test_master_starter.sh.in
@@ -41,6 +41,9 @@ elif [ ! -z "$USE_DOCKER" ]; then
echo "Waiting for 5s"
sleep 5
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./pending_subscription_test_sd_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./pending_subscription_test_sd_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/routing_tests/external_local_routing_test_starter.sh b/test/routing_tests/external_local_routing_test_starter.sh
index f8fa2df..7b3d37b 100755
--- a/test/routing_tests/external_local_routing_test_starter.sh
+++ b/test/routing_tests/external_local_routing_test_starter.sh
@@ -82,6 +82,9 @@ then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./external_local_routing_test_client_external_start.sh" &
+ elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./external_local_routing_test_client_external_start.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/second_address_tests/second_address_test_master_starter.sh b/test/second_address_tests/second_address_test_master_starter.sh
index a7bcc0a..c68c0b5 100755
--- a/test/second_address_tests/second_address_test_master_starter.sh
+++ b/test/second_address_tests/second_address_test_master_starter.sh
@@ -47,6 +47,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./second_address_test_slave_starter.sh $SLAVE_OPERATIONMODE $COMMUNICATIONMODE\"" &
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS; sleep 10; ./second_address_test_slave_starter.sh $SLAVE_OPERATIONMODE $COMMUNICATIONMODE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./second_address_test_slave_starter.sh $SLAVE_OPERATIONMODE $COMMUNICATIONMODE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/security_tests/security_test_external_master_start.sh b/test/security_tests/security_test_external_master_start.sh
index 75d8667..dc41b8c 100755
--- a/test/security_tests/security_test_external_master_start.sh
+++ b/test/security_tests/security_test_external_master_start.sh
@@ -39,7 +39,10 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting external security test on slave LXC"
ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./security_test_external_slave_start.sh $SERVICE_JSON_FILE $2\"" &
elif [ ! -z "$USE_DOCKER" ]; then
- docker run --name citms --cap-add NET_ADMIN $DOCKER_IMAGE sh -c "route add -net 224.0.0.0/4 dev eth0 && cd $DOCKER_TESTS && ./security_test_external_slave_start.sh $SERVICE_JSON_FILE $2" &
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./security_test_external_slave_start.sh $SERVICE_JSON_FILE $2" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./security_test_external_slave_start.sh $SERVICE_JSON_FILE $2\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
@@ -66,11 +69,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_VSOMEIPD
kill $PID_CLIENT
diff --git a/test/security_tests/security_test_external_slave_start.sh b/test/security_tests/security_test_external_slave_start.sh
index 41b6251..96f578f 100755
--- a/test/security_tests/security_test_external_slave_start.sh
+++ b/test/security_tests/security_test_external_slave_start.sh
@@ -43,11 +43,6 @@ do
fi
done
-if [ ! -z "$USE_DOCKER" ]; then
- docker stop citms
- docker rm citms
-fi
-
kill $PID_VSOMEIPD
kill $PID_SERVICE
diff --git a/test/someip_tp_tests/conf/someip_tp_test_master_starter.sh.in b/test/someip_tp_tests/conf/someip_tp_test_master_starter.sh.in
index c01feea..56e3ddf 100755
--- a/test/someip_tp_tests/conf/someip_tp_test_master_starter.sh.in
+++ b/test/someip_tp_tests/conf/someip_tp_test_master_starter.sh.in
@@ -34,6 +34,10 @@ elif [ ! -z "$USE_DOCKER" ]; then
echo "Waiting for 5s"
sleep 5
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./someip_tp_test_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE" &
+elif [ ! -z "$JENKINS" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./someip_tp_test_msg_sender @TEST_IP_MASTER@ @TEST_IP_SLAVE@ $TESTMODE\" >> $WS_ROOT/slave_test_output 2>&1" &
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/subscribe_notify_one_tests/subscribe_notify_one_test_master_starter.sh b/test/subscribe_notify_one_tests/subscribe_notify_one_test_master_starter.sh
index 75e948e..a53104f 100755
--- a/test/subscribe_notify_one_tests/subscribe_notify_one_test_master_starter.sh
+++ b/test/subscribe_notify_one_tests/subscribe_notify_one_test_master_starter.sh
@@ -38,7 +38,7 @@ export VSOMEIP_APPLICATION_NAME=subscribe_notify_one_test_service_three
export VSOMEIP_CONFIGURATION=$MASTER_JSON_FILE
./subscribe_notify_one_test_service 3 $RELIABILITY_TYPE &
-sleep 1
+sleep 3
if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting subscribe_notify_one_test_slave_starter.sh on slave LXC with parameters $CLIENT_JSON_FILE"
@@ -46,6 +46,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./subscribe_notify_one_test_slave_starter.sh $RELIABILITY_TYPE $CLIENT_JSON_FILE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./subscribe_notify_one_test_slave_starter.sh $RELIABILITY_TYPE $CLIENT_JSON_FILE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/subscribe_notify_one_tests/subscribe_notify_one_test_slave_starter.sh b/test/subscribe_notify_one_tests/subscribe_notify_one_test_slave_starter.sh
index e41852c..830484d 100755
--- a/test/subscribe_notify_one_tests/subscribe_notify_one_test_slave_starter.sh
+++ b/test/subscribe_notify_one_tests/subscribe_notify_one_test_slave_starter.sh
@@ -31,6 +31,8 @@ export VSOMEIP_APPLICATION_NAME=subscribe_notify_one_test_service_six
export VSOMEIP_CONFIGURATION=$2
./subscribe_notify_one_test_service 6 $1 &
+sleep 3
+
# Wait until all applications are finished
for job in $(jobs -p)
do
@@ -39,7 +41,7 @@ do
wait $job || ((FAIL+=1))
done
-# Check if both exited successfully
+# Check if both exited successfully
if [ $FAIL -eq 0 ]
then
exit 0
diff --git a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_master.json.in b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_master.json.in
index d0ce9cc..88d5ec9 100644
--- a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_master.json.in
+++ b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_master.json.in
@@ -2,7 +2,7 @@
"unicast" : "@TEST_IP_MASTER@",
"logging" :
{
- "level" : "debug",
+ "level" : "warning",
"console" : "true",
"file" : { "enable" : "false", "path" : "/var/log/vsomeip.log" },
"dlt" : "false"
diff --git a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_tcp_slave.json.in b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_tcp_slave.json.in
index 318cf3c..f712c07 100644
--- a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_tcp_slave.json.in
+++ b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_tcp_slave.json.in
@@ -2,7 +2,7 @@
"unicast" : "@TEST_IP_SLAVE@",
"logging" :
{
- "level" : "debug",
+ "level" : "warning",
"console" : "true",
"file" : { "enable" : "false", "path" : "/tmp/vsomeip.log" },
"dlt" : "false"
diff --git a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_udp_slave.json.in b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_udp_slave.json.in
index fa3e4f5..cd6415c 100644
--- a/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_udp_slave.json.in
+++ b/test/subscribe_notify_tests/conf/subscribe_notify_test_one_event_two_eventgroups_udp_slave.json.in
@@ -2,7 +2,7 @@
"unicast" : "@TEST_IP_SLAVE@",
"logging" :
{
- "level" : "debug",
+ "level" : "warning",
"console" : "true",
"file" : { "enable" : "false", "path" : "/tmp/vsomeip.log" },
"dlt" : "false"
diff --git a/test/subscribe_notify_tests/subscribe_notify_test_master_starter.sh b/test/subscribe_notify_tests/subscribe_notify_test_master_starter.sh
index f14550d..f068e99 100755
--- a/test/subscribe_notify_tests/subscribe_notify_test_master_starter.sh
+++ b/test/subscribe_notify_tests/subscribe_notify_test_master_starter.sh
@@ -40,7 +40,7 @@ export VSOMEIP_APPLICATION_NAME=subscribe_notify_test_service_three
export VSOMEIP_CONFIGURATION=$MASTER_JSON_FILE
./subscribe_notify_test_service 3 $RELIABILITY_TYPE $3 &
-sleep 1
+sleep 3
if [ ! -z "$USE_LXC_TEST" ]; then
echo "starting subscribe_notify_test_slave_starter.sh on slave LXC with parameters $CLIENT_JSON_FILE $2"
@@ -48,6 +48,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./subscribe_notify_test_slave_starter.sh $RELIABILITY_TYPE $CLIENT_JSON_FILE $3" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./subscribe_notify_test_slave_starter.sh $RELIABILITY_TYPE $CLIENT_JSON_FILE $3\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
diff --git a/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_master_starter.sh b/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_master_starter.sh
index 8da1ded..c453796 100755
--- a/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_master_starter.sh
+++ b/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_master_starter.sh
@@ -46,6 +46,9 @@ if [ ! -z "$USE_LXC_TEST" ]; then
echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh $RELIABILITY_TYPE $SLAVE_JSON_FILE" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh $RELIABILITY_TYPE $SLAVE_JSON_FILE\" >> $WS_ROOT/slave_test_output 2>&1" &
+
else
cat <<End-of-message
*******************************************************************************
@@ -74,7 +77,6 @@ wait $PID_CLIENT || FAIL=$(($FAIL+1))
kill $PID_VSOMEIPD
wait $PID_VSOMEIPD || FAIL=$(($FAIL+1))
-echo ""
# Check if both exited successfully
if [ $FAIL -eq 0 ]; then
diff --git a/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh b/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh
index d9f0161..0d663d6 100755
--- a/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh
+++ b/test/subscribe_notify_tests/subscribe_notify_test_one_event_two_eventgroups_slave_starter.sh
@@ -32,12 +32,10 @@ PID_SERVICE=$!
# wait until service exits successfully
wait $PID_SERVICE || FAIL=$(($FAIL+1))
-
# kill daemon
kill $PID_VSOMEIPD
wait $PID_VSOMEIPD || FAIL=$(($FAIL+1))
-echo ""
# Check if both exited successfully
if [ $FAIL -eq 0 ]; then
diff --git a/test/subscribe_notify_tests/subscribe_notify_test_slave_starter.sh b/test/subscribe_notify_tests/subscribe_notify_test_slave_starter.sh
index dca9e71..8133161 100755
--- a/test/subscribe_notify_tests/subscribe_notify_test_slave_starter.sh
+++ b/test/subscribe_notify_tests/subscribe_notify_test_slave_starter.sh
@@ -36,6 +36,8 @@ export VSOMEIP_APPLICATION_NAME=subscribe_notify_test_service_six
export VSOMEIP_CONFIGURATION=$SLAVE_JSON_FILE
./subscribe_notify_test_service 6 $RELIABILITY_TYPE $3 &
+sleep 3
+
# Wait until all applications are finished
for job in $(jobs -p)
do
@@ -44,7 +46,7 @@ do
wait $job || ((FAIL+=1))
done
-# Check if both exited successfully
+# Check if both exited successfully
if [ $FAIL -eq 0 ]
then
exit 0
diff --git a/test/suspend_resume_tests/conf/suspend_resume_test_client.json.in b/test/suspend_resume_tests/conf/suspend_resume_test_client.json.in
new file mode 100644
index 0000000..db94cea
--- /dev/null
+++ b/test/suspend_resume_tests/conf/suspend_resume_test_client.json.in
@@ -0,0 +1,32 @@
+{
+ "unicast" : "@TEST_IP_SLAVE@",
+ "netmask" : "255.255.255.0",
+ "logging" :
+ {
+ "level" : "debug",
+ "console" : "true",
+ "file" : { "enable" : "false", "path" : "" },
+ "dlt" : "false"
+ },
+ "applications" :
+ [
+ {
+ "name" : "suspend_resume_test_client",
+ "id" : "0x4567"
+ }
+ ],
+ "routing" : "suspend_resume_test_client",
+ "service-discovery" :
+ {
+ "enable" : "true",
+ "multicast" : "224.0.0.1",
+ "port" : "30490",
+ "protocol" : "udp",
+ "initial_delay_min" : "10",
+ "initial_delay_max" : "10",
+ "repetitions_base_delay" : "30",
+ "repetitions_max" : "3",
+ "cyclic_offer_delay" : "1000",
+ "ttl" : "3"
+ }
+} \ No newline at end of file
diff --git a/test/suspend_resume_tests/conf/suspend_resume_test_service.json.in b/test/suspend_resume_tests/conf/suspend_resume_test_service.json.in
new file mode 100644
index 0000000..44b510b
--- /dev/null
+++ b/test/suspend_resume_tests/conf/suspend_resume_test_service.json.in
@@ -0,0 +1,40 @@
+{
+ "unicast" : "@TEST_IP_MASTER@",
+ "netmask" : "255.255.255.0",
+ "logging" :
+ {
+ "level" : "debug",
+ "console" : "true",
+ "file" : { "enable" : "false", "path" : "" },
+ "dlt" : "false"
+ },
+ "applications" :
+ [
+ {
+ "name" : "suspend_resume_test_service",
+ "id" : "0x7654"
+ }
+ ],
+ "services" :
+ [
+ {
+ "service" : "0x6311",
+ "instance" : "0x0002",
+ "unreliable" : "34504"
+ }
+ ],
+ "routing" : "routingmanagerd",
+ "service-discovery" :
+ {
+ "enable" : "true",
+ "multicast" : "224.0.0.1",
+ "port" : "30490",
+ "protocol" : "udp",
+ "initial_delay_min" : "10",
+ "initial_delay_max" : "10",
+ "repetitions_base_delay" : "30",
+ "repetitions_max" : "3",
+ "cyclic_offer_delay" : "1000",
+ "ttl" : "3"
+ }
+} \ No newline at end of file
diff --git a/test/suspend_resume_tests/suspend_resume_test.hpp b/test/suspend_resume_tests/suspend_resume_test.hpp
new file mode 100644
index 0000000..5271bba
--- /dev/null
+++ b/test/suspend_resume_tests/suspend_resume_test.hpp
@@ -0,0 +1,22 @@
+// Copyright (C) 2021 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 SUSPEND_RESUME_TEST_
+#define SUSPEND_RESUME_TEST_
+
+#define TEST_SERVICE 0x6311
+#define TEST_INSTANCE 0x0002
+#define TEST_MAJOR 0x01
+#define TEST_MINOR 0x0
+
+#define TEST_EVENT 0x8005
+#define TEST_EVENTGROUP 0x0002
+
+#define TEST_METHOD 0x0001
+
+#define TEST_SUSPEND 0x00
+#define TEST_STOP 0xFF
+
+#endif // SUSPEND_RESUME_TEST_
diff --git a/test/suspend_resume_tests/suspend_resume_test_client.cpp b/test/suspend_resume_tests/suspend_resume_test_client.cpp
new file mode 100644
index 0000000..ca2956c
--- /dev/null
+++ b/test/suspend_resume_tests/suspend_resume_test_client.cpp
@@ -0,0 +1,239 @@
+// Copyright (C) 2021 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/.
+
+#include <condition_variable>
+#include <mutex>
+#include <thread>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "suspend_resume_test.hpp"
+
+class suspend_resume_test_client {
+public:
+ suspend_resume_test_client()
+ : name_("suspend_resume_test_client"),
+ app_(vsomeip::runtime::get()->create_application(name_)),
+ has_received_(false),
+ runner_(std::bind(&suspend_resume_test_client::run, this)) {
+
+ }
+
+ void run_test() {
+
+ register_state_handler();
+ register_message_handler();
+ register_availability_handler();
+
+ start();
+
+ {
+ VSOMEIP_DEBUG << "Started.";
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ auto r = cv_.wait_for(its_lock, std::chrono::seconds(10));
+ EXPECT_EQ(r, std::cv_status::no_timeout);
+ }
+
+ toggle();
+
+ {
+ VSOMEIP_DEBUG << "Toggled.";
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ if (!has_received_) {
+ auto r = cv_.wait_for(its_lock, std::chrono::seconds(10));
+ EXPECT_EQ(r, std::cv_status::no_timeout);
+ }
+ }
+
+ send_suspend();
+
+ bool was_successful;
+ {
+ VSOMEIP_DEBUG << "Triggered suspend/resume.";
+
+ // Wait for service to become availaber after suspend/resume.
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ auto r = cv_.wait_for(its_lock, std::chrono::seconds(10));
+ EXPECT_EQ(r, std::cv_status::no_timeout);
+
+ // Wait for initial event after suspend/resume.
+ r = cv_.wait_for(its_lock, std::chrono::seconds(10));
+ EXPECT_EQ(r, std::cv_status::no_timeout);
+
+ was_successful = (r == std::cv_status::no_timeout);
+ }
+
+ if (was_successful)
+ send_stop();
+
+ stop();
+ }
+
+private:
+ void register_state_handler() {
+
+ app_->register_state_handler(
+ std::bind(&suspend_resume_test_client::on_state, this, std::placeholders::_1));
+ }
+
+ void register_availability_handler() {
+
+ app_->register_availability_handler(TEST_SERVICE, TEST_INSTANCE,
+ std::bind(&suspend_resume_test_client::on_availability, this,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+ }
+
+ void register_message_handler() {
+
+ app_->register_message_handler(TEST_SERVICE, TEST_INSTANCE, TEST_EVENT,
+ std::bind(&suspend_resume_test_client::on_message, this,
+ std::placeholders::_1));
+ }
+
+ void start() {
+
+ app_->init();
+ cv_.notify_one();
+ }
+
+ void run() {
+
+ {
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ cv_.wait(its_lock);
+ }
+
+ app_->start();
+ }
+
+ void stop() {
+
+ app_->stop();
+ runner_.join();
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+
+ VSOMEIP_DEBUG << __func__ << ": state="
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "NOT registered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ app_->request_event(TEST_SERVICE, TEST_INSTANCE, TEST_EVENT, { TEST_EVENTGROUP });
+ app_->request_service(TEST_SERVICE, TEST_INSTANCE);
+ }
+ }
+
+ void on_availability(vsomeip::service_t _service, vsomeip::instance_t _instance, bool _is_available) {
+
+ static bool is_available(false);
+
+ if (_service == TEST_SERVICE && _instance == TEST_INSTANCE) {
+
+ VSOMEIP_DEBUG << __func__ << ": Test service is "
+ << (_is_available ? "available." : "NOT available.");
+
+ if (_is_available)
+ cv_.notify_one();
+ else if (is_available)
+ has_received_ = false;
+
+ is_available = _is_available;
+ }
+ }
+
+ void on_message(const std::shared_ptr<vsomeip::message> &_message) {
+
+ if (_message->get_service() == TEST_SERVICE
+ && _message->get_instance() == TEST_INSTANCE
+ && _message->get_method() == TEST_EVENT) {
+
+ VSOMEIP_DEBUG << __func__ << ": Received event.";
+ if (!has_received_) {
+ has_received_ = true;
+ cv_.notify_one();
+ }
+ }
+ }
+
+ void toggle() {
+
+ app_->subscribe(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP, TEST_MAJOR);
+ std::this_thread::sleep_for(std::chrono::seconds(3));
+ app_->unsubscribe(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP);
+ app_->subscribe(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP, TEST_MAJOR);
+ std::this_thread::sleep_for(std::chrono::seconds(2));
+ app_->unsubscribe(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP);
+ app_->subscribe(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP, TEST_MAJOR);
+
+ }
+
+
+ void send_suspend() {
+
+ auto its_message = vsomeip::runtime::get()->create_request(false);
+ its_message->set_service(TEST_SERVICE);
+ its_message->set_instance(TEST_INSTANCE);
+ its_message->set_method(TEST_METHOD);
+ its_message->set_interface_version(TEST_MAJOR);
+ its_message->set_message_type(vsomeip::message_type_e::MT_REQUEST_NO_RETURN);
+ its_message->set_return_code(vsomeip::return_code_e::E_OK);
+
+ vsomeip::byte_t its_data[] = { TEST_SUSPEND };
+ auto its_payload = vsomeip::runtime::get()->create_payload();
+ its_payload->set_data(its_data, sizeof(its_data));
+ its_message->set_payload(its_payload);
+
+ app_->send(its_message);
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
+ }
+
+ void send_stop() {
+
+ auto its_message = vsomeip::runtime::get()->create_request(false);
+ its_message->set_service(TEST_SERVICE);
+ its_message->set_instance(TEST_INSTANCE);
+ its_message->set_method(TEST_METHOD);
+ its_message->set_interface_version(TEST_MAJOR);
+ its_message->set_message_type(vsomeip::message_type_e::MT_REQUEST_NO_RETURN);
+ its_message->set_return_code(vsomeip::return_code_e::E_OK);
+
+ vsomeip::byte_t its_data[] = { TEST_STOP };
+ auto its_payload = vsomeip::runtime::get()->create_payload();
+ its_payload->set_data(its_data, sizeof(its_data));
+ its_message->set_payload(its_payload);
+
+ app_->send(its_message);
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
+ }
+
+private: // members
+ std::string name_;
+ std::shared_ptr<vsomeip::application> app_;
+ std::mutex mutex_;
+ std::condition_variable cv_;
+ bool has_received_;
+ std::thread runner_;
+};
+
+TEST(suspend_resume_test, fast)
+{
+ suspend_resume_test_client its_client;
+ its_client.run_test();
+}
+
+#ifndef _WIN32
+int main(int argc, char** argv) {
+
+ ::testing::InitGoogleTest(&argc, argv);
+
+ return RUN_ALL_TESTS();
+}
+#endif // _WIN32
diff --git a/test/suspend_resume_tests/suspend_resume_test_master_starter.sh b/test/suspend_resume_tests/suspend_resume_test_master_starter.sh
new file mode 100755
index 0000000..39a8d73
--- /dev/null
+++ b/test/suspend_resume_tests/suspend_resume_test_master_starter.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# Copyright (C) 2021 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/.
+
+# Purpose: This script is needed to start the services with
+# one command. This is necessary as ctest - which is used to run the
+# tests - isn't able to start multiple binaries for one testcase. Therefore
+# the testcase simply executes this script. This script then runs the services
+# and checks that all exit successfully.
+
+FAIL=0
+
+# Start the service
+export VSOMEIP_APPLICATION_NAME=suspend_resume_test_service
+export VSOMEIP_CONFIGURATION=suspend_resume_test_service.json
+
+# start daemon
+../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+
+# start the service
+./suspend_resume_test_service $PID_VSOMEIPD &
+PID_SERVICE=$!
+
+sleep 1
+
+if [ ! -z "$USE_LXC_TEST" ]; then
+ echo "starting suspend_resume_test_slave_starter.sh on slave LXC with parameters $SLAVE_JSON_FILE"
+ ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test; ./suspend_resume_test_slave_starter.sh\"" &
+ echo "remote ssh job id: $!"
+elif [ ! -z "$USE_DOCKER" ]; then
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./suspend_resume_test_slave_starter.sh" &
+elif [ ! -z "$JENKINS" ]; then
+ ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./suspend_resume_test_slave_starter.sh\" >> $WS_ROOT/slave_test_output 2>&1" &
+
+else
+ cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Please now run:
+** suspend_resume_test_slave_starter.sh
+** from an external host to successfully complete this test.
+**
+** You probably will need to adapt the 'unicast' settings in
+** suspend_resume_test_service.json and
+** suspend_resume_test_client.json to your personal setup.
+*******************************************************************************
+*******************************************************************************
+End-of-message
+fi
+
+if [ ! -z "$USE_DOCKER" ]; then
+ FAIL=0
+fi
+
+# wait until client exits successfully
+wait $PID_SERVICE || FAIL=$(($FAIL+1))
+
+# kill daemon
+kill $PID_VSOMEIPD
+wait $PID_VSOMEIPD || FAIL=$(($FAIL+1))
+
+echo ""
+
+# Check if both exited successfully
+if [ $FAIL -eq 0 ]; then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/suspend_resume_tests/suspend_resume_test_service.cpp b/test/suspend_resume_tests/suspend_resume_test_service.cpp
new file mode 100644
index 0000000..205a2ce
--- /dev/null
+++ b/test/suspend_resume_tests/suspend_resume_test_service.cpp
@@ -0,0 +1,213 @@
+// Copyright (C) 2021 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/.
+
+#include <condition_variable>
+#include <mutex>
+#include <thread>
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "suspend_resume_test.hpp"
+
+pid_t daemon_pid__;
+
+class suspend_resume_test_service {
+public:
+ suspend_resume_test_service()
+ : name_("suspend_resume_test_service"),
+ app_(vsomeip::runtime::get()->create_application(name_)),
+ is_running_(true),
+ is_unblocked_(false),
+ runner_(std::bind(&suspend_resume_test_service::run, this)),
+ sr_runner_(std::bind(&suspend_resume_test_service::sr_run, this)) {
+ }
+
+ void run_test() {
+
+ register_state_handler();
+ register_message_handler();
+ register_subscription_handler();
+
+ start();
+
+ VSOMEIP_DEBUG << "Using daemon with pid=" << std::dec << daemon_pid__;
+
+ {
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ auto r = cv_.wait_for(its_lock, std::chrono::seconds(30));
+ EXPECT_EQ(r, std::cv_status::no_timeout);
+ }
+
+ stop();
+ }
+
+private:
+ void start() {
+
+ app_->init();
+ cv_.notify_one();
+ }
+
+ void stop() {
+
+ is_running_ = false;
+ sr_cv_.notify_one();
+
+ app_->stop();
+
+ runner_.join();
+ sr_runner_.join();
+ }
+
+ void run() {
+
+ {
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ cv_.wait(its_lock);
+ }
+
+ app_->start();
+ }
+
+ void sr_run() {
+
+ while (is_running_) {
+ std::unique_lock<std::mutex> its_lock(sr_mutex_);
+ sr_cv_.wait(its_lock);
+
+ if (is_running_) {
+ VSOMEIP_DEBUG << "send kill SIGUSR1 to PID: " << std::dec << daemon_pid__;
+ kill(daemon_pid__, SIGUSR1);
+ std::this_thread::sleep_for(std::chrono::seconds(5));
+ VSOMEIP_DEBUG << "send kill SIGUSR2 to PID: " << std::dec << daemon_pid__;
+ kill(daemon_pid__, SIGUSR2);
+ }
+ }
+ }
+
+ void register_state_handler() {
+
+ app_->register_state_handler(
+ std::bind(&suspend_resume_test_service::on_state, this, std::placeholders::_1));
+ }
+
+ void register_message_handler() {
+
+ app_->register_message_handler(TEST_SERVICE, TEST_INSTANCE, TEST_METHOD,
+ std::bind(&suspend_resume_test_service::on_message, this,
+ std::placeholders::_1));
+ }
+
+ void register_subscription_handler() {
+
+ app_->register_subscription_handler(TEST_SERVICE, TEST_INSTANCE, TEST_EVENTGROUP,
+ std::bind(&suspend_resume_test_service::on_subscribe, this,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
+ }
+
+ void offer_service() {
+ app_->offer_event(TEST_SERVICE, TEST_INSTANCE, TEST_EVENT, { TEST_EVENTGROUP },
+ vsomeip::event_type_e::ET_FIELD,
+ std::chrono::milliseconds::zero(), false, true, nullptr,
+ vsomeip::reliability_type_e::RT_UNRELIABLE);
+
+ vsomeip::byte_t its_data[] = { 0x1, 0x2, 0x3 };
+ auto its_payload = vsomeip::runtime::get()->create_payload();
+ its_payload->set_data(its_data, sizeof(its_data));
+ app_->notify(TEST_SERVICE, TEST_INSTANCE, TEST_EVENT, its_payload);
+
+ app_->offer_service(TEST_SERVICE, TEST_INSTANCE, TEST_MAJOR, TEST_MINOR);
+ }
+
+ // handler
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_DEBUG << __func__ << ": state="
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "NOT registered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ offer_service();
+ }
+ }
+
+ void on_message(const std::shared_ptr<vsomeip::message> &_message) {
+
+ VSOMEIP_DEBUG << __func__ << ": Received "
+ << std::hex << std::setw(4) << std::setfill('0')
+ << _message->get_service()
+ << std::hex << std::setw(4) << std::setfill('0')
+ << _message->get_instance()
+ << std::hex << std::setw(4) << std::setfill('0')
+ << _message->get_method();
+
+ if (_message->get_service() == TEST_SERVICE
+ && _message->get_instance() == TEST_INSTANCE
+ && _message->get_method() == TEST_METHOD) {
+
+ if (_message->get_payload()->get_length() == 1) {
+
+ vsomeip::byte_t its_control_byte(*_message->get_payload()->get_data());
+
+ switch (its_control_byte) {
+ case TEST_SUSPEND:
+ sr_cv_.notify_one();
+ break;
+ case TEST_STOP:
+ cv_.notify_one();
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ }
+
+ bool on_subscribe(vsomeip::client_t _client,
+ vsomeip::uid_t _uid, vsomeip::gid_t _gid,
+ bool _is_subscribe) {
+
+ (void)_client;
+ (void)_uid;
+ (void)_gid;
+
+ VSOMEIP_DEBUG << __func__ << ": is_subscribe=" << std::boolalpha << _is_subscribe;
+ if (!_is_subscribe)
+ std::this_thread::sleep_for(std::chrono::milliseconds(2000));
+ return (true);
+ }
+
+private: // members
+ std::string name_;
+ std::shared_ptr<vsomeip::application> app_;
+ std::atomic<bool> is_running_;
+ bool is_unblocked_;
+ std::mutex mutex_;
+ std::condition_variable cv_;
+ std::mutex sr_mutex_;
+ std::condition_variable sr_cv_;
+ std::thread runner_;
+ std::thread sr_runner_;
+};
+
+TEST(suspend_resume_test, fast)
+{
+ suspend_resume_test_service its_service;
+ its_service.run_test();
+}
+
+#ifndef _WIN32
+int main(int argc, char** argv) {
+
+ ::testing::InitGoogleTest(&argc, argv);
+
+ daemon_pid__ = atoi(argv[1]);
+
+ return RUN_ALL_TESTS();
+}
+#endif // _WIN32
diff --git a/test/suspend_resume_tests/suspend_resume_test_slave_starter.sh b/test/suspend_resume_tests/suspend_resume_test_slave_starter.sh
new file mode 100755
index 0000000..9cbf85d
--- /dev/null
+++ b/test/suspend_resume_tests/suspend_resume_test_slave_starter.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright (C) 2021 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/.
+
+FAIL=0
+
+# Start the client
+export VSOMEIP_APPLICATION_NAME=suspend_resume_test_client
+export VSOMEIP_CONFIGURATION=suspend_resume_test_client.json
+./suspend_resume_test_client &
+PID_CLIENT=$!
+
+# Wait until all applications are finished
+for job in $(jobs -p)
+do
+ # Fail gets incremented if one of the binaries exits
+ # with a non-zero exit code
+ wait $job || ((FAIL+=1))
+done
+
+# Check if both exited successfully
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi \ No newline at end of file