#include "http2/adapter/oghttp2_adapter.h"

#include "http2/adapter/mock_http2_visitor.h"
#include "http2/adapter/test_utils.h"
#include "common/platform/api/quiche_test.h"
#include "common/platform/api/quiche_test_helpers.h"

namespace http2 {
namespace adapter {
namespace test {
namespace {

class OgHttp2AdapterTest : public testing::Test {
 protected:
  void SetUp() override {
    OgHttp2Adapter::Options options;
    adapter_ = OgHttp2Adapter::Create(http2_visitor_, options);
  }

  testing::StrictMock<MockHttp2Visitor> http2_visitor_;
  std::unique_ptr<OgHttp2Adapter> adapter_;
};

TEST_F(OgHttp2AdapterTest, ProcessBytes) {
  EXPECT_QUICHE_BUG(adapter_->ProcessBytes("fake data"), "Not implemented");
}

TEST_F(OgHttp2AdapterTest, SubmitMetadata) {
  EXPECT_QUICHE_BUG(adapter_->SubmitMetadata(3, true), "Not implemented");
}

TEST_F(OgHttp2AdapterTest, GetPeerConnectionWindow) {
  int peer_window = 0;
  EXPECT_QUICHE_BUG(peer_window = adapter_->GetPeerConnectionWindow(),
                    "Not implemented");
  EXPECT_GT(peer_window, 0);
}

TEST_F(OgHttp2AdapterTest, MarkDataConsumedForStream) {
  EXPECT_QUICHE_BUG(adapter_->MarkDataConsumedForStream(1, 11),
                    "Stream 1 not found");
}

TEST_F(OgHttp2AdapterTest, TestSerialize) {
  EXPECT_FALSE(adapter_->session().want_read());
  EXPECT_FALSE(adapter_->session().want_write());

  adapter_->SubmitSettings(
      {{HEADER_TABLE_SIZE, 128}, {MAX_FRAME_SIZE, 128 << 10}});
  EXPECT_TRUE(adapter_->session().want_write());

  adapter_->SubmitPriorityForStream(3, 1, 255, true);
  adapter_->SubmitRst(3, Http2ErrorCode::CANCEL);
  adapter_->SubmitPing(42);
  adapter_->SubmitGoAway(13, Http2ErrorCode::NO_ERROR, "");
  adapter_->SubmitWindowUpdate(3, 127);
  EXPECT_TRUE(adapter_->session().want_write());

  EXPECT_THAT(
      adapter_->GetBytesToWrite(absl::nullopt),
      ContainsFrames(
          {spdy::SpdyFrameType::SETTINGS, spdy::SpdyFrameType::PRIORITY,
           spdy::SpdyFrameType::RST_STREAM, spdy::SpdyFrameType::PING,
           spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::WINDOW_UPDATE}));
  EXPECT_FALSE(adapter_->session().want_write());
}

TEST_F(OgHttp2AdapterTest, TestPartialSerialize) {
  EXPECT_FALSE(adapter_->session().want_write());

  adapter_->SubmitSettings(
      {{HEADER_TABLE_SIZE, 128}, {MAX_FRAME_SIZE, 128 << 10}});
  adapter_->SubmitGoAway(13, Http2ErrorCode::NO_ERROR, "And don't come back!");
  adapter_->SubmitPing(42);
  EXPECT_TRUE(adapter_->session().want_write());

  const std::string first_part = adapter_->GetBytesToWrite(10);
  EXPECT_TRUE(adapter_->session().want_write());
  const std::string second_part = adapter_->GetBytesToWrite(absl::nullopt);
  EXPECT_FALSE(adapter_->session().want_write());
  EXPECT_THAT(
      absl::StrCat(first_part, second_part),
      ContainsFrames({spdy::SpdyFrameType::SETTINGS,
                      spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::PING}));
}

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