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