// Copyright 2020 The Chromium OS 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 "crash-reporter/arcvm_native_collector.h"

#include <fcntl.h>
#include <memory>
#include <utility>

#include <base/files/file_util.h>
#include <base/files/scoped_file.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <gtest/gtest.h>

#include "crash-reporter/arc_util.h"
#include "crash-reporter/test_util.h"

namespace {

constexpr char kDevice[] = "Device";
constexpr char kBoard[] = "Board";
constexpr char kCpuAbi[] = "CPUABI";
constexpr char kFingerprint[] = "Fingerprint";

// 1546300800 is unixtime of 2019-01-01 00:00:00
constexpr time_t kTime = 1546300800;
constexpr pid_t kPid = 1234;
constexpr char kExecName[] = "execname";

constexpr char kTestCrashDirectory[] = "test-crash-directory";
constexpr char kBasenameWithoutExt[] = "execname.20190101.000000.*.1234";

constexpr char kMinidumpSampleContent[] = "*minidump*";

arc_util::BuildProperty GetBuildProperty() {
  return {.device = kDevice,
          .board = kBoard,
          .cpu_abi = kCpuAbi,
          .fingerprint = kFingerprint};
}
ArcvmNativeCollector::CrashInfo GetCrashInfo() {
  return {.time = kTime, .pid = kPid, .exec_name = kExecName};
}

}  // namespace

class TestArcvmNativeCollector : public ArcvmNativeCollector {
 public:
  explicit TestArcvmNativeCollector(const base::FilePath& crash_directory) {
    Initialize(false /* early */);
    set_crash_directory_for_test(crash_directory);
  }
  ~TestArcvmNativeCollector() override = default;

  bool HasMetaData(const std::string& key, const std::string& value) const {
    const std::string metadata =
        base::StringPrintf("%s=%s\n", key.c_str(), value.c_str());
    return extra_metadata_.find(metadata) != std::string::npos;
  }

 private:
  void SetUpDBus() override {}
};

class ArcvmNativeCollectorTest : public ::testing::Test {
 public:
  ~ArcvmNativeCollectorTest() override = default;

  void SetUp() override {
    ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());

    base::FilePath minidump_path =
        scoped_temp_dir_.GetPath().Append("minidump.dmp");
    ASSERT_TRUE(test_util::CreateFile(minidump_path, kMinidumpSampleContent));
    minidump_fd_ = base::ScopedFD(
        HANDLE_EINTR(open(minidump_path.value().c_str(), O_RDONLY)));
    ASSERT_NE(minidump_fd_, -1);

    test_crash_directory_ =
        scoped_temp_dir_.GetPath().Append(kTestCrashDirectory);
    ASSERT_TRUE(base::CreateDirectory(test_crash_directory_));
    collector_ =
        std::make_unique<TestArcvmNativeCollector>(test_crash_directory_);
  }

 protected:
  std::unique_ptr<TestArcvmNativeCollector> collector_;
  base::ScopedTempDir scoped_temp_dir_;
  base::FilePath test_crash_directory_;
  base::ScopedFD minidump_fd_;
};

TEST_F(ArcvmNativeCollectorTest, HandleCrashWithMinidumpFD) {
  ASSERT_TRUE(collector_->HandleCrashWithMinidumpFD(
      GetBuildProperty(), GetCrashInfo(), std::move(minidump_fd_)));

  EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_crash_directory_, std::string(kBasenameWithoutExt) + ".meta",
      nullptr));

  base::FilePath minidump_path;
  ASSERT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_crash_directory_, std::string(kBasenameWithoutExt) + ".dmp",
      &minidump_path));
  std::string minidump_content;
  EXPECT_TRUE(base::ReadFileToString(minidump_path, &minidump_content));
  EXPECT_EQ(minidump_content, kMinidumpSampleContent);
}

TEST_F(ArcvmNativeCollectorTest, AddArcMetadata) {
  collector_->AddArcMetadata(GetBuildProperty(), GetCrashInfo());
  EXPECT_TRUE(collector_->HasMetaData(arc_util::kProcessField, kExecName));
  EXPECT_TRUE(
      collector_->HasMetaData(arc_util::kArcVersionField, kFingerprint));
  EXPECT_TRUE(collector_->HasMetaData(arc_util::kDeviceField, kDevice));
  EXPECT_TRUE(collector_->HasMetaData(arc_util::kBoardField, kBoard));
  EXPECT_TRUE(collector_->HasMetaData(arc_util::kCpuAbiField, kCpuAbi));
}
