blob: 1b4a02f9e18bb2d02319be99e1d05cb94969ee90 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fuchsia/wlan/mlme/cpp/fidl.h>
#include <gtest/gtest.h>
#include <src/connectivity/wlan/drivers/wlanif/convert.h>
#include <wlan/common/element.h>
namespace wlanif {
namespace {
namespace wlan_mlme = ::fuchsia::wlan::mlme;
template <typename T>
zx_status_t ValidateMessage(T* msg) {
fidl::Encoder enc(0);
enc.Alloc(fidl::EncodingInlineSize<T>(&enc));
msg->Encode(&enc, sizeof(fidl_message_header_t));
auto encoded = enc.GetMessage();
auto msg_body = encoded.payload();
const char* err_msg = nullptr;
return fidl_validate(T::FidlType, msg_body.data(), msg_body.size(), 0, &err_msg);
}
wlanif_bss_description_t FakeBssWithSsidLen(uint8_t ssid_len) {
return {
.ssid =
{
.len = ssid_len,
},
.bss_type = WLAN_BSS_TYPE_INFRASTRUCTURE,
};
}
TEST(ConvertTest, ToFidlBSSDescription_SsidEmpty) {
wlan_mlme::BSSDescription fidl_desc = {};
ConvertBSSDescription(&fidl_desc, FakeBssWithSsidLen(0));
auto status = ValidateMessage(&fidl_desc);
EXPECT_EQ(status, ZX_OK);
}
TEST(ConvertTest, ToFidlBSSDescription_Ssid) {
wlan_mlme::BSSDescription fidl_desc = {};
ConvertBSSDescription(&fidl_desc, FakeBssWithSsidLen(3));
auto status = ValidateMessage(&fidl_desc);
EXPECT_EQ(status, ZX_OK);
}
TEST(ConvertTest, ToFidlBSSDescription_SsidMaxLength) {
wlan_mlme::BSSDescription fidl_desc = {};
ConvertBSSDescription(&fidl_desc, FakeBssWithSsidLen(32));
auto status = ValidateMessage(&fidl_desc);
EXPECT_EQ(status, ZX_OK);
}
TEST(ConvertTest, ToFidlBSSDescription_SsidTooLong) {
wlan_mlme::BSSDescription fidl_desc = {};
ConvertBSSDescription(&fidl_desc, FakeBssWithSsidLen(33));
auto status = ValidateMessage(&fidl_desc);
EXPECT_EQ(status, ZX_OK);
}
TEST(ConvertTest, ToVectorRateSets_InvalidRateCount) {
wlanif_bss_description bss_desc{};
std::vector<uint8_t> expected;
bss_desc.num_rates = WLAN_MAC_MAX_RATES + 1;
for (unsigned i = 0; i < WLAN_MAC_MAX_RATES + 1; i++) {
bss_desc.rates[i] = i;
expected.push_back(i);
}
std::vector<uint8_t> rates;
ConvertRates(&rates, bss_desc);
expected.resize(wlan_mlme::RATES_MAX_LEN); // ConvertRates will truncate excess rates
EXPECT_EQ(rates, expected);
}
TEST(ConvertTest, ToFidlAssocInd) {
wlan_mlme::AssociateIndication fidl_ind = {};
wlanif_assoc_ind_t assoc_ind = {
.rsne_len = 64,
};
// Check if rsne gets copied over
ConvertAssocInd(&fidl_ind, assoc_ind);
ASSERT_TRUE(fidl_ind.rsne.has_value());
ASSERT_TRUE(fidl_ind.rsne->size() == 64);
auto status = ValidateMessage(&fidl_ind);
EXPECT_EQ(status, ZX_OK);
// Check to see rsne is not copied in this case and also ensure
// the FIDL message gets reset
assoc_ind.rsne_len = 0;
ConvertAssocInd(&fidl_ind, assoc_ind);
ASSERT_FALSE(fidl_ind.rsne.has_value());
status = ValidateMessage(&fidl_ind);
EXPECT_EQ(status, ZX_OK);
}
} // namespace
} // namespace wlanif