// 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_DEVICE_H_
#define SHILL_MOCK_DEVICE_H_

#include <string>
#include <vector>

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

#include "shill/device.h"
#include "shill/geolocation_info.h"

namespace shill {

class MockDevice : public Device {
 public:
  MockDevice(ControlInterface *control_interface,
             EventDispatcher *dispatcher,
             Metrics *metrics,
             Manager *manager,
             const std::string &link_name,
             const std::string &address,
             int interface_index);
  ~MockDevice() override;

  MOCK_METHOD2(Start, void(Error *error,
                           const EnabledStateChangedCallback &callback));
  MOCK_METHOD2(Stop, void(Error *error,
                          const EnabledStateChangedCallback &callback));
  MOCK_METHOD1(SetEnabled, void(bool));
  MOCK_METHOD3(SetEnabledPersistent, void(bool enable,
                                          Error* error,
                                          const ResultCallback &callback));
  MOCK_METHOD3(Scan, void(Device::ScanType scan_type, Error *error,
                          const std::string &reason));
  MOCK_METHOD1(Load, bool(StoreInterface *storage));
  MOCK_METHOD1(Save, bool(StoreInterface *storage));
  MOCK_METHOD0(DisableIPv6, void());
  MOCK_METHOD0(EnableIPv6, void());
  MOCK_METHOD0(EnableIPv6Privacy, void());
  MOCK_METHOD1(SetLooseRouting, void(bool));
  MOCK_METHOD1(SetIsMultiHomed, void(bool is_multi_homed));
  MOCK_METHOD0(RestartPortalDetection, bool());
  MOCK_METHOD0(RequestPortalDetection, bool());
  MOCK_METHOD0(GetReceiveByteCount, uint64_t());
  MOCK_METHOD0(GetTransmitByteCount, uint64_t());
  MOCK_CONST_METHOD1(IsConnectedToService, bool(const ServiceRefPtr &service));
  MOCK_CONST_METHOD0(technology, Technology::Identifier());
  MOCK_METHOD1(OnBeforeSuspend, void(const ResultCallback &callback));
  MOCK_METHOD1(OnDarkResume, void(const ResultCallback &callback));
  MOCK_METHOD0(OnAfterResume, void());
  MOCK_METHOD0(OnConnectionUpdated, void());
  MOCK_METHOD0(OnIPv6AddressChanged, void());
  MOCK_CONST_METHOD0(GetGeolocationObjects, std::vector<GeolocationInfo>());
  MOCK_METHOD0(OnIPv6DnsServerAddressesChanged, void());
  MOCK_METHOD0(StartConnectivityTest, bool());
  MOCK_CONST_METHOD0(connection, const ConnectionRefPtr &());

 private:
  DISALLOW_COPY_AND_ASSIGN(MockDevice);
};

}  // namespace shill

#endif  // SHILL_MOCK_DEVICE_H_
