QuicSpdyStreamTest HTTP/3 frame generation refactor.
Add HeadersFrame() and DataFrame() methods to QuicSpdyStreamTest that generate
HTTP/3 headers, and use them unless the test specifically needs to know the
frame header length or needs the frame header and frame payload separately.
Also minor fixes: factor out some string literals; fix progreesive_encoder typo;
restrict class member visibility; do not call Initialize if not necessary
(HasFrameHeader() now queries transport_version from GetParams() instead of
|connection_|).
gfe-relnote: n/a, test-only change.
PiperOrigin-RevId: 252088038
Change-Id: I28121b2a4994aafa1da84438cc4ff983d7a0586d
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index 7d8e06d..00a5dba 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -44,6 +44,7 @@
namespace {
const bool kShouldProcessData = true;
+const char kDataFramePayload[] = "some data";
class TestStream : public QuicSpdyStream {
public:
@@ -117,7 +118,7 @@
};
class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
- public:
+ protected:
QuicSpdyStreamTest() {
headers_[":host"] = "www.google.com";
headers_[":path"] = "/index.hml";
@@ -151,10 +152,10 @@
std::string EncodeQpackHeaders(QuicStreamId id, SpdyHeaderBlock* header) {
auto qpack_encoder =
QuicMakeUnique<QpackEncoder>(session_.get(), session_.get());
- auto progreesive_encoder = qpack_encoder->EncodeHeaderList(id, header);
+ auto progressive_encoder = qpack_encoder->EncodeHeaderList(id, header);
std::string encoded_headers;
- while (progreesive_encoder->HasNext()) {
- progreesive_encoder->Next(std::numeric_limits<size_t>::max(),
+ while (progressive_encoder->HasNext()) {
+ progressive_encoder->Next(std::numeric_limits<size_t>::max(),
&encoded_headers);
}
return encoded_headers;
@@ -194,7 +195,24 @@
return VersionHasDataFrameHeader(GetParam().transport_version);
}
- protected:
+ std::string HeadersFrame(QuicStringPiece payload) {
+ std::unique_ptr<char[]> headers_buffer;
+ QuicByteCount headers_frame_header_length =
+ encoder_.SerializeHeadersFrameHeader(payload.length(), &headers_buffer);
+ QuicStringPiece headers_frame_header(headers_buffer.get(),
+ headers_frame_header_length);
+ return QuicStrCat(headers_frame_header, payload);
+ }
+
+ std::string DataFrame(QuicStringPiece payload) {
+ std::unique_ptr<char[]> data_buffer;
+ QuicByteCount data_frame_header_length =
+ encoder_.SerializeDataFrameHeader(payload.length(), &data_buffer);
+ QuicStringPiece data_frame_header(data_buffer.get(),
+ data_frame_header_length);
+ return QuicStrCat(data_frame_header, payload);
+ }
+
MockQuicConnectionHelper helper_;
MockAlarmFactory alarm_factory_;
MockQuicConnection* connection_;
@@ -379,11 +397,7 @@
Initialize(kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buffer);
- std::string header = std::string(buffer.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
EXPECT_EQ("", stream_->data());
QuicHeaderList headers = ProcessHeaders(false, headers_);
@@ -397,13 +411,8 @@
}
TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) {
- Initialize(kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buffer);
- std::string header = std::string(buffer.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
for (size_t fragment_size = 1; fragment_size < data.size(); ++fragment_size) {
Initialize(kShouldProcessData);
@@ -423,13 +432,8 @@
}
TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) {
- Initialize(kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buffer);
- std::string header = std::string(buffer.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
for (size_t split_point = 1; split_point < data.size() - 1; ++split_point) {
Initialize(kShouldProcessData);
@@ -456,11 +460,7 @@
Initialize(!kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
ProcessHeaders(false, headers_);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -483,11 +483,8 @@
TEST_P(QuicSpdyStreamTest, ProcessHeadersAndLargeBodySmallReadv) {
Initialize(kShouldProcessData);
std::string body(12 * 1024, 'a');
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
+
ProcessHeaders(false, headers_);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
QuicStringPiece(data));
@@ -510,11 +507,7 @@
Initialize(!kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
ProcessHeaders(false, headers_);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -535,14 +528,9 @@
TEST_P(QuicSpdyStreamTest, ProcessHeadersAndConsumeMultipleBody) {
Initialize(!kShouldProcessData);
std::string body1 = "this is body 1";
+ std::string data1 = HasFrameHeader() ? DataFrame(body1) : body1;
std::string body2 = "body 2";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body1.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data1 = HasFrameHeader() ? header + body1 : body1;
- header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buf);
- std::string data2 = HasFrameHeader() ? header + body2 : body2;
+ std::string data2 = HasFrameHeader() ? DataFrame(body2) : body2;
ProcessHeaders(false, headers_);
QuicStreamFrame frame1(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -562,11 +550,7 @@
Initialize(!kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
ProcessHeaders(false, headers_);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -590,11 +574,7 @@
Initialize(!kShouldProcessData);
std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
ProcessHeaders(false, headers_);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -849,11 +829,7 @@
// Receive data to overflow the window, violating flow control.
std::string body(kWindow + 1, 'a');
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
QuicStringPiece(data));
EXPECT_CALL(*connection_,
@@ -891,11 +867,7 @@
// Send enough data to overflow the connection level flow control window.
std::string body(kConnectionWindow + 1, 'a');
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
EXPECT_LT(data.size(), kStreamWindow);
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -990,11 +962,7 @@
stream_->ConsumeHeaderList();
const std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
// Receive trailing headers.
SpdyHeaderBlock trailers_block;
@@ -1070,11 +1038,7 @@
stream_->ConsumeHeaderList();
const std::string body = "this is the body";
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
// Receive trailing headers.
SpdyHeaderBlock trailers_block;
@@ -1188,11 +1152,7 @@
// Receive and consume body with FIN set, and no trailers.
std::string body(1024, 'x');
- std::unique_ptr<char[]> buf;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buf);
- std::string header = std::string(buf.get(), header_length);
- std::string data = HasFrameHeader() ? header + body : body;
+ std::string data = HasFrameHeader() ? DataFrame(body) : body;
QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), /*fin=*/true,
0, data);
@@ -1376,12 +1336,22 @@
}
TEST_P(QuicSpdyStreamTest, HeaderStreamNotiferCorrespondingSpdyStream) {
+ // There is no headers stream if QPACK is used.
+ if (!VersionUsesQpack(GetParam().transport_version)) {
+ return;
+ }
+
if (GetParam().handshake_protocol == PROTOCOL_TLS1_3) {
// TODO(nharper, b/112643533): Figure out why this test fails when TLS is
// enabled and fix it.
return;
}
+ const char kHeader1[] = "Header1";
+ const char kHeader2[] = "Header2";
+ const char kBody1[] = "Test1";
+ const char kBody2[] = "Test2";
+
Initialize(kShouldProcessData);
EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
testing::InSequence s;
@@ -1392,28 +1362,23 @@
stream_->set_ack_listener(ack_listener1);
stream2_->set_ack_listener(ack_listener2);
- session_->headers_stream()->WriteOrBufferData("Header1", false,
- ack_listener1);
- stream_->WriteOrBufferBody("Test1", true);
+ session_->headers_stream()->WriteOrBufferData(kHeader1, false, ack_listener1);
+ stream_->WriteOrBufferBody(kBody1, true);
- session_->headers_stream()->WriteOrBufferData("Header2", false,
- ack_listener2);
- stream2_->WriteOrBufferBody("Test2", false);
+ session_->headers_stream()->WriteOrBufferData(kHeader2, false, ack_listener2);
+ stream2_->WriteOrBufferBody(kBody2, false);
QuicStreamFrame frame1(
QuicUtils::GetHeadersStreamId(connection_->transport_version()), false, 0,
- "Header1");
- std::string header = "";
- if (HasFrameHeader()) {
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length = encoder_.SerializeDataFrameHeader(5, &buffer);
- header = std::string(buffer.get(), header_length);
- }
- QuicStreamFrame frame2(stream_->id(), true, 0, header + "Test1");
+ kHeader1);
+
+ std::string data1 = HasFrameHeader() ? DataFrame(kBody1) : kBody1;
+ QuicStreamFrame frame2(stream_->id(), true, 0, data1);
QuicStreamFrame frame3(
QuicUtils::GetHeadersStreamId(connection_->transport_version()), false, 7,
- "Header2");
- QuicStreamFrame frame4(stream2_->id(), false, 0, header + "Test2");
+ kHeader2);
+ std::string data2 = HasFrameHeader() ? DataFrame(kBody2) : kBody2;
+ QuicStreamFrame frame4(stream2_->id(), false, 0, data2);
EXPECT_CALL(*ack_listener1, OnPacketRetransmitted(7));
session_->OnStreamFrameRetransmitted(frame1);
@@ -1654,14 +1619,15 @@
QuicTime::Zero()));
EXPECT_CALL(*mock_ack_listener, OnPacketAcked(0, _));
- QuicStreamFrame frame2(stream_->id(), false, (header + body).length(),
+ QuicStreamFrame frame2(stream_->id(), false, header.length() + body.length(),
header2);
EXPECT_TRUE(session_->OnFrameAcked(QuicFrame(frame2), QuicTime::Delta::Zero(),
QuicTime::Zero()));
EXPECT_CALL(*mock_ack_listener, OnPacketAcked(body2.length(), _));
QuicStreamFrame frame3(stream_->id(), true,
- (header + body).length() + header2.length(), body2);
+ header.length() + body.length() + header2.length(),
+ body2);
EXPECT_TRUE(session_->OnFrameAcked(QuicFrame(frame3), QuicTime::Delta::Zero(),
QuicTime::Zero()));
@@ -1685,9 +1651,9 @@
QuicReferenceCountedPointer<MockAckListener> mock_ack_listener(
new StrictMock<MockAckListener>);
stream_->set_ack_listener(mock_ack_listener);
- std::string body = "Test1";
+ std::string body1 = "Test1";
std::string body2(100, 'x');
- struct iovec body1_iov = {const_cast<char*>(body.data()), body.length()};
+ struct iovec body1_iov = {const_cast<char*>(body1.data()), body1.length()};
struct iovec body2_iov = {const_cast<char*>(body2.data()), body2.length()};
QuicMemSliceStorage storage(&body1_iov, 1,
helper_.GetStreamSendBufferAllocator(), 1024);
@@ -1697,18 +1663,12 @@
stream_->WriteBodySlices(storage.ToSpan(), false);
stream_->WriteBodySlices(storage2.ToSpan(), true);
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buffer);
- std::string header = std::string(buffer.get(), header_length);
-
- header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
- std::string header2 = std::string(buffer.get(), header_length);
+ std::string data1 = DataFrame(body1);
+ std::string data2 = DataFrame(body2);
EXPECT_CALL(*mock_ack_listener,
- OnPacketAcked(body.length() + body2.length(), _));
- QuicStreamFrame frame(stream_->id(), true, 0,
- header + body + header2 + body2);
+ OnPacketAcked(body1.length() + body2.length(), _));
+ QuicStreamFrame frame(stream_->id(), true, 0, data1 + data2);
EXPECT_TRUE(session_->OnFrameAcked(QuicFrame(frame), QuicTime::Delta::Zero(),
QuicTime::Zero()));
@@ -1731,28 +1691,22 @@
QuicReferenceCountedPointer<MockAckListener> mock_ack_listener(
new StrictMock<MockAckListener>);
stream_->set_ack_listener(mock_ack_listener);
- std::string body = "Test1";
+ std::string body1 = "Test1";
std::string body2(100, 'x');
EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
- stream_->WriteOrBufferBody(body, false);
+ stream_->WriteOrBufferBody(body1, false);
stream_->WriteOrBufferBody(body2, true);
- std::unique_ptr<char[]> buffer;
- QuicByteCount header_length =
- encoder_.SerializeDataFrameHeader(body.length(), &buffer);
- std::string header = std::string(buffer.get(), header_length);
+ std::string data1 = DataFrame(body1);
+ std::string data2 = DataFrame(body2);
- header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
- std::string header2 = std::string(buffer.get(), header_length);
-
- EXPECT_CALL(*mock_ack_listener, OnPacketRetransmitted(body.length()));
- QuicStreamFrame frame(stream_->id(), false, 0, header + body);
+ EXPECT_CALL(*mock_ack_listener, OnPacketRetransmitted(body1.length()));
+ QuicStreamFrame frame(stream_->id(), false, 0, data1);
session_->OnStreamFrameRetransmitted(frame);
EXPECT_CALL(*mock_ack_listener, OnPacketRetransmitted(body2.length()));
- QuicStreamFrame frame2(stream_->id(), true, (header + body).length(),
- header2 + body2);
+ QuicStreamFrame frame2(stream_->id(), true, data1.length(), data2);
session_->OnStreamFrameRetransmitted(frame2);
EXPECT_FALSE(
@@ -1766,37 +1720,16 @@
Initialize(kShouldProcessData);
- // QPACK encoded header block with single header field "foo: bar".
- std::string headers_frame_payload =
- QuicTextUtils::HexDecode("00002a94e703626172");
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- encoder_.SerializeHeadersFrameHeader(headers_frame_payload.length(),
- &headers_buffer);
- QuicStringPiece headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
+ // HEADERS frame with QPACK encoded single header field "foo: bar".
+ std::string headers =
+ HeadersFrame(QuicTextUtils::HexDecode("00002a94e703626172"));
+ std::string data = DataFrame(kDataFramePayload);
+ // HEADERS frame with QPACK encoded single header
+ // field "custom-key: custom-value".
+ std::string trailers = HeadersFrame(
+ QuicTextUtils::HexDecode("00002f0125a849e95ba97d7f8925a849e95bb8e8b4bf"));
- std::string data_frame_payload = "some data";
- std::unique_ptr<char[]> data_buffer;
- QuicByteCount data_frame_header_length = encoder_.SerializeDataFrameHeader(
- data_frame_payload.length(), &data_buffer);
- QuicStringPiece data_frame_header(data_buffer.get(),
- data_frame_header_length);
-
- // QPACK encoded header block with single header field
- // "custom-key: custom-value".
- std::string trailers_frame_payload =
- QuicTextUtils::HexDecode("00002f0125a849e95ba97d7f8925a849e95bb8e8b4bf");
- std::unique_ptr<char[]> trailers_buffer;
- QuicByteCount trailers_frame_header_length =
- encoder_.SerializeHeadersFrameHeader(trailers_frame_payload.length(),
- &trailers_buffer);
- QuicStringPiece trailers_frame_header(trailers_buffer.get(),
- trailers_frame_header_length);
-
- std::string stream_frame_payload = QuicStrCat(
- headers_frame_header, headers_frame_payload, data_frame_header,
- data_frame_payload, trailers_frame_header, trailers_frame_payload);
+ std::string stream_frame_payload = QuicStrCat(headers, data, trailers);
QuicStreamFrame frame(stream_->id(), false, 0, stream_frame_payload);
stream_->OnStreamFrame(frame);
@@ -1811,11 +1744,10 @@
// after the header list has been consumed.
EXPECT_EQ("", stream_->data());
stream_->ConsumeHeaderList();
- EXPECT_EQ("some data", stream_->data());
+ EXPECT_EQ(kDataFramePayload, stream_->data());
- const spdy::SpdyHeaderBlock& trailers = stream_->received_trailers();
- EXPECT_THAT(trailers, testing::ElementsAre(
- testing::Pair("custom-key", "custom-value")));
+ EXPECT_THAT(stream_->received_trailers(), testing::ElementsAre(testing::Pair(
+ "custom-key", "custom-value")));
}
TEST_P(QuicSpdyStreamTest, ProcessBodyAfterTrailers) {
@@ -1825,22 +1757,10 @@
Initialize(!kShouldProcessData);
- // QPACK encoded header block with single header field "foo: bar".
- std::string headers_frame_payload =
- QuicTextUtils::HexDecode("00002a94e703626172");
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- encoder_.SerializeHeadersFrameHeader(headers_frame_payload.length(),
- &headers_buffer);
- QuicStringPiece headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
-
- std::string data_frame_payload = "some data";
- std::unique_ptr<char[]> data_buffer;
- QuicByteCount data_frame_header_length = encoder_.SerializeDataFrameHeader(
- data_frame_payload.length(), &data_buffer);
- QuicStringPiece data_frame_header(data_buffer.get(),
- data_frame_header_length);
+ // HEADERS frame with QPACK encoded single header field "foo: bar".
+ std::string headers =
+ HeadersFrame(QuicTextUtils::HexDecode("00002a94e703626172"));
+ std::string data = DataFrame(kDataFramePayload);
// A header block that will take more than one block of sequencer buffer.
// This ensures that when the trailers are consumed, some buffer buckets will
@@ -1849,17 +1769,9 @@
trailers_block["key1"] = std::string(10000, 'x');
std::string trailers_frame_payload =
EncodeQpackHeaders(stream_->id(), &trailers_block);
+ std::string trailers = HeadersFrame(trailers_frame_payload);
- std::unique_ptr<char[]> trailers_buffer;
- QuicByteCount trailers_frame_header_length =
- encoder_.SerializeHeadersFrameHeader(trailers_frame_payload.length(),
- &trailers_buffer);
- QuicStringPiece trailers_frame_header(trailers_buffer.get(),
- trailers_frame_header_length);
-
- std::string stream_frame_payload = QuicStrCat(
- headers_frame_header, headers_frame_payload, data_frame_header,
- data_frame_payload, trailers_frame_header, trailers_frame_payload);
+ std::string stream_frame_payload = QuicStrCat(headers, data, trailers);
QuicStreamFrame frame(stream_->id(), false, 0, stream_frame_payload);
stream_->OnStreamFrame(frame);
@@ -1870,8 +1782,7 @@
vec.iov_base = buffer;
vec.iov_len = QUIC_ARRAYSIZE(buffer);
size_t bytes_read = stream_->Readv(&vec, 1);
- std::string data(buffer, bytes_read);
- EXPECT_EQ("some data", data);
+ EXPECT_EQ(kDataFramePayload, QuicStringPiece(buffer, bytes_read));
}
// The test stream will receive a stream frame containing malformed headers and
@@ -1888,25 +1799,11 @@
connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
// Random bad headers.
- std::string headers_frame_payload =
- QuicTextUtils::HexDecode("00002a94e7036261");
- std::unique_ptr<char[]> headers_buffer;
- QuicByteCount headers_frame_header_length =
- encoder_.SerializeHeadersFrameHeader(headers_frame_payload.length(),
- &headers_buffer);
- QuicStringPiece headers_frame_header(headers_buffer.get(),
- headers_frame_header_length);
+ std::string headers =
+ HeadersFrame(QuicTextUtils::HexDecode("00002a94e7036261"));
+ std::string data = DataFrame(kDataFramePayload);
- std::string data_frame_payload = "some data";
- std::unique_ptr<char[]> data_buffer;
- QuicByteCount data_frame_header_length = encoder_.SerializeDataFrameHeader(
- data_frame_payload.length(), &data_buffer);
- QuicStringPiece data_frame_header(data_buffer.get(),
- data_frame_header_length);
-
- std::string stream_frame_payload =
- QuicStrCat(headers_frame_header, headers_frame_payload, data_frame_header,
- data_frame_payload);
+ std::string stream_frame_payload = QuicStrCat(headers, data);
QuicStreamFrame frame(stream_->id(), false, 0, stream_frame_payload);
EXPECT_CALL(*connection_,