// 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 <gtest/gtest.h>

#include "third_party/iwlwifi/test/sim-nvm.h"

extern "C" {
#include "third_party/iwlwifi/mvm/mvm.h"
}

#include "third_party/iwlwifi/iwl-drv.h"
#include "third_party/iwlwifi/test/fake-ucode-test.h"

namespace wlan::testing {
namespace {

class NvmTest : public FakeUcodeTest {
 public:
  NvmTest() : FakeUcodeTest({IWL_UCODE_TLV_CAPA_LAR_SUPPORT}, {}) {}
  ~NvmTest() {}
};

// Please refer the default NVM data in sim-default-nvm.cc. The expected values in this test
// are based on those binary data.
TEST_F(NvmTest, TestParsingDefaultNvm) {
  auto mvm = iwl_trans_get_mvm(sim_trans_.iwl_trans());
  auto data = mvm->nvm_data;
  EXPECT_EQ(data->nvm_version, 0xc16);

  // Compare the parsed MAC address
  uint8_t expected_mac[] = {0xb4, 0xd5, 0xbd, 0x11, 0x22, 0x33};
  EXPECT_EQ(0, std::memcmp(expected_mac, data->hw_addr, sizeof(expected_mac)));
  EXPECT_EQ(data->n_hw_addrs, 5);

  // Radio config
  EXPECT_EQ(data->radio_cfg_type, NVM_RF_CFG_TYPE_MSK(0x33d0));

  // Features
  EXPECT_EQ(data->sku_cap_band_24ghz_enable, true);
  EXPECT_EQ(data->sku_cap_band_52ghz_enable, true);
  EXPECT_EQ(data->sku_cap_11n_enable, true);
  EXPECT_EQ(data->sku_cap_11ac_enable, true);
  EXPECT_EQ(data->sku_cap_mimo_disabled, false);

  EXPECT_EQ(data->calib_version, 255);

  // Band and channel info
  // - 2G band
  EXPECT_EQ(data->bands[WLAN_BAND_TWO_GHZ].band, WLAN_BAND_TWO_GHZ);
  EXPECT_EQ(data->bands[WLAN_BAND_TWO_GHZ].n_channels, 14);
  EXPECT_EQ(data->bands[WLAN_BAND_TWO_GHZ].channels[0].ch_num, 1);
  // - 5G band
  EXPECT_EQ(data->bands[WLAN_BAND_FIVE_GHZ].band, WLAN_BAND_FIVE_GHZ);
  EXPECT_EQ(data->bands[WLAN_BAND_FIVE_GHZ].n_channels, 25);
  EXPECT_EQ(data->bands[WLAN_BAND_FIVE_GHZ].channels[0].ch_num, 36);
}

TEST_F(NvmTest, CfgRatesTo80211) {
  EXPECT_EQ(2, cfg_rates_to_80211(1 * 10));  // 1 Mbps
}

TEST_F(NvmTest, UpdateMcc) {
  auto mvm = iwl_trans_get_mvm(sim_trans_.iwl_trans());
  struct iwl_mcc_update_resp *resp;

  mtx_lock(&mvm->mutex);
  EXPECT_EQ(ZX_OK, iwl_mvm_update_mcc(mvm, "US", MCC_SOURCE_WIFI, &resp));
  mtx_unlock(&mvm->mutex);

  EXPECT_EQ(resp->mcc, 0x5553);  // "US"

  free(resp);
}

TEST_F(NvmTest, InitMcc) {
  auto mvm = iwl_trans_get_mvm(sim_trans_.iwl_trans());

  mtx_lock(&mvm->mutex);
  EXPECT_EQ(ZX_OK, iwl_mvm_init_mcc(mvm));
  mtx_unlock(&mvm->mutex);
  EXPECT_EQ(true, mvm->lar_regdom_set);
}

}  // namespace
}  // namespace wlan::testing
