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

#ifndef SHILL_MOCK_SERVICE_H_
#define SHILL_MOCK_SERVICE_H_

#include <string>

#include <base/memory/ref_counted.h>
#include <gmock/gmock.h>

#include "shill/connection.h"
#include "shill/refptr_types.h"
#include "shill/service.h"
#include "shill/technology.h"

namespace shill {

class MockService : public Service {
 public:
  // A constructor for the Service object
  MockService(ControlInterface* control_interface,
              EventDispatcher* dispatcher,
              Metrics* metrics,
              Manager* manager);
  ~MockService() override;

  MOCK_METHOD0(AutoConnect, void());
  MOCK_METHOD2(Connect, void(Error* error, const char* reason));
  MOCK_METHOD2(Disconnect, void(Error* error, const char* reason));
  MOCK_METHOD3(DisconnectWithFailure, void(Service::ConnectFailure failure,
                                           Error* error,
                                           const char* reason));
  MOCK_METHOD1(UserInitiatedDisconnect, void(Error* error));
  MOCK_METHOD1(CalculateState, std::string(Error* error));
  MOCK_CONST_METHOD0(state, ConnectState());
  MOCK_METHOD1(SetState, void(ConnectState state));
  MOCK_METHOD2(SetPortalDetectionFailure, void(const std::string& phase,
                                               const std::string& status));
  MOCK_CONST_METHOD0(IsConnected, bool());
  MOCK_CONST_METHOD0(IsConnecting, bool());
  MOCK_CONST_METHOD1(IsDependentOn, bool(const ServiceRefPtr& b));
  MOCK_CONST_METHOD0(IsFailed, bool());
  MOCK_CONST_METHOD0(IsOnline, bool());
  MOCK_CONST_METHOD0(IsVisible, bool());
  MOCK_METHOD1(SetFailure, void(ConnectFailure failure));
  MOCK_CONST_METHOD0(failure, ConnectFailure());
  MOCK_CONST_METHOD1(GetDeviceRpcId, std::string(Error* error));
  MOCK_CONST_METHOD0(GetRpcIdentifier, std::string());
  MOCK_CONST_METHOD0(GetStorageIdentifier, std::string());
  MOCK_CONST_METHOD1(GetLoadableStorageIdentifier,
                     std::string(const StoreInterface& store_interface));
  MOCK_METHOD1(Load, bool(StoreInterface* store_interface));
  MOCK_METHOD0(Unload, bool());
  MOCK_METHOD1(Save, bool(StoreInterface* store_interface));
  MOCK_METHOD0(SaveToCurrentProfile, void());
  MOCK_METHOD2(Configure, void(const KeyValueStore& args, Error* error));
  MOCK_CONST_METHOD1(DoPropertiesMatch, bool(const KeyValueStore& args));
  MOCK_CONST_METHOD0(Is8021xConnectable, bool());
  MOCK_CONST_METHOD0(HasStaticNameServers, bool());
  MOCK_CONST_METHOD0(IsPortalDetectionDisabled, bool());
  MOCK_CONST_METHOD0(IsPortalDetectionAuto, bool());
  MOCK_CONST_METHOD0(IsRemembered, bool());
  MOCK_CONST_METHOD0(HasProxyConfig, bool());
  MOCK_METHOD1(SetConnection, void(const ConnectionRefPtr& connection));
  MOCK_CONST_METHOD0(connection, const ConnectionRefPtr&());
  MOCK_CONST_METHOD0(explicitly_disconnected, bool());
#if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
  MOCK_CONST_METHOD0(eap, const EapCredentials*());
#endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
  MOCK_CONST_METHOD0(technology, Technology::Identifier());
  MOCK_METHOD1(OnPropertyChanged, void(const std::string& property));
  MOCK_METHOD0(ClearExplicitlyDisconnected, void());
  MOCK_CONST_METHOD0(is_dns_auto_fallback_allowed, bool());
  MOCK_METHOD0(NotifyIPConfigChanges, void());
  MOCK_CONST_METHOD0(link_monitor_disabled, bool());
  MOCK_METHOD0(EnableAndRetainAutoConnect, void());

  // Set a string for this Service via |store|.  Can be wired to Save() for
  // test purposes.
  bool FauxSave(StoreInterface* store);
  // Sets the connection reference returned by default when connection()
  // is called.
  void set_mock_connection(const ConnectionRefPtr& connection) {
    mock_connection_ = connection;
  }
  const std::string& friendly_name() const { return Service::friendly_name(); }

 private:
  ConnectionRefPtr mock_connection_;
  DISALLOW_COPY_AND_ASSIGN(MockService);
};

}  // namespace shill

#endif  // SHILL_MOCK_SERVICE_H_
