// Copyright 2019 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/generic_failure_collector.h"

#include <unistd.h>

#include <string>

#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "crash-reporter/test_util.h"

using base::FilePath;

namespace {

bool s_metrics = false;

// Source tree log config file name.
const char kLogConfigFileName[] = "crash_reporter_logs.conf";

const char kTestFilename[] = "test-generic-failure";
const char kTestFailureDirectory[] = "test-failure_directory";

bool IsMetrics() {
  return s_metrics;
}

}  // namespace

class GenericFailureCollectorMock : public GenericFailureCollector {
 public:
  GenericFailureCollectorMock() : GenericFailureCollector() {}
  explicit GenericFailureCollectorMock(const std::string& exec_name)
      : GenericFailureCollector(exec_name) {}
  MOCK_METHOD(void, SetUpDBus, (), (override));
};

class GenericFailureCollectorTest : public ::testing::Test {
 public:
  GenericFailureCollectorTest() {}
  explicit GenericFailureCollectorTest(const std::string& exec_name)
      : collector_(exec_name) {}
  void SetUp() {
    s_metrics = true;

    EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(testing::Return());

    collector_.Initialize(IsMetrics, false);
    ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
    test_path_ = scoped_temp_dir_.GetPath().Append(kTestFilename);
    collector_.failure_report_path_ = test_path_.value();

    test_failure_directory_ =
        scoped_temp_dir_.GetPath().Append(kTestFailureDirectory);
    CreateDirectory(test_failure_directory_);
    collector_.set_crash_directory_for_test(test_failure_directory_);
    collector_.set_log_config_path(
        test_util::GetTestDataPath(kLogConfigFileName).value());
  }

 protected:
  GenericFailureCollectorMock collector_;
  base::ScopedTempDir scoped_temp_dir_;
  FilePath test_path_;
  FilePath test_failure_directory_;
};

class SuspendFailureCollectorTest : public GenericFailureCollectorTest {
 public:
  SuspendFailureCollectorTest()
      : GenericFailureCollectorTest(GenericFailureCollector::kSuspendFailure) {}
};

TEST_F(GenericFailureCollectorTest, CollectOKMain) {
  // Collector produces a crash report.
  ASSERT_TRUE(test_util::CreateFile(test_path_,
                                    "generic failure for testing purposes\n"));
  EXPECT_TRUE(collector_.Collect());
  EXPECT_FALSE(IsDirectoryEmpty(test_failure_directory_));
  EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_failure_directory_, "generic_failure.*.meta", NULL));
  EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_failure_directory_, "generic_failure.*.log", NULL));
}

TEST_F(SuspendFailureCollectorTest, SuspendExecName) {
  // Check that the suspend-failure exec name is used
  ASSERT_TRUE(test_util::CreateFile(test_path_,
                                    "suspend failure for testing purposes\n"));
  EXPECT_TRUE(collector_.Collect());
  EXPECT_FALSE(IsDirectoryEmpty(test_failure_directory_));
  EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_failure_directory_, "suspend_failure.*.meta", NULL));
  EXPECT_TRUE(test_util::DirectoryHasFileWithPattern(
      test_failure_directory_, "suspend_failure.*.log", NULL));
}

TEST_F(GenericFailureCollectorTest, FailureReportDoesNotExist) {
  // Generic failure report file doesn't exist.
  EXPECT_TRUE(collector_.Collect());
  EXPECT_TRUE(IsDirectoryEmpty(test_failure_directory_));
}

TEST_F(GenericFailureCollectorTest, EmptyFailureReport) {
  // Generic failure report file exists, but doesn't have the expected contents.
  ASSERT_TRUE(test_util::CreateFile(test_path_, ""));
  EXPECT_TRUE(collector_.Collect());
  EXPECT_TRUE(IsDirectoryEmpty(test_failure_directory_));
}

TEST_F(GenericFailureCollectorTest, FeedbackNotAllowed) {
  // Feedback not allowed.
  s_metrics = false;
  ASSERT_TRUE(test_util::CreateFile(test_path_,
                                    "generic failure for testing purposes\n"));
  EXPECT_TRUE(collector_.Collect());
  EXPECT_TRUE(IsDirectoryEmpty(test_failure_directory_));
}
