#include "http2/adapter/nghttp2_util.h"

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

namespace http2 {
namespace adapter {
namespace test {
namespace {

// This send callback assumes |source|'s pointer is a TestDataSource, and
// |user_data| is a std::string.
int FakeSendCallback(nghttp2_session*,
                     nghttp2_frame* frame,
                     const uint8_t* framehd,
                     size_t length,
                     nghttp2_data_source* source,
                     void* user_data) {
  auto* dest = static_cast<std::string*>(user_data);
  // Appends the frame header to the string.
  absl::StrAppend(dest, ToStringView(framehd, 9));
  auto* test_source = static_cast<TestDataSource*>(source->ptr);
  absl::string_view payload = test_source->ReadNext(length);
  // Appends the frame payload to the string.
  absl::StrAppend(dest, payload);
  return 0;
}

TEST(MakeZeroCopyDataFrameSource, EmptyPayload) {
  std::string result;

  const absl::string_view kEmptyBody = "";
  TestDataSource body1{kEmptyBody};
  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
  nghttp2_data_provider provider = body1.MakeDataProvider();

  // This call transforms it back into a DataFrameSource, which is compatible
  // with the Http2Adapter API.
  std::unique_ptr<DataFrameSource> frame_source =
      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
  auto [length, eof] = frame_source->SelectPayloadLength(100);
  EXPECT_EQ(length, 0);
  EXPECT_TRUE(eof);
  frame_source->Send("ninebytes", 0);
  EXPECT_EQ(result, "ninebytes");
}

TEST(MakeZeroCopyDataFrameSource, ShortPayload) {
  std::string result;

  const absl::string_view kShortBody =
      "<html><head><title>Example Page!</title></head>"
      "<body><div><span><table><tr><th><blink>Wow!!"
      "</blink></th></tr></table></span></div></body>"
      "</html>";
  TestDataSource body1{kShortBody};
  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
  nghttp2_data_provider provider = body1.MakeDataProvider();

  // This call transforms it back into a DataFrameSource, which is compatible
  // with the Http2Adapter API.
  std::unique_ptr<DataFrameSource> frame_source =
      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
  auto [length, eof] = frame_source->SelectPayloadLength(200);
  EXPECT_EQ(length, kShortBody.size());
  EXPECT_TRUE(eof);
  frame_source->Send("ninebytes", length);
  EXPECT_EQ(result, absl::StrCat("ninebytes", kShortBody));
}

TEST(MakeZeroCopyDataFrameSource, MultiFramePayload) {
  std::string result;

  const absl::string_view kShortBody =
      "<html><head><title>Example Page!</title></head>"
      "<body><div><span><table><tr><th><blink>Wow!!"
      "</blink></th></tr></table></span></div></body>"
      "</html>";
  TestDataSource body1{kShortBody};
  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
  nghttp2_data_provider provider = body1.MakeDataProvider();

  // This call transforms it back into a DataFrameSource, which is compatible
  // with the Http2Adapter API.
  std::unique_ptr<DataFrameSource> frame_source =
      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
  auto ret = frame_source->SelectPayloadLength(50);
  EXPECT_EQ(ret.first, 50);
  EXPECT_FALSE(ret.second);
  frame_source->Send("ninebyte1", ret.first);

  ret = frame_source->SelectPayloadLength(50);
  EXPECT_EQ(ret.first, 50);
  EXPECT_FALSE(ret.second);
  frame_source->Send("ninebyte2", ret.first);

  ret = frame_source->SelectPayloadLength(50);
  EXPECT_EQ(ret.first, 44);
  EXPECT_TRUE(ret.second);
  frame_source->Send("ninebyte3", ret.first);

  EXPECT_EQ(result,
            "ninebyte1<html><head><title>Example Page!</title></head><bo"
            "ninebyte2dy><div><span><table><tr><th><blink>Wow!!</blink><"
            "ninebyte3/th></tr></table></span></div></body></html>");
}

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