// 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 "src/developer/forensics/utils/archive.h"

#include <fuchsia/feedback/cpp/fidl.h>
#include <fuchsia/mem/cpp/fidl.h>
#include <lib/syslog/cpp/macros.h>

#include <map>
#include <string>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "src/developer/forensics/testing/gmatchers.h"
#include "src/developer/forensics/testing/gpretty_printers.h"
#include "src/lib/fsl/vmo/file.h"
#include "src/lib/fsl/vmo/sized_vmo.h"
#include "src/lib/fsl/vmo/vector.h"

namespace forensics {
namespace {

using fuchsia::feedback::Attachment;
using fuchsia::mem::Buffer;
using testing::Pair;
using testing::UnorderedElementsAreArray;

constexpr char kPlainTextFilename[] = "filename.txt";
constexpr char kJsonFilename[] = "filename.json";
constexpr char kXmlFilename[] = "filename.xml";
constexpr char kPlainTextFileContent[] = "plain text content";
constexpr char kJsonFileContent[] = R"({
  "key": "json content"
})";
constexpr char kXmlFileContent[] = "<tag>xml content</tag>";

// This corresponds to the content of resources/test_data.zip
const std::map<std::string, std::string> kAttachments = {
    {kPlainTextFilename, kPlainTextFileContent},
    {kJsonFilename, kJsonFileContent},
    {kXmlFilename, kXmlFileContent},
};

TEST(ArchiveTest, Archive) {
  Buffer archive;
  ASSERT_TRUE(Archive(kAttachments, &archive));
  ASSERT_TRUE(archive.vmo.is_valid());
  ASSERT_GT(archive.size, 0u);

  fsl::SizedVmo expected_vmo;
  ASSERT_TRUE(fsl::VmoFromFilename("/pkg/data/test_data.zip", &expected_vmo));
  std::vector<uint8_t> expected_bytes;
  ASSERT_TRUE(fsl::VectorFromVmo(expected_vmo, &expected_bytes));
  std::vector<uint8_t> actual_bytes;
  ASSERT_TRUE(fsl::VectorFromVmo(archive, &actual_bytes));
  EXPECT_EQ(actual_bytes, expected_bytes);
}

TEST(ArchiveTest, Unpack) {
  fsl::SizedVmo vmo;
  ASSERT_TRUE(fsl::VmoFromFilename("/pkg/data/test_data.zip", &vmo));
  Buffer archive = std::move(vmo).ToTransport();

  std::map<std::string, std::string> unpacked_attachments;
  ASSERT_TRUE(Unpack(archive, &unpacked_attachments));
  EXPECT_THAT(unpacked_attachments, UnorderedElementsAreArray({
                                        Pair(kPlainTextFilename, kPlainTextFileContent),
                                        Pair(kJsonFilename, kJsonFileContent),
                                        Pair(kXmlFilename, kXmlFileContent),
                                    }));
}

TEST(ArchiveTest, UnpackArchive) {
  Buffer archive;
  ASSERT_TRUE(Archive(kAttachments, &archive));

  std::map<std::string, std::string> unpacked_attachments;
  ASSERT_TRUE(Unpack(archive, &unpacked_attachments));
  EXPECT_EQ(unpacked_attachments, kAttachments);
}

}  // namespace
}  // namespace forensics
