// 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 "test_support.h"

#include <ddk/driver.h>
#include <lib/zx/vmar.h>

#include "gtest/gtest.h"

static zx_device_t* g_parent_device;

TestSupport::FirmwareFile::~FirmwareFile() {
  if (ptr)
    zx::vmar::root_self()->unmap((uintptr_t)ptr, size);
}

zx_device_t* TestSupport::parent_device() { return g_parent_device; }

void TestSupport::set_parent_device(zx_device_t* handle) {
  g_parent_device = handle;
}

void TestSupport::RunAllTests() {
  const int kArgc = 1;
  const char* argv[kArgc] = {"test_support"};
  testing::InitGoogleTest(const_cast<int*>(&kArgc), const_cast<char**>(argv));
  (void)RUN_ALL_TESTS();
}

std::unique_ptr<TestSupport::FirmwareFile> TestSupport::LoadFirmwareFile(
    const char* name) {
  auto firmware_file = std::make_unique<FirmwareFile>();
  zx::vmo test_file;
  size_t test_file_size;
  zx_status_t status =
      load_firmware(TestSupport::parent_device(), name,
                    test_file.reset_and_get_address(), &test_file_size);
  if (status != ZX_OK)
    return nullptr;
  uint64_t ptr;
  status = zx::vmar::root_self()->map(0, test_file, 0, test_file_size,
                                      ZX_VM_PERM_READ, &ptr);
  if (status != ZX_OK)
    return nullptr;
  firmware_file->vmo = std::move(test_file);
  firmware_file->size = test_file_size;
  firmware_file->ptr = (uint8_t*)ptr;
  return firmware_file;
}
