12
12
#include < map>
13
13
#include < algorithm>
14
14
#include < atomic>
15
+ #include < future>
15
16
16
17
#include < gtest/gtest.h>
17
18
@@ -76,13 +77,17 @@ class offered_services_info_test_client {
76
77
std::bind (&offered_services_info_test_client::on_message, this ,
77
78
std::placeholders::_1));
78
79
79
- app_->register_availability_handler (service_info_. service_id ,
80
- service_info_. instance_id ,
80
+ app_->register_availability_handler (vsomeip::ANY_SERVICE ,
81
+ vsomeip::ANY_INSTANCE ,
81
82
std::bind (&offered_services_info_test_client::on_availability, this ,
82
83
std::placeholders::_1, std::placeholders::_2,
83
84
std::placeholders::_3));
84
- app_->request_service (service_info_.service_id ,
85
- service_info_.instance_id );
85
+ // request all services
86
+ app_->request_service (service_info_.service_id , service_info_.instance_id );
87
+ app_->request_service (service_info_.service_id , vsomeip::instance_t (service_info_.instance_id + 1 ));
88
+ app_->request_service (remote_service_info_.service_id , remote_service_info_.instance_id );
89
+ app_->request_service (vsomeip::service_t (remote_service_info_.service_id + 1 ), vsomeip::instance_t (remote_service_info_.instance_id + 1 ));
90
+ app_->request_service (vsomeip::service_t (remote_service_info_.service_id + 2 ), vsomeip::instance_t (remote_service_info_.instance_id + 2 ));
86
91
87
92
app_->start ();
88
93
}
@@ -109,10 +114,14 @@ class offered_services_info_test_client {
109
114
VSOMEIP_INFO << " Service [" << std::setw (4 )
110
115
<< std::setfill (' 0' ) << std::hex << _service << " ." << _instance
111
116
<< " ] is " << (_is_available ? " available" :" not available" ) << " ." ;
117
+ static int services_available =0 ;
112
118
std::lock_guard<std::mutex> its_lock (mutex_);
113
119
if (_is_available) {
114
- wait_until_service_available_ = false ;
115
- condition_.notify_one ();
120
+ services_available++;
121
+ if (services_available == 5 ) {
122
+ wait_until_service_available_ = false ;
123
+ condition_.notify_one ();
124
+ }
116
125
} else {
117
126
wait_until_service_available_ = true ;
118
127
condition_.notify_one ();
@@ -165,28 +174,16 @@ class offered_services_info_test_client {
165
174
VSOMEIP_INFO << " TEST LOCAL SERVICES" ;
166
175
app_->get_offered_services_async (vsomeip::offer_type_e::OT_LOCAL, std::bind (&offered_services_info_test_client::on_offered_services_local, this , std::placeholders::_1));
167
176
168
- VSOMEIP_INFO << " TEST REMOTE SERVICES" ;
169
- app_->get_offered_services_async (vsomeip::offer_type_e::OT_REMOTE, std::bind (&offered_services_info_test_client::on_offered_services_remote, this , std::placeholders::_1));
170
-
171
- VSOMEIP_INFO << " TEST ALL SERVICES" ;
172
- app_->get_offered_services_async (vsomeip::offer_type_e::OT_ALL, std::bind (&offered_services_info_test_client::on_offered_services_all, this , std::placeholders::_1));
173
-
174
-
175
177
// send shutdown command to service
176
- bool send (false );
177
- {
178
- std::lock_guard<std::mutex> its_lock (mutex_);
179
- send = !wait_until_service_available_;
180
- }
181
- if (send) {
178
+ if (std::future_status::timeout == all_callbacks_received_.get_future ().wait_for (std::chrono::seconds (15 ))) {
179
+ ADD_FAILURE () << " Didn't receive all callbacks within time" ;
180
+ } else {
182
181
std::shared_ptr<vsomeip::message> its_req = vsomeip::runtime::get ()->create_request ();
183
182
its_req->set_service (service_info_.service_id );
184
183
its_req->set_instance (service_info_.instance_id );
185
184
its_req->set_method (service_info_.shutdown_method_id );
186
185
app_->send (its_req);
187
186
std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
188
- } else {
189
- std::this_thread::sleep_for (std::chrono::milliseconds (50 ));
190
187
}
191
188
192
189
@@ -201,6 +198,7 @@ class offered_services_info_test_client {
201
198
202
199
void on_offered_services_local ( const std::vector<std::pair<vsomeip::service_t , vsomeip::instance_t >> &_services) {
203
200
std::cout << " ON OFFERED SERVICES LOCAL CALLBACK START" << std::endl;
201
+ EXPECT_EQ (2u , _services.size ());
204
202
bool local_service_test_failed (true );
205
203
for (auto its_pair : _services) {
206
204
local_service_test_failed = true ;
@@ -215,10 +213,13 @@ class offered_services_info_test_client {
215
213
EXPECT_FALSE (local_service_test_failed);
216
214
}
217
215
std::cout << " ON OFFERED SERVICES LOCAL CALLBACK END" << std::endl;
216
+ VSOMEIP_INFO << " TEST REMOTE SERVICES" ;
217
+ app_->get_offered_services_async (vsomeip::offer_type_e::OT_REMOTE, std::bind (&offered_services_info_test_client::on_offered_services_remote, this , std::placeholders::_1));
218
218
}
219
219
220
220
void on_offered_services_remote ( const std::vector<std::pair<vsomeip::service_t , vsomeip::instance_t >> &_services) {
221
221
std::cout << " ON OFFERED SERVICES REMOTE CALLBACK START" << std::endl;
222
+ EXPECT_EQ (3u , _services.size ());
222
223
bool remote_service_test_failed (true );
223
224
for (auto its_pair : _services) {
224
225
remote_service_test_failed = true ;
@@ -233,10 +234,13 @@ class offered_services_info_test_client {
233
234
EXPECT_FALSE (remote_service_test_failed);
234
235
}
235
236
std::cout << " ON OFFERED SERVICES REMOTE CALLBACK END" << std::endl;
237
+ VSOMEIP_INFO << " TEST ALL SERVICES" ;
238
+ app_->get_offered_services_async (vsomeip::offer_type_e::OT_ALL, std::bind (&offered_services_info_test_client::on_offered_services_all, this , std::placeholders::_1));
236
239
}
237
240
238
241
void on_offered_services_all ( const std::vector<std::pair<vsomeip::service_t , vsomeip::instance_t >> &_services) {
239
242
std::cout << " ON OFFERED SERVICES ALL CALLBACK START" << std::endl;
243
+ EXPECT_EQ (5u , _services.size ());
240
244
bool all_service_test_failed (true );
241
245
for (auto its_pair : _services) {
242
246
all_service_test_failed = true ;
@@ -251,6 +255,7 @@ class offered_services_info_test_client {
251
255
EXPECT_FALSE (all_service_test_failed);
252
256
}
253
257
std::cout << " ON OFFERED SERVICES ALL CALLBACK END" << std::endl;
258
+ all_callbacks_received_.set_value ();
254
259
}
255
260
256
261
void wait_for_stop () {
@@ -282,6 +287,7 @@ class offered_services_info_test_client {
282
287
std::uint32_t last_received_counter_;
283
288
std::chrono::steady_clock::time_point last_received_response_;
284
289
std::atomic<std::uint32_t > number_received_responses_;
290
+ std::promise<void > all_callbacks_received_;
285
291
std::thread stop_thread_;
286
292
std::thread test_offered_services_thread_;
287
293
};
0 commit comments