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

#include <lib/inspect/cpp/reader.h>

#include <algorithm>
#include <memory>

#include <zxtest/zxtest.h>

extern "C" {
#include "third_party/iwlwifi/fw/dbg.h"
#include "third_party/iwlwifi/fw/error-dump.h"
#include "third_party/iwlwifi/fw/runtime.h"
}

#include "third_party/iwlwifi/platform/driver-inspector.h"
#include "third_party/iwlwifi/test/single-ap-test.h"

namespace wlan::testing {
namespace {

class FwDbgTest : public SingleApTest {
 public:
  FwDbgTest();
  ~FwDbgTest() override;

 protected:
  std::unique_ptr<::wlan::iwlwifi::DriverInspector> inspector_;
  struct iwl_fw fw_ = {};
  struct iwl_fw_runtime fwrt_ = {};
};

FwDbgTest::FwDbgTest() {
  inspector_ = std::make_unique<::wlan::iwlwifi::DriverInspector>(
      wlan::iwlwifi::DriverInspectorOptions{.root_name = "fw_dbg_test" });
  sim_trans_.iwl_trans()->dev->inspector = static_cast<struct driver_inspector*>(inspector_.get());
  iwl_fw_runtime_init(&fwrt_, sim_trans_.iwl_trans(), &fw_, nullptr, nullptr, nullptr);
}

FwDbgTest::~FwDbgTest() { iwl_fw_runtime_free(&fwrt_); }

// Test a user-triggered firmware debug dump.
TEST_F(FwDbgTest, TestUserTrigger) {
  static const char kFwErrorDumpName[] = "fw_dbg_test_dump";
  iwl_fw_dbg_collect(&fwrt_, FW_DBG_TRIGGER_USER, kFwErrorDumpName, sizeof(kFwErrorDumpName));
  iwl_fw_flush_dump(&fwrt_);

  // Check that the dump exists.
  auto root_hierarchy = ::inspect::ReadFromVmo(inspector_->DuplicateVmo()).take_value();
  EXPECT_EQ(1, root_hierarchy.children().size());
  auto hierarchy = root_hierarchy.GetByPath({"fw_dbg_test"});
  EXPECT_NOT_NULL(hierarchy);

  if (hierarchy != nullptr) {
    EXPECT_EQ(1, hierarchy->node().properties().size());
    auto prop = hierarchy->node().get_property<inspect::ByteVectorPropertyValue>(kFwErrorDumpName);
    EXPECT_NOT_NULL(prop);

    // Sanity check the header of the dump.
    if (prop != nullptr) {
      const uint32_t barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
      EXPECT_LE(sizeof(barker), prop->value().size());
      EXPECT_EQ(0, std::memcmp(&barker, prop->value().data(),
                               std::min(sizeof(barker), prop->value().size())));
    }
  }
}

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