// Copyright (C) 2015-2019 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 #include "../npdu_tests/npdu_test_rmd.hpp" #include #include "npdu_test_globals.hpp" #include "../npdu_tests/npdu_test_globals.hpp" npdu_test_rmd::npdu_test_rmd() : app_(vsomeip::runtime::get()->create_application()), is_registered_(false), blocked_(false), offer_thread_(std::bind(&npdu_test_rmd::run, this)) { // TODO Auto-generated constructor stub } void npdu_test_rmd::init() { std::lock_guard its_lock(mutex_); app_->init(); #ifdef RMD_CLIENT_SIDE app_->register_message_handler(npdu_test::RMD_SERVICE_ID_CLIENT_SIDE, #elif defined (RMD_SERVICE_SIDE) app_->register_message_handler(npdu_test::RMD_SERVICE_ID_SERVICE_SIDE, #endif npdu_test::RMD_INSTANCE_ID, npdu_test::RMD_SHUTDOWN_METHOD_ID, std::bind(&npdu_test_rmd::on_message_shutdown, this, std::placeholders::_1)); app_->register_state_handler( std::bind(&npdu_test_rmd::on_state, this, std::placeholders::_1)); } void npdu_test_rmd::start() { VSOMEIP_INFO << "Starting..."; app_->start(); } void npdu_test_rmd::stop() { VSOMEIP_INFO << "Stopping..."; app_->unregister_message_handler(npdu_test::RMD_SERVICE_ID_CLIENT_SIDE, npdu_test::RMD_INSTANCE_ID, npdu_test::RMD_SHUTDOWN_METHOD_ID); app_->unregister_state_handler(); offer_thread_.join(); app_->stop(); } void npdu_test_rmd::on_state( vsomeip::state_type_e _state) { VSOMEIP_INFO << "Application " << app_->get_name() << " is " << (_state == vsomeip::state_type_e::ST_REGISTERED ? "registered." : "deregistered."); if(_state == vsomeip::state_type_e::ST_REGISTERED) { if(!is_registered_) { std::lock_guard its_lock(mutex_); is_registered_ = true; blocked_ = true; // "start" the run method thread condition_.notify_one(); } } else { is_registered_ = false; } } void npdu_test_rmd::on_message_shutdown( const std::shared_ptr& _request) { (void)_request; std::shared_ptr request = vsomeip::runtime::get()->create_request(false); #ifdef RMD_CLIENT_SIDE static int counter = 0; counter++; VSOMEIP_INFO << counter << " of " << npdu_test::client_ids_clients.size() << " clients are finished."; if (counter == npdu_test::client_ids_clients.size()) { VSOMEIP_INFO << "All clients are finished, notify routing manager daemon on service side."; // notify the RMD_SERVICE_SIDE that he can shutdown as well std::this_thread::sleep_for(std::chrono::seconds(1)); request->set_service(npdu_test::RMD_SERVICE_ID_SERVICE_SIDE); request->set_instance(npdu_test::RMD_INSTANCE_ID); request->set_method(npdu_test::RMD_SHUTDOWN_METHOD_ID); request->set_message_type(vsomeip::message_type_e::MT_REQUEST_NO_RETURN); app_->send(request); std::this_thread::sleep_for(std::chrono::seconds(5)); stop(); } #elif defined RMD_SERVICE_SIDE VSOMEIP_INFO << "All clients are finished shutting down services"; // shutdown all services for(unsigned int i = 0; i < npdu_test::service_ids.size(); i++) { request->set_service(npdu_test::service_ids[i]); request->set_instance(npdu_test::instance_ids[i]); request->set_method(npdu_test::NPDU_SERVICE_SHUTDOWNMETHOD_ID); request->set_message_type(vsomeip::message_type_e::MT_REQUEST_NO_RETURN); app_->send(request); } app_->stop_offer_service(npdu_test::RMD_SERVICE_ID_SERVICE_SIDE, npdu_test::RMD_INSTANCE_ID); VSOMEIP_INFO << "Wait a few seconds until all services are shutdown."; std::atomic finished(false); for (int i = 0; !finished && i < 20; i++) { app_->get_offered_services_async( vsomeip::offer_type_e::OT_REMOTE, [&](const std::vector> &_services){ if (_services.empty()) { finished = true; } }); std::this_thread::sleep_for(std::chrono::seconds(1)); } stop(); #endif } void npdu_test_rmd::join_shutdown_thread() { shutdown_thread_.join(); } void npdu_test_rmd::run() { std::unique_lock its_lock(mutex_); while (!blocked_) condition_.wait(its_lock); #ifdef RMD_CLIENT_SIDE app_->offer_service(npdu_test::RMD_SERVICE_ID_CLIENT_SIDE, npdu_test::RMD_INSTANCE_ID); #elif defined (RMD_SERVICE_SIDE) app_->offer_service(npdu_test::RMD_SERVICE_ID_SERVICE_SIDE, npdu_test::RMD_INSTANCE_ID); #endif } TEST(someip_npdu_test, offer_routing_manager_functionality) { npdu_test_rmd daemon; daemon.init(); daemon.start(); } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }