#include "http2/adapter/nghttp2_data_provider.h"

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

namespace http2 {
namespace adapter {
namespace test {

const size_t kFrameHeaderSize = 9;

// Verifies that a nghttp2_data_provider derived from a DataFrameSource works
// correctly with nghttp2-style callbacks when the amount of data read is less
// than what the source provides.
TEST(DataProviderTest, ReadLessThanSourceProvides) {
  DataSavingVisitor visitor;
  TestDataFrameSource source(visitor, "Example payload");
  auto provider = MakeDataProvider(&source);
  uint32_t data_flags = 0;
  const int32_t kStreamId = 1;
  const size_t kReadLength = 10;
  // Read callback selects a payload length given an upper bound.
  ssize_t result =
      provider->read_callback(nullptr, kStreamId, nullptr, kReadLength,
                              &data_flags, &provider->source, nullptr);
  ASSERT_EQ(kReadLength, result);
  EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY, data_flags);

  const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  // Sends the frame header and some payload bytes.
  int send_result = callbacks::DataFrameSourceSendCallback(
      nullptr, nullptr, framehd, result, &provider->source, nullptr);
  EXPECT_EQ(0, send_result);
  // Data accepted by the visitor includes a frame header and kReadLength bytes
  // of payload.
  EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kReadLength);
}

// Verifies that a nghttp2_data_provider derived from a DataFrameSource works
// correctly with nghttp2-style callbacks when the amount of data read is more
// than what the source provides.
TEST(DataProviderTest, ReadMoreThanSourceProvides) {
  DataSavingVisitor visitor;
  const absl::string_view kPayload = "Example payload";
  TestDataFrameSource source(visitor, kPayload);
  auto provider = MakeDataProvider(&source);
  uint32_t data_flags = 0;
  const int32_t kStreamId = 1;
  const size_t kReadLength = 30;
  // Read callback selects a payload length given an upper bound.
  ssize_t result =
      provider->read_callback(nullptr, kStreamId, nullptr, kReadLength,
                              &data_flags, &provider->source, nullptr);
  ASSERT_EQ(kPayload.size(), result);
  EXPECT_EQ(NGHTTP2_DATA_FLAG_NO_COPY | NGHTTP2_DATA_FLAG_EOF, data_flags);

  const uint8_t framehd[kFrameHeaderSize] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  // Sends the frame header and some payload bytes.
  int send_result = callbacks::DataFrameSourceSendCallback(
      nullptr, nullptr, framehd, result, &provider->source, nullptr);
  EXPECT_EQ(0, send_result);
  // Data accepted by the visitor includes a frame header and the entire
  // payload.
  EXPECT_EQ(visitor.data().size(), kFrameHeaderSize + kPayload.size());
}

// Verifies that a nghttp2_data_provider derived from a DataFrameSource works
// correctly with nghttp2-style callbacks when the source is blocked.
TEST(DataProviderTest, ReadFromBlockedSource) {
  DataSavingVisitor visitor;
  const absl::string_view kPayload = "This source is blocked.";
  TestDataFrameSource source(visitor, kPayload);
  // Setting is_data_available(false) indicates the source is blocked.
  source.set_is_data_available(false);
  auto provider = MakeDataProvider(&source);
  uint32_t data_flags = 0;
  const int32_t kStreamId = 1;
  const size_t kReadLength = 10;
  ssize_t result =
      provider->read_callback(nullptr, kStreamId, nullptr, kReadLength,
                              &data_flags, &provider->source, nullptr);
  // Read operation is deferred, since the source is blocked.
  EXPECT_EQ(NGHTTP2_ERR_DEFERRED, result);
}

// Verifies that a nghttp2_data_provider derived from a DataFrameSource works
// correctly with nghttp2-style callbacks when the source provides only fin and
// no data.
TEST(DataProviderTest, ReadFromZeroLengthSource) {
  DataSavingVisitor visitor;
  const absl::string_view kPayload = "";
  // Empty payload and fin=true indicates the source is done.
  TestDataFrameSource source(visitor, kPayload);
  auto provider = MakeDataProvider(&source);
  uint32_t data_flags = 0;
  const int32_t kStreamId = 1;
  const size_t kReadLength = 10;
  ssize_t result =
      provider->read_callback(nullptr, kStreamId, nullptr, kReadLength,
                              &data_flags, &provider->source, nullptr);
  // BUG: should return a zero-length read and EOF.
  ASSERT_EQ(NGHTTP2_ERR_DEFERRED, result);
}

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