// 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/anomaly_detector_text_file_reader.h"

#include <memory>
#include <string>
#include <utility>
#include <vector>

#include <gtest/gtest.h>

#include "crash-reporter/test_util.h"

namespace anomaly {

using FileReaderRun = std::vector<std::string>;

std::unique_ptr<TextFileReader> InitializeFileReaderForTest(
    const std::string& input_file_name) {
  base::FilePath input_file_path = test_util::GetTestDataPath(input_file_name);

  return std::make_unique<TextFileReader>(input_file_path);
}

void ReaderTest(const std::unique_ptr<TextFileReader>& r,
                const FileReaderRun& want) {
  FileReaderRun got{};
  std::string line;
  while (r->GetLine(&line)) {
    got.push_back(line);
  }
  ASSERT_EQ(want.size(), got.size());

  for (int i = 0; i < want.size(); i++) {
    EXPECT_EQ(want[i], got[i]);
  }
}

// Tests that an invalid file does not cause the entire program to fail.
TEST(AnomalyDetectorFileReaderTest, InvalidFileTest) {
  auto r = InitializeFileReaderForTest("FILE_DOES_NOT_EXIST");
  EXPECT_FALSE(r->file_.IsValid());

  // Make sure all public methods are safe with invalid file.
  std::string line;
  EXPECT_FALSE(r->GetLine(&line));
  r->SeekToEnd();
  r->SeekToBegin();
  SUCCEED();
}

TEST(AnomalyDetectorFileReaderTest, OpenFileTest) {
  auto r = InitializeFileReaderForTest("TEST_MESSAGE_LOG");
  EXPECT_TRUE(r->file_.IsValid());
}

// Tests if SeekToEnd() successfully moves the TextFileReader past
// the last line of the log to avoid re-reading of old logs.
TEST(AnomalyDetectorFileReaderTest, SeekToEndTest) {
  auto r = InitializeFileReaderForTest("TEST_MESSAGE_LOG");
  r->SeekToEnd();
  FileReaderRun want{};
  ReaderTest(r, want);
}

TEST(AnomalyDetectorFileReaderTest, FileTextReaderTest) {
  auto r = InitializeFileReaderForTest("TEST_MESSAGE_LOG");
  std::string l1 =
      "2020-05-10T22:45:04.419261-07:00 ERR tpm_managerd[790]: TPM error "
      "0x3011 (Communication failure): Failed to connect context.";
  std::string l2 = "";
  std::string l3 =
      R"(2020-05-12T20:56:03.754453-07:00 INFO rsyslogd[642]:  [origin )"
      R"(software="rsyslogd" swVersion="8.1904.0" x-pid="642" )"
      R"(x-info="https://www.rsyslog.com"] rsyslogd was HUPed)";
  std::string l4 =
      "2020-05-13T11:56:27.236308+09:00 INFO kernel: [  893.009245] "
      "atme1_mxt_ts 3-004b: Status: 00 Config Checksum: 673e89";
  std::string l5 =
      "2020-05-14T19:37:04.202906+09:00 INFO VM(3)[8947]:  "
      "[devices/src/virtio/balloon.rs:290] ballon config changed to consume "
      "255836 pages";
  std::string l6 =
      "2020-06-08T08:28:49.080656+09:00 NOTICE [2917]: log message with no "
      "tag.";
  FileReaderRun want{std::move(l1), std::move(l2), std::move(l3),
                     std::move(l4), std::move(l5), std::move(l6)};
  ReaderTest(r, want);
}

// This test fixture is responsible for the creation and deletion of temporary
// files.
class AnomalyDetectorFileReaderConcurrentTest : public ::testing::Test {
 protected:
  void SetUp() override {
    CHECK(base::CreateTemporaryFile(&path_));
    file_ = base::File(path_, base::File::FLAG_OPEN | base::File::FLAG_APPEND);
    CHECK(file_.IsValid());
  }

  void TearDown() override {
    CHECK(base::DeleteFile(path_, false));
    CHECK(base::DeleteFile(path_.AddExtension("old"), false));
  };

  // Use this method to append lines to file_.
  void AppendToFile(const std::vector<std::string>& lines) {
    for (auto line : lines) {
      file_.WriteAtCurrentPos(line.c_str(), line.length());
      file_.WriteAtCurrentPos("\n", 1);
    }
  }

  // This simulates log rotation. The original file_ will be moved to
  // ${path_}.old and a new file is created in its place. After this function
  // is called, AppendToFile will write to the newly createcd file.
  void RotateFiles() {
    CHECK(base::Move(path_, path_.AddExtension("old")));
    file_ =
        base::File(path_, base::File::FLAG_CREATE | base::File::FLAG_APPEND);
    CHECK(file_.IsValid());
  }

  base::FilePath path_;
  base::File file_;
};

TEST_F(AnomalyDetectorFileReaderConcurrentTest, ReadAppendedTextTest) {
  std::vector<std::string> file_content{"line 1", "line 2", "end"};

  auto r = std::make_unique<TextFileReader>(path_);
  EXPECT_TRUE(r->file_.IsValid());

  FileReaderRun want{};
  // Test that the file is empty.
  ReaderTest(r, want);

  // Append new lines to the file.
  AppendToFile(file_content);

  want.insert(want.end(), file_content.begin(), file_content.end());
  // Test if the newly appended lines are correctly read by TextFileReader.
  ReaderTest(r, want);
}

// Test that text appended to file after calling SeekToEnd is read properly.
// This is important since LogReader calls SeekToEnd upon initialisation.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, ReadAfterSeekToEndTest) {
  std::vector<std::string> file_content{"line 1", "line 2", "end"};

  AppendToFile(file_content);

  auto r = std::make_unique<TextFileReader>(path_);
  r->SeekToEnd();

  AppendToFile(file_content);

  FileReaderRun want{};
  want.insert(want.end(), file_content.begin(), file_content.end());
  ReaderTest(r, want);
}

// This simulates concurrent read and write on the file.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, ReadDuringWriteTest) {
  auto r = std::make_unique<TextFileReader>(path_);

  file_.WriteAtCurrentPos("li", 2);
  // r will not return any line since there is no '\n' at the end.
  ReaderTest(r, {});

  file_.WriteAtCurrentPos("ne\n", 3);
  ReaderTest(r, {"line"});
}

// Tests if LoadToBuffer works as intended when given a file containing lines
// that are longer than the buffer size of TextFileReader.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, ReadLineLongerThanBufferTest) {
  auto r = std::make_unique<TextFileReader>(path_);

  const int size_larger_than_buffer = TextFileReader::kBufferSize_ + 1;

  // Create a line longer than TextFileReader::kBufferSize_.
  std::string long_line(size_larger_than_buffer, 'a');

  for (int i = 0; i < 2; i++) {
    file_.WriteAtCurrentPos(long_line.c_str(), size_larger_than_buffer);
    file_.WriteAtCurrentPos("\n", 1);
  }

  ReaderTest(r, {long_line, long_line});
}

// Test if TextFileReader can open a file that did not exist when it was
// initialised.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, OpenFileRetryTest) {
  // File <path_>.old does not exist yet.
  auto r = std::make_unique<TextFileReader>(path_.AddExtension("old"));

  std::string line;
  EXPECT_FALSE(r->GetLine(&line));
  EXPECT_FALSE(r->file_.IsValid());

  // Write to file <path_>.
  std::vector<std::string> file_content{"line 1", "line 2", "end"};
  AppendToFile(file_content);

  // This moves the file <path_> to <path_>.old.
  RotateFiles();

  // TextFileReader should detect that <path_>.old now exists and read from it.
  FileReaderRun want{};
  want.insert(want.end(), file_content.begin(), file_content.end());
  ReaderTest(r, want);
}

// Test if TextFileReader stops retrying to open the file pointed by file_path_
// after kMaxOpenRetries_ times.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, OpenFileRetryExceededTest) {
  // File <path_>.old does not exist yet.
  auto r = std::make_unique<TextFileReader>(path_.AddExtension("old"));

  // GetLine internally calls Open.
  std::string line;
  for (int i = 0; i < TextFileReader::kMaxOpenRetries_; i++) {
    r->GetLine(&line);
  }

  std::vector<std::string> file_content{"line 1", "line 2", "end"};
  AppendToFile(file_content);

  // This moves the file <path_> to <path_>.old. Now <path_>.old exists and has
  // content.
  RotateFiles();

  // r does not try to open <path_>.old anymore since maximum number of retries
  // have been reached.
  FileReaderRun want{};
  ReaderTest(r, want);
}

// The original file opened by TextFileReader is replaced by a new file.
// TextFileReader should finish reading the original file and then read the new
// file to the end.
TEST_F(AnomalyDetectorFileReaderConcurrentTest, HandleFileMoveTest) {
  std::vector<std::string> file_content_1{"line1", "line2", "end"};
  std::vector<std::string> file_content_2{"new line 1", "new line 2",
                                          "new end"};

  auto r = std::make_unique<TextFileReader>(path_);
  EXPECT_TRUE(r->file_.IsValid());

  // Adding lines to file_.
  AppendToFile(file_content_1);

  RotateFiles();
  // The original file is now moved to ${path_}.old but file_ is still pointing
  // to it.

  // Adding lines to newly created file ${path_}.
  AppendToFile(file_content_2);

  // want should include both file_content_1 and file_content_2.
  FileReaderRun want{};
  want.insert(want.end(), file_content_1.begin(), file_content_1.end());
  want.insert(want.end(), file_content_2.begin(), file_content_2.end());

  // r should first read lines till the end of ${path_}.old file then open
  // ${path_} and read the lines from the new file.
  ReaderTest(r, want);
}

}  // namespace anomaly
