1 /*
2  * Copyright (C) 2017, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <android-base/logging.h>
18 #include <android-base/macros.h>
19 #include <gmock/gmock.h>
20 
21 #undef NAN
22 #include "hidl_struct_util.h"
23 
24 using testing::Test;
25 
26 namespace {
27 constexpr uint32_t kMacId1 = 1;
28 constexpr uint32_t kMacId2 = 2;
29 constexpr uint32_t kIfaceChannel1 = 3;
30 constexpr uint32_t kIfaceChannel2 = 5;
31 constexpr char kIfaceName1[] = "wlan0";
32 constexpr char kIfaceName2[] = "wlan1";
33 }  // namespace
34 namespace android {
35 namespace hardware {
36 namespace wifi {
37 namespace V1_5 {
38 namespace implementation {
39 using namespace android::hardware::wifi::V1_0;
40 using ::android::hardware::wifi::V1_0::WifiChannelWidthInMhz;
41 
42 class HidlStructUtilTest : public Test {};
43 
TEST_F(HidlStructUtilTest,CanConvertLegacyWifiMacInfosToHidlWithOneMac)44 TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithOneMac) {
45     std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
46     legacy_hal::WifiMacInfo legacy_mac_info1 = {
47         .wlan_mac_id = kMacId1,
48         .mac_band =
49             legacy_hal::WLAN_MAC_5_0_BAND | legacy_hal::WLAN_MAC_2_4_BAND};
50     legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1,
51                                                     .channel = kIfaceChannel1};
52     legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2,
53                                                     .channel = kIfaceChannel2};
54     legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
55     legacy_mac_info1.iface_infos.push_back(legacy_iface_info2);
56     legacy_mac_infos.push_back(legacy_mac_info1);
57 
58     std::vector<V1_4::IWifiChipEventCallback::RadioModeInfo>
59         hidl_radio_mode_infos;
60     ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
61         legacy_mac_infos, &hidl_radio_mode_infos));
62 
63     ASSERT_EQ(1u, hidl_radio_mode_infos.size());
64     auto hidl_radio_mode_info1 = hidl_radio_mode_infos[0];
65     EXPECT_EQ(legacy_mac_info1.wlan_mac_id, hidl_radio_mode_info1.radioId);
66     EXPECT_EQ(V1_4::WifiBand::BAND_24GHZ_5GHZ, hidl_radio_mode_info1.bandInfo);
67     ASSERT_EQ(2u, hidl_radio_mode_info1.ifaceInfos.size());
68     auto hidl_iface_info1 = hidl_radio_mode_info1.ifaceInfos[0];
69     EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
70     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
71               hidl_iface_info1.channel);
72     auto hidl_iface_info2 = hidl_radio_mode_info1.ifaceInfos[1];
73     EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
74     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
75               hidl_iface_info2.channel);
76 }
77 
TEST_F(HidlStructUtilTest,CanConvertLegacyWifiMacInfosToHidlWithTwoMac)78 TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) {
79     std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
80     legacy_hal::WifiMacInfo legacy_mac_info1 = {
81         .wlan_mac_id = kMacId1, .mac_band = legacy_hal::WLAN_MAC_5_0_BAND};
82     legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1,
83                                                     .channel = kIfaceChannel1};
84     legacy_hal::WifiMacInfo legacy_mac_info2 = {
85         .wlan_mac_id = kMacId2, .mac_band = legacy_hal::WLAN_MAC_2_4_BAND};
86     legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2,
87                                                     .channel = kIfaceChannel2};
88     legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
89     legacy_mac_infos.push_back(legacy_mac_info1);
90     legacy_mac_info2.iface_infos.push_back(legacy_iface_info2);
91     legacy_mac_infos.push_back(legacy_mac_info2);
92 
93     std::vector<V1_4::IWifiChipEventCallback::RadioModeInfo>
94         hidl_radio_mode_infos;
95     ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
96         legacy_mac_infos, &hidl_radio_mode_infos));
97 
98     ASSERT_EQ(2u, hidl_radio_mode_infos.size());
99 
100     // Find mac info 1.
101     const auto hidl_radio_mode_info1 =
102         std::find_if(hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
103                      [&legacy_mac_info1](
104                          const V1_4::IWifiChipEventCallback::RadioModeInfo& x) {
105                          return x.radioId == legacy_mac_info1.wlan_mac_id;
106                      });
107     ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info1);
108     EXPECT_EQ(V1_4::WifiBand::BAND_5GHZ, hidl_radio_mode_info1->bandInfo);
109     ASSERT_EQ(1u, hidl_radio_mode_info1->ifaceInfos.size());
110     auto hidl_iface_info1 = hidl_radio_mode_info1->ifaceInfos[0];
111     EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
112     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
113               hidl_iface_info1.channel);
114 
115     // Find mac info 2.
116     const auto hidl_radio_mode_info2 =
117         std::find_if(hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
118                      [&legacy_mac_info2](
119                          const V1_4::IWifiChipEventCallback::RadioModeInfo& x) {
120                          return x.radioId == legacy_mac_info2.wlan_mac_id;
121                      });
122     ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info2);
123     EXPECT_EQ(V1_4::WifiBand::BAND_24GHZ, hidl_radio_mode_info2->bandInfo);
124     ASSERT_EQ(1u, hidl_radio_mode_info2->ifaceInfos.size());
125     auto hidl_iface_info2 = hidl_radio_mode_info2->ifaceInfos[0];
126     EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
127     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
128               hidl_iface_info2.channel);
129 }
130 
TEST_F(HidlStructUtilTest,canConvertLegacyLinkLayerStatsToHidl)131 TEST_F(HidlStructUtilTest, canConvertLegacyLinkLayerStatsToHidl) {
132     legacy_hal::LinkLayerStats legacy_stats{};
133     legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
134     legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
135     legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
136     legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
137     legacy_stats.iface.beacon_rx = rand();
138     legacy_stats.iface.rssi_mgmt = rand();
139     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu = rand();
140     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu = rand();
141     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost = rand();
142     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries = rand();
143     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min = rand();
144     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max = rand();
145     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg = rand();
146     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples =
147         rand();
148 
149     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu = rand();
150     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu = rand();
151     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost = rand();
152     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries = rand();
153     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min = rand();
154     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max = rand();
155     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg = rand();
156     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples =
157         rand();
158 
159     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu = rand();
160     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu = rand();
161     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost = rand();
162     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries = rand();
163     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min = rand();
164     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max = rand();
165     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg = rand();
166     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples =
167         rand();
168 
169     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu = rand();
170     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu = rand();
171     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost = rand();
172     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries = rand();
173     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min = rand();
174     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max = rand();
175     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg = rand();
176     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples =
177         rand();
178 
179     legacy_stats.iface.info.time_slicing_duty_cycle_percent = rand();
180     legacy_stats.iface.num_peers = 1;
181 
182     for (auto& radio : legacy_stats.radios) {
183         radio.stats.radio = rand();
184         radio.stats.on_time = rand();
185         radio.stats.tx_time = rand();
186         radio.stats.rx_time = rand();
187         radio.stats.on_time_scan = rand();
188         radio.stats.on_time_nbd = rand();
189         radio.stats.on_time_gscan = rand();
190         radio.stats.on_time_roam_scan = rand();
191         radio.stats.on_time_pno_scan = rand();
192         radio.stats.on_time_hs20 = rand();
193         for (int i = 0; i < 4; i++) {
194             radio.tx_time_per_levels.push_back(rand());
195         }
196 
197         legacy_hal::wifi_channel_stat channel_stat1 = {
198             .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 2437, 2437, 0},
199             .on_time = 0x1111,
200             .cca_busy_time = 0x55,
201         };
202         legacy_hal::wifi_channel_stat channel_stat2 = {
203             .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 5180, 5180, 0},
204             .on_time = 0x2222,
205             .cca_busy_time = 0x66,
206         };
207         radio.channel_stats.push_back(channel_stat1);
208         radio.channel_stats.push_back(channel_stat2);
209     }
210 
211     for (auto& peer : legacy_stats.peers) {
212         peer.peer_info.bssload.sta_count = rand();
213         peer.peer_info.bssload.chan_util = rand();
214         wifi_rate_stat rate_stat1 = {
215             .rate = {3, 1, 2, 5, 0, 0},
216             .tx_mpdu = 0,
217             .rx_mpdu = 1,
218             .mpdu_lost = 2,
219             .retries = 3,
220             .retries_short = 4,
221             .retries_long = 5,
222         };
223         wifi_rate_stat rate_stat2 = {
224             .rate = {2, 2, 1, 6, 0, 1},
225             .tx_mpdu = 6,
226             .rx_mpdu = 7,
227             .mpdu_lost = 8,
228             .retries = 9,
229             .retries_short = 10,
230             .retries_long = 11,
231         };
232         peer.rate_stats.push_back(rate_stat1);
233         peer.rate_stats.push_back(rate_stat2);
234     }
235 
236     V1_5::StaLinkLayerStats converted{};
237     hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
238                                                         &converted);
239     EXPECT_EQ(legacy_stats.iface.beacon_rx, converted.iface.V1_0.beaconRx);
240     EXPECT_EQ(legacy_stats.iface.rssi_mgmt, converted.iface.V1_0.avgRssiMgmt);
241     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu,
242               converted.iface.V1_0.wmeBePktStats.rxMpdu);
243     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu,
244               converted.iface.V1_0.wmeBePktStats.txMpdu);
245     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost,
246               converted.iface.V1_0.wmeBePktStats.lostMpdu);
247     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries,
248               converted.iface.V1_0.wmeBePktStats.retries);
249     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min,
250               converted.iface.wmeBeContentionTimeStats.contentionTimeMinInUsec);
251     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max,
252               converted.iface.wmeBeContentionTimeStats.contentionTimeMaxInUsec);
253     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg,
254               converted.iface.wmeBeContentionTimeStats.contentionTimeAvgInUsec);
255     EXPECT_EQ(
256         legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples,
257         converted.iface.wmeBeContentionTimeStats.contentionNumSamples);
258 
259     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu,
260               converted.iface.V1_0.wmeBkPktStats.rxMpdu);
261     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu,
262               converted.iface.V1_0.wmeBkPktStats.txMpdu);
263     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost,
264               converted.iface.V1_0.wmeBkPktStats.lostMpdu);
265     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries,
266               converted.iface.V1_0.wmeBkPktStats.retries);
267     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min,
268               converted.iface.wmeBkContentionTimeStats.contentionTimeMinInUsec);
269     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max,
270               converted.iface.wmeBkContentionTimeStats.contentionTimeMaxInUsec);
271     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg,
272               converted.iface.wmeBkContentionTimeStats.contentionTimeAvgInUsec);
273     EXPECT_EQ(
274         legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples,
275         converted.iface.wmeBkContentionTimeStats.contentionNumSamples);
276 
277     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu,
278               converted.iface.V1_0.wmeViPktStats.rxMpdu);
279     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu,
280               converted.iface.V1_0.wmeViPktStats.txMpdu);
281     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost,
282               converted.iface.V1_0.wmeViPktStats.lostMpdu);
283     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries,
284               converted.iface.V1_0.wmeViPktStats.retries);
285     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min,
286               converted.iface.wmeViContentionTimeStats.contentionTimeMinInUsec);
287     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max,
288               converted.iface.wmeViContentionTimeStats.contentionTimeMaxInUsec);
289     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg,
290               converted.iface.wmeViContentionTimeStats.contentionTimeAvgInUsec);
291     EXPECT_EQ(
292         legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples,
293         converted.iface.wmeViContentionTimeStats.contentionNumSamples);
294 
295     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu,
296               converted.iface.V1_0.wmeVoPktStats.rxMpdu);
297     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu,
298               converted.iface.V1_0.wmeVoPktStats.txMpdu);
299     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost,
300               converted.iface.V1_0.wmeVoPktStats.lostMpdu);
301     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries,
302               converted.iface.V1_0.wmeVoPktStats.retries);
303     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min,
304               converted.iface.wmeVoContentionTimeStats.contentionTimeMinInUsec);
305     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max,
306               converted.iface.wmeVoContentionTimeStats.contentionTimeMaxInUsec);
307     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg,
308               converted.iface.wmeVoContentionTimeStats.contentionTimeAvgInUsec);
309     EXPECT_EQ(
310         legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples,
311         converted.iface.wmeVoContentionTimeStats.contentionNumSamples);
312 
313     EXPECT_EQ(legacy_stats.iface.info.time_slicing_duty_cycle_percent,
314               converted.iface.timeSliceDutyCycleInPercent);
315 
316     EXPECT_EQ(legacy_stats.radios.size(), converted.radios.size());
317     for (size_t i = 0; i < legacy_stats.radios.size(); i++) {
318         EXPECT_EQ(legacy_stats.radios[i].stats.radio,
319                   converted.radios[i].radioId);
320         EXPECT_EQ(legacy_stats.radios[i].stats.on_time,
321                   converted.radios[i].V1_3.V1_0.onTimeInMs);
322         EXPECT_EQ(legacy_stats.radios[i].stats.tx_time,
323                   converted.radios[i].V1_3.V1_0.txTimeInMs);
324         EXPECT_EQ(legacy_stats.radios[i].stats.rx_time,
325                   converted.radios[i].V1_3.V1_0.rxTimeInMs);
326         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_scan,
327                   converted.radios[i].V1_3.V1_0.onTimeInMsForScan);
328         EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels.size(),
329                   converted.radios[i].V1_3.V1_0.txTimeInMsPerLevel.size());
330         for (size_t j = 0; j < legacy_stats.radios[i].tx_time_per_levels.size();
331              j++) {
332             EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels[j],
333                       converted.radios[i].V1_3.V1_0.txTimeInMsPerLevel[j]);
334         }
335         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_nbd,
336                   converted.radios[i].V1_3.onTimeInMsForNanScan);
337         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_gscan,
338                   converted.radios[i].V1_3.onTimeInMsForBgScan);
339         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_roam_scan,
340                   converted.radios[i].V1_3.onTimeInMsForRoamScan);
341         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_pno_scan,
342                   converted.radios[i].V1_3.onTimeInMsForPnoScan);
343         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_hs20,
344                   converted.radios[i].V1_3.onTimeInMsForHs20Scan);
345         EXPECT_EQ(legacy_stats.radios[i].channel_stats.size(),
346                   converted.radios[i].V1_3.channelStats.size());
347         for (size_t k = 0; k < legacy_stats.radios[i].channel_stats.size();
348              k++) {
349             auto& legacy_channel_st = legacy_stats.radios[i].channel_stats[k];
350             EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_20,
351                       converted.radios[i].V1_3.channelStats[k].channel.width);
352             EXPECT_EQ(
353                 WifiChannelInMhz(legacy_channel_st.channel.center_freq),
354                 converted.radios[i].V1_3.channelStats[k].channel.centerFreq);
355             EXPECT_EQ(
356                 WifiChannelInMhz(legacy_channel_st.channel.center_freq0),
357                 converted.radios[i].V1_3.channelStats[k].channel.centerFreq0);
358             EXPECT_EQ(
359                 WifiChannelInMhz(legacy_channel_st.channel.center_freq1),
360                 converted.radios[i].V1_3.channelStats[k].channel.centerFreq1);
361             EXPECT_EQ(legacy_channel_st.cca_busy_time,
362                       converted.radios[i].V1_3.channelStats[k].ccaBusyTimeInMs);
363             EXPECT_EQ(legacy_channel_st.on_time,
364                       converted.radios[i].V1_3.channelStats[k].onTimeInMs);
365         }
366     }
367 
368     EXPECT_EQ(legacy_stats.peers.size(), converted.iface.peers.size());
369     for (size_t i = 0; i < legacy_stats.peers.size(); i++) {
370         EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.sta_count,
371                   converted.iface.peers[i].staCount);
372         EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.chan_util,
373                   converted.iface.peers[i].chanUtil);
374         for (size_t j = 0; j < legacy_stats.peers[i].rate_stats.size(); j++) {
375             EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.preamble,
376                       (uint32_t)converted.iface.peers[i]
377                           .rateStats[j]
378                           .rateInfo.preamble);
379             EXPECT_EQ(
380                 legacy_stats.peers[i].rate_stats[j].rate.nss,
381                 (uint32_t)converted.iface.peers[i].rateStats[j].rateInfo.nss);
382             EXPECT_EQ(
383                 legacy_stats.peers[i].rate_stats[j].rate.bw,
384                 (uint32_t)converted.iface.peers[i].rateStats[j].rateInfo.bw);
385             EXPECT_EQ(
386                 legacy_stats.peers[i].rate_stats[j].rate.rateMcsIdx,
387                 converted.iface.peers[i].rateStats[j].rateInfo.rateMcsIdx);
388             EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].tx_mpdu,
389                       converted.iface.peers[i].rateStats[j].txMpdu);
390             EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rx_mpdu,
391                       converted.iface.peers[i].rateStats[j].rxMpdu);
392             EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].mpdu_lost,
393                       converted.iface.peers[i].rateStats[j].mpduLost);
394             EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].retries,
395                       converted.iface.peers[i].rateStats[j].retries);
396         }
397     }
398 }
399 
TEST_F(HidlStructUtilTest,CanConvertLegacyFeaturesToHidl)400 TEST_F(HidlStructUtilTest, CanConvertLegacyFeaturesToHidl) {
401     using HidlChipCaps = V1_3::IWifiChip::ChipCapabilityMask;
402 
403     uint32_t hidle_caps;
404 
405     uint32_t legacy_feature_set =
406         WIFI_FEATURE_D2D_RTT | WIFI_FEATURE_SET_LATENCY_MODE;
407     uint32_t legacy_logger_feature_set =
408         legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED;
409 
410     ASSERT_TRUE(hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
411         legacy_feature_set, legacy_logger_feature_set, &hidle_caps));
412 
413     EXPECT_EQ(HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA |
414                   HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS |
415                   HidlChipCaps::DEBUG_ERROR_ALERTS | HidlChipCaps::D2D_RTT |
416                   HidlChipCaps::SET_LATENCY_MODE |
417                   HidlChipCaps::DEBUG_MEMORY_DRIVER_DUMP,
418               hidle_caps);
419 }
420 }  // namespace implementation
421 }  // namespace V1_5
422 }  // namespace wifi
423 }  // namespace hardware
424 }  // namespace android
425