// Copyright (c) 2012 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 <string>

#include <base/time/time.h>

#include "login_manager/fake_generator_job.h"
#include "login_manager/mock_device_policy_service.h"
#include "login_manager/mock_file_checker.h"
#include "login_manager/mock_init_daemon_controller.h"
#include "login_manager/mock_key_generator.h"
#include "login_manager/mock_liveness_checker.h"
#include "login_manager/mock_metrics.h"
#include "login_manager/mock_mitigator.h"
#include "login_manager/mock_policy_key.h"
#include "login_manager/mock_policy_service.h"
#include "login_manager/mock_policy_store.h"
#include "login_manager/mock_process_manager_service.h"
#include "login_manager/mock_session_manager.h"
#include "login_manager/mock_system_utils.h"
#include "login_manager/mock_user_policy_service_factory.h"

// Per the gmock documentation, the vast majority of the time spent on
// compiling a mock class is in generating its constructor and
// destructor, as they perform non-trivial tasks.  To combat this, the
// docs recommend moving the definition of your mock class'
// constructor and destructor out of the class body and into a .cc
// file. This way, even if you #include your mock class in N files,
// the compiler only needs to generate its constructor and destructor
// once, resulting in a much faster compilation.
//
// To avoid having to add a bunch of boilerplate and a .cc file for every
// mock I define, I will simply collect the constructors all here.

namespace login_manager {

MockDevicePolicyService::MockDevicePolicyService()
    : MockDevicePolicyService(nullptr, nullptr) {}
MockDevicePolicyService::MockDevicePolicyService(
    std::unique_ptr<MockPolicyStore> policy_store,
    PolicyKey* policy_key)
    : DevicePolicyService(std::move(policy_store),
                          policy_key,
                          base::FilePath(),
                          nullptr,
                          nullptr,
                          nullptr,
                          nullptr,
                          nullptr) {}
MockDevicePolicyService::~MockDevicePolicyService() = default;

MockFileChecker::MockFileChecker() : FileChecker(base::FilePath()) {}
MockFileChecker::~MockFileChecker() = default;

MockInitDaemonController::MockInitDaemonController() = default;
MockInitDaemonController::~MockInitDaemonController() = default;

MockKeyGenerator::MockKeyGenerator() : KeyGenerator(-1, nullptr) {}
MockKeyGenerator::~MockKeyGenerator() = default;

MockLivenessChecker::MockLivenessChecker() = default;
MockLivenessChecker::~MockLivenessChecker() = default;

MockMetrics::MockMetrics() : LoginMetrics(base::FilePath()) {}
MockMetrics::~MockMetrics() = default;

MockMitigator::MockMitigator() = default;
MockMitigator::~MockMitigator() = default;

MockPolicyKey::MockPolicyKey() : PolicyKey(base::FilePath(), nullptr) {}
MockPolicyKey::~MockPolicyKey() = default;

MockPolicyService::MockPolicyService()
    : PolicyService(std::unique_ptr<PolicyStore>(), nullptr) {}
MockPolicyService::~MockPolicyService() = default;

MockPolicyServiceDelegate::MockPolicyServiceDelegate() = default;
MockPolicyServiceDelegate::~MockPolicyServiceDelegate() = default;

MockPolicyStore::MockPolicyStore() : PolicyStore(base::FilePath()) {}
MockPolicyStore::~MockPolicyStore() = default;

MockProcessManagerService::MockProcessManagerService() = default;
MockProcessManagerService::~MockProcessManagerService() = default;

MockSessionManager::MockSessionManager() = default;
MockSessionManager::~MockSessionManager() = default;

MockSystemUtils::MockSystemUtils() = default;
MockSystemUtils::~MockSystemUtils() = default;

MockUserPolicyServiceFactory::MockUserPolicyServiceFactory()
    : UserPolicyServiceFactory(0, nullptr, nullptr) {}
MockUserPolicyServiceFactory::~MockUserPolicyServiceFactory() = default;

}  // namespace login_manager
