• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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