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

using VirtioMagmaGuestTest = GuestTest<TerminaEnclosedGuest>;

static constexpr const char* kDevicePath = "/dev/magma0";
static const std::unordered_map<std::string, std::string> kMagmaEnv = {
  {"VK_ICD_FILENAMES", "/tmp/extras/magma.json"},
};

TEST_F(VirtioMagmaGuestTest, DeviceProperties) {
  int32_t return_code = 0;
  ASSERT_EQ(this->Execute({"test", "-e", kDevicePath}, nullptr, &return_code), ZX_OK);
  ASSERT_EQ(return_code, 0) << kDevicePath << " does not exist";
  ASSERT_EQ(this->Execute({"test", "-c", kDevicePath}, nullptr, &return_code), ZX_OK);
  ASSERT_EQ(return_code, 0) << kDevicePath << " is not a character device";
}

TEST_F(VirtioMagmaGuestTest, MagmaConformance) {
  std::string text;
  int32_t return_code = 0;
  ASSERT_EQ(this->Execute({"/tmp/extras/magma_abi_conformance_tests"}, kMagmaEnv, &text, &return_code), ZX_OK);
  ASSERT_EQ(return_code, 0) << "[BEGIN GUEST TEXT]" << text << "[END GUEST TEXT]";
}

TEST_F(VirtioMagmaGuestTest, MagmaUnit) {
  std::string text;
  int32_t return_code = 0;
  ASSERT_EQ(this->Execute({"/tmp/extras/virtmagma_unit_tests_linux"}, kMagmaEnv, &text, &return_code), ZX_OK);
  ASSERT_EQ(return_code, 0) << "[BEGIN GUEST TEXT]" << text << "[END GUEST TEXT]";
}

TEST_F(VirtioMagmaGuestTest, VulkanUnit) {
  std::string text;
  int32_t return_code = 0;
  ASSERT_EQ(this->Execute({"/tmp/extras/virtmagma_vulkan_unit_tests"}, kMagmaEnv, &text, &return_code), ZX_OK);
  ASSERT_EQ(return_code, 0) << "[BEGIN GUEST TEXT]" << text << "[END GUEST TEXT]";
}
