// Copyright 2021 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.

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_FAKE_UCODE_TEST_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_FAKE_UCODE_TEST_H_

#include <memory>

#include <gtest/gtest.h>

#include "third_party/iwlwifi/test/sim-trans.h"
#include "third_party/iwlwifi/test/mock-device.h"

namespace wlan::testing {

// Helper class for unit test code to inherit in order to create an fake firmware with
// customized ucode capability.
//
// Note that the contructor will call the init function of transportation layer,
// and assert it is successful. The test case doesn't need to init again.
//
class FakeUcodeTest : public ::testing::Test {
 public:
  // The constructor takes four parameters. They will be assigned to the API flags and capabilities.
  // The *_index are the array index in iwl_ucode_capabilities._api[] and ._capa[]. The *_value are
  // limited from 0 to 31. These 2 fields are used to present all values of IWL_UCODE_TLV_API_* and
  // IWL_UCODE_TLV_CAPA_*.
  //
  // TODO(fxbug.dev/92106): support multiple bits.
  //
  // For how iwlwifi driver is parsing the ucode capabilities from firmware tlv binary, please refer
  // to iwl_set_ucode_capabilities() in iwlwifi/iwl-drv.c. For the value options, please refer to
  // enum iwl_ucode_tlv_capa and enum iwl_ucode_tlv_api in iwlwifi/fw/file.h.
  FakeUcodeTest(uint32_t capa_index, uint32_t capa_val, uint32_t api_index, uint32_t api_val);
  ~FakeUcodeTest() = default;

 protected:
  std::shared_ptr<MockDevice> fake_parent_;
  SimTransport sim_trans_;
};

}  // namespace wlan::testing

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_FAKE_UCODE_TEST_H_
