// 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:
  using CrosFpBiometricsManager::CrosFpBiometricsManager;
  ~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<BiometricsManagerRecord>>,
              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));
  MOCK_METHOD(bool,
              WriteRecord,
              (const BiometricsManagerRecord& record,
               uint8_t* tmpl_data,
               size_t tmpl_size),
              (override));

  // Delegate to the real implementation in the base class:
  // https://github.com/google/googletest/blob/HEAD/googlemock/docs/cook_book.md#delegating-calls-to-a-parent-class
  void OnMaintenanceTimerFiredDelegate() {
    CrosFpBiometricsManager::OnMaintenanceTimerFired();
  }
  // Expose protected methods for testing
  using CrosFpBiometricsManager::GetDirtyList;
  using CrosFpBiometricsManager::LoadRecord;
  using CrosFpBiometricsManager::UpdateTemplatesOnDisk;
};

}  // namespace biod

#endif  // BIOD_MOCK_CROS_FP_BIOMETRICS_MANAGER_H_
