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

#include <gtest/gtest.h>

namespace croslog {

class ViewerPlaintextTest : public ::testing::Test {
 public:
  ViewerPlaintextTest() = default;

  static std::vector<BootRecords::BootEntry> GenerateBootLog(base::Time now) {
    std::vector<BootRecords::BootEntry> boot_entries;
    boot_entries.emplace_back(now + base::TimeDelta::FromSeconds(0),
                              "46640bbceeb149a696171d1ea34516ad");
    boot_entries.emplace_back(now + base::TimeDelta::FromSeconds(2),
                              "9fa644cb05dc4e3ebe3be322ac8d1e86");
    return boot_entries;
  }

  static LogEntry GenerateLogEntry(base::Time time) {
    return LogEntry{time, Severity::ERROR, "TAG",
                    1234, "MESSAGE",       "ENTIRE STRING"};
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(ViewerPlaintextTest);
};

TEST_F(ViewerPlaintextTest, ShouldFilterOutEntry) {
  {
    Config c;
    LogEntry e{base::Time::Now(), Severity::ERROR, "TAG", 1234,
               "MESSAGE",         "ENTIRE STRING"};

    ViewerPlaintext v(c);
    EXPECT_FALSE(v.ShouldFilterOutEntry(e));
  }

  {
    Config c;
    c.identifier = "TAG1";
    LogEntry e1{base::Time::Now(), Severity::ERROR, "TAG1", 1234,
                "MESSAGE",         "ENTIRE STRING"};
    LogEntry e2{base::Time::Now(), Severity::ERROR, "TAG2", 1234,
                "MESSAGE",         "ENTIRE STRING"};

    ViewerPlaintext v(c);
    EXPECT_FALSE(v.ShouldFilterOutEntry(e1));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e2));
  }

  {
    Config c;
    c.severity = Severity::ERROR;
    LogEntry e1{base::Time::Now(), Severity::WARNING, "TAG", 1234,
                "MESSAGE",         "ENTIRE STRING"};
    LogEntry e2{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "MESSAGE",         "ENTIRE STRING"};
    LogEntry e3{base::Time::Now(), Severity::CRIT, "TAG", 1234,
                "MESSAGE",         "ENTIRE STRING"};

    ViewerPlaintext v(c);
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e3));
  }

  {
    Config c;
    c.grep = "M.....E";
    LogEntry e1{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "MESSAGE",         "ENTIRE STRING"};
    LogEntry e2{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "xxMESSAGE",       "ENTIRE STRING"};
    LogEntry e3{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "MESSAGExx",       "ENTIRE STRING"};
    LogEntry e4{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "xxMESSAGExx",     "ENTIRE STRING"};
    LogEntry e5{base::Time::Now(), Severity::ERROR, "TAG", 1234,
                "message",         "ENTIRE STRING"};

    ViewerPlaintext v(c);
    EXPECT_FALSE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e3));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e4));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e5));
  }
}

TEST_F(ViewerPlaintextTest, ShouldFilterOutEntryWithBootId) {
  base::Time now = base::Time::Now();

  // First boot.
  {
    Config c;
    c.boot = "46640bbceeb149a696171d1ea34516ad";

    LogEntry e1 = GenerateLogEntry(now - base::TimeDelta::FromSeconds(2));
    LogEntry e2 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(0));
    LogEntry e3 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(2));

    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e3));
  }

  // Second (last) boot.
  {
    Config c;
    c.boot = "9fa644cb05dc4e3ebe3be322ac8d1e86";

    LogEntry e1 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(0));
    LogEntry e2 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(2));
    LogEntry e3 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(4));

    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e3));
  }

  // Last (second) boot.
  {
    Config c;
    c.boot = "";

    LogEntry e1 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(0));
    LogEntry e2 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(2));
    LogEntry e3 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(4));

    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e3));
  }

  // Last (second) boot.
  {
    Config c;
    c.boot = "0";

    LogEntry e1 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(0));
    LogEntry e2 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(2));
    LogEntry e3 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(4));

    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e2));
    EXPECT_FALSE(v.ShouldFilterOutEntry(e3));
  }

  // Invalid boot.
  {
    Config c;
    c.boot = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    LogEntry e1 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(0));
    LogEntry e2 = GenerateLogEntry(now + base::TimeDelta::FromSeconds(2));

    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e1));
    EXPECT_TRUE(v.ShouldFilterOutEntry(e2));
  }
}

TEST_F(ViewerPlaintextTest, GetBootIdAt) {
  base::Time now = base::Time::Now();

  {
    Config c;
    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));

    // Found no corresponding boot (before the 1st boot).
    EXPECT_TRUE(v.GetBootIdAt(now - base::TimeDelta::FromSeconds(100)).empty());

    // Found the 1st boot.
    EXPECT_EQ("46640bbceeb149a696171d1ea34516ad", v.GetBootIdAt(now));
    EXPECT_EQ("46640bbceeb149a696171d1ea34516ad",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(1)));

    // Found the 2nd (current) boot.
    EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(2)));
    EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(3)));
    EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(100)));
  }

  {
    Config c;
    ViewerPlaintext v(c, BootRecords(GenerateBootLog(now)));

    // Found the 2nd (current) boot.
    EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(100)));
    EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(2)));

    // Found the 1st boot.
    EXPECT_EQ("46640bbceeb149a696171d1ea34516ad",
              v.GetBootIdAt(now + base::TimeDelta::FromSeconds(1)));
    EXPECT_EQ("46640bbceeb149a696171d1ea34516ad", v.GetBootIdAt(now));

    // Found no corresponding boot (before the 1st boot).
    EXPECT_TRUE(v.GetBootIdAt(now - base::TimeDelta::FromSeconds(100)).empty());
  }
}

}  // namespace croslog
