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

#include <base/memory/ptr_util.h>
#include <base/test/simple_test_tick_clock.h>
#include <base/time/time.h>
#include <cros_config/fake_cros_config.h>
#include <testing/gtest/include/gtest/gtest.h>

#include "biod/fake_power_manager_client.h"

namespace biod {

class PowerButtonFilterTest : public testing::Test {
 public:
  PowerButtonFilterTest() = default;
  PowerButtonFilterTest(const PowerButtonFilterTest&) = delete;
  PowerButtonFilterTest& operator=(const PowerButtonFilterTest&) = delete;

  ~PowerButtonFilterTest() = default;

  void SetUp() override {
    power_manager_client_ = new FakePowerManagerClient();
    test_clock_ = new base::SimpleTestTickClock();
  }

 protected:
  // Ownership passed to PowerButtonFilter instance.
  FakePowerManagerClient* power_manager_client_ = nullptr;
  // Ownership passed to PowerButtonFilter instance.
  brillo::FakeCrosConfig* cros_config_prefs_ = nullptr;
  // Ownership passed to PowerButtonFilter instance
  base::SimpleTestTickClock* test_clock_ = nullptr;

  std::unique_ptr<PowerButtonFilterInterface> InitializePowerButtonFilter(
      bool should_set_fp_type, bool is_fp_overlapped = true) {
    // Start at an arbitrary non-zero time.
    test_clock_->SetNowTicks(
        (base::TimeTicks() + base::TimeDelta::FromHours(1)));
    if (should_set_fp_type) {
      cros_config_prefs_ = new brillo::FakeCrosConfig();
      std::string fp_type = is_fp_overlapped
                                ? biod::kFingerprintSensorTypeOverlapped
                                : biod::kFingerprintSensorTypeStandAlone;
      cros_config_prefs_->SetString(biod::kCrosConfigFPPath,
                                    biod::kFingerprintSensorTypePrefName,
                                    fp_type);
    }
    return PowerButtonFilter::create_power_button_filter_for_test(
        base::WrapUnique(power_manager_client_),
        base::WrapUnique(cros_config_prefs_), base::WrapUnique(test_clock_));
  }
};

// Tests PowerButtonFilter reports true on ShouldFilterFingerprintMatch() if
// it has seen power button down event in the last |kAuthIgnoreTimeoutmsecs|.
TEST_F(PowerButtonFilterTest, TestFilterOnPowerButtonDownEvent) {
  std::unique_ptr<PowerButtonFilterInterface> power_button_filter =
      InitializePowerButtonFilter(true);
  power_manager_client_->GeneratePowerButtonEvent(true,
                                                  test_clock_->NowTicks());
  // Advance time by |kAuthIgnoreTimeoutmsecs - 1|.
  test_clock_->Advance(
      base::TimeDelta::FromMilliseconds(biod::kAuthIgnoreTimeoutmsecs - 1));
  EXPECT_TRUE(power_button_filter->ShouldFilterFingerprintMatch());
  // Now |power_button_filter| should return false on
  // ShouldFilterFingerprintMatch() as we have already suppressed one touch.
  EXPECT_FALSE(power_button_filter->ShouldFilterFingerprintMatch());
  // Generate one more power button event.
  power_manager_client_->GeneratePowerButtonEvent(true,
                                                  test_clock_->NowTicks());
  // Now that there is one more power button event,
  // ShouldFilterFingerprintMatch() should return true.
  EXPECT_TRUE(power_button_filter->ShouldFilterFingerprintMatch());
}

// Tests PowerButtonFilter reports false on ShouldFilterFingerprintMatch() if
// it has only seen power button up event in the last |kAuthIgnoreTimeoutmsecs|.
// This test guarantees that PowerButtonFilter does not consider power button
// up event as a new power button press.
TEST_F(PowerButtonFilterTest, TestFilterOnPowerButtonUpEvent) {
  std::unique_ptr<PowerButtonFilterInterface> power_button_filter =
      InitializePowerButtonFilter(true);
  power_manager_client_->GeneratePowerButtonEvent(false,
                                                  test_clock_->NowTicks());
  // Advance time by |kAuthIgnoreTimeoutmsecs - 1|.
  test_clock_->Advance(
      base::TimeDelta::FromMilliseconds(biod::kAuthIgnoreTimeoutmsecs - 1));
  EXPECT_FALSE(power_button_filter->ShouldFilterFingerprintMatch());
}

// Tests PowerButtonFilter reports false on ShouldFilterFingerprintMatch() if
// it has not seen power button down event in the last
// |kAuthIgnoreTimeoutmsecs|.
TEST_F(PowerButtonFilterTest, TestFilterAfterkAuthIgnoreTimeoutmsecs) {
  std::unique_ptr<PowerButtonFilterInterface> power_button_filter =
      InitializePowerButtonFilter(true);
  power_manager_client_->GeneratePowerButtonEvent(true,
                                                  test_clock_->NowTicks());
  // Advance time by |kAuthIgnoreTimeoutmsecs| + 1.
  test_clock_->Advance(
      base::TimeDelta::FromMilliseconds(biod::kAuthIgnoreTimeoutmsecs + 1));
  EXPECT_FALSE(power_button_filter->ShouldFilterFingerprintMatch());
}

// Tests PowerButtonFilter reports false on ShouldFilterFingerprintMatch() on
// devices with stand-alone fingerprint device, even when a power button event
// is seen in the last |kAuthIgnoreTimeoutmsecs|.
TEST_F(PowerButtonFilterTest, TestPowerButtonNotSeenOnStandAloneFp) {
  std::unique_ptr<PowerButtonFilterInterface> power_button_filter =
      InitializePowerButtonFilter(true, false);
  power_manager_client_->GeneratePowerButtonEvent(true,
                                                  test_clock_->NowTicks());
  // Advance time by |kAuthIgnoreTimeoutmsecs| - 1.
  test_clock_->Advance(
      base::TimeDelta::FromMilliseconds(biod::kAuthIgnoreTimeoutmsecs - 1));
  EXPECT_FALSE(power_button_filter->ShouldFilterFingerprintMatch());
}

// Tests PowerButtonFilter reports expected value on
// ShouldFilterFingerprintMatch() if it has seen power button down event on
// devices with/without the use flag.
TEST_F(PowerButtonFilterTest, TestPowerButtonDownFilterWithUseFlag) {
  std::unique_ptr<PowerButtonFilterInterface> power_button_filter =
      InitializePowerButtonFilter(false);
  power_manager_client_->GeneratePowerButtonEvent(true,
                                                  test_clock_->NowTicks());
  // Advance time by |kAuthIgnoreTimeoutmsecs| - 1.
  test_clock_->Advance(
      base::TimeDelta::FromMilliseconds(biod::kAuthIgnoreTimeoutmsecs - 1));
#if defined(FP_ON_POWER_BUTTON)
  EXPECT_TRUE(power_button_filter->ShouldFilterFingerprintMatch());
#else
  EXPECT_FALSE(power_button_filter->ShouldFilterFingerprintMatch());
#endif
}

}  // namespace biod
