OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
6 | 6 |
7 #include "net/quic/quic_flags.h" | 7 #include "net/quic/quic_flags.h" |
8 #include "net/quic/quic_utils.h" | 8 #include "net/quic/quic_utils.h" |
9 #include "net/quic/spdy_utils.h" | 9 #include "net/quic/spdy_utils.h" |
10 #include "net/quic/test_tools/quic_connection_peer.h" | 10 #include "net/quic/test_tools/quic_connection_peer.h" |
11 #include "net/quic/test_tools/quic_session_peer.h" | 11 #include "net/quic/test_tools/quic_session_peer.h" |
12 #include "net/quic/test_tools/quic_test_utils.h" | 12 #include "net/quic/test_tools/quic_test_utils.h" |
13 #include "net/spdy/spdy_protocol.h" | 13 #include "net/spdy/spdy_protocol.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 | 15 |
16 using base::StringPiece; | 16 using base::StringPiece; |
17 using std::string; | 17 using std::string; |
18 using testing::Invoke; | 18 using testing::Invoke; |
19 using testing::StrictMock; | 19 using testing::StrictMock; |
20 using testing::WithArgs; | 20 using testing::WithArgs; |
21 using testing::_; | 21 using testing::_; |
22 | 22 |
23 namespace net { | 23 namespace net { |
24 namespace test { | 24 namespace test { |
25 namespace { | 25 namespace { |
26 | 26 |
27 class MockVisitor : public SpdyFramerVisitorInterface { | 27 class MockVisitor : public SpdyFramerVisitorInterface { |
28 public: | 28 public: |
29 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); | 29 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); |
30 MOCK_METHOD3(OnDataFrameHeader, void(SpdyStreamId stream_id, | 30 MOCK_METHOD3(OnDataFrameHeader, |
31 size_t length, | 31 void(SpdyStreamId stream_id, size_t length, bool fin)); |
32 bool fin)); | 32 MOCK_METHOD4( |
33 MOCK_METHOD4(OnStreamFrameData, void(SpdyStreamId stream_id, | 33 OnStreamFrameData, |
34 const char* data, | 34 void(SpdyStreamId stream_id, const char* data, size_t len, bool fin)); |
35 size_t len, | 35 MOCK_METHOD3(OnControlFrameHeaderData, |
36 bool fin)); | 36 bool(SpdyStreamId stream_id, |
37 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, | 37 const char* header_data, |
38 const char* header_data, | 38 size_t len)); |
39 size_t len)); | 39 MOCK_METHOD5(OnSynStream, |
40 MOCK_METHOD5(OnSynStream, void(SpdyStreamId stream_id, | 40 void(SpdyStreamId stream_id, |
41 SpdyStreamId associated_stream_id, | 41 SpdyStreamId associated_stream_id, |
42 SpdyPriority priority, | 42 SpdyPriority priority, |
43 bool fin, | 43 bool fin, |
44 bool unidirectional)); | 44 bool unidirectional)); |
45 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin)); | 45 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin)); |
46 MOCK_METHOD2(OnRstStream, void(SpdyStreamId stream_id, | 46 MOCK_METHOD2(OnRstStream, |
47 SpdyRstStreamStatus status)); | 47 void(SpdyStreamId stream_id, SpdyRstStreamStatus status)); |
48 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); | 48 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); |
49 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); | 49 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); |
50 MOCK_METHOD0(OnSettingsAck, void()); | 50 MOCK_METHOD0(OnSettingsAck, void()); |
51 MOCK_METHOD0(OnSettingsEnd, void()); | 51 MOCK_METHOD0(OnSettingsEnd, void()); |
52 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); | 52 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); |
53 MOCK_METHOD2(OnGoAway, void(SpdyStreamId last_accepted_stream_id, | 53 MOCK_METHOD2(OnGoAway, |
54 SpdyGoAwayStatus status)); | 54 void(SpdyStreamId last_accepted_stream_id, |
| 55 SpdyGoAwayStatus status)); |
55 MOCK_METHOD3(OnHeaders, void(SpdyStreamId stream_id, bool fin, bool end)); | 56 MOCK_METHOD3(OnHeaders, void(SpdyStreamId stream_id, bool fin, bool end)); |
56 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId stream_id, | 57 MOCK_METHOD2(OnWindowUpdate, |
57 uint32 delta_window_size)); | 58 void(SpdyStreamId stream_id, uint32 delta_window_size)); |
58 MOCK_METHOD2(OnCredentialFrameData, bool(const char* credential_data, | 59 MOCK_METHOD2(OnCredentialFrameData, |
59 size_t len)); | 60 bool(const char* credential_data, size_t len)); |
60 MOCK_METHOD1(OnBlocked, void(SpdyStreamId stream_id)); | 61 MOCK_METHOD1(OnBlocked, void(SpdyStreamId stream_id)); |
61 MOCK_METHOD3(OnPushPromise, void(SpdyStreamId stream_id, | 62 MOCK_METHOD3(OnPushPromise, |
62 SpdyStreamId promised_stream_id, | 63 void(SpdyStreamId stream_id, |
63 bool end)); | 64 SpdyStreamId promised_stream_id, |
| 65 bool end)); |
64 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); | 66 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); |
65 }; | 67 }; |
66 | 68 |
67 class QuicHeadersStreamTest : public ::testing::TestWithParam<bool> { | 69 class QuicHeadersStreamTest : public ::testing::TestWithParam<bool> { |
68 public: | 70 public: |
69 static QuicVersionVector GetVersions() { | 71 static QuicVersionVector GetVersions() { |
70 QuicVersionVector versions; | 72 QuicVersionVector versions; |
71 versions.push_back(QuicVersionMax()); | 73 versions.push_back(QuicVersionMax()); |
72 return versions; | 74 return versions; |
73 } | 75 } |
74 | 76 |
75 QuicHeadersStreamTest() | 77 QuicHeadersStreamTest() |
76 : connection_(new StrictMock<MockConnection>(is_server(), GetVersions())), | 78 : connection_(new StrictMock<MockConnection>(is_server(), GetVersions())), |
77 session_(connection_), | 79 session_(connection_), |
78 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), | 80 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), |
79 body_("hello world"), | 81 body_("hello world"), |
80 framer_(SPDY3) { | 82 framer_(SPDY3) { |
81 headers_[":version"] = "HTTP/1.1"; | 83 headers_[":version"] = "HTTP/1.1"; |
82 headers_[":status"] = "200 Ok"; | 84 headers_[":status"] = "200 Ok"; |
83 headers_["content-length"] = "11"; | 85 headers_["content-length"] = "11"; |
84 framer_.set_visitor(&visitor_); | 86 framer_.set_visitor(&visitor_); |
85 EXPECT_EQ(QuicVersionMax(), session_.connection()->version()); | 87 EXPECT_EQ(QuicVersionMax(), session_.connection()->version()); |
86 EXPECT_TRUE(headers_stream_ != NULL); | 88 EXPECT_TRUE(headers_stream_ != NULL); |
87 } | 89 } |
88 | 90 |
89 QuicConsumedData SaveIov(const IOVector& data) { | 91 QuicConsumedData SaveIov(const IOVector& data) { |
90 const iovec* iov = data.iovec(); | 92 const iovec* iov = data.iovec(); |
91 int count = data.Capacity(); | 93 int count = data.Capacity(); |
92 for (int i = 0 ; i < count; ++i) { | 94 for (int i = 0; i < count; ++i) { |
93 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); | 95 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); |
94 } | 96 } |
95 return QuicConsumedData(saved_data_.length(), false); | 97 return QuicConsumedData(saved_data_.length(), false); |
96 } | 98 } |
97 | 99 |
98 bool SaveHeaderData(const char* data, int len) { | 100 bool SaveHeaderData(const char* data, int len) { |
99 saved_header_data_.append(data, len); | 101 saved_header_data_.append(data, len); |
100 return true; | 102 return true; |
101 } | 103 } |
102 | 104 |
103 void SaveHeaderDataStringPiece(StringPiece data) { | 105 void SaveHeaderDataStringPiece(StringPiece data) { |
104 saved_header_data_.append(data.data(), data.length()); | 106 saved_header_data_.append(data.data(), data.length()); |
105 } | 107 } |
106 | 108 |
107 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 109 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
108 bool fin, | 110 bool fin, |
109 QuicPriority priority) { | 111 QuicPriority priority) { |
110 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 112 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
111 } | 113 } |
112 | 114 |
113 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, | 115 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
114 bool fin) { | |
115 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 116 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
116 } | 117 } |
117 | 118 |
118 void WriteHeadersAndCheckData(QuicStreamId stream_id, | 119 void WriteHeadersAndCheckData(QuicStreamId stream_id, |
119 bool fin, | 120 bool fin, |
120 QuicPriority priority, | 121 QuicPriority priority, |
121 SpdyFrameType type) { | 122 SpdyFrameType type) { |
122 // Write the headers and capture the outgoing data | 123 // Write the headers and capture the outgoing data |
123 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, NULL)) | 124 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, NULL)) |
124 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 125 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
125 headers_stream_->WriteHeaders(stream_id, headers_, fin, NULL); | 126 headers_stream_->WriteHeaders(stream_id, headers_, fin, NULL); |
126 | 127 |
127 // Parse the outgoing data and check that it matches was was written. | 128 // Parse the outgoing data and check that it matches was was written. |
128 if (type == SYN_STREAM) { | 129 if (type == SYN_STREAM) { |
129 EXPECT_CALL(visitor_, OnSynStream(stream_id, kNoAssociatedStream, 0, | 130 EXPECT_CALL(visitor_, |
130 // priority, | 131 OnSynStream(stream_id, |
131 fin, kNotUnidirectional)); | 132 kNoAssociatedStream, |
| 133 0, |
| 134 // priority, |
| 135 fin, |
| 136 kNotUnidirectional)); |
132 } else { | 137 } else { |
133 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin)); | 138 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin)); |
134 } | 139 } |
135 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 140 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
136 .WillRepeatedly(WithArgs<1, 2>( | 141 .WillRepeatedly(WithArgs<1, 2>( |
137 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 142 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
138 if (fin) { | 143 if (fin) { |
139 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, NULL, 0, true)); | 144 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, NULL, 0, true)); |
140 } | 145 } |
141 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); | 146 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); |
142 EXPECT_FALSE(framer_.HasError()) << framer_.error_code(); | 147 EXPECT_FALSE(framer_.HasError()) << framer_.error_code(); |
143 | 148 |
144 CheckHeaders(); | 149 CheckHeaders(); |
145 saved_data_.clear(); | 150 saved_data_.clear(); |
146 } | 151 } |
147 | 152 |
148 void CheckHeaders() { | 153 void CheckHeaders() { |
149 SpdyHeaderBlock headers; | 154 SpdyHeaderBlock headers; |
150 EXPECT_EQ(saved_header_data_.length(), | 155 EXPECT_EQ( |
151 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(), | 156 saved_header_data_.length(), |
152 saved_header_data_.length(), | 157 framer_.ParseHeaderBlockInBuffer( |
153 &headers)); | 158 saved_header_data_.data(), saved_header_data_.length(), &headers)); |
154 EXPECT_EQ(headers_, headers); | 159 EXPECT_EQ(headers_, headers); |
155 saved_header_data_.clear(); | 160 saved_header_data_.clear(); |
156 } | 161 } |
157 | 162 |
158 bool is_server() { | 163 bool is_server() { return GetParam(); } |
159 return GetParam(); | |
160 } | |
161 | 164 |
162 void CloseConnection() { | 165 void CloseConnection() { QuicConnectionPeer::CloseConnection(connection_); } |
163 QuicConnectionPeer::CloseConnection(connection_); | |
164 } | |
165 | 166 |
166 static const bool kNotUnidirectional = false; | 167 static const bool kNotUnidirectional = false; |
167 static const bool kNoAssociatedStream = false; | 168 static const bool kNoAssociatedStream = false; |
168 | 169 |
169 StrictMock<MockConnection>* connection_; | 170 StrictMock<MockConnection>* connection_; |
170 StrictMock<MockSession> session_; | 171 StrictMock<MockSession> session_; |
171 QuicHeadersStream* headers_stream_; | 172 QuicHeadersStream* headers_stream_; |
172 SpdyHeaderBlock headers_; | 173 SpdyHeaderBlock headers_; |
173 string body_; | 174 string body_; |
174 string saved_data_; | 175 string saved_data_; |
175 string saved_header_data_; | 176 string saved_header_data_; |
176 SpdyFramer framer_; | 177 SpdyFramer framer_; |
177 StrictMock<MockVisitor> visitor_; | 178 StrictMock<MockVisitor> visitor_; |
178 }; | 179 }; |
179 | 180 |
180 INSTANTIATE_TEST_CASE_P(Tests, QuicHeadersStreamTest, testing::Bool()); | 181 INSTANTIATE_TEST_CASE_P(Tests, QuicHeadersStreamTest, testing::Bool()); |
181 | 182 |
182 TEST_P(QuicHeadersStreamTest, StreamId) { | 183 TEST_P(QuicHeadersStreamTest, StreamId) { |
183 EXPECT_EQ(3u, headers_stream_->id()); | 184 EXPECT_EQ(3u, headers_stream_->id()); |
184 } | 185 } |
185 | 186 |
186 TEST_P(QuicHeadersStreamTest, EffectivePriority) { | 187 TEST_P(QuicHeadersStreamTest, EffectivePriority) { |
187 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); | 188 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); |
188 } | 189 } |
189 | 190 |
190 TEST_P(QuicHeadersStreamTest, WriteHeaders) { | 191 TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
191 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id +=2) { | 192 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id += 2) { |
192 for (int count = 0; count < 2; ++count) { | 193 for (int count = 0; count < 2; ++count) { |
193 bool fin = (count == 0); | 194 bool fin = (count == 0); |
194 if (is_server()) { | 195 if (is_server()) { |
195 WriteHeadersAndExpectSynReply(stream_id, fin); | 196 WriteHeadersAndExpectSynReply(stream_id, fin); |
196 } else { | 197 } else { |
197 for (QuicPriority priority = 0; priority < 7; ++priority) { | 198 for (QuicPriority priority = 0; priority < 7; ++priority) { |
198 WriteHeadersAndExpectSynStream(stream_id, fin, priority); | 199 WriteHeadersAndExpectSynStream(stream_id, fin, priority); |
199 } | 200 } |
200 } | 201 } |
201 } | 202 } |
202 } | 203 } |
203 } | 204 } |
204 | 205 |
205 TEST_P(QuicHeadersStreamTest, ProcessRawData) { | 206 TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
206 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id +=2) { | 207 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id += 2) { |
207 for (int count = 0; count < 2; ++count) { | 208 for (int count = 0; count < 2; ++count) { |
208 bool fin = (count == 0); | 209 bool fin = (count == 0); |
209 for (QuicPriority priority = 0; priority < 7; ++priority) { | 210 for (QuicPriority priority = 0; priority < 7; ++priority) { |
210 // Replace with "WriteHeadersAndSaveData" | 211 // Replace with "WriteHeadersAndSaveData" |
211 scoped_ptr<SpdySerializedFrame> frame; | 212 scoped_ptr<SpdySerializedFrame> frame; |
212 if (is_server()) { | 213 if (is_server()) { |
213 SpdySynStreamIR syn_stream(stream_id); | 214 SpdySynStreamIR syn_stream(stream_id); |
214 syn_stream.set_name_value_block(headers_); | 215 syn_stream.set_name_value_block(headers_); |
215 syn_stream.set_fin(fin); | 216 syn_stream.set_fin(fin); |
216 frame.reset(framer_.SerializeSynStream(syn_stream)); | 217 frame.reset(framer_.SerializeSynStream(syn_stream)); |
217 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 218 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
218 } else { | 219 } else { |
219 SpdySynReplyIR syn_reply(stream_id); | 220 SpdySynReplyIR syn_reply(stream_id); |
220 syn_reply.set_name_value_block(headers_); | 221 syn_reply.set_name_value_block(headers_); |
221 syn_reply.set_fin(fin); | 222 syn_reply.set_fin(fin); |
222 frame.reset(framer_.SerializeSynReply(syn_reply)); | 223 frame.reset(framer_.SerializeSynReply(syn_reply)); |
223 } | 224 } |
224 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | 225 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
225 .WillRepeatedly(WithArgs<1>( | 226 .WillRepeatedly(WithArgs<1>(Invoke( |
226 Invoke(this, | 227 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
227 &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
228 EXPECT_CALL(session_, | 228 EXPECT_CALL(session_, |
229 OnStreamHeadersComplete(stream_id, fin, frame->size())); | 229 OnStreamHeadersComplete(stream_id, fin, frame->size())); |
230 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 230 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
231 | 231 |
232 CheckHeaders(); | 232 CheckHeaders(); |
233 } | 233 } |
234 } | 234 } |
235 } | 235 } |
236 } | 236 } |
237 | 237 |
238 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { | 238 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { |
239 SpdyDataIR data(2, ""); | 239 SpdyDataIR data(2, ""); |
240 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 240 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
241 EXPECT_CALL(*connection_, | 241 EXPECT_CALL(*connection_, |
242 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 242 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
243 "SPDY DATA frame received.")) | 243 "SPDY DATA frame received.")) |
244 .WillOnce(InvokeWithoutArgs(this, | 244 .WillOnce( |
245 &QuicHeadersStreamTest::CloseConnection)); | 245 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
246 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 246 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
247 } | 247 } |
248 | 248 |
249 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { | 249 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { |
250 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, ""); | 250 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, ""); |
251 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 251 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
252 EXPECT_CALL(*connection_, | 252 EXPECT_CALL(*connection_, |
253 SendConnectionCloseWithDetails( | 253 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
254 QUIC_INVALID_HEADERS_STREAM_DATA, | 254 "SPDY RST_STREAM frame received.")) |
255 "SPDY RST_STREAM frame received.")) | 255 .WillOnce( |
256 .WillOnce(InvokeWithoutArgs(this, | 256 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
257 &QuicHeadersStreamTest::CloseConnection)); | |
258 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 257 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
259 } | 258 } |
260 | 259 |
261 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { | 260 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { |
262 SpdySettingsIR data; | 261 SpdySettingsIR data; |
263 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0); | 262 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0); |
264 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 263 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
265 EXPECT_CALL(*connection_, | 264 EXPECT_CALL(*connection_, |
266 SendConnectionCloseWithDetails( | 265 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
267 QUIC_INVALID_HEADERS_STREAM_DATA, | 266 "SPDY SETTINGS frame received.")) |
268 "SPDY SETTINGS frame received.")) | 267 .WillOnce( |
269 .WillOnce(InvokeWithoutArgs(this, | 268 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
270 &QuicHeadersStreamTest::CloseConnection)); | |
271 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 269 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
272 } | 270 } |
273 | 271 |
274 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { | 272 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { |
275 SpdyPingIR data(1); | 273 SpdyPingIR data(1); |
276 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 274 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
277 EXPECT_CALL(*connection_, | 275 EXPECT_CALL(*connection_, |
278 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 276 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
279 "SPDY PING frame received.")) | 277 "SPDY PING frame received.")) |
280 .WillOnce(InvokeWithoutArgs(this, | 278 .WillOnce( |
281 &QuicHeadersStreamTest::CloseConnection)); | 279 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
282 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 280 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
283 } | 281 } |
284 | 282 |
285 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { | 283 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { |
286 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); | 284 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); |
287 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 285 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
288 EXPECT_CALL(*connection_, | 286 EXPECT_CALL(*connection_, |
289 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 287 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
290 "SPDY GOAWAY frame received.")) | 288 "SPDY GOAWAY frame received.")) |
291 .WillOnce(InvokeWithoutArgs(this, | 289 .WillOnce( |
292 &QuicHeadersStreamTest::CloseConnection)); | 290 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
293 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 291 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
294 } | 292 } |
295 | 293 |
296 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) { | 294 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) { |
297 SpdyHeadersIR data(1); | 295 SpdyHeadersIR data(1); |
298 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 296 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
299 EXPECT_CALL(*connection_, | 297 EXPECT_CALL(*connection_, |
300 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 298 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
301 "SPDY HEADERS frame received.")) | 299 "SPDY HEADERS frame received.")) |
302 .WillOnce(InvokeWithoutArgs(this, | 300 .WillOnce( |
303 &QuicHeadersStreamTest::CloseConnection)); | 301 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
304 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 302 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
305 } | 303 } |
306 | 304 |
307 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { | 305 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { |
308 SpdyWindowUpdateIR data(1, 1); | 306 SpdyWindowUpdateIR data(1, 1); |
309 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 307 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
310 EXPECT_CALL(*connection_, | 308 EXPECT_CALL( |
311 SendConnectionCloseWithDetails( | 309 *connection_, |
312 QUIC_INVALID_HEADERS_STREAM_DATA, | 310 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
313 "SPDY WINDOW_UPDATE frame received.")) | 311 "SPDY WINDOW_UPDATE frame received.")) |
314 .WillOnce(InvokeWithoutArgs(this, | 312 .WillOnce( |
315 &QuicHeadersStreamTest::CloseConnection)); | 313 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
316 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 314 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
317 } | 315 } |
318 | 316 |
319 TEST_P(QuicHeadersStreamTest, NoFlowControl) { | 317 TEST_P(QuicHeadersStreamTest, NoFlowControl) { |
320 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control_2, true); | 318 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control_2, true); |
321 EXPECT_FALSE(headers_stream_->flow_controller()->IsEnabled()); | 319 EXPECT_FALSE(headers_stream_->flow_controller()->IsEnabled()); |
322 } | 320 } |
323 | 321 |
324 } // namespace | 322 } // namespace |
325 } // namespace test | 323 } // namespace test |
326 } // namespace net | 324 } // namespace net |
OLD | NEW |