// Copyright (c) 2011 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 LOGIN_MANAGER_MOCK_POLICY_SERVICE_H_
#define LOGIN_MANAGER_MOCK_POLICY_SERVICE_H_

#include "login_manager/policy_service.h"

#include <vector>

#include <gmock/gmock.h>

namespace login_manager {
class MockPolicyService : public PolicyService {
 public:
  MockPolicyService();
  virtual ~MockPolicyService();
  MOCK_METHOD4(Store, bool(const uint8*, uint32, Completion*, int));
  MOCK_METHOD1(Retrieve, bool(std::vector<uint8>*));
  MOCK_METHOD0(PersistKey, void(void));
  MOCK_METHOD1(PersistPolicy, void(Completion*));
  MOCK_METHOD0(PersistPolicySync, bool(void));
};

MATCHER_P(PolicyErrorEq, error_code, "") {
  return (arg.code() == error_code);
}

class MockPolicyServiceCompletion : public PolicyService::Completion {
 public:
  MockPolicyServiceCompletion();
  virtual ~MockPolicyServiceCompletion();
  MOCK_METHOD0(ReportSuccess, void(void));
  MOCK_METHOD1(ReportFailure, void(const PolicyService::Error&));
};

class MockPolicyServiceDelegate : public PolicyService::Delegate {
 public:
  MockPolicyServiceDelegate();
  virtual ~MockPolicyServiceDelegate();
  MOCK_METHOD1(OnPolicyPersisted, void(bool));
  MOCK_METHOD1(OnKeyPersisted, void(bool));
};
}  // namespace login_manager

#endif  // LOGIN_MANAGER_MOCK_POLICY_SERVICE_H_
