// 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() 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));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockModemProxy);
};

}  // namespace mm1
}  // namespace shill

#endif  // SHILL_CELLULAR_MOCK_MM1_MODEM_PROXY_H_
