1 #include "osi/src/stack_power_telemetry.cc"
2
3 #include <gtest/gtest.h>
4
5 #include "osi/include/stack_power_telemetry.h"
6 #include "types/raw_address.h"
7
8 class PowerTelemetryTest : public ::testing::Test {
9 protected:
10 uint16_t handle = 123;
11 RawAddress bdaddr;
12 bool isConnected = true;
13
reset()14 void reset() {
15 power_telemetry::GetInstance().pimpl_->LogDataTransfer();
16 power_telemetry::GetInstance().pimpl_->idx_containers = 0;
17 for (int i = 0; i < kLogEntriesSize; i++) {
18 power_telemetry::GetInstance().pimpl_->log_data_containers_[i] =
19 LogDataContainer();
20 }
21 }
22
SetUp()23 void SetUp() override {
24 power_telemetry::GetInstance(); // Init the object.
25 power_telemerty_enabled_ = true; // Enable the feature flag
26 RawAddress::FromString("00:00:00:00:00:00", bdaddr);
27 }
28 };
29
TEST_F(PowerTelemetryTest,test_getCurrentLogDataContainer)30 TEST_F(PowerTelemetryTest, test_getCurrentLogDataContainer) {
31 reset();
32
33 // Record smth, log index move to 1
34 power_telemetry::GetInstance().pimpl_->RecordLogDataContainer();
35 ASSERT_EQ(1, power_telemetry::GetInstance().pimpl_->idx_containers);
36 }
37
TEST_F(PowerTelemetryTest,test_recordLogDataContainer)38 TEST_F(PowerTelemetryTest, test_recordLogDataContainer) {
39 reset();
40
41 // Create maximum number of nodes
42 for (int i = 0; i < kLogEntriesSize - 1; i++) {
43 power_telemetry::GetInstance().pimpl_->RecordLogDataContainer();
44 ASSERT_EQ(i + 1, power_telemetry::GetInstance().pimpl_->idx_containers);
45 }
46
47 // Create 1 more node. index integer should be 0
48 power_telemetry::GetInstance().pimpl_->RecordLogDataContainer();
49 ASSERT_EQ(0, power_telemetry::GetInstance().pimpl_->idx_containers);
50 }
51
TEST_F(PowerTelemetryTest,test_LogInqScanDetails)52 TEST_F(PowerTelemetryTest, test_LogInqScanDetails) {
53 reset();
54
55 power_telemetry::GetInstance().LogInqScanStopped();
56 ASSERT_EQ(0, power_telemetry::GetInstance().pimpl_->inq_scan.count_);
57
58 power_telemetry::GetInstance().LogInqScanStarted();
59 ASSERT_EQ(1, power_telemetry::GetInstance().pimpl_->inq_scan.count_);
60 }
61
TEST_F(PowerTelemetryTest,test_LogBleScan)62 TEST_F(PowerTelemetryTest, test_LogBleScan) {
63 reset();
64
65 power_telemetry::GetInstance().LogBleScan(10);
66 ASSERT_EQ(10, (int)power_telemetry::GetInstance().pimpl_->ble_scan.count_);
67 }
68
TEST_F(PowerTelemetryTest,test_LogBleAdvDetails)69 TEST_F(PowerTelemetryTest, test_LogBleAdvDetails) {
70 reset();
71
72 LogDataContainer& ldc =
73 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
74
75 // Failed Case. Shouldn't crash if run false first
76 power_telemetry::GetInstance().LogBleAdvStopped();
77 ASSERT_EQ(0, (int)ldc.adv_list.size());
78
79 // Add new BleAdv data
80 power_telemetry::GetInstance().LogBleAdvStarted();
81 ASSERT_EQ(1, (int)ldc.adv_list.size());
82 ASSERT_NE(0, ldc.adv_list.back().active.begin);
83
84 // BleAdv data update endTime
85 power_telemetry::GetInstance().LogBleAdvStopped();
86 ASSERT_EQ(1, (int)ldc.adv_list.size());
87 ASSERT_NE(0, ldc.adv_list.back().active.end);
88
89 // Add new BleAdv data
90 power_telemetry::GetInstance().LogBleAdvStarted();
91 ASSERT_EQ(2, (int)ldc.adv_list.size());
92 }
93
TEST_F(PowerTelemetryTest,test_LogTxPower)94 TEST_F(PowerTelemetryTest, test_LogTxPower) {
95 reset();
96
97 LogDataContainer& ldc =
98 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
99 tBTM_TX_POWER_RESULT dummy_res;
100 dummy_res.rem_bda = bdaddr;
101
102 // Failed Case. Shouldn't crash if no init data
103 dummy_res.status = BTM_SUCCESS;
104 void* p = &dummy_res;
105 power_telemetry::GetInstance().LogTxPower(p);
106
107 // init data
108 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
109 true);
110
111 // Successful case
112 dummy_res.tx_power = 100;
113 power_telemetry::GetInstance().LogTxPower(p);
114 ASSERT_EQ(dummy_res.tx_power,
115 ldc.acl.link_details_map[handle].tx_power_level);
116
117 // Failed case
118 dummy_res.tx_power = 99;
119 dummy_res.status = BTM_UNDEFINED;
120 power_telemetry::GetInstance().LogTxPower(p);
121 ASSERT_NE(dummy_res.tx_power,
122 ldc.acl.link_details_map[handle].tx_power_level);
123 }
124
TEST_F(PowerTelemetryTest,test_LogAclLinkDetails)125 TEST_F(PowerTelemetryTest, test_LogAclLinkDetails) {
126 reset();
127 LogDataContainer& ldc =
128 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
129
130 // Failed Case. Shouldn't crash if first invoke function with false
131 isConnected = false;
132 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
133 true);
134 ASSERT_EQ(0, (int)ldc.acl.link_details_list.size());
135
136 // Successful case
137 isConnected = true;
138 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
139 true);
140 ASSERT_EQ(1, (int)ldc.acl.link_details_map.count(handle));
141 ASSERT_EQ(0, (int)ldc.acl.link_details_list.size());
142 ASSERT_EQ(1, (int)ldc.sniff_activity_map.count(handle));
143
144 isConnected = false;
145 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
146 true);
147 ASSERT_EQ(0, (int)ldc.acl.link_details_map.count(handle));
148 ASSERT_EQ(1, (int)ldc.acl.link_details_list.size());
149 }
150
TEST_F(PowerTelemetryTest,test_LogScoLinkDetails)151 TEST_F(PowerTelemetryTest, test_LogScoLinkDetails) {
152 reset();
153 LogDataContainer& ldc =
154 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
155
156 // Failed Case. Shouldn't crash if first invoke function with false
157 isConnected = false;
158 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
159 false);
160 ASSERT_EQ(0, (int)ldc.sco.link_details_list.size());
161
162 // Successful case
163 isConnected = true;
164 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
165 false);
166 ASSERT_EQ(1, (int)ldc.sco.link_details_map.count(handle));
167 ASSERT_EQ(0, (int)ldc.sco.link_details_list.size());
168
169 isConnected = false;
170 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
171 false);
172 ASSERT_EQ(0, (int)ldc.sco.link_details_map.count(handle));
173 ASSERT_EQ(1, (int)ldc.sco.link_details_list.size());
174 }
175
TEST_F(PowerTelemetryTest,test_LogHciCmdEvtDetails)176 TEST_F(PowerTelemetryTest, test_LogHciCmdEvtDetails) {
177 reset();
178
179 // After log hci_cmd, the number of it should be 1
180 power_telemetry::GetInstance().LogHciCmdDetail();
181 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->cmd.count_);
182 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->event.count_);
183
184 // After log hci_evt, the number of it should be 1
185 power_telemetry::GetInstance().LogHciEvtDetail();
186 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->cmd.count_);
187 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->event.count_);
188 }
189
TEST_F(PowerTelemetryTest,test_LogSniffActivity)190 TEST_F(PowerTelemetryTest, test_LogSniffActivity) {
191 reset();
192 LogDataContainer& ldc =
193 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
194
195 power_telemetry::GetInstance().LogSniffStarted(handle, bdaddr);
196 ASSERT_EQ(1, (int)ldc.sniff_activity_map[handle].sniff_count);
197 ASSERT_EQ(0, (int)ldc.sniff_activity_map[handle].active_count);
198
199 power_telemetry::GetInstance().LogSniffStopped(handle, bdaddr);
200 ASSERT_EQ(1, (int)ldc.sniff_activity_map[handle].sniff_count);
201 ASSERT_EQ(1, (int)ldc.sniff_activity_map[handle].active_count);
202 }
203
TEST_F(PowerTelemetryTest,test_LogDataTransfer)204 TEST_F(PowerTelemetryTest, test_LogDataTransfer) {
205 reset();
206
207 // We should create new record. index should be 1
208 power_telemetry::GetInstance().pimpl_->LogDataTransfer();
209 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->idx_containers);
210 }
211
TEST_F(PowerTelemetryTest,test_LogScanStarted)212 TEST_F(PowerTelemetryTest, test_LogScanStarted) {
213 reset();
214
215 power_telemetry::GetInstance().LogScanStarted();
216 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->scan.count_);
217 }
218
TEST_F(PowerTelemetryTest,test_LogAclPktDetails)219 TEST_F(PowerTelemetryTest, test_LogAclPktDetails) {
220 reset();
221
222 // scanCount should be 1
223 power_telemetry::GetInstance().LogTxAclPktData(10);
224 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->tx.pkt_);
225 ASSERT_EQ(10, (int)power_telemetry::GetInstance().pimpl_->tx.len_);
226
227 power_telemetry::GetInstance().LogRxAclPktData(11);
228 ASSERT_EQ(1, (int)power_telemetry::GetInstance().pimpl_->rx.pkt_);
229 ASSERT_EQ(11, (int)power_telemetry::GetInstance().pimpl_->rx.len_);
230 }
231
TEST_F(PowerTelemetryTest,test_LogChannelConnected)232 TEST_F(PowerTelemetryTest, test_LogChannelConnected) {
233 reset();
234 LogDataContainer& ldc =
235 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
236
237 power_telemetry::GetInstance().LogChannelConnected(BT_PSM_RFCOMM, 0, 0,
238 bdaddr);
239 ASSERT_EQ(1, (int)ldc.channel_map[bdaddr].size());
240 ASSERT_EQ(State::kConnected, ldc.channel_map[bdaddr].back().state);
241
242 power_telemetry::GetInstance().LogChannelConnected(BT_PSM_RFCOMM, 0, 0,
243 bdaddr);
244 ASSERT_EQ(2, (int)ldc.channel_map[bdaddr].size());
245 ASSERT_EQ(State::kConnected, ldc.channel_map[bdaddr].back().state);
246 }
247
TEST_F(PowerTelemetryTest,test_LogChannelDisconnected)248 TEST_F(PowerTelemetryTest, test_LogChannelDisconnected) {
249 reset();
250 LogDataContainer& ldc =
251 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
252
253 power_telemetry::GetInstance().LogChannelConnected(0, 0, 0, bdaddr);
254 power_telemetry::GetInstance().LogChannelDisconnected(0, 0, 0, bdaddr);
255 ASSERT_EQ(State::kDisconnected, ldc.channel_map[bdaddr].back().state);
256
257 RawAddress dummyAddr;
258 RawAddress::FromString("00:00:00:00:00:11", dummyAddr);
259 power_telemetry::GetInstance().LogChannelDisconnected(0, 0, 0, bdaddr);
260 ASSERT_EQ(1, (int)ldc.channel_map[bdaddr].size());
261 }
262
TEST_F(PowerTelemetryTest,test_LogTxBytes)263 TEST_F(PowerTelemetryTest, test_LogTxBytes) {
264 reset();
265
266 power_telemetry::GetInstance().LogTxBytes(BT_PSM_RFCOMM, 0, 0, bdaddr, 10);
267 ASSERT_EQ(10, (int)power_telemetry::GetInstance().pimpl_->rfc.tx.bytes_);
268
269 power_telemetry::GetInstance().LogTxBytes(0, 0, 0, bdaddr, 11);
270 ASSERT_EQ(11, (int)power_telemetry::GetInstance().pimpl_->l2c.tx.bytes_);
271 }
272
TEST_F(PowerTelemetryTest,test_LogRxBytes)273 TEST_F(PowerTelemetryTest, test_LogRxBytes) {
274 reset();
275
276 power_telemetry::GetInstance().LogRxBytes(BT_PSM_RFCOMM, 0, 0, bdaddr, 10);
277 ASSERT_EQ(10, (int)power_telemetry::GetInstance().pimpl_->rfc.rx.bytes_);
278
279 power_telemetry::GetInstance().LogRxBytes(0, 0, 0, bdaddr, 11);
280 ASSERT_EQ(11, (int)power_telemetry::GetInstance().pimpl_->l2c.rx.bytes_);
281 }
282
TEST_F(PowerTelemetryTest,test_feature_flag)283 TEST_F(PowerTelemetryTest, test_feature_flag) {
284 reset();
285
286 // init data
287 isConnected = true;
288 LogDataContainer& ldc =
289 power_telemetry::GetInstance().pimpl_->GetCurrentLogDataContainer();
290 tBTM_TX_POWER_RESULT dummy_res;
291 dummy_res.rem_bda = bdaddr;
292 dummy_res.status = BTM_SUCCESS;
293 void* p = &dummy_res;
294 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
295 true);
296
297 // Set feature flag to false
298 // All function shouldn't work if flag is false
299 power_telemerty_enabled_ = false;
300
301 power_telemetry::GetInstance().Dumpsys(0);
302 ASSERT_EQ(0, power_telemetry::GetInstance().pimpl_->idx_containers);
303
304 power_telemetry::GetInstance().LogRxBytes(BT_PSM_RFCOMM, 0, 0, bdaddr, 87);
305 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->rfc.rx.bytes_);
306
307 power_telemetry::GetInstance().LogTxBytes(BT_PSM_RFCOMM, 0, 0, bdaddr, 10);
308 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->rfc.tx.bytes_);
309
310 power_telemetry::GetInstance().LogChannelConnected(0, 0, 0, bdaddr);
311 ASSERT_EQ(0, (int)ldc.channel_map.count(bdaddr));
312
313 power_telemetry::GetInstance().LogChannelDisconnected(0, 0, 0, bdaddr);
314 ASSERT_EQ(0, (int)ldc.channel_map.count(bdaddr));
315
316 power_telemetry::GetInstance().LogTxAclPktData(10);
317 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->tx.pkt_);
318
319 power_telemetry::GetInstance().LogRxAclPktData(11);
320 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->rx.pkt_);
321
322 power_telemetry::GetInstance().LogScanStarted();
323 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->scan.count_);
324
325 power_telemetry::GetInstance().pimpl_->LogDataTransfer();
326 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->idx_containers);
327
328 power_telemetry::GetInstance().LogSniffStarted(handle, bdaddr);
329 ASSERT_EQ(0, (int)ldc.sniff_activity_map[handle].sniff_count);
330
331 power_telemetry::GetInstance().LogHciCmdDetail();
332 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->cmd.count_);
333
334 power_telemetry::GetInstance().LogHciEvtDetail();
335 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->event.count_);
336
337 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
338 false);
339 ASSERT_EQ(0, (int)ldc.sco.link_details_map.count(handle));
340
341 // Set to 1 because of fake data
342 power_telemetry::GetInstance().LogLinkDetails(handle, bdaddr, isConnected,
343 true);
344 ASSERT_EQ(1, (int)ldc.acl.link_details_map.count(handle));
345
346 dummy_res.tx_power = 100;
347 power_telemetry::GetInstance().LogTxPower(p);
348 ASSERT_EQ(0, ldc.acl.link_details_map[handle].tx_power_level);
349
350 power_telemetry::GetInstance().LogBleScan(10);
351 ASSERT_EQ(0, (int)power_telemetry::GetInstance().pimpl_->ble_scan.count_);
352
353 power_telemetry::GetInstance().LogBleAdvStarted();
354 ASSERT_EQ(0, (int)ldc.adv_list.size());
355
356 power_telemetry::GetInstance().LogInqScanStarted();
357 ASSERT_EQ(0, power_telemetry::GetInstance().pimpl_->inq_scan.count_);
358
359 power_telemetry::GetInstance().pimpl_->RecordLogDataContainer();
360 ASSERT_EQ(0, power_telemetry::GetInstance().pimpl_->idx_containers);
361
362 power_telemerty_enabled_ = true;
363 }
364