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