Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index 5072e929a54d67435d1697390c6350943e7dd680..4f0af5905818ef48b4dd51c6aa57f870b6da70f5 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -21,6 +21,7 @@ |
#include "base/memory/ptr_util.h" |
#include "base/strings/string_number_conversions.h" |
#include "net/quic/core/quic_flags.h" |
+#include "net/spdy/array_output_buffer.h" |
#include "net/spdy/hpack/hpack_constants.h" |
#include "net/spdy/mock_spdy_framer_visitor.h" |
#include "net/spdy/spdy_flags.h" |
@@ -40,6 +41,12 @@ namespace net { |
namespace test { |
+namespace { |
+ |
+const int64_t kSize = 64 * 1024; |
+char output_buffer[kSize] = ""; |
+} |
+ |
class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { |
public: |
MOCK_METHOD4(OnSendCompressedFrame, |
@@ -261,6 +268,31 @@ class SpdyFramerPeer { |
EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
return serialized_headers_old_version; |
} |
+ |
+ static SpdySerializedFrame SerializeHeaders(SpdyFramer* framer, |
+ const SpdyHeadersIR& headers, |
+ ArrayOutputBuffer* output) { |
+ if (output == nullptr) { |
+ return SerializeHeaders(framer, headers); |
+ } |
+ output->Reset(); |
+ EXPECT_TRUE(framer->SerializeHeaders(headers, output)); |
+ SpdySerializedFrame serialized_headers_old_version(output->Begin(), |
+ output->Size(), false); |
+ framer->hpack_encoder_.reset(nullptr); |
+ auto* saved_debug_visitor = framer->debug_visitor_; |
+ framer->debug_visitor_ = nullptr; |
+ |
+ std::vector<SpdySerializedFrame> frame_list; |
+ SpdyFramer::SpdyHeaderFrameIterator it(framer, CloneSpdyHeadersIR(headers)); |
+ while (it.HasNextFrame()) { |
+ frame_list.push_back(it.NextFrame()); |
+ } |
+ framer->debug_visitor_ = saved_debug_visitor; |
+ |
+ EXPECT_THAT(serialized_headers_old_version, IsFrameUnionOf(&frame_list)); |
+ return serialized_headers_old_version; |
+ } |
}; |
class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
@@ -637,9 +669,13 @@ StringPiece GetSerializedHeaders(const SpdySerializedFrame& frame, |
enum DecoderChoice { DECODER_SELF, DECODER_NESTED, DECODER_HTTP2 }; |
enum HpackChoice { HPACK_DECODER_1, HPACK_DECODER_2, HPACK_DECODER_3 }; |
+enum Output { USE, NOT_USE }; |
+ |
+class SpdyFramerTest : public ::testing::TestWithParam< |
+ std::tuple<DecoderChoice, HpackChoice, Output>> { |
+ public: |
+ SpdyFramerTest() : output_(output_buffer, kSize) {} |
-class SpdyFramerTest |
- : public ::testing::TestWithParam<std::tuple<DecoderChoice, HpackChoice>> { |
protected: |
void SetUp() override { |
auto param = GetParam(); |
@@ -671,6 +707,16 @@ class SpdyFramerTest |
FLAGS_chromium_http2_flag_spdy_use_hpack_decoder3 = true; |
break; |
} |
+ switch (std::get<2>(param)) { |
+ case USE: |
+ use_output_ = true; |
+ break; |
+ case NOT_USE: |
+ // TODO(yasong): remove this case after |
+ // gfe2_reloadable_flag_write_queue_zero_copy_buffer deprecates. |
Bence
2017/03/16 18:12:54
s/gfe2_reloadable_flag_write_queue_zero_copy_buffe
yasong
2017/03/16 22:28:52
Done.
|
+ use_output_ = false; |
+ break; |
+ } |
} |
void CompareFrame(const string& description, |
@@ -693,6 +739,9 @@ class SpdyFramerTest |
reinterpret_cast<const unsigned char*>(actual_frame.data()), |
actual_frame.size()); |
} |
+ |
+ bool use_output_ = false; |
+ ArrayOutputBuffer output_; |
}; |
INSTANTIATE_TEST_CASE_P( |
@@ -700,7 +749,8 @@ INSTANTIATE_TEST_CASE_P( |
SpdyFramerTest, |
::testing::Combine( |
::testing::Values(DECODER_SELF, DECODER_NESTED, DECODER_HTTP2), |
- ::testing::Values(HPACK_DECODER_1, HPACK_DECODER_2, HPACK_DECODER_3))); |
+ ::testing::Values(HPACK_DECODER_1, HPACK_DECODER_2, HPACK_DECODER_3), |
+ ::testing::Values(USE, NOT_USE))); |
// Test that we can encode and decode a SpdyHeaderBlock in serialized form. |
TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { |
@@ -711,7 +761,8 @@ TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { |
headers.SetHeader("alpha", "beta"); |
headers.SetHeader("gamma", "charlie"); |
headers.SetHeader("cookie", "key1=value1; key2=value2"); |
- SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
@@ -729,7 +780,8 @@ TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { |
SpdyHeadersIR headers(1); |
headers.SetHeader("alpha", "beta"); |
headers.SetHeader("gamma", "charlie"); |
- SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
@@ -786,8 +838,8 @@ TEST_P(SpdyFramerTest, HeaderStreamDependencyValues) { |
headers.set_has_priority(true); |
headers.set_parent_stream_id(parent_stream_id); |
headers.set_exclusive(exclusive); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
@@ -1008,7 +1060,8 @@ TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { |
SpdyHeadersIR headers(0); |
headers.SetHeader("alpha", "beta"); |
- SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
// We shouldn't have to read the whole frame before we signal an error. |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
@@ -1027,6 +1080,10 @@ TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { |
SpdyPriorityIR priority_ir(0, 1, 16, true); |
SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeFrame(priority_ir, &output_)); |
Bence
2017/03/16 18:12:54
Please use ASSERT_TRUE instead of EXPECT_TRUE, bec
yasong
2017/03/16 22:28:52
Done.
|
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
// We shouldn't have to read the whole frame before we signal an error. |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
@@ -1045,6 +1102,10 @@ TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { |
SpdyRstStreamIR rst_stream_ir(0, ERROR_CODE_PROTOCOL_ERROR); |
SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeRstStream(rst_stream_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
// We shouldn't have to read the whole frame before we signal an error. |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
@@ -1122,6 +1183,10 @@ TEST_P(SpdyFramerTest, ContinuationWithStreamIdZero) { |
continuation.take_encoding(std::move(some_nonsense_encoding)); |
continuation.set_end_headers(true); |
SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
// We shouldn't have to read the whole frame before we signal an error. |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
@@ -1141,6 +1206,10 @@ TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { |
SpdyPushPromiseIR push_promise(0, 4); |
push_promise.SetHeader("alpha", "beta"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
// We shouldn't have to read the whole frame before we signal an error. |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
@@ -1160,6 +1229,10 @@ TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { |
SpdyPushPromiseIR push_promise(3, 0); |
push_promise.SetHeader("alpha", "beta"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
framer.ProcessInput(frame.data(), frame.size()); |
@@ -1406,8 +1479,8 @@ TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) { |
SpdyHeadersIR headers(1); |
headers.SetHeader(kHeader1, kValue1); |
headers.SetHeader(kHeader2, kValue2); |
- SpdySerializedFrame headers_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame headers_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
const char bytes[] = "this is a test test test test test!"; |
SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes))); |
@@ -1439,8 +1512,12 @@ TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) { |
TEST_P(SpdyFramerTest, WindowUpdateFrame) { |
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
- SpdySerializedFrame frame( |
- framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x12345678))); |
+ SpdyWindowUpdateIR window_update(1, 0x12345678); |
+ SpdySerializedFrame frame(framer.SerializeWindowUpdate(window_update)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeWindowUpdate(window_update, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; |
const unsigned char kH2FrameData[] = { |
@@ -1670,6 +1747,10 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
}; |
SpdyRstStreamIR rst_stream(1, ERROR_CODE_PROTOCOL_ERROR); |
SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1684,6 +1765,11 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
}; |
SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_PROTOCOL_ERROR); |
SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1698,6 +1784,11 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
}; |
SpdyRstStreamIR rst_stream(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR); |
SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
} |
@@ -1724,6 +1815,10 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
settings_ir.AddSetting(kId, kValue); |
SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1753,6 +1848,11 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); |
settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 8); |
SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1768,6 +1868,12 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
}; |
SpdySettingsIR settings_ir; |
SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
+ |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
} |
@@ -1799,11 +1905,20 @@ TEST_P(SpdyFramerTest, CreatePingFrame) { |
// Tests SpdyPingIR when the ping is not an ack. |
ASSERT_FALSE(ping_ir.is_ack()); |
frame = framer.SerializePing(ping_ir); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePing(ping_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
// Tests SpdyPingIR when the ping is an ack. |
ping_ir.set_is_ack(true); |
frame = framer.SerializePing(ping_ir); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializePing(ping_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameDataWithAck, |
arraysize(kH2FrameDataWithAck)); |
} |
@@ -1825,6 +1940,10 @@ TEST_P(SpdyFramerTest, CreateGoAway) { |
}; |
SpdyGoAwayIR goaway_ir(0, ERROR_CODE_NO_ERROR, "GA"); |
SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1841,6 +1960,11 @@ TEST_P(SpdyFramerTest, CreateGoAway) { |
}; |
SpdyGoAwayIR goaway_ir(0x7FFFFFFF, ERROR_CODE_INTERNAL_ERROR, "GA"); |
SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
} |
@@ -1874,8 +1998,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
SpdyHeadersIR headers(1); |
headers.SetHeader("bar", "foo"); |
headers.SetHeader("foo", "bar"); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1905,8 +2029,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers.set_fin(true); |
headers.SetHeader("", "foo"); |
headers.SetHeader("foo", "bar"); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1936,8 +2060,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers_ir.set_fin(true); |
headers_ir.SetHeader("bar", "foo"); |
headers_ir.SetHeader("foo", ""); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -1972,8 +2096,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers_ir.set_weight(220); |
headers_ir.SetHeader("bar", "foo"); |
headers_ir.SetHeader("foo", ""); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -2011,8 +2135,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers_ir.set_parent_stream_id(0); |
headers_ir.SetHeader("bar", "foo"); |
headers_ir.SetHeader("foo", ""); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); |
} |
@@ -2050,8 +2174,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers_ir.set_parent_stream_id(0x7fffffff); |
headers_ir.SetHeader("bar", "foo"); |
headers_ir.SetHeader("foo", ""); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kV4FrameData, arraysize(kV4FrameData)); |
} |
@@ -2087,8 +2211,8 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
headers_ir.SetHeader("", "foo"); |
headers_ir.SetHeader("foo", "bar"); |
headers_ir.set_padding_len(6); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
} |
@@ -2103,8 +2227,8 @@ TEST_P(SpdyFramerTest, CreateHeadersCompressed) { |
SpdyHeadersIR headers_ir(1); |
headers_ir.SetHeader("bar", "foo"); |
headers_ir.SetHeader("foo", "bar"); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
// Deflate compression doesn't apply to HPACK. |
} |
} |
@@ -2124,6 +2248,12 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
}; |
SpdySerializedFrame frame( |
framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE( |
+ framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1), &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -2138,6 +2268,12 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
}; |
SpdySerializedFrame frame( |
framer.SerializeWindowUpdate(SpdyWindowUpdateIR(0x7FFFFFFF, 1))); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeWindowUpdate( |
+ SpdyWindowUpdateIR(0x7FFFFFFF, 1), &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
@@ -2152,6 +2288,12 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
}; |
SpdySerializedFrame frame( |
framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 0x7FFFFFFF))); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeWindowUpdate( |
+ SpdyWindowUpdateIR(1, 0x7FFFFFFF), &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kH2FrameData, arraysize(kH2FrameData)); |
} |
} |
@@ -2169,6 +2311,10 @@ TEST_P(SpdyFramerTest, SerializeBlocked) { |
}; |
SpdyBlockedIR blocked_ir(0); |
SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeFrame(blocked_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2180,6 +2326,11 @@ TEST_P(SpdyFramerTest, CreateBlocked) { |
SpdySerializedFrame frame_serialized( |
framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeBlocked(SpdyBlockedIR(kStreamId), &output_)); |
+ frame_serialized = |
+ SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SpdyBlockedIR blocked_ir(kStreamId); |
SpdySerializedFrame frame_created(framer.SerializeFrame(blocked_ir)); |
@@ -2218,6 +2369,10 @@ TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
push_promise.SetHeader("bar", "foo"); |
push_promise.SetHeader("foo", "bar"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2254,6 +2409,11 @@ TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
push_promise.SetHeader("bar", "foo"); |
push_promise.SetHeader("foo", "bar"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2310,6 +2470,11 @@ TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
push_promise.SetHeader("bar", "foo"); |
push_promise.SetHeader("foo", "bar"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
} |
@@ -2365,6 +2530,10 @@ TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { |
continuation.set_end_headers(true); |
SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2469,6 +2638,10 @@ TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) { |
string big_value(TestSpdyVisitor::sent_control_frame_max_size(), 'x'); |
push_promise.SetHeader("xxx", big_value); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
// The entire frame should look like below: |
// Name Length in Byte |
@@ -2527,6 +2700,10 @@ TEST_P(SpdyFramerTest, CreateAltSvc) { |
"p\"=i:d", "h_\\o\"st", 123, 42, |
SpdyAltSvcWireFormat::VersionVector{24})); |
SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2544,12 +2721,22 @@ TEST_P(SpdyFramerTest, CreatePriority) { |
}; |
SpdyPriorityIR priority_ir(2, 1, 17, true); |
SpdySerializedFrame frame(framer.SerializeFrame(priority_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeFrame(priority_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
SpdyPriorityIR priority2(2); |
priority2.set_parent_stream_id(1); |
priority2.set_weight(17); |
priority2.set_exclusive(true); |
- frame = framer.SerializeFrame(priority2); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeFrame(priority2, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } else { |
+ frame = framer.SerializeFrame(priority2); |
+ } |
CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); |
} |
@@ -2558,8 +2745,8 @@ TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
SpdyHeadersIR headers_ir(1); |
headers_ir.SetHeader("alpha", "beta"); |
headers_ir.SetHeader("gamma", "delta"); |
- SpdySerializedFrame control_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame.data()), |
@@ -2577,8 +2764,8 @@ TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { |
headers_ir.set_fin(true); |
headers_ir.SetHeader("alpha", "beta"); |
headers_ir.SetHeader("gamma", "delta"); |
- SpdySerializedFrame control_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame.data()), |
@@ -2600,8 +2787,8 @@ TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { |
const size_t kBigValueSize = TestSpdyVisitor::sent_control_frame_max_size(); |
string big_value(kBigValueSize, 'x'); |
headers.SetHeader("aa", big_value); |
- SpdySerializedFrame control_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
EXPECT_GT(control_frame.size(), |
TestSpdyVisitor::sent_control_frame_max_size()); |
@@ -2688,6 +2875,10 @@ TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { |
string big_value(kBigValueSize, 'x'); |
push_promise.SetHeader("aa", big_value); |
SpdySerializedFrame control_frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
EXPECT_GT(control_frame.size(), |
TestSpdyVisitor::sent_control_frame_max_size()); |
@@ -2715,8 +2906,8 @@ TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { |
SpdyHeadersIR headers(1); |
headers.set_fin(true); |
headers.SetHeader("aa", big_value); |
- SpdySerializedFrame control_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame control_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
visitor.set_header_buffer_size(kHeaderBufferSize); |
visitor.SimulateInFramer( |
@@ -2770,6 +2961,10 @@ TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { |
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
SpdySettingsIR settings_ir; |
SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SetFrameLength(&control_frame, 0); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
visitor.SimulateInFramer( |
@@ -2791,6 +2986,10 @@ TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { |
settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0x00000002); |
settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 0x00000002); |
SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
const size_t kNewLength = 8; |
SetFrameLength(&control_frame, kNewLength); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
@@ -2815,6 +3014,11 @@ TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { |
settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 7); |
SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
+ |
EXPECT_LT(SpdyFramerPeer::ControlFrameBufferSize(), control_frame.size()); |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
@@ -3026,6 +3230,11 @@ TEST_P(SpdyFramerTest, ReadWindowUpdate) { |
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
SpdySerializedFrame control_frame( |
framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); |
+ if (use_output_) { |
+ EXPECT_TRUE( |
+ framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2), &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame.data()), |
@@ -3040,6 +3249,12 @@ TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
push_promise.SetHeader("foo", "bar"); |
push_promise.SetHeader("bar", "foofoo"); |
SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
+ if (use_output_) { |
+ // Use a new framer to clean up the hpack dynamic table. |
+ SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
+ EXPECT_TRUE(framer.SerializePushPromise(push_promise, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
frame.size()); |
@@ -3465,6 +3680,10 @@ TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) { |
SpdySettingsIR settings_ir; |
settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 10); |
SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ control_frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame.data()), |
control_frame.size()); |
@@ -3674,6 +3893,11 @@ TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
SpdyRstStreamIR rst_stream(13, ERROR_CODE_CANCEL); |
SpdySerializedFrame frame(framer.SerializeRstStream(rst_stream)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeRstStream(rst_stream, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SetFrameFlags(&frame, flags); |
EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); |
@@ -3699,6 +3923,11 @@ TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
SpdySettingsIR settings_ir; |
settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16); |
SpdySerializedFrame frame(framer.SerializeSettings(settings_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeSettings(settings_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SetFrameFlags(&frame, flags); |
if (flags & SETTINGS_FLAG_ACK) { |
@@ -3736,6 +3965,11 @@ TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
SpdyGoAwayIR goaway_ir(97, ERROR_CODE_NO_ERROR, "test"); |
SpdySerializedFrame frame(framer.SerializeGoAway(goaway_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeGoAway(goaway_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SetFrameFlags(&frame, flags); |
EXPECT_CALL(visitor, OnGoAway(97, ERROR_CODE_NO_ERROR)); |
@@ -3765,8 +3999,8 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
headers_ir.set_exclusive(true); |
} |
headers_ir.SetHeader("foo", "bar"); |
- SpdySerializedFrame frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
uint8_t set_flags = flags & ~HEADERS_FLAG_PADDED; |
SetFrameFlags(&frame, set_flags); |
@@ -3912,12 +4146,17 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
SpdyHeadersIR headers_ir(42); |
headers_ir.SetHeader("foo", "bar"); |
- SpdySerializedFrame frame0( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers_ir)); |
+ SpdySerializedFrame frame0(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers_ir, use_output_ ? &output_ : nullptr)); |
SetFrameFlags(&frame0, 0); |
SpdyContinuationIR continuation(42); |
SpdySerializedFrame frame(framer.SerializeContinuation(continuation)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeContinuation(continuation, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
SetFrameFlags(&frame, flags); |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); |
@@ -4034,6 +4273,11 @@ TEST_P(SpdyFramerTest, OnBlocked) { |
SpdyBlockedIR blocked_ir(0); |
SpdySerializedFrame frame(framer.SerializeFrame(blocked_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeFrame(blocked_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
framer.ProcessInput(frame.data(), framer.GetBlockedSize()); |
EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
@@ -4063,6 +4307,11 @@ TEST_P(SpdyFramerTest, OnAltSvcWithOrigin) { |
altsvc_ir.add_altsvc(altsvc1); |
altsvc_ir.add_altsvc(altsvc2); |
SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
framer.ProcessInput(frame.data(), frame.size()); |
EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
@@ -4113,6 +4362,11 @@ TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) { |
altsvc_ir.add_altsvc(SpdyAltSvcWireFormat::AlternativeService( |
"", "h1", 443, 10, SpdyAltSvcWireFormat::VersionVector())); |
SpdySerializedFrame frame(framer.SerializeFrame(altsvc_ir)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializeFrame(altsvc_ir, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
framer.ProcessInput(frame.data(), frame.size()); |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
@@ -4235,6 +4489,11 @@ TEST_P(SpdyFramerTest, ReadPriority) { |
SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
SpdyPriorityIR priority(3, 1, 256, false); |
SpdySerializedFrame frame(framer.SerializePriority(priority)); |
+ if (use_output_) { |
+ output_.Reset(); |
+ EXPECT_TRUE(framer.SerializePriority(priority, &output_)); |
+ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); |
+ } |
testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
framer.set_visitor(&visitor); |
EXPECT_CALL(visitor, OnPriority(3, 1, 256, false)); |
@@ -4366,8 +4625,8 @@ TEST_P(SpdyFramerTest, ProcessAllInput) { |
headers.SetHeader("alpha", "beta"); |
headers.SetHeader("gamma", "charlie"); |
headers.SetHeader("cookie", "key1=value1; key2=value2"); |
- SpdySerializedFrame headers_frame( |
- SpdyFramerPeer::SerializeHeaders(&framer, headers)); |
+ SpdySerializedFrame headers_frame(SpdyFramerPeer::SerializeHeaders( |
+ &framer, headers, use_output_ ? &output_ : nullptr)); |
const char four_score[] = "Four score and seven years ago"; |
SpdyDataIR four_score_ir(1, four_score); |