#ifndef QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_
#define QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_

#include <cstdint>

#include "absl/strings/string_view.h"
#include "http2/adapter/nghttp2.h"
#include "http2/adapter/nghttp2_util.h"
#include "common/platform/api/quiche_export.h"
#include "common/platform/api/quiche_test.h"

namespace http2 {
namespace adapter {
namespace test {

// This class provides a set of mock nghttp2 callbacks for use in unit test
// expectations.
class QUICHE_NO_EXPORT MockNghttp2Callbacks {
 public:
  MockNghttp2Callbacks() = default;

  // The caller takes ownership of the |nghttp2_session_callbacks|.
  static nghttp2_session_callbacks_unique_ptr GetCallbacks();

  MOCK_METHOD(ssize_t,
              Send,
              (const uint8_t* data, size_t length, int flags),
              ());

  MOCK_METHOD(int,
              SendData,
              (nghttp2_frame * frame,
               const uint8_t* framehd,
               size_t length,
               nghttp2_data_source* source),
              ());

  MOCK_METHOD(int, OnBeginHeaders, (const nghttp2_frame* frame), ());

  MOCK_METHOD(int,
              OnHeader,
              (const nghttp2_frame* frame,
               absl::string_view name,
               absl::string_view value,
               uint8_t flags),
              ());

  MOCK_METHOD(int,
              OnDataChunkRecv,
              (uint8_t flags, int32_t stream_id, absl::string_view data),
              ());

  MOCK_METHOD(int, OnBeginFrame, (const nghttp2_frame_hd* hd), ());

  MOCK_METHOD(int, OnFrameRecv, (const nghttp2_frame* frame), ());

  MOCK_METHOD(int, OnStreamClose, (int32_t stream_id, uint32_t error_code), ());

  MOCK_METHOD(int, BeforeFrameSend, (const nghttp2_frame* frame), ());

  MOCK_METHOD(int, OnFrameSend, (const nghttp2_frame* frame), ());

  MOCK_METHOD(int,
              OnFrameNotSend,
              (const nghttp2_frame* frame, int lib_error_code),
              ());

  MOCK_METHOD(int,
              OnInvalidFrameRecv,
              (const nghttp2_frame* frame, int error_code),
              ());

  MOCK_METHOD(int,
              OnErrorCallback2,
              (int lib_error_code, const char* msg, size_t len),
              ());

  MOCK_METHOD(ssize_t, OnPackExtension,
              (uint8_t * buf, size_t len, const nghttp2_frame* frame), ());
};

}  // namespace test
}  // namespace adapter
}  // namespace http2

#endif  // QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_
