// Copyright 2021 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 MINIOS_MOCK_SHILL_PROXY_H_
#define MINIOS_MOCK_SHILL_PROXY_H_

#include <gmock/gmock.h>

#include "minios/shill_proxy_interface.h"

namespace minios {

class MockShillProxy : public ShillProxyInterface {
 public:
  MockShillProxy() = default;

  MockShillProxy(const MockShillProxy&) = delete;
  MockShillProxy& operator=(const MockShillProxy&) = delete;

  MOCK_METHOD(void,
              ManagerRequestScan,
              (const WifiTechnologyType& technology,
               OnManagerRequestScanSuccess success_callback,
               OnManagerRequestScanError error_callback),
              (override));

  MOCK_METHOD(void,
              ManagerGetProperties,
              (OnManagerGetPropertiesSuccess success_callback,
               OnManagerGetPropertiesError error_callback),
              (override));

  MOCK_METHOD(void,
              ManagerFindMatchingService,
              (const brillo::VariantDictionary& dict,
               OnManagerFindMatchingServiceSuccess success_callback,
               OnManagerFindMatchingServiceError error_callback),
              (override));

  MOCK_METHOD(void,
              ServiceGetProperties,
              (const dbus::ObjectPath& service_path,
               OnServiceGetPropertiesSuccess success_callback,
               OnServiceGetPropertiesError error_callback),
              (override));

  MOCK_METHOD(void,
              ServiceSetProperties,
              (const dbus::ObjectPath& service_path,
               const brillo::VariantDictionary& dict,
               OnServiceSetPropertiesSuccess success_callback,
               OnServiceSetPropertiesError error_callback),
              (override));

  MOCK_METHOD(void,
              ServiceConnect,
              (const dbus::ObjectPath& service_path,
               OnServiceConnectSuccess success_callback,
               OnServiceConnectError error_callback),
              (override));
};

}  // namespace minios

#endif  // MINIOS_MOCK_SHILL_PROXY_H_
