// 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 <fidl/fuchsia.sysinfo/cpp/wire.h>
#include <lib/component/incoming/cpp/protocol.h>

#include <iostream>

#include <fbl/string.h>

#include "zircon/system/utest/device-enumeration/aemu.h"
#include "zircon/system/utest/device-enumeration/common.h"

namespace {

fbl::String GetTestFilter() {
  zx::result sys_info = component::Connect<fuchsia_sysinfo::SysInfo>();
  if (sys_info.is_error()) {
    return "Unknown";
  }

  const fidl::WireResult result = fidl::WireCall(sys_info.value())->GetBoardName();
  if (!result.ok()) {
    return "Unknown";
  }
  const fidl::WireResponse response = result.value();
  if (response.status != ZX_OK) {
    return "Unknown";
  }
  const std::string_view board_name = response.name.get();

  std::cout << "Found board " << board_name << std::endl;

  if (board_name == "qemu-arm64") {
    return "*QemuArm64*";
  } else if (board_name == "qemu-riscv64") {
    return "*QemuRiscv64*";
  } else if (board_name == "vim3") {
    return "*Vim3*";
  } else if (board_name == "astro") {
    return "*Astro*";
  } else if (board_name == "sherlock") {
    return "*Sherlock*";
  } else if (board_name == "nelson") {
    return "*Nelson*";
  } else if (board_name == "NUC7i5DNB" || board_name == "NUC11TNBv5") {
    return "*Nuc*";
  } else if (board_name == "Standard PC (Q35 + ICH9, 2009)") {
    // QEMU and AEMU with emulated Q35 boards have this board name.
    if (device_enumeration::IsAemuBoard()) {
      return "*AemuX64*";
    }
    return "*QemuX64*";
  } else if (board_name == "Google Compute Engine") {
#ifdef __aarch64__
    return "*GceArm64*";
#endif
  } else if (board_name == "arm64" || board_name == "x64") {
    return "*GenericShouldFail*";
  }

  return "Unknown";
}

// If this test fails, it indicates that the board driver set the board name incorrectly.
TEST_F(DeviceEnumerationTest, GenericShouldFailTest) {
  ASSERT_TRUE(false,
              "Board name was a generic board name, likely indicating that the board driver failed "
              "to find a real board name.");
}

}  // namespace

int main(int argc, char** argv) {
  fbl::Vector<fbl::String> errors;
  auto options = zxtest::Runner::Options::FromArgs(argc, argv, &errors);
  zxtest::LogSink* log_sink = zxtest::Runner::GetInstance()->mutable_reporter()->mutable_log_sink();

  if (!errors.is_empty()) {
    for (const auto& error : errors) {
      log_sink->Write("%s\n", error.c_str());
    }
    options.help = true;
  }

  options.filter = fbl::StringPrintf("%s:%s", GetTestFilter().c_str(), options.filter.c_str());

  // Errors will always set help to true.
  if (options.help) {
    zxtest::Runner::Options::Usage(argv[0], log_sink);
    return errors.is_empty();
  }

  if (options.list) {
    zxtest::Runner::GetInstance()->List(options);
    return 0;
  }

  return zxtest::Runner::GetInstance()->Run(options);
}
