// Copyright 2018 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_CELLULAR_MOCK_MM1_MODEM_PROXY_H_
#define SHILL_CELLULAR_MOCK_MM1_MODEM_PROXY_H_

#include <string>
#include <vector>

#include <base/macros.h>
#include <gmock/gmock.h>

#include "shill/cellular/mm1_modem_proxy_interface.h"

namespace shill {
namespace mm1 {

class MockModemProxy : public ModemProxyInterface {
 public:
  MockModemProxy();
  MockModemProxy(const MockModemProxy&) = delete;
  MockModemProxy& operator=(const MockModemProxy&) = delete;

  ~MockModemProxy() override;

  // Inherited methods from ModemProxyInterface.
  MOCK_METHOD(void,
              Enable,
              (bool, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(void,
              CreateBearer,
              (const KeyValueStore&, Error*, const RpcIdentifierCallback&, int),
              (override));
  MOCK_METHOD(void,
              DeleteBearer,
              (const RpcIdentifier&, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(void, Reset, (Error*, const ResultCallback&, int), (override));
  MOCK_METHOD(void,
              FactoryReset,
              (const std::string&, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(void,
              SetCurrentCapabilities,
              (uint32_t, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(void,
              SetCurrentModes,
              (uint32_t, uint32_t, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(
      void,
      SetCurrentBands,
      (const std::vector<uint32_t>&, Error*, const ResultCallback&, int),
      (override));
  MOCK_METHOD(
      void,
      Command,
      (const std::string&, uint32_t, Error*, const StringCallback&, int),
      (override));
  MOCK_METHOD(void,
              SetPowerState,
              (uint32_t, Error*, const ResultCallback&, int),
              (override));
  MOCK_METHOD(void,
              set_state_changed_callback,
              (const ModemStateChangedSignalCallback&),
              (override));
};

}  // namespace mm1
}  // namespace shill

#endif  // SHILL_CELLULAR_MOCK_MM1_MODEM_PROXY_H_
