blob: a8de2fc85f1a99c76366174a756e1d638bb75680 [file] [log] [blame]
Jack Hef3175622016-12-08 19:29:00 -08001/******************************************************************************
2 *
3 * Copyright (C) 2016 Google, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18#include <chrono>
19#include <cstdint>
20#include <string>
21#include <thread>
22#include <vector>
23
24#include <gmock/gmock.h>
25#include <gtest/gtest.h>
26
27#include <base/logging.h>
28
29#include "osi/include/metrics.h"
30#include "osi/include/time.h"
Jack Hee2eeff42016-12-07 18:25:17 -080031#include "src/protos/bluetooth.pb.h"
Jack Hef3175622016-12-08 19:29:00 -080032
33#define BTM_COD_MAJOR_AUDIO_TEST 0x04
34
35namespace testing {
36
37using clearcut::connectivity::A2DPSession;
38using clearcut::connectivity::BluetoothLog;
39using clearcut::connectivity::BluetoothSession;
40using clearcut::connectivity::BluetoothSession_ConnectionTechnologyType;
Jack Hea3f831c2017-01-17 15:41:30 -080041using clearcut::connectivity::BluetoothSession_DisconnectReasonType;
Jack Hef3175622016-12-08 19:29:00 -080042using clearcut::connectivity::DeviceInfo;
43using clearcut::connectivity::DeviceInfo_DeviceType;
44using clearcut::connectivity::PairEvent;
45using clearcut::connectivity::RFCommSession;
46using clearcut::connectivity::ScanEvent;
47using clearcut::connectivity::ScanEvent_ScanTechnologyType;
48using clearcut::connectivity::ScanEvent_ScanEventType;
49using clearcut::connectivity::WakeEvent;
50using clearcut::connectivity::WakeEvent_WakeEventType;
51using system_bt_osi::BluetoothMetricsLogger;
52using system_bt_osi::A2dpSessionMetrics;
53
Jack Hea3f831c2017-01-17 15:41:30 -080054namespace {
55const size_t kMaxEventGenerationLimit = 5000;
56}
57
Jack Hef3175622016-12-08 19:29:00 -080058/*
59 * Get current OS boot time in ms
60 */
61static int64_t time_get_os_boottime_ms(void) {
62 return time_get_os_boottime_us() / 1000;
63}
64
65static void sleep_ms(int64_t t) {
66 std::this_thread::sleep_for(std::chrono::milliseconds(t));
67}
68
69DeviceInfo* MakeDeviceInfo(int32_t device_class,
70 DeviceInfo_DeviceType device_type) {
71 DeviceInfo* info = new DeviceInfo();
72 info->set_device_class(device_class);
73 info->set_device_type(device_type);
74 return info;
75}
76
77PairEvent* MakePairEvent(int32_t disconnect_reason, int64_t timestamp_ms,
78 DeviceInfo* device_info) {
79 PairEvent* event = new PairEvent();
80 event->set_disconnect_reason(disconnect_reason);
81 event->set_event_time_millis(timestamp_ms);
82 if (device_info) event->set_allocated_device_paired_with(device_info);
83 return event;
84}
85
86WakeEvent* MakeWakeEvent(WakeEvent_WakeEventType event_type,
87 const std::string& requestor, const std::string& name,
88 int64_t timestamp_ms) {
89 WakeEvent* event = new WakeEvent();
90 event->set_wake_event_type(event_type);
91 event->set_requestor(requestor);
92 event->set_name(name);
93 event->set_event_time_millis(timestamp_ms);
94 return event;
95}
96
97ScanEvent* MakeScanEvent(ScanEvent_ScanEventType event_type,
98 const std::string& initiator,
99 ScanEvent_ScanTechnologyType tech_type,
100 int32_t num_results, int64_t timestamp_ms) {
101 ScanEvent* event = new ScanEvent();
102 event->set_scan_event_type(event_type);
103 event->set_initiator(initiator);
104 event->set_scan_technology_type(tech_type);
105 event->set_number_results(num_results);
106 event->set_event_time_millis(timestamp_ms);
107 return event;
108}
109
110A2DPSession* MakeA2DPSession(const A2dpSessionMetrics& metrics) {
111 A2DPSession* session = new A2DPSession();
112 session->set_media_timer_min_millis(metrics.media_timer_min_ms);
113 session->set_media_timer_max_millis(metrics.media_timer_max_ms);
114 session->set_media_timer_avg_millis(metrics.media_timer_avg_ms);
115 session->set_buffer_overruns_max_count(metrics.buffer_overruns_max_count);
116 session->set_buffer_overruns_total(metrics.buffer_overruns_total);
117 session->set_buffer_underruns_average(metrics.buffer_underruns_average);
118 session->set_buffer_underruns_count(metrics.buffer_underruns_count);
119 session->set_audio_duration_millis(metrics.audio_duration_ms);
120 return session;
121}
122
123BluetoothSession* MakeBluetoothSession(
124 int64_t session_duration_sec,
125 BluetoothSession_ConnectionTechnologyType conn_type,
Jack Hea3f831c2017-01-17 15:41:30 -0800126 BluetoothSession_DisconnectReasonType disconnect_reason,
127 DeviceInfo* device_info, RFCommSession* rfcomm_session,
128 A2DPSession* a2dp_session) {
Jack Hef3175622016-12-08 19:29:00 -0800129 BluetoothSession* session = new BluetoothSession();
130 if (a2dp_session) session->set_allocated_a2dp_session(a2dp_session);
131 if (rfcomm_session) session->set_allocated_rfcomm_session(rfcomm_session);
132 if (device_info) session->set_allocated_device_connected_to(device_info);
133 session->set_session_duration_sec(session_duration_sec);
134 session->set_connection_technology_type(conn_type);
Jack Hea3f831c2017-01-17 15:41:30 -0800135 session->set_disconnect_reason_type(disconnect_reason);
Jack Hef3175622016-12-08 19:29:00 -0800136 return session;
137}
138
139BluetoothLog* MakeBluetoothLog(std::vector<BluetoothSession*> bt_sessions,
140 std::vector<PairEvent*> pair_events,
141 std::vector<WakeEvent*> wake_events,
142 std::vector<ScanEvent*> scan_events) {
143 BluetoothLog* bt_log = new BluetoothLog();
144 for (BluetoothSession* session : bt_sessions) {
145 bt_log->mutable_session()->AddAllocated(session);
146 }
147 bt_sessions.clear();
148 for (PairEvent* event : pair_events) {
149 bt_log->mutable_pair_event()->AddAllocated(event);
150 }
151 pair_events.clear();
152 for (WakeEvent* event : wake_events) {
153 bt_log->mutable_wake_event()->AddAllocated(event);
154 }
155 wake_events.clear();
156 for (ScanEvent* event : scan_events) {
157 bt_log->mutable_scan_event()->AddAllocated(event);
158 }
159 scan_events.clear();
160 return bt_log;
161}
162
Jack Hea3f831c2017-01-17 15:41:30 -0800163void GenerateWakeEvents(size_t start, size_t end,
Jack Hef3175622016-12-08 19:29:00 -0800164 std::vector<WakeEvent*>* wake_events) {
Jack Hea3f831c2017-01-17 15:41:30 -0800165 for (size_t i = start; i < end; ++i) {
Jack Hef3175622016-12-08 19:29:00 -0800166 wake_events->push_back(MakeWakeEvent(
167 i % 2 == 0 ? WakeEvent_WakeEventType::WakeEvent_WakeEventType_ACQUIRED
168 : WakeEvent_WakeEventType::WakeEvent_WakeEventType_RELEASED,
169 "TEST_REQ", "TEST_NAME", i));
170 }
171}
172
173#define COMPARE_A2DP_METRICS(a, b) \
174 do { \
175 EXPECT_EQ(a.audio_duration_ms, b.audio_duration_ms); \
176 EXPECT_EQ(a.media_timer_min_ms, b.media_timer_min_ms); \
177 EXPECT_EQ(a.media_timer_max_ms, b.media_timer_max_ms); \
178 EXPECT_EQ(a.media_timer_avg_ms, b.media_timer_avg_ms); \
179 EXPECT_EQ(a.total_scheduling_count, b.total_scheduling_count); \
180 EXPECT_EQ(a.buffer_overruns_max_count, b.buffer_overruns_max_count); \
181 EXPECT_EQ(a.buffer_overruns_total, b.buffer_overruns_total); \
182 EXPECT_THAT(a.buffer_underruns_average, \
183 FloatNear(b.buffer_underruns_average, 0.01)); \
184 a.buffer_underruns_average = b.buffer_underruns_average; \
185 EXPECT_EQ(a.buffer_underruns_count, b.buffer_underruns_count); \
186 } while (0)
187
188/*
189 * metrics_sum = metrics1 + metrics2
190 */
191TEST(BluetoothA2DPSessionMetricsTest, TestUpdateNormal) {
192 A2dpSessionMetrics metrics1;
193 A2dpSessionMetrics metrics2;
194 A2dpSessionMetrics metrics_sum;
195 metrics1.audio_duration_ms = 10;
196 metrics2.audio_duration_ms = 25;
197 metrics_sum.audio_duration_ms = 35;
198 metrics1.media_timer_min_ms = 10;
199 metrics2.media_timer_min_ms = 25;
200 metrics_sum.media_timer_min_ms = 10;
201 metrics1.media_timer_max_ms = 100;
202 metrics2.media_timer_max_ms = 200;
203 metrics_sum.media_timer_max_ms = 200;
204 metrics1.media_timer_avg_ms = 50;
205 metrics1.total_scheduling_count = 50;
206 metrics2.media_timer_avg_ms = 100;
207 metrics2.total_scheduling_count = 50;
208 metrics_sum.media_timer_avg_ms = 75;
209 metrics_sum.total_scheduling_count = 100;
210 metrics1.buffer_overruns_max_count = 70;
211 metrics2.buffer_overruns_max_count = 80;
212 metrics_sum.buffer_overruns_max_count = 80;
213 metrics1.buffer_underruns_average = 80;
214 metrics1.buffer_underruns_count = 1200;
215 metrics2.buffer_underruns_average = 130;
216 metrics2.buffer_underruns_count = 2400;
217 metrics_sum.buffer_underruns_average = 113.33333333;
218 metrics_sum.buffer_underruns_count = 3600;
219 metrics1.Update(metrics2);
220 COMPARE_A2DP_METRICS(metrics1, metrics_sum);
221 EXPECT_TRUE(metrics1 == metrics_sum);
222 EXPECT_EQ(metrics1, metrics_sum);
223}
224
225TEST(BluetoothA2DPSessionMetricsTest, TestUpdateNew) {
226 A2dpSessionMetrics metrics1;
227 A2dpSessionMetrics metrics2;
228 A2dpSessionMetrics metrics_sum;
229 metrics2.audio_duration_ms = 25;
230 metrics_sum.audio_duration_ms = 25;
231 metrics2.media_timer_min_ms = 25;
232 metrics_sum.media_timer_min_ms = 25;
233 metrics2.media_timer_max_ms = 200;
234 metrics_sum.media_timer_max_ms = 200;
235 metrics2.media_timer_avg_ms = 100;
236 metrics2.total_scheduling_count = 50;
237 metrics_sum.media_timer_avg_ms = 100;
238 metrics_sum.total_scheduling_count = 50;
239 metrics2.buffer_overruns_max_count = 80;
240 metrics_sum.buffer_overruns_max_count = 80;
241 metrics2.buffer_underruns_average = 130;
242 metrics2.buffer_underruns_count = 2400;
243 metrics_sum.buffer_underruns_average = 130;
244 metrics_sum.buffer_underruns_count = 2400;
245 metrics1.Update(metrics2);
246 COMPARE_A2DP_METRICS(metrics1, metrics_sum);
247 EXPECT_TRUE(metrics1 == metrics_sum);
248 EXPECT_EQ(metrics1, metrics_sum);
249}
250
251TEST(BluetoothA2DPSessionMetricsTest, TestNullUpdate) {
252 A2dpSessionMetrics metrics1;
253 A2dpSessionMetrics metrics2;
254 A2dpSessionMetrics metrics_sum;
255 metrics2.audio_duration_ms = 25;
256 metrics_sum.audio_duration_ms = 25;
257 metrics2.media_timer_min_ms = 25;
258 metrics_sum.media_timer_min_ms = 25;
259 metrics2.media_timer_max_ms = 200;
260 metrics_sum.media_timer_max_ms = 200;
261 metrics2.media_timer_avg_ms = 100;
262 metrics2.total_scheduling_count = 50;
263 metrics_sum.media_timer_avg_ms = 100;
264 metrics_sum.total_scheduling_count = 50;
265 metrics2.buffer_overruns_max_count = 80;
266 metrics_sum.buffer_overruns_max_count = 80;
267 metrics2.buffer_underruns_average = 130;
268 metrics2.buffer_underruns_count = 2400;
269 metrics_sum.buffer_underruns_average = 130;
270 metrics_sum.buffer_underruns_count = 2400;
271 metrics2.Update(metrics1);
272 COMPARE_A2DP_METRICS(metrics2, metrics_sum);
273 EXPECT_TRUE(metrics2 == metrics_sum);
274 EXPECT_EQ(metrics2, metrics_sum);
275}
276
277TEST(BluetoothA2DPSessionMetricsTest, TestPartialUpdate) {
278 A2dpSessionMetrics metrics1;
279 A2dpSessionMetrics metrics2;
280 A2dpSessionMetrics metrics_sum;
281 metrics1.audio_duration_ms = 10;
282 metrics2.audio_duration_ms = 25;
283 metrics_sum.audio_duration_ms = 35;
284 metrics1.media_timer_min_ms = 10;
285 metrics_sum.media_timer_min_ms = 10;
286 metrics1.media_timer_max_ms = 100;
287 metrics_sum.media_timer_max_ms = 100;
288 metrics1.media_timer_avg_ms = 50;
289 metrics1.total_scheduling_count = 50;
290 metrics2.media_timer_avg_ms = 100;
291 metrics_sum.media_timer_avg_ms = 50;
292 metrics_sum.total_scheduling_count = 50;
293 metrics1.buffer_overruns_max_count = 70;
294 metrics_sum.buffer_overruns_max_count = 70;
295 metrics1.buffer_underruns_average = 80;
296 metrics1.buffer_underruns_count = 1200;
297 metrics2.buffer_underruns_count = 2400;
298 metrics_sum.buffer_underruns_average = 80;
299 metrics_sum.buffer_underruns_count = 1200;
300 metrics1.Update(metrics2);
301 COMPARE_A2DP_METRICS(metrics1, metrics_sum);
302 EXPECT_TRUE(metrics1 == metrics_sum);
303 EXPECT_EQ(metrics1, metrics_sum);
304}
305
306class BluetoothMetricsLoggerTest : public Test {
307 protected:
308 // Use to hold test protos
309 std::vector<PairEvent*> pair_events_;
310 std::vector<WakeEvent*> wake_events_;
311 std::vector<ScanEvent*> scan_events_;
312 std::vector<BluetoothSession*> bt_sessions_;
Jack Hea3f831c2017-01-17 15:41:30 -0800313 int64_t num_pair_event_ = 0;
314 int64_t num_wake_event_ = 0;
315 int64_t num_scan_event_ = 0;
316 int64_t num_bt_session_ = 0;
Jack Hef3175622016-12-08 19:29:00 -0800317 BluetoothLog* bt_log_;
318 std::string bt_log_str_;
319 std::string bt_log_ascii_str_;
320
321 void UpdateLog() {
322 for (BluetoothSession* session : bt_sessions_) {
323 bt_log_->mutable_session()->AddAllocated(session);
324 }
Jack Hea3f831c2017-01-17 15:41:30 -0800325 if (num_bt_session_ > 0) {
326 bt_log_->set_num_bluetooth_session(num_bt_session_);
327 } else if (bt_sessions_.size() > 0) {
328 bt_log_->set_num_bluetooth_session(bt_sessions_.size());
329 }
Jack Hef3175622016-12-08 19:29:00 -0800330 bt_sessions_.clear();
331 for (PairEvent* event : pair_events_) {
332 bt_log_->mutable_pair_event()->AddAllocated(event);
333 }
Jack Hea3f831c2017-01-17 15:41:30 -0800334 if (num_pair_event_ > 0) {
335 bt_log_->set_num_pair_event(num_pair_event_);
336 } else if (pair_events_.size() > 0) {
337 bt_log_->set_num_pair_event(pair_events_.size());
338 }
Jack Hef3175622016-12-08 19:29:00 -0800339 pair_events_.clear();
340 for (WakeEvent* event : wake_events_) {
341 bt_log_->mutable_wake_event()->AddAllocated(event);
342 }
Jack Hea3f831c2017-01-17 15:41:30 -0800343 if (num_wake_event_ > 0) {
344 bt_log_->set_num_wake_event(num_wake_event_);
345 } else if (wake_events_.size() > 0) {
346 bt_log_->set_num_wake_event(wake_events_.size());
347 }
Jack Hef3175622016-12-08 19:29:00 -0800348 wake_events_.clear();
349 for (ScanEvent* event : scan_events_) {
350 bt_log_->mutable_scan_event()->AddAllocated(event);
351 }
Jack Hea3f831c2017-01-17 15:41:30 -0800352 if (num_scan_event_ > 0) {
353 bt_log_->set_num_scan_event(num_scan_event_);
354 } else if (scan_events_.size() > 0) {
355 bt_log_->set_num_scan_event(scan_events_.size());
356 }
Jack Hef3175622016-12-08 19:29:00 -0800357 scan_events_.clear();
358 bt_log_->SerializeToString(&bt_log_str_);
359 }
360
361 void ClearLog() {
362 for (BluetoothSession* session : bt_sessions_) {
363 session->Clear();
364 delete session;
365 }
366 bt_sessions_.clear();
367 for (PairEvent* event : pair_events_) {
368 event->Clear();
369 delete event;
370 }
371 pair_events_.clear();
372 for (WakeEvent* event : wake_events_) {
373 event->Clear();
374 delete event;
375 }
376 wake_events_.clear();
377 for (ScanEvent* event : scan_events_) {
378 event->Clear();
379 delete event;
380 }
381 scan_events_.clear();
382 bt_log_->Clear();
383 }
384
385 void SetUp() {
386 bt_log_ = new BluetoothLog();
387 // Clear existing metrics entries, if any
388 BluetoothMetricsLogger::GetInstance()->Reset();
389 }
390 void TearDown() {
391 // Clear remaining metrics entries, if any
392 BluetoothMetricsLogger::GetInstance()->Reset();
393 ClearLog();
394 delete bt_log_;
395 }
396
397 public:
398};
399
400TEST_F(BluetoothMetricsLoggerTest, PairEventTest) {
401 pair_events_.push_back(MakePairEvent(
402 35, 12345,
403 MakeDeviceInfo(
404 42, DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR)));
405 UpdateLog();
406 BluetoothMetricsLogger::GetInstance()->LogPairEvent(
407 35, 12345, 42, system_bt_osi::DEVICE_TYPE_BREDR);
408 std::string msg_str;
409 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
410 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
411}
412
413TEST_F(BluetoothMetricsLoggerTest, WakeEventTest) {
414 wake_events_.push_back(
415 MakeWakeEvent(WakeEvent_WakeEventType::WakeEvent_WakeEventType_ACQUIRED,
416 "TEST_REQ", "TEST_NAME", 12345));
417 UpdateLog();
418 BluetoothMetricsLogger::GetInstance()->LogWakeEvent(
419 system_bt_osi::WAKE_EVENT_ACQUIRED, "TEST_REQ", "TEST_NAME", 12345);
420 std::string msg_str;
421 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
422 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
423}
424
Jack Hea3f831c2017-01-17 15:41:30 -0800425TEST_F(BluetoothMetricsLoggerTest, WakeEventOverrunTest) {
426 GenerateWakeEvents(
427 kMaxEventGenerationLimit - BluetoothMetricsLogger::kMaxNumWakeEvent,
428 kMaxEventGenerationLimit, &wake_events_);
429 num_wake_event_ = kMaxEventGenerationLimit;
Jack Hef3175622016-12-08 19:29:00 -0800430 UpdateLog();
Jack Hea3f831c2017-01-17 15:41:30 -0800431 for (size_t i = 0; i < kMaxEventGenerationLimit; ++i) {
Jack Hef3175622016-12-08 19:29:00 -0800432 BluetoothMetricsLogger::GetInstance()->LogWakeEvent(
433 i % 2 == 0 ? system_bt_osi::WAKE_EVENT_ACQUIRED
434 : system_bt_osi::WAKE_EVENT_RELEASED,
435 "TEST_REQ", "TEST_NAME", i);
436 }
437 std::string msg_str;
438 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
439 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
440}
441
442TEST_F(BluetoothMetricsLoggerTest, ScanEventTest) {
443 scan_events_.push_back(MakeScanEvent(
444 ScanEvent_ScanEventType::ScanEvent_ScanEventType_SCAN_EVENT_STOP,
445 "TEST_INITIATOR", ScanEvent_ScanTechnologyType::
446 ScanEvent_ScanTechnologyType_SCAN_TECH_TYPE_BREDR,
447 42, 123456));
448 UpdateLog();
449 BluetoothMetricsLogger::GetInstance()->LogScanEvent(
450 false, "TEST_INITIATOR", system_bt_osi::SCAN_TECH_TYPE_BREDR, 42, 123456);
451 std::string msg_str;
452 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
453 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
454}
455
456TEST_F(BluetoothMetricsLoggerTest, BluetoothSessionTest) {
457 bt_sessions_.push_back(MakeBluetoothSession(
458 10,
459 BluetoothSession_ConnectionTechnologyType::
460 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_LE,
Jack Hea3f831c2017-01-17 15:41:30 -0800461 BluetoothSession_DisconnectReasonType::
462 BluetoothSession_DisconnectReasonType_UNKNOWN,
463 nullptr, nullptr, nullptr));
Jack Hef3175622016-12-08 19:29:00 -0800464 UpdateLog();
465 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
466 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_LE, 123456);
467 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionEnd(
Jack Hea3f831c2017-01-17 15:41:30 -0800468 system_bt_osi::DISCONNECT_REASON_UNKNOWN, 133456);
Jack Hef3175622016-12-08 19:29:00 -0800469 std::string msg_str;
470 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
471 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
472}
473
474TEST_F(BluetoothMetricsLoggerTest, BluetoothSessionDumpBeforeEndTest) {
475 bt_sessions_.push_back(MakeBluetoothSession(
476 1,
477 BluetoothSession_ConnectionTechnologyType::
478 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_LE,
Jack Hea3f831c2017-01-17 15:41:30 -0800479 BluetoothSession_DisconnectReasonType::
480 BluetoothSession_DisconnectReasonType_METRICS_DUMP,
481 nullptr, nullptr, nullptr));
Jack Hef3175622016-12-08 19:29:00 -0800482 UpdateLog();
483 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
484 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_LE, time_get_os_boottime_ms());
485 sleep_ms(1000);
486 std::string msg_str;
487 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
488 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
489}
490
491TEST_F(BluetoothMetricsLoggerTest, BluetoothSessionStartBeforeEndTest) {
492 bt_sessions_.push_back(MakeBluetoothSession(
493 1,
494 BluetoothSession_ConnectionTechnologyType::
495 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_UNKNOWN,
Jack Hea3f831c2017-01-17 15:41:30 -0800496 BluetoothSession_DisconnectReasonType::
497 BluetoothSession_DisconnectReasonType_NEXT_START_WITHOUT_END_PREVIOUS,
498 nullptr, nullptr, nullptr));
Jack Hef3175622016-12-08 19:29:00 -0800499 bt_sessions_.push_back(MakeBluetoothSession(
500 2,
501 BluetoothSession_ConnectionTechnologyType::
502 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_LE,
Jack Hea3f831c2017-01-17 15:41:30 -0800503 BluetoothSession_DisconnectReasonType::
504 BluetoothSession_DisconnectReasonType_METRICS_DUMP,
505 nullptr, nullptr, nullptr));
Jack Hef3175622016-12-08 19:29:00 -0800506 UpdateLog();
507 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
508 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_UNKNOWN, 0);
509 sleep_ms(1000);
510 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
511 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_LE, 0);
512 sleep_ms(2000);
513 std::string msg_str;
514 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
515 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
516}
517
518/*
519 * Test Case: A2DPSessionTwoUpdatesTest
520 *
521 * 1. Create Instance
522 * 2. LogBluetoothSessionStart
523 * 3. LogBluetoothSessionDeviceInfo
524 * 4. LogA2dpSession
525 * 5. LogA2dpSession
526 * 6. LogBluetoothSessionEnd
527 * 7. WriteString
528 *
529 */
530TEST_F(BluetoothMetricsLoggerTest, A2DPSessionTwoUpdatesTest) {
531 /* Same metrics from BluetoothA2DPSessionMetricsTest.TestUpdateNormal */
532 A2dpSessionMetrics metrics1;
533 A2dpSessionMetrics metrics2;
534 A2dpSessionMetrics metrics_sum;
535 metrics1.audio_duration_ms = 10;
536 metrics2.audio_duration_ms = 25;
537 metrics_sum.audio_duration_ms = 35;
538 metrics1.media_timer_min_ms = 10;
539 metrics2.media_timer_min_ms = 25;
540 metrics_sum.media_timer_min_ms = 10;
541 metrics1.media_timer_max_ms = 100;
542 metrics2.media_timer_max_ms = 200;
543 metrics_sum.media_timer_max_ms = 200;
544 metrics1.media_timer_avg_ms = 50;
545 metrics1.total_scheduling_count = 50;
546 metrics2.media_timer_avg_ms = 100;
547 metrics2.total_scheduling_count = 50;
548 metrics_sum.media_timer_avg_ms = 75;
549 metrics_sum.total_scheduling_count = 100;
550 metrics1.buffer_overruns_max_count = 70;
551 metrics2.buffer_overruns_max_count = 80;
552 metrics_sum.buffer_overruns_max_count = 80;
553 metrics1.buffer_underruns_average = 80;
554 metrics1.buffer_underruns_count = 1200;
555 metrics2.buffer_underruns_average = 130;
556 metrics2.buffer_underruns_count = 2400;
557 metrics_sum.buffer_underruns_average = 113.33333333;
558 metrics_sum.buffer_underruns_count = 3600;
559 DeviceInfo* info = MakeDeviceInfo(
560 BTM_COD_MAJOR_AUDIO_TEST,
561 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
562 A2DPSession* session = MakeA2DPSession(metrics_sum);
563 bt_sessions_.push_back(MakeBluetoothSession(
564 10,
565 BluetoothSession_ConnectionTechnologyType::
566 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800567 BluetoothSession_DisconnectReasonType::
568 BluetoothSession_DisconnectReasonType_UNKNOWN,
569 info, nullptr, session));
Jack Hef3175622016-12-08 19:29:00 -0800570 UpdateLog();
571 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
572 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_BREDR, 123456);
573 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionDeviceInfo(
574 BTM_COD_MAJOR_AUDIO_TEST, system_bt_osi::DEVICE_TYPE_BREDR);
575 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics1);
576 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics2);
577 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionEnd(
Jack Hea3f831c2017-01-17 15:41:30 -0800578 system_bt_osi::DISCONNECT_REASON_UNKNOWN, 133456);
Jack Hef3175622016-12-08 19:29:00 -0800579 std::string msg_str;
580 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
581 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
582}
583
584/*
585 * Test Case: A2DPSessionTwoUpdatesSeparatedbyDumpTest
586 *
587 * 1. Create Instance
588 * 2. LogBluetoothSessionStart
589 * 3. LogBluetoothSessionDeviceInfo
590 * 4. LogA2dpSession
591 * 5. WriteString
592 * 6. LogA2dpSession
593 * 7. LogBluetoothSessionEnd
594 * 8. WriteString
595 *
596 */
597TEST_F(BluetoothMetricsLoggerTest, A2DPSessionTwoUpdatesSeparatedbyDumpTest) {
598 /* Same metrics from BluetoothA2DPSessionMetricsTest.TestUpdateNormal */
599 A2dpSessionMetrics metrics1;
600 A2dpSessionMetrics metrics2;
601 metrics1.audio_duration_ms = 10;
602 metrics2.audio_duration_ms = 25;
603 metrics1.media_timer_min_ms = 10;
604 metrics2.media_timer_min_ms = 25;
605 metrics1.media_timer_max_ms = 100;
606 metrics2.media_timer_max_ms = 200;
607 metrics1.media_timer_avg_ms = 50;
608 metrics1.total_scheduling_count = 50;
609 metrics2.media_timer_avg_ms = 100;
610 metrics2.total_scheduling_count = 50;
611 metrics1.buffer_overruns_max_count = 70;
612 metrics2.buffer_overruns_max_count = 80;
613 metrics1.buffer_underruns_average = 80;
614 metrics1.buffer_underruns_count = 1200;
615 metrics2.buffer_underruns_average = 130;
616 metrics2.buffer_underruns_count = 2400;
617 DeviceInfo* info = MakeDeviceInfo(
618 BTM_COD_MAJOR_AUDIO_TEST,
619 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
620 A2DPSession* session = MakeA2DPSession(metrics1);
621 bt_sessions_.push_back(MakeBluetoothSession(
622 1,
623 BluetoothSession_ConnectionTechnologyType::
624 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800625 BluetoothSession_DisconnectReasonType::
626 BluetoothSession_DisconnectReasonType_METRICS_DUMP,
627 info, nullptr, session));
Jack Hef3175622016-12-08 19:29:00 -0800628 UpdateLog();
629 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
630 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_BREDR, 0);
631 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionDeviceInfo(
632 BTM_COD_MAJOR_AUDIO_TEST, system_bt_osi::DEVICE_TYPE_BREDR);
633 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics1);
634 sleep_ms(1000);
635 std::string msg_str;
636 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
637 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
638 ClearLog();
639 info = MakeDeviceInfo(
640 BTM_COD_MAJOR_AUDIO_TEST,
641 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
642 session = MakeA2DPSession(metrics2);
643 bt_sessions_.push_back(MakeBluetoothSession(
644 1,
645 BluetoothSession_ConnectionTechnologyType::
646 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800647 BluetoothSession_DisconnectReasonType::
648 BluetoothSession_DisconnectReasonType_UNKNOWN,
649 info, nullptr, session));
Jack Hef3175622016-12-08 19:29:00 -0800650 UpdateLog();
651 sleep_ms(1000);
652 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics2);
653 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionEnd(
Jack Hea3f831c2017-01-17 15:41:30 -0800654 system_bt_osi::DISCONNECT_REASON_UNKNOWN, 0);
Jack Hef3175622016-12-08 19:29:00 -0800655 msg_str.clear();
656 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
657 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
658}
659
660/*
661 * Test Case 1: A2DPSessionOnlyTest
662 *
663 * 1. Create Instance
664 * 4. LogA2dpSession
665 * 5. WriteString
666 * 6. LogA2dpSession
667 * 8. WriteString
668 *
669 */
670TEST_F(BluetoothMetricsLoggerTest, A2DPSessionOnlyTest) {
671 /* Same metrics from BluetoothA2DPSessionMetricsTest.TestUpdateNormal */
672 A2dpSessionMetrics metrics1;
673 A2dpSessionMetrics metrics2;
674 A2dpSessionMetrics metrics_sum;
675 metrics1.audio_duration_ms = 10;
676 metrics2.audio_duration_ms = 25;
677 metrics_sum.audio_duration_ms = 35;
678 metrics1.media_timer_min_ms = 10;
679 metrics2.media_timer_min_ms = 25;
680 metrics_sum.media_timer_min_ms = 10;
681 metrics1.media_timer_max_ms = 100;
682 metrics2.media_timer_max_ms = 200;
683 metrics_sum.media_timer_max_ms = 200;
684 metrics1.media_timer_avg_ms = 50;
685 metrics1.total_scheduling_count = 50;
686 metrics2.media_timer_avg_ms = 100;
687 metrics2.total_scheduling_count = 50;
688 metrics_sum.media_timer_avg_ms = 75;
689 metrics_sum.total_scheduling_count = 100;
690 metrics1.buffer_overruns_max_count = 70;
691 metrics2.buffer_overruns_max_count = 80;
692 metrics_sum.buffer_overruns_max_count = 80;
693 metrics1.buffer_underruns_average = 80;
694 metrics1.buffer_underruns_count = 1200;
695 metrics2.buffer_underruns_average = 130;
696 metrics2.buffer_underruns_count = 2400;
697 metrics_sum.buffer_underruns_average = 113.33333333;
698 metrics_sum.buffer_underruns_count = 3600;
699 DeviceInfo* info = MakeDeviceInfo(
700 BTM_COD_MAJOR_AUDIO_TEST,
701 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
702 A2DPSession* session = MakeA2DPSession(metrics_sum);
703 bt_sessions_.push_back(MakeBluetoothSession(
704 1,
705 BluetoothSession_ConnectionTechnologyType::
706 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800707 BluetoothSession_DisconnectReasonType::
708 BluetoothSession_DisconnectReasonType_METRICS_DUMP,
709 info, nullptr, session));
Jack Hef3175622016-12-08 19:29:00 -0800710 UpdateLog();
711 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics1);
712 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics2);
713 sleep_ms(1000);
714 std::string msg_str;
715 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
716 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
717}
718
719/*
720 * Test Case: A2DPSessionDumpBeforeTwoUpdatesTest
721 *
722 * 1. Create Instance
723 * 2. LogBluetoothSessionStart
724 * 3. LogBluetoothSessionDeviceInfo
725 * 5. WriteString
726 * 6. LogA2dpSession
727 * 7. LogA2dpSession
728 * 8. LogBluetoothSessionEnd
729 * 9. WriteString
730 *
731 */
732TEST_F(BluetoothMetricsLoggerTest, A2DPSessionDumpBeforeTwoUpdatesTest) {
733 /* Same metrics from BluetoothA2DPSessionMetricsTest.TestUpdateNormal */
734 A2dpSessionMetrics metrics1;
735 A2dpSessionMetrics metrics2;
736 A2dpSessionMetrics metrics_sum;
737 metrics1.audio_duration_ms = 10;
738 metrics2.audio_duration_ms = 25;
739 metrics_sum.audio_duration_ms = 35;
740 metrics1.media_timer_min_ms = 10;
741 metrics2.media_timer_min_ms = 25;
742 metrics_sum.media_timer_min_ms = 10;
743 metrics1.media_timer_max_ms = 100;
744 metrics2.media_timer_max_ms = 200;
745 metrics_sum.media_timer_max_ms = 200;
746 metrics1.media_timer_avg_ms = 50;
747 metrics1.total_scheduling_count = 50;
748 metrics2.media_timer_avg_ms = 100;
749 metrics2.total_scheduling_count = 50;
750 metrics_sum.media_timer_avg_ms = 75;
751 metrics_sum.total_scheduling_count = 100;
752 metrics1.buffer_overruns_max_count = 70;
753 metrics2.buffer_overruns_max_count = 80;
754 metrics_sum.buffer_overruns_max_count = 80;
755 metrics1.buffer_underruns_average = 80;
756 metrics1.buffer_underruns_count = 1200;
757 metrics2.buffer_underruns_average = 130;
758 metrics2.buffer_underruns_count = 2400;
759 metrics_sum.buffer_underruns_average = 113.33333333;
760 metrics_sum.buffer_underruns_count = 3600;
761 DeviceInfo* info = MakeDeviceInfo(
762 BTM_COD_MAJOR_AUDIO_TEST,
763 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
764 bt_sessions_.push_back(MakeBluetoothSession(
765 1,
766 BluetoothSession_ConnectionTechnologyType::
767 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800768 BluetoothSession_DisconnectReasonType::
769 BluetoothSession_DisconnectReasonType_METRICS_DUMP,
770 info, nullptr, nullptr));
Jack Hef3175622016-12-08 19:29:00 -0800771 UpdateLog();
772 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionStart(
773 system_bt_osi::CONNECTION_TECHNOLOGY_TYPE_BREDR, 0);
774 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionDeviceInfo(
775 BTM_COD_MAJOR_AUDIO_TEST, system_bt_osi::DEVICE_TYPE_BREDR);
776 sleep_ms(1000);
777 std::string msg_str;
778 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
779 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
780 ClearLog();
781 info = MakeDeviceInfo(
782 BTM_COD_MAJOR_AUDIO_TEST,
783 DeviceInfo_DeviceType::DeviceInfo_DeviceType_DEVICE_TYPE_BREDR);
784 A2DPSession* session = MakeA2DPSession(metrics_sum);
785 bt_sessions_.push_back(MakeBluetoothSession(
786 1,
787 BluetoothSession_ConnectionTechnologyType::
788 BluetoothSession_ConnectionTechnologyType_CONNECTION_TECHNOLOGY_TYPE_BREDR,
Jack Hea3f831c2017-01-17 15:41:30 -0800789 BluetoothSession_DisconnectReasonType::
790 BluetoothSession_DisconnectReasonType_UNKNOWN,
791 info, nullptr, session));
Jack Hef3175622016-12-08 19:29:00 -0800792 UpdateLog();
793 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics1);
794 BluetoothMetricsLogger::GetInstance()->LogA2dpSession(metrics2);
795 sleep_ms(1000);
796 BluetoothMetricsLogger::GetInstance()->LogBluetoothSessionEnd(
Jack Hea3f831c2017-01-17 15:41:30 -0800797 system_bt_osi::DISCONNECT_REASON_UNKNOWN, 0);
Jack Hef3175622016-12-08 19:29:00 -0800798 msg_str.clear();
799 BluetoothMetricsLogger::GetInstance()->WriteString(&msg_str, true);
800 EXPECT_THAT(msg_str, StrEq(bt_log_str_));
801}
802}