diff options
Diffstat (limited to 'test')
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 |