// 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 <gmock/gmock.h>
#include <gtest/gtest.h>

#include "timberslide/fingerprint_log_listener_impl.h"

using testing::_;
using testing::Invoke;
using testing::NiceMock;
using testing::Return;

namespace timberslide {
namespace {

class FingerprintLogListenerImplMock : public FingerprintLogListenerImpl {
 public:
  MOCK_METHOD(bool, IsRebootLine, (const std::string&));
  MOCK_METHOD(bool, SendFingerprintMCUReboot, ());
};

TEST(FingerprintLogListenerImplTest,
     IsRebootLine_FeedbackReportLog_ExpectMatch) {
  FingerprintLogListenerImpl listener;
  EXPECT_TRUE(
      listener.IsRebootLine("[Image: RW, dartmonkey_v2.0.1873-b99b1b10c "
                            "2019-07-30 07:45:24 <email: 2>]"));
}

TEST(FingerprintLogListenerImplTest,
     IsRebootLine_StandardCrosFpLog_ExpectMatch) {
  FingerprintLogListenerImpl listener;
  EXPECT_TRUE(
      listener.IsRebootLine("[Image: RW, nocturne_fp_v2.2.110-b936c0a3c "
                            "2018-11-02 14:16:46 @swarm-cros-461"));
}

TEST(FingerprintLogListenerImplTest,
     IsRebootLine_StandardCrosFpLog_ExpectNoMatch) {
  FingerprintLogListenerImpl listener;
  EXPECT_FALSE(listener.IsRebootLine(
      "[Image: RO, hatch_fp_v2.0.2149-631b4461d private:v0.0.92-9afd891 "
      "2019-09-09 20:50:32 tomhughes@tomhughes-desktop.mtv.corp.google.com]"));
  EXPECT_FALSE(listener.IsRebootLine("[0.103361 RW verify OK]"));
}

TEST(FingerprintLogListenerImplTest, NewLogLine_FirstBoot) {
  NiceMock<FingerprintLogListenerImplMock> mock;
  EXPECT_CALL(mock, IsRebootLine).WillOnce(Return(true));
  EXPECT_CALL(mock, SendFingerprintMCUReboot).Times(0);
  mock.OnLogLine("foo");
}

TEST(FingerprintLogListenerImplTest, NewLogLine_ExpectReboot) {
  NiceMock<FingerprintLogListenerImplMock> mock;
  EXPECT_CALL(mock, IsRebootLine).WillRepeatedly(Return(true));
  EXPECT_CALL(mock, SendFingerprintMCUReboot).Times(1);
  mock.OnLogLine("foo1");
  mock.OnLogLine("foo2");
}

}  // namespace
}  // namespace timberslide
