#include "http2/adapter/test_utils.h"

#include "common/platform/api/quiche_test.h"
#include "spdy/core/spdy_framer.h"

namespace http2 {
namespace adapter {
namespace test {
namespace {

using spdy::SpdyFramer;

TEST(EqualsFrames, Empty) {
  EXPECT_THAT("", EqualsFrames(std::vector<spdy::SpdyFrameType>{}));
}

TEST(EqualsFrames, SingleFrameWithLength) {
  SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION};

  spdy::SpdyPingIR ping{511};
  EXPECT_THAT(framer.SerializeFrame(ping),
              EqualsFrames({{spdy::SpdyFrameType::PING, 8}}));

  spdy::SpdyWindowUpdateIR window_update{1, 101};
  EXPECT_THAT(framer.SerializeFrame(window_update),
              EqualsFrames({{spdy::SpdyFrameType::WINDOW_UPDATE, 4}}));

  spdy::SpdyDataIR data{3, "Some example data, ha ha!"};
  EXPECT_THAT(framer.SerializeFrame(data),
              EqualsFrames({{spdy::SpdyFrameType::DATA, 25}}));
}

TEST(EqualsFrames, SingleFrameWithoutLength) {
  SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION};

  spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM};
  EXPECT_THAT(framer.SerializeFrame(rst_stream),
              EqualsFrames({{spdy::SpdyFrameType::RST_STREAM, absl::nullopt}}));

  spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM,
                            "Consider taking some deep breaths."};
  EXPECT_THAT(framer.SerializeFrame(goaway),
              EqualsFrames({{spdy::SpdyFrameType::GOAWAY, absl::nullopt}}));

  spdy::Http2HeaderBlock block;
  block[":method"] = "GET";
  block[":path"] = "/example";
  block[":authority"] = "example.com";
  spdy::SpdyHeadersIR headers{17, std::move(block)};
  EXPECT_THAT(framer.SerializeFrame(headers),
              EqualsFrames({{spdy::SpdyFrameType::HEADERS, absl::nullopt}}));
}

TEST(EqualsFrames, MultipleFrames) {
  SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION};

  spdy::SpdyPingIR ping{511};
  spdy::SpdyWindowUpdateIR window_update{1, 101};
  spdy::SpdyDataIR data{3, "Some example data, ha ha!"};
  spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM};
  spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM,
                            "Consider taking some deep breaths."};
  spdy::Http2HeaderBlock block;
  block[":method"] = "GET";
  block[":path"] = "/example";
  block[":authority"] = "example.com";
  spdy::SpdyHeadersIR headers{17, std::move(block)};

  const std::string frame_sequence =
      absl::StrCat(absl::string_view(framer.SerializeFrame(ping)),
                   absl::string_view(framer.SerializeFrame(window_update)),
                   absl::string_view(framer.SerializeFrame(data)),
                   absl::string_view(framer.SerializeFrame(rst_stream)),
                   absl::string_view(framer.SerializeFrame(goaway)),
                   absl::string_view(framer.SerializeFrame(headers)));
  absl::string_view frame_sequence_view = frame_sequence;
  EXPECT_THAT(frame_sequence,
              EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt},
                            {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt},
                            {spdy::SpdyFrameType::DATA, 25},
                            {spdy::SpdyFrameType::RST_STREAM, absl::nullopt},
                            {spdy::SpdyFrameType::GOAWAY, 42},
                            {spdy::SpdyFrameType::HEADERS, 19}}));
  EXPECT_THAT(frame_sequence_view,
              EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt},
                            {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt},
                            {spdy::SpdyFrameType::DATA, 25},
                            {spdy::SpdyFrameType::RST_STREAM, absl::nullopt},
                            {spdy::SpdyFrameType::GOAWAY, 42},
                            {spdy::SpdyFrameType::HEADERS, 19}}));
  EXPECT_THAT(
      frame_sequence,
      EqualsFrames(
          {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE,
           spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM,
           spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS}));
  EXPECT_THAT(
      frame_sequence_view,
      EqualsFrames(
          {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE,
           spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM,
           spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS}));

  // If the final frame type is removed the expectation fails, as there are
  // bytes left to read.
  EXPECT_THAT(
      frame_sequence,
      testing::Not(EqualsFrames(
          {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE,
           spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM,
           spdy::SpdyFrameType::GOAWAY})));
  EXPECT_THAT(
      frame_sequence_view,
      testing::Not(EqualsFrames(
          {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE,
           spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM,
           spdy::SpdyFrameType::GOAWAY})));
}

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