// Copyright 2020 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/zbitl/error-string.h>
#include <lib/zbitl/view.h>

#include <rapidjson/prettywriter.h>
#include <rapidjson/stringbuffer.h>

#include "src/lib/files/scoped_temp_dir.h"
#include "tests.h"

namespace {

using JsonBuffer = rapidjson::GenericStringBuffer<rapidjson::UTF8<char>>;

void TestJson(TestDataZbiType type) {
  files::ScopedTempDir dir;
  fbl::unique_fd fd;
  size_t size = 0;
  ASSERT_NO_FATAL_FAILURE(OpenTestDataZbi(type, dir.path(), &fd, &size));

  char buff[kMaxZbiSize];
  EXPECT_EQ(static_cast<ssize_t>(size), read(fd.get(), buff, size));

  zbitl::View view(std::string_view{buff, size});

  JsonBuffer buffer;
  rapidjson::PrettyWriter<JsonBuffer> json_writer(buffer);
  json_writer.SetIndent(' ', 2);
  JsonWriteZbi(json_writer, view, 0);
  EXPECT_EQ(GetExpectedJson(type), buffer.GetString());

  auto result = view.take_error();
  EXPECT_FALSE(result.is_error()) << ViewErrorString(result.error_value());
}

TEST(ZbitlJsonTests, EmptyZbi) { ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kEmpty)); }

TEST(ZbitlJsonTests, OneItemZbi) { ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kOneItem)); }

TEST(ZbitlJsonTests, CompressedItemZbi) {
  ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kCompressedItem));
}

TEST(ZbitlJsonTests, MultipleSmallItemsZbi) {
  ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kMultipleSmallItems));
}

TEST(ZbitlJsonTests, SecondItemOnPageBoundaryZbi) {
  ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kSecondItemOnPageBoundary));
}

TEST(ZbitlJsonTests, BootfsZbi) { ASSERT_NO_FATAL_FAILURE(TestJson(TestDataZbiType::kBootfs)); }

}  // namespace
