// Copyright 2014 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 LIBBRILLO_BRILLO_HTTP_MOCK_CURL_API_H_
#define LIBBRILLO_BRILLO_HTTP_MOCK_CURL_API_H_

#include <string>

#include <brillo/http/curl_api.h>
#include <gmock/gmock.h>

namespace brillo {
namespace http {

// This is a mock for CURL interfaces which allows to mock out the CURL's
// low-level C APIs in tests by intercepting the virtual function calls on
// the abstract CurlInterface.
class MockCurlInterface : public CurlInterface {
 public:
  MockCurlInterface() = default;

  MOCK_METHOD(CURL*, EasyInit, (), (override));
  MOCK_METHOD(void, EasyCleanup, (CURL*), (override));
  MOCK_METHOD(CURLcode, EasySetOptInt, (CURL*, CURLoption, int), (override));
  MOCK_METHOD(CURLcode,
              EasySetOptStr,
              (CURL*, CURLoption, const std::string&),
              (override));
  MOCK_METHOD(CURLcode, EasySetOptPtr, (CURL*, CURLoption, void*), (override));
  MOCK_METHOD(CURLcode,
              EasySetOptCallback,
              (CURL*, CURLoption, intptr_t),
              (override));
  MOCK_METHOD(CURLcode,
              EasySetOptOffT,
              (CURL*, CURLoption, curl_off_t),
              (override));
  MOCK_METHOD(CURLcode, EasyPerform, (CURL*), (override));
  MOCK_METHOD(CURLcode,
              EasyGetInfoInt,
              (CURL*, CURLINFO, int*),
              (const, override));
  MOCK_METHOD(CURLcode,
              EasyGetInfoDbl,
              (CURL*, CURLINFO, double*),
              (const, override));
  MOCK_METHOD(CURLcode,
              EasyGetInfoStr,
              (CURL*, CURLINFO, std::string*),
              (const, override));
  MOCK_METHOD(CURLcode,
              EasyGetInfoPtr,
              (CURL*, CURLINFO, void**),
              (const, override));
  MOCK_METHOD(std::string, EasyStrError, (CURLcode), (const, override));
  MOCK_METHOD(CURLM*, MultiInit, (), (override));
  MOCK_METHOD(CURLMcode, MultiCleanup, (CURLM*), (override));
  MOCK_METHOD(CURLMsg*, MultiInfoRead, (CURLM*, int*), (override));
  MOCK_METHOD(CURLMcode, MultiAddHandle, (CURLM*, CURL*), (override));
  MOCK_METHOD(CURLMcode, MultiRemoveHandle, (CURLM*, CURL*), (override));
  MOCK_METHOD(CURLMcode,
              MultiSetSocketCallback,
              (CURLM*, curl_socket_callback, void*),
              (override));
  MOCK_METHOD(CURLMcode,
              MultiSetTimerCallback,
              (CURLM*, curl_multi_timer_callback, void*),
              (override));
  MOCK_METHOD(CURLMcode,
              MultiAssign,
              (CURLM*, curl_socket_t, void*),
              (override));
  MOCK_METHOD(CURLMcode,
              MultiSocketAction,
              (CURLM*, curl_socket_t, int, int*),
              (override));
  MOCK_METHOD(std::string, MultiStrError, (CURLMcode), (const, override));
  MOCK_METHOD(CURLMcode, MultiPerform, (CURLM*, int*), (override));
  MOCK_METHOD(CURLMcode,
              MultiWait,
              (CURLM*, curl_waitfd[], unsigned int, int, int*),
              (override));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockCurlInterface);
};

}  // namespace http
}  // namespace brillo

#endif  // LIBBRILLO_BRILLO_HTTP_MOCK_CURL_API_H_
