#ifndef QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_
#define QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_

#include "absl/strings/string_view.h"
#include "third_party/nghttp2/src/lib/includes/nghttp2/nghttp2.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 MockNghttp2Callbacks {
 public:
  MockNghttp2Callbacks() = default;

  // The caller takes ownership of the |nghttp2_session_callbacks|.
  static nghttp2_session_callbacks* 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, OnFrameSend, (const nghttp2_frame* frame), ());

  MOCK_METHOD(int, BeforeFrameSend, (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),
              ());
};

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

#endif  // QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_
