// 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.

#ifndef BIOD_MOCK_CROS_FP_BIOMETRICS_MANAGER_H_
#define BIOD_MOCK_CROS_FP_BIOMETRICS_MANAGER_H_

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

#include <gmock/gmock.h>

#include "biod/cros_fp_biometrics_manager.h"
#include "biod/mock_biod_metrics.h"
#include "biod/power_button_filter.h"

namespace biod {

class MockCrosFpBiometricsManager : public CrosFpBiometricsManager {
 public:
  /**
   * @param bus DBus Usually a mock bus
   * @param cros_fp_device Usually a mock device so the call to Init()
   * succeeds.
   * @param biod_metrics Usually a mock metrics object
   *
   * @return mock instance on success, nullptr on failure
   */
  static std::unique_ptr<MockCrosFpBiometricsManager> Create(
      const scoped_refptr<dbus::Bus>& bus,
      std::unique_ptr<CrosFpDeviceInterface> cros_fp_device,
      std::unique_ptr<BiodMetricsInterface> biod_metrics) {
    // Using new to access non-public constructor.
    // See https://abseil.io/tips/134.
    auto mock = base::WrapUnique(new MockCrosFpBiometricsManager(
        PowerButtonFilter::Create(bus), std::move(cros_fp_device),
        std::move(biod_metrics)));
    if (!mock->Init()) {
      return nullptr;
    }
    return mock;
  }

  ~MockCrosFpBiometricsManager() override = default;

  MOCK_METHOD(BiometricType, GetType, (), (override));
  MOCK_METHOD(BiometricsManager::EnrollSession,
              StartEnrollSession,
              (std::string user_id, std::string label),
              (override));
  MOCK_METHOD(BiometricsManager::AuthSession, StartAuthSession, (), (override));
  MOCK_METHOD(std::vector<std::unique_ptr<BiometricsManager::Record>>,
              GetRecords,
              (),
              (override));
  MOCK_METHOD(bool, DestroyAllRecords, (), (override));
  MOCK_METHOD(void, RemoveRecordsFromMemory, (), (override));
  MOCK_METHOD(bool,
              ReadRecordsForSingleUser,
              (const std::string& user_id),
              (override));
  MOCK_METHOD(
      void,
      SetEnrollScanDoneHandler,
      (const BiometricsManager::EnrollScanDoneCallback& on_enroll_scan_done),
      (override));
  MOCK_METHOD(
      void,
      SetAuthScanDoneHandler,
      (const BiometricsManager::AuthScanDoneCallback& on_auth_scan_done),
      (override));
  MOCK_METHOD(
      void,
      SetSessionFailedHandler,
      (const BiometricsManager::SessionFailedCallback& on_session_failed),
      (override));
  MOCK_METHOD(bool, SendStatsOnLogin, (), (override));
  MOCK_METHOD(void, SetDiskAccesses, (bool allow), (override));
  MOCK_METHOD(bool, ResetSensor, (), (override));
  MOCK_METHOD(bool, ResetEntropy, (bool factory_init), (override));
  MOCK_METHOD(void, EndEnrollSession, (), (override));
  MOCK_METHOD(void, EndAuthSession, (), (override));
  MOCK_METHOD(void, OnMaintenanceTimerFired, (), (override));

  // Delegate to the real implementation in the base class:
  // https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md#delegating-calls-to-a-parent-class
  void OnMaintenanceTimerFiredDelegate() {
    CrosFpBiometricsManager::OnMaintenanceTimerFired();
  }

 protected:
  using CrosFpBiometricsManager::CrosFpBiometricsManager;
};

}  // namespace biod

#endif  // BIOD_MOCK_CROS_FP_BIOMETRICS_MANAGER_H_
