• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
2 // This Source Code Form is subject to the terms of the Mozilla Public
3 // License, v. 2.0. If a copy of the MPL was not distributed with this
4 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 
6 #include <gtest/gtest.h>
7 
8 #include <vsomeip/vsomeip.hpp>
9 
10 #include <thread>
11 #include <mutex>
12 #include <condition_variable>
13 #include <functional>
14 #include <numeric>
15 #include <cmath> // for isfinite
16 
17 #include "cpu_load_test_globals.hpp"
18 #include <vsomeip/internal/logger.hpp>
19 #include "cpu_load_measurer.hpp"
20 
21 // for getpid
22 #include <sys/types.h>
23 #include <unistd.h>
24 
25 class cpu_load_test_service
26 {
27 public:
cpu_load_test_service()28     cpu_load_test_service() :
29                     app_(vsomeip::runtime::get()->create_application("cpu_load_test_service")),
30                     is_registered_(false),
31                     blocked_(false),
32                     number_of_received_messages_(0),
33                     number_of_received_messages_total_(0),
34                     load_measurer_(static_cast<std::uint32_t>(::getpid())),
35                     offer_thread_(std::bind(&cpu_load_test_service::run, this))
36     {
37     }
38 
~cpu_load_test_service()39     ~cpu_load_test_service() {
40         {
41             std::lock_guard<std::mutex> its_lock(mutex_);
42             blocked_ = true;
43             condition_.notify_one();
44         }
45         offer_thread_.join();
46     }
47 
init()48     bool init()
49     {
50         std::lock_guard<std::mutex> its_lock(mutex_);
51 
52         if (!app_->init()) {
53             ADD_FAILURE() << "Couldn't initialize application";
54             return false;
55         }
56         app_->register_message_handler(cpu_load_test::service_id,
57                 cpu_load_test::instance_id, cpu_load_test::method_id,
58                 std::bind(&cpu_load_test_service::on_message, this,
59                         std::placeholders::_1));
60 
61         app_->register_message_handler(cpu_load_test::service_id,
62                 cpu_load_test::instance_id, cpu_load_test::method_id_shutdown,
63                 std::bind(&cpu_load_test_service::on_message_shutdown, this,
64                         std::placeholders::_1));
65         app_->register_message_handler(cpu_load_test::service_id,
66                 cpu_load_test::instance_id, cpu_load_test::method_id_cpu_measure_start,
67                 std::bind(&cpu_load_test_service::on_message_start_measuring, this,
68                         std::placeholders::_1));
69         app_->register_message_handler(cpu_load_test::service_id,
70                 cpu_load_test::instance_id, cpu_load_test::method_id_cpu_measure_stop,
71                 std::bind(&cpu_load_test_service::on_message_stop_measuring, this,
72                         std::placeholders::_1));
73         app_->register_state_handler(
74                 std::bind(&cpu_load_test_service::on_state, this,
75                         std::placeholders::_1));
76         return true;
77     }
78 
start()79     void start()
80     {
81         VSOMEIP_INFO << "Starting...";
82         app_->start();
83     }
84 
stop()85     void stop()
86     {
87         VSOMEIP_INFO << "Stopping...";
88         app_->stop_offer_service(cpu_load_test::service_id, cpu_load_test::instance_id);
89         app_->clear_all_handler();
90         app_->stop();
91     }
92 
on_state(vsomeip::state_type_e _state)93     void on_state(vsomeip::state_type_e _state)
94     {
95         VSOMEIP_INFO << "Application " << app_->get_name() << " is "
96                 << (_state == vsomeip::state_type_e::ST_REGISTERED ? "registered." :
97                         "deregistered.");
98 
99         if(_state == vsomeip::state_type_e::ST_REGISTERED)
100         {
101             if(!is_registered_)
102             {
103                 is_registered_ = true;
104                 std::lock_guard<std::mutex> its_lock(mutex_);
105                 blocked_ = true;
106                 // "start" the run method thread
107                 condition_.notify_one();
108             }
109         }
110         else
111         {
112             is_registered_ = false;
113         }
114     }
115 
on_message(const std::shared_ptr<vsomeip::message> & _request)116     void on_message(const std::shared_ptr<vsomeip::message>& _request)
117     {
118         number_of_received_messages_++;
119         number_of_received_messages_total_++;
120         // send response
121         app_->send(vsomeip::runtime::get()->create_response(_request));
122     }
123 
on_message_start_measuring(const std::shared_ptr<vsomeip::message> & _request)124     void on_message_start_measuring(const std::shared_ptr<vsomeip::message>& _request)
125     {
126         (void)_request;
127         load_measurer_.start();
128     }
129 
on_message_stop_measuring(const std::shared_ptr<vsomeip::message> & _request)130     void on_message_stop_measuring(const std::shared_ptr<vsomeip::message>& _request)
131     {
132         (void)_request;
133         load_measurer_.stop();
134         VSOMEIP_DEBUG << "Received " << std::setw(4) << std::setfill('0')
135         << number_of_received_messages_ << " messages. CPU load [%]: "
136         << std::fixed << std::setprecision(2)
137         << (std::isfinite(load_measurer_.get_cpu_load()) ? load_measurer_.get_cpu_load() : 0.0);
138         results_.push_back(std::isfinite(load_measurer_.get_cpu_load()) ? load_measurer_.get_cpu_load() : 0.0);
139         number_of_received_messages_ = 0;
140     }
141 
on_message_shutdown(const std::shared_ptr<vsomeip::message> & _request)142     void on_message_shutdown(
143             const std::shared_ptr<vsomeip::message>& _request)
144     {
145         (void)_request;
146         VSOMEIP_INFO << "Shutdown method was called, going down now.";
147         const double average_load(std::accumulate(results_.begin(), results_.end(), 0.0) / static_cast<double>(results_.size()));
148         VSOMEIP_INFO << "Received: " << number_of_received_messages_total_
149             << " in total (excluding control messages). This caused: "
150             << std::fixed << std::setprecision(2)
151             << average_load << "% load in average (average of "
152             << results_.size() << " measurements).";
153 
154         std::vector<double> results_no_zero;
155         for(const auto &v : results_) {
156             if(v > 0.0) {
157                 results_no_zero.push_back(v);
158             }
159         }
160         const double average_load_no_zero(std::accumulate(results_no_zero.begin(), results_no_zero.end(), 0.0) / static_cast<double>(results_no_zero.size()));
161         VSOMEIP_INFO << "Sent: " << number_of_received_messages_total_
162             << " messages in total (excluding control messages). This caused: "
163             << std::fixed << std::setprecision(2)
164             << average_load_no_zero << "% load in average, if measured cpu load "
165             << "was greater zero (average of "
166             << results_no_zero.size() << " measurements).";
167         stop();
168     }
169 
run()170     void run()
171     {
172         std::unique_lock<std::mutex> its_lock(mutex_);
173         while (!blocked_) {
174             condition_.wait(its_lock);
175         }
176 
177         app_->offer_service(cpu_load_test::service_id, cpu_load_test::instance_id);
178     }
179 
180 private:
181     std::shared_ptr<vsomeip::application> app_;
182     bool is_registered_;
183 
184     std::mutex mutex_;
185     std::condition_variable condition_;
186     bool blocked_;
187     std::uint32_t number_of_received_messages_;
188     std::uint32_t number_of_received_messages_total_;
189     cpu_load_measurer load_measurer_;
190     std::vector<double> results_;
191     std::thread offer_thread_;
192 };
193 
194 
TEST(someip_payload_test,DISABLED_send_response_for_every_request)195 TEST(someip_payload_test, DISABLED_send_response_for_every_request)
196 {
197     cpu_load_test_service test_service;
198     if (test_service.init()) {
199         test_service.start();
200     }
201 }
202 
203 #ifndef _WIN32
main(int argc,char ** argv)204 int main(int argc, char** argv)
205 {
206     ::testing::InitGoogleTest(&argc, argv);
207     return RUN_ALL_TESTS();
208 }
209 #endif
210