// Copyright 2022 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/elfldltl/layout.h>
#include <lib/stdcompat/string_view.h>

#include <cstdlib>

#include <gtest/gtest.h>

#include "dump-tests.h"
#include "test-tool-process.h"

namespace {

void UsageTest(int expected_status, std::vector<std::string> args = {}) {
  zxdump::testing::TestToolProcess child;
  ASSERT_NO_FATAL_FAILURE(child.Start("gcore", args));
  ASSERT_NO_FATAL_FAILURE(child.CollectStdout());
  ASSERT_NO_FATAL_FAILURE(child.CollectStderr());
  int status;
  ASSERT_NO_FATAL_FAILURE(child.Finish(status));
  EXPECT_EQ(status, expected_status);
  EXPECT_EQ(child.collected_stdout(), "");
  std::string text = child.collected_stderr();
  EXPECT_TRUE(cpp20::starts_with(std::string_view(text), "Usage: "));
  EXPECT_TRUE(cpp20::ends_with(std::string_view(text), '\n'));
}

TEST(ZxdumpTests, GcoreHelp) { UsageTest(EXIT_SUCCESS, {"--help"}); }

TEST(ZxdumpTests, GcoreUsage) { UsageTest(EXIT_FAILURE); }

TEST(Zxdump, GcoreProcessDumpIsElfCore) {
  zxdump::testing::TestProcess process;
  ASSERT_NO_FATAL_FAILURE(process.StartChild());
  const std::string pid_string = std::to_string(process.koid());

  zxdump::testing::TestToolProcess child;
  auto& dump_file = child.MakeFile("process-dump", "." + pid_string);
  std::string prefix = dump_file.name();
  prefix.resize(prefix.size() - pid_string.size());
  ASSERT_NO_FATAL_FAILURE(child.Start("gcore", {"-o", prefix, pid_string}));
  ASSERT_NO_FATAL_FAILURE(child.CollectStdout());
  ASSERT_NO_FATAL_FAILURE(child.CollectStderr());
  int status;
  ASSERT_NO_FATAL_FAILURE(child.Finish(status));
  EXPECT_EQ(status, EXIT_SUCCESS);
  EXPECT_EQ(child.collected_stdout(), "");
  EXPECT_EQ(child.collected_stderr(), "");

  fbl::unique_fd fd = dump_file.OpenOutput();
  ASSERT_TRUE(fd);
  elfldltl::Elf<>::Ehdr ehdr;
  ASSERT_EQ(read(fd.get(), &ehdr, sizeof(ehdr)), static_cast<ssize_t>(sizeof(ehdr)))
      << strerror(errno);
  EXPECT_TRUE(ehdr.Valid());
  EXPECT_EQ(ehdr.type, elfldltl::ElfType::kCore);
}

}  // namespace
