// Copyright 2018 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 <wlan/common/element.h>
#include <wlan/mlme/client/bss.h>

#include <fuchsia/wlan/mlme/cpp/fidl.h>

#include <gtest/gtest.h>

#include <memory>

namespace wlan {
namespace {

namespace wlan_mlme = ::fuchsia::wlan::mlme;

TEST(FidlToElement, VhtMcsNssFidlToBitField) {
    wlan_mlme::VhtMcsNss fidl;

    fidl.rx_max_mcs[0] = 1;
    fidl.rx_max_mcs[1] = 2;
    fidl.rx_max_mcs[2] = 3;
    fidl.rx_max_mcs[3] = 1;
    fidl.rx_max_mcs[4] = 2;
    fidl.rx_max_mcs[5] = 3;
    fidl.rx_max_mcs[6] = 1;
    fidl.rx_max_mcs[7] = 2;

    fidl.tx_max_mcs[0] = 3;
    fidl.tx_max_mcs[1] = 2;
    fidl.tx_max_mcs[2] = 1;
    fidl.tx_max_mcs[3] = 3;
    fidl.tx_max_mcs[4] = 2;
    fidl.tx_max_mcs[5] = 1;
    fidl.tx_max_mcs[6] = 3;
    fidl.tx_max_mcs[7] = 2;

    fidl.rx_max_data_rate = 1234;
    fidl.max_nsts = 7;

    fidl.tx_max_data_rate = 8191;
    fidl.ext_nss_bw = 1;

    VhtMcsNss out = VhtMcsNss::FromFidl(fidl);

    EXPECT_EQ(out.val(), 0x3FFFB6DBE4D29E79ULL);

    EXPECT_EQ(out.rx_max_mcs_ss1(), 1);
    EXPECT_EQ(out.rx_max_mcs_ss2(), 2);
    EXPECT_EQ(out.rx_max_mcs_ss3(), 3);
    EXPECT_EQ(out.rx_max_mcs_ss4(), 1);
    EXPECT_EQ(out.rx_max_mcs_ss5(), 2);
    EXPECT_EQ(out.rx_max_mcs_ss6(), 3);
    EXPECT_EQ(out.rx_max_mcs_ss7(), 1);
    EXPECT_EQ(out.rx_max_mcs_ss8(), 2);

    EXPECT_EQ(out.tx_max_mcs_ss1(), 3);
    EXPECT_EQ(out.tx_max_mcs_ss2(), 2);
    EXPECT_EQ(out.tx_max_mcs_ss3(), 1);
    EXPECT_EQ(out.tx_max_mcs_ss4(), 3);
    EXPECT_EQ(out.tx_max_mcs_ss5(), 2);
    EXPECT_EQ(out.tx_max_mcs_ss6(), 1);
    EXPECT_EQ(out.tx_max_mcs_ss7(), 3);
    EXPECT_EQ(out.tx_max_mcs_ss8(), 2);

    EXPECT_EQ(out.rx_max_data_rate(), 1234);
    EXPECT_EQ(out.max_nsts(), 7);

    EXPECT_EQ(out.tx_max_data_rate(), 8191);
    EXPECT_EQ(out.ext_nss_bw(), 1);
}

TEST(ElementToFidl, VhtMcsNssBitFieldToFidl) {
    VhtMcsNss vmn;
    vmn.set_rx_max_mcs_ss1(1);
    vmn.set_rx_max_mcs_ss2(2);
    vmn.set_rx_max_mcs_ss3(3);
    vmn.set_rx_max_mcs_ss4(1);
    vmn.set_rx_max_mcs_ss5(2);
    vmn.set_rx_max_mcs_ss6(3);
    vmn.set_rx_max_mcs_ss7(1);
    vmn.set_rx_max_mcs_ss8(2);
    vmn.set_rx_max_data_rate(1234);
    vmn.set_max_nsts(7);

    vmn.set_tx_max_mcs_ss1(3);
    vmn.set_tx_max_mcs_ss2(2);
    vmn.set_tx_max_mcs_ss3(1);
    vmn.set_tx_max_mcs_ss4(3);
    vmn.set_tx_max_mcs_ss5(2);
    vmn.set_tx_max_mcs_ss6(1);
    vmn.set_tx_max_mcs_ss7(3);
    vmn.set_tx_max_mcs_ss8(2);
    vmn.set_tx_max_data_rate(8191);
    vmn.set_ext_nss_bw(1);

    auto fidl = vmn.ToFidl();

    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[0]), 1);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[1]), 2);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[2]), 3);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[3]), 1);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[4]), 2);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[5]), 3);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[6]), 1);
    EXPECT_EQ(static_cast<uint8_t>(fidl.rx_max_mcs[7]), 2);
    EXPECT_EQ(fidl.rx_max_data_rate, 1234);
    EXPECT_EQ(fidl.max_nsts, 7);

    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[0]), 3);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[1]), 2);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[2]), 1);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[3]), 3);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[4]), 2);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[5]), 1);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[6]), 3);
    EXPECT_EQ(static_cast<uint8_t>(fidl.tx_max_mcs[7]), 2);
    EXPECT_EQ(fidl.tx_max_data_rate, 8191);
    EXPECT_EQ(fidl.ext_nss_bw, 1);
}

TEST(ElementHumanAccessor, HtCapabilitiesBitFieldOrHuman) {
    HtCapabilities hc;

    hc.mcs_set.tx_mcs.set_max_ss_human(3);
    hc.txbf_cap.set_csi_antennas_human(4);
    hc.txbf_cap.set_noncomp_steering_ants_human(2);
    hc.txbf_cap.set_comp_steering_ants_human(3);
    hc.txbf_cap.set_csi_rows_human(2);
    hc.txbf_cap.set_chan_estimation_human(4);

    EXPECT_EQ(hc.mcs_set.tx_mcs.max_ss(), 2);
    EXPECT_EQ(hc.txbf_cap.csi_antennas(), 3);
    EXPECT_EQ(hc.txbf_cap.noncomp_steering_ants(), 1);
    EXPECT_EQ(hc.txbf_cap.comp_steering_ants(), 2);
    EXPECT_EQ(hc.txbf_cap.csi_rows(), 1);
    EXPECT_EQ(hc.txbf_cap.chan_estimation(), 3);

    hc.mcs_set.tx_mcs.set_max_ss(3);
    hc.txbf_cap.set_csi_antennas(2);
    hc.txbf_cap.set_noncomp_steering_ants(1);
    hc.txbf_cap.set_comp_steering_ants(1);
    hc.txbf_cap.set_csi_rows(2);
    hc.txbf_cap.set_chan_estimation(3);

    EXPECT_EQ(hc.mcs_set.tx_mcs.max_ss_human(), 4);
    EXPECT_EQ(hc.txbf_cap.csi_antennas_human(), 3);
    EXPECT_EQ(hc.txbf_cap.noncomp_steering_ants_human(), 2);
    EXPECT_EQ(hc.txbf_cap.comp_steering_ants_human(), 2);
    EXPECT_EQ(hc.txbf_cap.csi_rows_human(), 3);
    EXPECT_EQ(hc.txbf_cap.chan_estimation_human(), 4);
}

TEST(FidlToElement, HtCapabilitiesFidlToBitField) {
    wlan_mlme::HtCapabilities fidl;

    fidl.mcs_set.rx_mcs_set = 0xfedcba9876543210;
    fidl.mcs_set.tx_max_ss = 3;
    fidl.txbf_cap.csi_antennas = 4;
    fidl.txbf_cap.noncomp_steering_ants = 2;
    fidl.txbf_cap.comp_steering_ants = 1;
    fidl.txbf_cap.csi_rows = 2;
    fidl.txbf_cap.chan_estimation = 3;

    HtCapabilities out = HtCapabilities::FromFidl(fidl);

    EXPECT_EQ(out.mcs_set.rx_mcs_head.bitmask(), 0xfedcba9876543210ULL);
    EXPECT_EQ(out.mcs_set.tx_mcs.max_ss_human(), 3);
    EXPECT_EQ(out.mcs_set.tx_mcs.max_ss(), 2);
    EXPECT_EQ(out.txbf_cap.csi_antennas_human(), 4);
    EXPECT_EQ(out.txbf_cap.csi_antennas(), 3);
    EXPECT_EQ(out.txbf_cap.noncomp_steering_ants_human(), 2);
    EXPECT_EQ(out.txbf_cap.noncomp_steering_ants(), 1);
    EXPECT_EQ(out.txbf_cap.comp_steering_ants_human(), 1);
    EXPECT_EQ(out.txbf_cap.comp_steering_ants(), 0);
    EXPECT_EQ(out.txbf_cap.chan_estimation_human(), 3);
    EXPECT_EQ(out.txbf_cap.chan_estimation(), 2);
}

TEST(ElementToFidl, HtCapabilitiesToFidlHuman) {
    HtCapabilities hc;

    hc.mcs_set.rx_mcs_head.set_bitmask(0xfedcba9876543210);
    hc.mcs_set.tx_mcs.set_max_ss_human(3);
    hc.txbf_cap.set_csi_antennas_human(4);
    hc.txbf_cap.set_noncomp_steering_ants_human(2);
    hc.txbf_cap.set_comp_steering_ants_human(1);
    hc.txbf_cap.set_csi_rows_human(2);
    hc.txbf_cap.set_chan_estimation_human(3);

    auto fidl = hc.ToFidl();
    EXPECT_EQ(fidl.mcs_set.rx_mcs_set, static_cast<uint64_t>(0xfedcba9876543210));
    EXPECT_EQ(fidl.mcs_set.tx_max_ss, 3);
    EXPECT_EQ(fidl.txbf_cap.csi_antennas, 4);
    EXPECT_EQ(fidl.txbf_cap.noncomp_steering_ants, 2);
    EXPECT_EQ(fidl.txbf_cap.comp_steering_ants, 1);
    EXPECT_EQ(fidl.txbf_cap.csi_rows, 2);
    EXPECT_EQ(fidl.txbf_cap.chan_estimation, 3);
}

TEST(FidlToElement, HtOperationFidlToBitField) {
    wlan_mlme::HtOperation fidl;

    fidl.primary_chan = 169;

    auto* ht_op_info = &fidl.ht_op_info;
    ht_op_info->secondary_chan_offset = to_enum_type(wlan_mlme::SecChanOffset::SECONDARY_ABOVE);
    ht_op_info->sta_chan_width = to_enum_type(wlan_mlme::StaChanWidth::ANY);
    ht_op_info->rifs_mode = true;
    ht_op_info->ht_protect = to_enum_type(wlan_mlme::HtProtect::TWENTY_MHZ);
    ht_op_info->nongreenfield_present = true;
    ht_op_info->obss_non_ht = true;
    ht_op_info->center_freq_seg2 = 155;
    ht_op_info->dual_beacon = true;
    ht_op_info->dual_cts_protect = true;

    ht_op_info->stbc_beacon = true;
    ht_op_info->lsig_txop_protect = true;
    ht_op_info->pco_active = true;
    ht_op_info->pco_phase = true;

    fidl.basic_mcs_set.rx_mcs_set = 0x89abcdef01234567ULL;

    HtOperation elem = HtOperation::FromFidl(fidl);

    EXPECT_EQ(elem.primary_chan, 169);

    EXPECT_EQ(elem.head.secondary_chan_offset(), 1);
    EXPECT_EQ(elem.head.sta_chan_width(), 1);
    EXPECT_EQ(elem.head.rifs_mode(), 1);
    EXPECT_EQ(elem.head.ht_protect(), 2);
    EXPECT_EQ(elem.head.nongreenfield_present(), 1);
    EXPECT_EQ(elem.head.obss_non_ht(), 1);
    EXPECT_EQ(elem.head.center_freq_seg2(), 155);
    EXPECT_EQ(elem.head.dual_beacon(), 1);
    EXPECT_EQ(elem.head.dual_cts_protect(), 1);

    EXPECT_EQ(elem.tail.stbc_beacon(), 1);
    EXPECT_EQ(elem.tail.lsig_txop_protect(), 1);
    EXPECT_EQ(elem.tail.pco_active(), 1);
    EXPECT_EQ(elem.tail.pco_phase(), 1);

    EXPECT_EQ(elem.basic_mcs_set.rx_mcs_head.bitmask(), 0x89abcdef01234567ULL);
}

TEST(ElementToFidl, HtOperationToFidl) {
    HtOperation hto;

    hto.primary_chan = 169;

    hto.head.set_secondary_chan_offset(1);
    hto.head.set_sta_chan_width(1);
    hto.head.set_rifs_mode(1);
    hto.head.set_ht_protect(2);
    hto.head.set_nongreenfield_present(1);
    hto.head.set_obss_non_ht(1);
    hto.head.set_center_freq_seg2(155);
    hto.head.set_dual_beacon(1);
    hto.head.set_dual_cts_protect(1);

    hto.tail.set_stbc_beacon(1);
    hto.tail.set_lsig_txop_protect(1);
    hto.tail.set_pco_active(1);
    hto.tail.set_pco_phase(1);

    hto.basic_mcs_set.rx_mcs_head.set_bitmask(0x89abcdef01234567);

    auto fidl = hto.ToFidl();
    EXPECT_EQ(fidl.primary_chan, 169);

    const auto& htoi = fidl.ht_op_info;
    EXPECT_EQ(htoi.secondary_chan_offset, to_enum_type(wlan_mlme::SecChanOffset::SECONDARY_ABOVE));
    EXPECT_EQ(htoi.sta_chan_width, to_enum_type(wlan_mlme::StaChanWidth::ANY));
    EXPECT_TRUE(htoi.rifs_mode);
    EXPECT_EQ(htoi.ht_protect, to_enum_type(wlan_mlme::HtProtect::TWENTY_MHZ));
    EXPECT_TRUE(htoi.nongreenfield_present);
    EXPECT_TRUE(htoi.obss_non_ht);
    EXPECT_EQ(htoi.center_freq_seg2, 155);
    EXPECT_TRUE(htoi.dual_beacon);
    EXPECT_TRUE(htoi.dual_cts_protect);

    EXPECT_TRUE(htoi.stbc_beacon);
    EXPECT_TRUE(htoi.lsig_txop_protect);
    EXPECT_TRUE(htoi.pco_active);
    EXPECT_TRUE(htoi.pco_phase);

    EXPECT_EQ(fidl.basic_mcs_set.rx_mcs_set, static_cast<uint64_t>(0x89abcdef01234567));
}

TEST(FidlToElement, VhtOperationFidlToBitField) {
    wlan_mlme::VhtOperation fidl;

    fidl.vht_cbw = to_enum_type(wlan_mlme::VhtCbw::CBW_160);
    fidl.center_freq_seg0 = 155;
    fidl.center_freq_seg1 = 169;
    fidl.basic_mcs.max_mcs[0] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8);
    fidl.basic_mcs.max_mcs[1] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9);
    fidl.basic_mcs.max_mcs[2] = to_enum_type(wlan_mlme::VhtMcs::SET_NONE);
    fidl.basic_mcs.max_mcs[3] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9);
    fidl.basic_mcs.max_mcs[4] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8);
    fidl.basic_mcs.max_mcs[5] = to_enum_type(wlan_mlme::VhtMcs::SET_NONE);
    fidl.basic_mcs.max_mcs[6] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8);
    fidl.basic_mcs.max_mcs[7] = to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9);

    VhtOperation elem = VhtOperation::FromFidl(fidl);

    EXPECT_EQ(elem.vht_cbw, 2);
    EXPECT_EQ(elem.center_freq_seg0, 155);
    EXPECT_EQ(elem.center_freq_seg1, 169);

    EXPECT_EQ(elem.basic_mcs.val(), 0x9db9);
    EXPECT_EQ(elem.basic_mcs.ss1(), 1);
    EXPECT_EQ(elem.basic_mcs.ss2(), 2);
    EXPECT_EQ(elem.basic_mcs.ss3(), 3);
    EXPECT_EQ(elem.basic_mcs.ss4(), 2);
    EXPECT_EQ(elem.basic_mcs.ss5(), 1);
    EXPECT_EQ(elem.basic_mcs.ss6(), 3);
    EXPECT_EQ(elem.basic_mcs.ss7(), 1);
    EXPECT_EQ(elem.basic_mcs.ss8(), 2);
}

TEST(ElementToFidl, VhtOperationBitFieldToField) {
    VhtOperation elem;

    elem.vht_cbw = 2;
    elem.center_freq_seg0 = 155;
    elem.center_freq_seg1 = 169;

    elem.basic_mcs.set_ss1(1);
    elem.basic_mcs.set_ss2(2);
    elem.basic_mcs.set_ss3(3);
    elem.basic_mcs.set_ss4(2);
    elem.basic_mcs.set_ss5(1);
    elem.basic_mcs.set_ss6(3);
    elem.basic_mcs.set_ss7(1);
    elem.basic_mcs.set_ss8(2);

    wlan_mlme::VhtOperation fidl = elem.ToFidl();

    EXPECT_EQ(fidl.vht_cbw, to_enum_type(wlan_mlme::VhtCbw::CBW_160));
    EXPECT_EQ(fidl.center_freq_seg0, 155);
    EXPECT_EQ(fidl.center_freq_seg1, 169);

    EXPECT_EQ(fidl.basic_mcs.max_mcs[0], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[1], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[2], to_enum_type(wlan_mlme::VhtMcs::SET_NONE));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[3], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[4], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[5], to_enum_type(wlan_mlme::VhtMcs::SET_NONE));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[6], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_8));
    EXPECT_EQ(fidl.basic_mcs.max_mcs[7], to_enum_type(wlan_mlme::VhtMcs::SET_0_TO_9));
}

}  // namespace
}  // namespace wlan
