summaryrefslogtreecommitdiff
path: root/test/network_tests/npdu_tests/npdu_test_rmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/network_tests/npdu_tests/npdu_test_rmd.cpp')
-rw-r--r--test/network_tests/npdu_tests/npdu_test_rmd.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/test/network_tests/npdu_tests/npdu_test_rmd.cpp b/test/network_tests/npdu_tests/npdu_test_rmd.cpp
new file mode 100644
index 0000000..8e5451b
--- /dev/null
+++ b/test/network_tests/npdu_tests/npdu_test_rmd.cpp
@@ -0,0 +1,160 @@
+// 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 <atomic>
+
+#include "../npdu_tests/npdu_test_rmd.hpp"
+
+#include <vsomeip/internal/logger.hpp>
+#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<std::mutex> 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<std::mutex> 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<vsomeip::message>& _request) {
+ (void)_request;
+ std::shared_ptr<vsomeip::message> request = vsomeip::runtime::get()->create_request(false);
+#ifdef RMD_CLIENT_SIDE
+ static uint32_t 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<bool> finished(false);
+ for (int i = 0; !finished && i < 20; i++) {
+ app_->get_offered_services_async(
+ vsomeip::offer_type_e::OT_REMOTE,
+ [&](const std::vector<std::pair<vsomeip::service_t,
+ vsomeip::instance_t>> &_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<std::mutex> 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();
+}
+
+