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 <cstddef> | 5 #include <cstddef> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 | 39 |
40 class SpdyStreamTest : public ::testing::Test, | 40 class SpdyStreamTest : public ::testing::Test, |
41 public ::testing::WithParamInterface<NextProto> { | 41 public ::testing::WithParamInterface<NextProto> { |
42 protected: | 42 protected: |
43 // A function that takes a SpdyStream and the number of bytes which | 43 // A function that takes a SpdyStream and the number of bytes which |
44 // will unstall the next frame completely. | 44 // will unstall the next frame completely. |
45 typedef base::Callback<void(const base::WeakPtr<SpdyStream>&, int32)> | 45 typedef base::Callback<void(const base::WeakPtr<SpdyStream>&, int32)> |
46 UnstallFunction; | 46 UnstallFunction; |
47 | 47 |
48 SpdyStreamTest() | 48 SpdyStreamTest() |
49 : spdy_util_(GetParam()), | 49 : spdy_util_(GetParam()), session_deps_(GetParam()), offset_(0) {} |
50 session_deps_(GetParam()), | |
51 offset_(0) {} | |
52 | 50 |
53 base::WeakPtr<SpdySession> CreateDefaultSpdySession() { | 51 base::WeakPtr<SpdySession> CreateDefaultSpdySession() { |
54 SpdySessionKey key(HostPortPair("www.google.com", 80), | 52 SpdySessionKey key(HostPortPair("www.google.com", 80), |
55 ProxyServer::Direct(), | 53 ProxyServer::Direct(), |
56 PRIVACY_MODE_DISABLED); | 54 PRIVACY_MODE_DISABLED); |
57 return CreateInsecureSpdySession(session_, key, BoundNetLog()); | 55 return CreateInsecureSpdySession(session_, key, BoundNetLog()); |
58 } | 56 } |
59 | 57 |
60 virtual void TearDown() { | 58 virtual void TearDown() { base::MessageLoop::current()->RunUntilIdle(); } |
61 base::MessageLoop::current()->RunUntilIdle(); | |
62 } | |
63 | 59 |
64 void RunResumeAfterUnstallRequestResponseTest( | 60 void RunResumeAfterUnstallRequestResponseTest( |
65 const UnstallFunction& unstall_function); | 61 const UnstallFunction& unstall_function); |
66 | 62 |
67 void RunResumeAfterUnstallBidirectionalTest( | 63 void RunResumeAfterUnstallBidirectionalTest( |
68 const UnstallFunction& unstall_function); | 64 const UnstallFunction& unstall_function); |
69 | 65 |
70 // Add{Read,Write}() populates lists that are eventually passed to a | 66 // Add{Read,Write}() populates lists that are eventually passed to a |
71 // SocketData class. |frame| must live for the whole test. | 67 // SocketData class. |frame| must live for the whole test. |
72 | 68 |
73 void AddRead(const SpdyFrame& frame) { | 69 void AddRead(const SpdyFrame& frame) { |
74 reads_.push_back(CreateMockRead(frame, offset_++)); | 70 reads_.push_back(CreateMockRead(frame, offset_++)); |
75 } | 71 } |
76 | 72 |
77 void AddWrite(const SpdyFrame& frame) { | 73 void AddWrite(const SpdyFrame& frame) { |
78 writes_.push_back(CreateMockWrite(frame, offset_++)); | 74 writes_.push_back(CreateMockWrite(frame, offset_++)); |
79 } | 75 } |
80 | 76 |
81 void AddReadEOF() { | 77 void AddReadEOF() { reads_.push_back(MockRead(ASYNC, 0, offset_++)); } |
82 reads_.push_back(MockRead(ASYNC, 0, offset_++)); | |
83 } | |
84 | 78 |
85 MockRead* GetReads() { | 79 MockRead* GetReads() { return vector_as_array(&reads_); } |
86 return vector_as_array(&reads_); | |
87 } | |
88 | 80 |
89 size_t GetNumReads() const { | 81 size_t GetNumReads() const { return reads_.size(); } |
90 return reads_.size(); | |
91 } | |
92 | 82 |
93 MockWrite* GetWrites() { | 83 MockWrite* GetWrites() { return vector_as_array(&writes_); } |
94 return vector_as_array(&writes_); | |
95 } | |
96 | 84 |
97 int GetNumWrites() const { | 85 int GetNumWrites() const { return writes_.size(); } |
98 return writes_.size(); | |
99 } | |
100 | 86 |
101 SpdyTestUtil spdy_util_; | 87 SpdyTestUtil spdy_util_; |
102 SpdySessionDependencies session_deps_; | 88 SpdySessionDependencies session_deps_; |
103 scoped_refptr<HttpNetworkSession> session_; | 89 scoped_refptr<HttpNetworkSession> session_; |
104 | 90 |
105 private: | 91 private: |
106 // Used by Add{Read,Write}() above. | 92 // Used by Add{Read,Write}() above. |
107 std::vector<MockWrite> writes_; | 93 std::vector<MockWrite> writes_; |
108 std::vector<MockRead> reads_; | 94 std::vector<MockRead> reads_; |
109 int offset_; | 95 int offset_; |
110 }; | 96 }; |
111 | 97 |
112 INSTANTIATE_TEST_CASE_P( | 98 INSTANTIATE_TEST_CASE_P(NextProto, |
113 NextProto, | 99 SpdyStreamTest, |
114 SpdyStreamTest, | 100 testing::Values(kProtoDeprecatedSPDY2, |
115 testing::Values(kProtoDeprecatedSPDY2, | 101 kProtoSPDY3, |
116 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); | 102 kProtoSPDY31, |
| 103 kProtoSPDY4)); |
117 | 104 |
118 TEST_P(SpdyStreamTest, SendDataAfterOpen) { | 105 TEST_P(SpdyStreamTest, SendDataAfterOpen) { |
119 GURL url(kStreamUrl); | 106 GURL url(kStreamUrl); |
120 | 107 |
121 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 108 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
122 | 109 |
123 scoped_ptr<SpdyFrame> req( | 110 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
124 spdy_util_.ConstructSpdyPost( | 111 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
125 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
126 AddWrite(*req); | 112 AddWrite(*req); |
127 | 113 |
128 scoped_ptr<SpdyFrame> resp( | 114 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
129 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | |
130 AddRead(*resp); | 115 AddRead(*resp); |
131 | 116 |
132 scoped_ptr<SpdyFrame> msg( | 117 scoped_ptr<SpdyFrame> msg( |
133 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 118 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
134 AddWrite(*msg); | 119 AddWrite(*msg); |
135 | 120 |
136 scoped_ptr<SpdyFrame> echo( | 121 scoped_ptr<SpdyFrame> echo( |
137 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 122 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
138 AddRead(*echo); | 123 AddRead(*echo); |
139 | 124 |
140 AddReadEOF(); | 125 AddReadEOF(); |
141 | 126 |
142 OrderedSocketData data(GetReads(), GetNumReads(), | 127 OrderedSocketData data( |
143 GetWrites(), GetNumWrites()); | 128 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
144 MockConnect connect_data(SYNCHRONOUS, OK); | 129 MockConnect connect_data(SYNCHRONOUS, OK); |
145 data.set_connect_data(connect_data); | 130 data.set_connect_data(connect_data); |
146 | 131 |
147 session_deps_.socket_factory->AddSocketDataProvider(&data); | 132 session_deps_.socket_factory->AddSocketDataProvider(&data); |
148 | 133 |
149 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 134 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
150 | 135 |
151 base::WeakPtr<SpdyStream> stream = | 136 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
152 CreateStreamSynchronously( | 137 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); |
153 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); | |
154 ASSERT_TRUE(stream.get() != NULL); | 138 ASSERT_TRUE(stream.get() != NULL); |
155 | 139 |
156 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); | 140 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); |
157 stream->SetDelegate(&delegate); | 141 stream->SetDelegate(&delegate); |
158 | 142 |
159 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 143 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
160 | 144 |
161 scoped_ptr<SpdyHeaderBlock> headers( | 145 scoped_ptr<SpdyHeaderBlock> headers( |
162 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 146 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
163 EXPECT_EQ(ERR_IO_PENDING, | 147 EXPECT_EQ(ERR_IO_PENDING, |
164 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 148 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
165 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 149 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
166 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 150 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
167 | 151 |
168 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 152 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
169 | 153 |
170 EXPECT_TRUE(delegate.send_headers_completed()); | 154 EXPECT_TRUE(delegate.send_headers_completed()); |
171 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 155 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
172 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 156 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
173 delegate.TakeReceivedData()); | 157 delegate.TakeReceivedData()); |
174 EXPECT_TRUE(data.at_write_eof()); | 158 EXPECT_TRUE(data.at_write_eof()); |
175 } | 159 } |
176 | 160 |
177 TEST_P(SpdyStreamTest, PushedStream) { | 161 TEST_P(SpdyStreamTest, PushedStream) { |
178 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 162 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
179 | 163 |
180 AddReadEOF(); | 164 AddReadEOF(); |
181 | 165 |
182 OrderedSocketData data(GetReads(), GetNumReads(), | 166 OrderedSocketData data( |
183 GetWrites(), GetNumWrites()); | 167 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
184 MockConnect connect_data(SYNCHRONOUS, OK); | 168 MockConnect connect_data(SYNCHRONOUS, OK); |
185 data.set_connect_data(connect_data); | 169 data.set_connect_data(connect_data); |
186 | 170 |
187 session_deps_.socket_factory->AddSocketDataProvider(&data); | 171 session_deps_.socket_factory->AddSocketDataProvider(&data); |
188 | 172 |
189 base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession()); | 173 base::WeakPtr<SpdySession> spdy_session(CreateDefaultSpdySession()); |
190 | 174 |
191 // Conjure up a stream. | 175 // Conjure up a stream. |
192 SpdyStream stream(SPDY_PUSH_STREAM, | 176 SpdyStream stream(SPDY_PUSH_STREAM, |
193 spdy_session, | 177 spdy_session, |
(...skipping 28 matching lines...) Expand all Loading... |
222 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); | 206 EXPECT_EQ("200", delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey())); |
223 | 207 |
224 EXPECT_TRUE(spdy_session == NULL); | 208 EXPECT_TRUE(spdy_session == NULL); |
225 } | 209 } |
226 | 210 |
227 TEST_P(SpdyStreamTest, StreamError) { | 211 TEST_P(SpdyStreamTest, StreamError) { |
228 GURL url(kStreamUrl); | 212 GURL url(kStreamUrl); |
229 | 213 |
230 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 214 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
231 | 215 |
232 scoped_ptr<SpdyFrame> req( | 216 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
233 spdy_util_.ConstructSpdyPost( | 217 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
234 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
235 AddWrite(*req); | 218 AddWrite(*req); |
236 | 219 |
237 scoped_ptr<SpdyFrame> resp( | 220 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
238 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
239 AddRead(*resp); | 221 AddRead(*resp); |
240 | 222 |
241 scoped_ptr<SpdyFrame> msg( | 223 scoped_ptr<SpdyFrame> msg( |
242 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 224 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
243 AddWrite(*msg); | 225 AddWrite(*msg); |
244 | 226 |
245 scoped_ptr<SpdyFrame> echo( | 227 scoped_ptr<SpdyFrame> echo( |
246 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 228 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
247 AddRead(*echo); | 229 AddRead(*echo); |
248 | 230 |
249 AddReadEOF(); | 231 AddReadEOF(); |
250 | 232 |
251 CapturingBoundNetLog log; | 233 CapturingBoundNetLog log; |
252 | 234 |
253 OrderedSocketData data(GetReads(), GetNumReads(), | 235 OrderedSocketData data( |
254 GetWrites(), GetNumWrites()); | 236 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
255 MockConnect connect_data(SYNCHRONOUS, OK); | 237 MockConnect connect_data(SYNCHRONOUS, OK); |
256 data.set_connect_data(connect_data); | 238 data.set_connect_data(connect_data); |
257 | 239 |
258 session_deps_.socket_factory->AddSocketDataProvider(&data); | 240 session_deps_.socket_factory->AddSocketDataProvider(&data); |
259 | 241 |
260 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 242 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
261 | 243 |
262 base::WeakPtr<SpdyStream> stream = | 244 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
263 CreateStreamSynchronously( | 245 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, log.bound()); |
264 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, log.bound()); | |
265 ASSERT_TRUE(stream.get() != NULL); | 246 ASSERT_TRUE(stream.get() != NULL); |
266 | 247 |
267 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); | 248 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); |
268 stream->SetDelegate(&delegate); | 249 stream->SetDelegate(&delegate); |
269 | 250 |
270 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 251 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
271 | 252 |
272 scoped_ptr<SpdyHeaderBlock> headers( | 253 scoped_ptr<SpdyHeaderBlock> headers( |
273 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 254 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
274 EXPECT_EQ(ERR_IO_PENDING, | 255 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 11 matching lines...) Expand all Loading... |
286 delegate.TakeReceivedData()); | 267 delegate.TakeReceivedData()); |
287 EXPECT_TRUE(data.at_write_eof()); | 268 EXPECT_TRUE(data.at_write_eof()); |
288 | 269 |
289 // Check that the NetLog was filled reasonably. | 270 // Check that the NetLog was filled reasonably. |
290 net::CapturingNetLog::CapturedEntryList entries; | 271 net::CapturingNetLog::CapturedEntryList entries; |
291 log.GetEntries(&entries); | 272 log.GetEntries(&entries); |
292 EXPECT_LT(0u, entries.size()); | 273 EXPECT_LT(0u, entries.size()); |
293 | 274 |
294 // Check that we logged SPDY_STREAM_ERROR correctly. | 275 // Check that we logged SPDY_STREAM_ERROR correctly. |
295 int pos = net::ExpectLogContainsSomewhere( | 276 int pos = net::ExpectLogContainsSomewhere( |
296 entries, 0, | 277 entries, 0, net::NetLog::TYPE_SPDY_STREAM_ERROR, net::NetLog::PHASE_NONE); |
297 net::NetLog::TYPE_SPDY_STREAM_ERROR, | |
298 net::NetLog::PHASE_NONE); | |
299 | 278 |
300 int stream_id2; | 279 int stream_id2; |
301 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); | 280 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &stream_id2)); |
302 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); | 281 EXPECT_EQ(static_cast<int>(stream_id), stream_id2); |
303 } | 282 } |
304 | 283 |
305 // Make sure that large blocks of data are properly split up into | 284 // Make sure that large blocks of data are properly split up into |
306 // frame-sized chunks for a request/response (i.e., an HTTP-like) | 285 // frame-sized chunks for a request/response (i.e., an HTTP-like) |
307 // stream. | 286 // stream. |
308 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { | 287 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { |
309 GURL url(kStreamUrl); | 288 GURL url(kStreamUrl); |
310 | 289 |
311 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 290 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
312 | 291 |
313 scoped_ptr<SpdyFrame> req( | 292 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
314 spdy_util_.ConstructSpdyPost( | 293 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
315 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
316 AddWrite(*req); | 294 AddWrite(*req); |
317 | 295 |
318 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 296 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
319 scoped_ptr<SpdyFrame> chunk( | 297 scoped_ptr<SpdyFrame> chunk(spdy_util_.ConstructSpdyBodyFrame( |
320 spdy_util_.ConstructSpdyBodyFrame( | 298 1, chunk_data.data(), chunk_data.length(), false)); |
321 1, chunk_data.data(), chunk_data.length(), false)); | |
322 AddWrite(*chunk); | 299 AddWrite(*chunk); |
323 AddWrite(*chunk); | 300 AddWrite(*chunk); |
324 | 301 |
325 scoped_ptr<SpdyFrame> last_chunk( | 302 scoped_ptr<SpdyFrame> last_chunk(spdy_util_.ConstructSpdyBodyFrame( |
326 spdy_util_.ConstructSpdyBodyFrame( | 303 1, chunk_data.data(), chunk_data.length(), true)); |
327 1, chunk_data.data(), chunk_data.length(), true)); | |
328 AddWrite(*last_chunk); | 304 AddWrite(*last_chunk); |
329 | 305 |
330 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 306 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
331 AddRead(*resp); | 307 AddRead(*resp); |
332 | 308 |
333 AddReadEOF(); | 309 AddReadEOF(); |
334 | 310 |
335 OrderedSocketData data(GetReads(), GetNumReads(), | 311 OrderedSocketData data( |
336 GetWrites(), GetNumWrites()); | 312 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
337 MockConnect connect_data(SYNCHRONOUS, OK); | 313 MockConnect connect_data(SYNCHRONOUS, OK); |
338 data.set_connect_data(connect_data); | 314 data.set_connect_data(connect_data); |
339 | 315 |
340 session_deps_.socket_factory->AddSocketDataProvider(&data); | 316 session_deps_.socket_factory->AddSocketDataProvider(&data); |
341 | 317 |
342 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 318 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
343 | 319 |
344 base::WeakPtr<SpdyStream> stream = | 320 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
345 CreateStreamSynchronously( | 321 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
346 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
347 ASSERT_TRUE(stream.get() != NULL); | 322 ASSERT_TRUE(stream.get() != NULL); |
348 | 323 |
349 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); | 324 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
350 StreamDelegateWithBody delegate(stream, body_data); | 325 StreamDelegateWithBody delegate(stream, body_data); |
351 stream->SetDelegate(&delegate); | 326 stream->SetDelegate(&delegate); |
352 | 327 |
353 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 328 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
354 | 329 |
355 scoped_ptr<SpdyHeaderBlock> headers( | 330 scoped_ptr<SpdyHeaderBlock> headers( |
356 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 331 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
(...skipping 11 matching lines...) Expand all Loading... |
368 } | 343 } |
369 | 344 |
370 // Make sure that large blocks of data are properly split up into | 345 // Make sure that large blocks of data are properly split up into |
371 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) | 346 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) |
372 // stream. | 347 // stream. |
373 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { | 348 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { |
374 GURL url(kStreamUrl); | 349 GURL url(kStreamUrl); |
375 | 350 |
376 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 351 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
377 | 352 |
378 scoped_ptr<SpdyFrame> req( | 353 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
379 spdy_util_.ConstructSpdyPost( | 354 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
380 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
381 AddWrite(*req); | 355 AddWrite(*req); |
382 | 356 |
383 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 357 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
384 AddRead(*resp); | 358 AddRead(*resp); |
385 | 359 |
386 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 360 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
387 scoped_ptr<SpdyFrame> chunk( | 361 scoped_ptr<SpdyFrame> chunk(spdy_util_.ConstructSpdyBodyFrame( |
388 spdy_util_.ConstructSpdyBodyFrame( | 362 1, chunk_data.data(), chunk_data.length(), false)); |
389 1, chunk_data.data(), chunk_data.length(), false)); | |
390 AddWrite(*chunk); | 363 AddWrite(*chunk); |
391 AddWrite(*chunk); | 364 AddWrite(*chunk); |
392 AddWrite(*chunk); | 365 AddWrite(*chunk); |
393 | 366 |
394 AddReadEOF(); | 367 AddReadEOF(); |
395 | 368 |
396 OrderedSocketData data(GetReads(), GetNumReads(), | 369 OrderedSocketData data( |
397 GetWrites(), GetNumWrites()); | 370 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
398 MockConnect connect_data(SYNCHRONOUS, OK); | 371 MockConnect connect_data(SYNCHRONOUS, OK); |
399 data.set_connect_data(connect_data); | 372 data.set_connect_data(connect_data); |
400 | 373 |
401 session_deps_.socket_factory->AddSocketDataProvider(&data); | 374 session_deps_.socket_factory->AddSocketDataProvider(&data); |
402 | 375 |
403 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 376 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
404 | 377 |
405 base::WeakPtr<SpdyStream> stream = | 378 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
406 CreateStreamSynchronously( | 379 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); |
407 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); | |
408 ASSERT_TRUE(stream.get() != NULL); | 380 ASSERT_TRUE(stream.get() != NULL); |
409 | 381 |
410 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); | 382 std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x'); |
411 StreamDelegateSendImmediate delegate(stream, body_data); | 383 StreamDelegateSendImmediate delegate(stream, body_data); |
412 stream->SetDelegate(&delegate); | 384 stream->SetDelegate(&delegate); |
413 | 385 |
414 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 386 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
415 | 387 |
416 scoped_ptr<SpdyHeaderBlock> headers( | 388 scoped_ptr<SpdyHeaderBlock> headers( |
417 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 389 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
(...skipping 16 matching lines...) Expand all Loading... |
434 GURL url(kStreamUrl); | 406 GURL url(kStreamUrl); |
435 | 407 |
436 session_ = | 408 session_ = |
437 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 409 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
438 | 410 |
439 scoped_ptr<SpdyFrame> syn( | 411 scoped_ptr<SpdyFrame> syn( |
440 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 412 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
441 AddWrite(*syn); | 413 AddWrite(*syn); |
442 | 414 |
443 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 415 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
444 scoped_ptr<SpdyFrame> | 416 scoped_ptr<SpdyFrame> reply( |
445 reply(spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 417 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
446 AddRead(*reply); | 418 AddRead(*reply); |
447 | 419 |
448 scoped_ptr<SpdyFrame> rst( | 420 scoped_ptr<SpdyFrame> rst( |
449 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 421 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
450 AddWrite(*rst); | 422 AddWrite(*rst); |
451 | 423 |
452 AddReadEOF(); | 424 AddReadEOF(); |
453 | 425 |
454 DeterministicSocketData data(GetReads(), GetNumReads(), | 426 DeterministicSocketData data( |
455 GetWrites(), GetNumWrites()); | 427 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
456 MockConnect connect_data(SYNCHRONOUS, OK); | 428 MockConnect connect_data(SYNCHRONOUS, OK); |
457 data.set_connect_data(connect_data); | 429 data.set_connect_data(connect_data); |
458 | 430 |
459 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 431 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
460 | 432 |
461 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 433 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
462 | 434 |
463 base::WeakPtr<SpdyStream> stream = | 435 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
464 CreateStreamSynchronously( | 436 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
465 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
466 ASSERT_TRUE(stream.get() != NULL); | 437 ASSERT_TRUE(stream.get() != NULL); |
467 | 438 |
468 StreamDelegateDoNothing delegate(stream); | 439 StreamDelegateDoNothing delegate(stream); |
469 stream->SetDelegate(&delegate); | 440 stream->SetDelegate(&delegate); |
470 | 441 |
471 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 442 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
472 | 443 |
473 scoped_ptr<SpdyHeaderBlock> headers( | 444 scoped_ptr<SpdyHeaderBlock> headers( |
474 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 445 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
475 EXPECT_EQ(ERR_IO_PENDING, | 446 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 11 matching lines...) Expand all Loading... |
487 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { | 458 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { |
488 GURL url(kStreamUrl); | 459 GURL url(kStreamUrl); |
489 | 460 |
490 session_ = | 461 session_ = |
491 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 462 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
492 | 463 |
493 scoped_ptr<SpdyFrame> syn( | 464 scoped_ptr<SpdyFrame> syn( |
494 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 465 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
495 AddWrite(*syn); | 466 AddWrite(*syn); |
496 | 467 |
497 scoped_ptr<SpdyFrame> | 468 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
498 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
499 AddRead(*reply); | 469 AddRead(*reply); |
500 | 470 |
501 const char* const extra_headers[] = {"X-UpperCase", "yes"}; | 471 const char* const extra_headers[] = {"X-UpperCase", "yes"}; |
502 scoped_ptr<SpdyFrame> | 472 scoped_ptr<SpdyFrame> push( |
503 push(spdy_util_.ConstructSpdyPush(extra_headers, 1, 2, 1, kStreamUrl)); | 473 spdy_util_.ConstructSpdyPush(extra_headers, 1, 2, 1, kStreamUrl)); |
504 AddRead(*push); | 474 AddRead(*push); |
505 | 475 |
506 scoped_ptr<SpdyFrame> rst( | 476 scoped_ptr<SpdyFrame> rst( |
507 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 477 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
508 AddWrite(*rst); | 478 AddWrite(*rst); |
509 | 479 |
510 AddReadEOF(); | 480 AddReadEOF(); |
511 | 481 |
512 DeterministicSocketData data(GetReads(), GetNumReads(), | 482 DeterministicSocketData data( |
513 GetWrites(), GetNumWrites()); | 483 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
514 MockConnect connect_data(SYNCHRONOUS, OK); | 484 MockConnect connect_data(SYNCHRONOUS, OK); |
515 data.set_connect_data(connect_data); | 485 data.set_connect_data(connect_data); |
516 | 486 |
517 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 487 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
518 | 488 |
519 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 489 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
520 | 490 |
521 base::WeakPtr<SpdyStream> stream = | 491 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
522 CreateStreamSynchronously( | 492 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
523 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
524 ASSERT_TRUE(stream.get() != NULL); | 493 ASSERT_TRUE(stream.get() != NULL); |
525 | 494 |
526 StreamDelegateDoNothing delegate(stream); | 495 StreamDelegateDoNothing delegate(stream); |
527 stream->SetDelegate(&delegate); | 496 stream->SetDelegate(&delegate); |
528 | 497 |
529 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 498 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
530 | 499 |
531 scoped_ptr<SpdyHeaderBlock> headers( | 500 scoped_ptr<SpdyHeaderBlock> headers( |
532 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 501 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
533 EXPECT_EQ(ERR_IO_PENDING, | 502 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 17 matching lines...) Expand all Loading... |
551 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { | 520 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { |
552 GURL url(kStreamUrl); | 521 GURL url(kStreamUrl); |
553 | 522 |
554 session_ = | 523 session_ = |
555 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 524 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
556 | 525 |
557 scoped_ptr<SpdyFrame> syn( | 526 scoped_ptr<SpdyFrame> syn( |
558 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 527 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
559 AddWrite(*syn); | 528 AddWrite(*syn); |
560 | 529 |
561 scoped_ptr<SpdyFrame> | 530 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
562 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
563 AddRead(*reply); | 531 AddRead(*reply); |
564 | 532 |
565 scoped_ptr<SpdyFrame> | 533 scoped_ptr<SpdyFrame> push( |
566 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 534 spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
567 AddRead(*push); | 535 AddRead(*push); |
568 | 536 |
569 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 537 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
570 (*late_headers)["X-UpperCase"] = "yes"; | 538 (*late_headers)["X-UpperCase"] = "yes"; |
571 scoped_ptr<SpdyFrame> headers_frame( | 539 scoped_ptr<SpdyFrame> headers_frame(spdy_util_.ConstructSpdyControlFrame( |
572 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 540 late_headers.Pass(), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, 0)); |
573 false, | |
574 2, | |
575 LOWEST, | |
576 HEADERS, | |
577 CONTROL_FLAG_NONE, | |
578 0)); | |
579 AddRead(*headers_frame); | 541 AddRead(*headers_frame); |
580 | 542 |
581 scoped_ptr<SpdyFrame> rst( | 543 scoped_ptr<SpdyFrame> rst( |
582 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 544 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
583 AddWrite(*rst); | 545 AddWrite(*rst); |
584 | 546 |
585 AddReadEOF(); | 547 AddReadEOF(); |
586 | 548 |
587 DeterministicSocketData data(GetReads(), GetNumReads(), | 549 DeterministicSocketData data( |
588 GetWrites(), GetNumWrites()); | 550 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
589 MockConnect connect_data(SYNCHRONOUS, OK); | 551 MockConnect connect_data(SYNCHRONOUS, OK); |
590 data.set_connect_data(connect_data); | 552 data.set_connect_data(connect_data); |
591 | 553 |
592 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 554 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
593 | 555 |
594 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 556 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
595 | 557 |
596 base::WeakPtr<SpdyStream> stream = | 558 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
597 CreateStreamSynchronously( | 559 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
598 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
599 ASSERT_TRUE(stream.get() != NULL); | 560 ASSERT_TRUE(stream.get() != NULL); |
600 | 561 |
601 StreamDelegateDoNothing delegate(stream); | 562 StreamDelegateDoNothing delegate(stream); |
602 stream->SetDelegate(&delegate); | 563 stream->SetDelegate(&delegate); |
603 | 564 |
604 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 565 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
605 | 566 |
606 scoped_ptr<SpdyHeaderBlock> headers( | 567 scoped_ptr<SpdyHeaderBlock> headers( |
607 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 568 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
608 EXPECT_EQ(ERR_IO_PENDING, | 569 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 22 matching lines...) Expand all Loading... |
631 TEST_P(SpdyStreamTest, DuplicateHeaders) { | 592 TEST_P(SpdyStreamTest, DuplicateHeaders) { |
632 GURL url(kStreamUrl); | 593 GURL url(kStreamUrl); |
633 | 594 |
634 session_ = | 595 session_ = |
635 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 596 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
636 | 597 |
637 scoped_ptr<SpdyFrame> syn( | 598 scoped_ptr<SpdyFrame> syn( |
638 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 599 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
639 AddWrite(*syn); | 600 AddWrite(*syn); |
640 | 601 |
641 scoped_ptr<SpdyFrame> | 602 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
642 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
643 AddRead(*reply); | 603 AddRead(*reply); |
644 | 604 |
645 scoped_ptr<SpdyFrame> | 605 scoped_ptr<SpdyFrame> push( |
646 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 606 spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
647 AddRead(*push); | 607 AddRead(*push); |
648 | 608 |
649 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); | 609 scoped_ptr<SpdyHeaderBlock> late_headers(new SpdyHeaderBlock()); |
650 (*late_headers)[spdy_util_.GetStatusKey()] = "500 Server Error"; | 610 (*late_headers)[spdy_util_.GetStatusKey()] = "500 Server Error"; |
651 scoped_ptr<SpdyFrame> headers_frame( | 611 scoped_ptr<SpdyFrame> headers_frame(spdy_util_.ConstructSpdyControlFrame( |
652 spdy_util_.ConstructSpdyControlFrame(late_headers.Pass(), | 612 late_headers.Pass(), false, 2, LOWEST, HEADERS, CONTROL_FLAG_NONE, 0)); |
653 false, | |
654 2, | |
655 LOWEST, | |
656 HEADERS, | |
657 CONTROL_FLAG_NONE, | |
658 0)); | |
659 AddRead(*headers_frame); | 613 AddRead(*headers_frame); |
660 | 614 |
661 scoped_ptr<SpdyFrame> rst( | 615 scoped_ptr<SpdyFrame> rst( |
662 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); | 616 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); |
663 AddWrite(*rst); | 617 AddWrite(*rst); |
664 | 618 |
665 AddReadEOF(); | 619 AddReadEOF(); |
666 | 620 |
667 DeterministicSocketData data(GetReads(), GetNumReads(), | 621 DeterministicSocketData data( |
668 GetWrites(), GetNumWrites()); | 622 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
669 MockConnect connect_data(SYNCHRONOUS, OK); | 623 MockConnect connect_data(SYNCHRONOUS, OK); |
670 data.set_connect_data(connect_data); | 624 data.set_connect_data(connect_data); |
671 | 625 |
672 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 626 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
673 | 627 |
674 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 628 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
675 | 629 |
676 base::WeakPtr<SpdyStream> stream = | 630 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
677 CreateStreamSynchronously( | 631 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
678 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
679 ASSERT_TRUE(stream.get() != NULL); | 632 ASSERT_TRUE(stream.get() != NULL); |
680 | 633 |
681 StreamDelegateDoNothing delegate(stream); | 634 StreamDelegateDoNothing delegate(stream); |
682 stream->SetDelegate(&delegate); | 635 stream->SetDelegate(&delegate); |
683 | 636 |
684 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 637 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
685 | 638 |
686 scoped_ptr<SpdyHeaderBlock> headers( | 639 scoped_ptr<SpdyHeaderBlock> headers( |
687 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 640 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
688 EXPECT_EQ(ERR_IO_PENDING, | 641 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 22 matching lines...) Expand all Loading... |
711 // Call IncreaseSendWindowSize on a stream with a large enough delta | 664 // Call IncreaseSendWindowSize on a stream with a large enough delta |
712 // to overflow an int32. The SpdyStream should handle that case | 665 // to overflow an int32. The SpdyStream should handle that case |
713 // gracefully. | 666 // gracefully. |
714 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 667 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
715 if (spdy_util_.protocol() < kProtoSPDY3) | 668 if (spdy_util_.protocol() < kProtoSPDY3) |
716 return; | 669 return; |
717 | 670 |
718 session_ = | 671 session_ = |
719 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 672 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
720 | 673 |
721 scoped_ptr<SpdyFrame> req( | 674 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
722 spdy_util_.ConstructSpdyPost( | 675 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
723 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
724 AddWrite(*req); | 676 AddWrite(*req); |
725 | 677 |
726 // Triggered by the overflowing call to IncreaseSendWindowSize | 678 // Triggered by the overflowing call to IncreaseSendWindowSize |
727 // below. | 679 // below. |
728 scoped_ptr<SpdyFrame> rst( | 680 scoped_ptr<SpdyFrame> rst( |
729 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); | 681 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); |
730 AddWrite(*rst); | 682 AddWrite(*rst); |
731 | 683 |
732 AddReadEOF(); | 684 AddReadEOF(); |
733 | 685 |
734 CapturingBoundNetLog log; | 686 CapturingBoundNetLog log; |
735 | 687 |
736 DeterministicSocketData data(GetReads(), GetNumReads(), | 688 DeterministicSocketData data( |
737 GetWrites(), GetNumWrites()); | 689 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
738 MockConnect connect_data(SYNCHRONOUS, OK); | 690 MockConnect connect_data(SYNCHRONOUS, OK); |
739 data.set_connect_data(connect_data); | 691 data.set_connect_data(connect_data); |
740 | 692 |
741 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 693 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
742 | 694 |
743 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 695 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
744 GURL url(kStreamUrl); | 696 GURL url(kStreamUrl); |
745 | 697 |
746 base::WeakPtr<SpdyStream> stream = | 698 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
747 CreateStreamSynchronously( | 699 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, log.bound()); |
748 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, log.bound()); | |
749 ASSERT_TRUE(stream.get() != NULL); | 700 ASSERT_TRUE(stream.get() != NULL); |
750 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); | 701 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); |
751 stream->SetDelegate(&delegate); | 702 stream->SetDelegate(&delegate); |
752 | 703 |
753 scoped_ptr<SpdyHeaderBlock> headers( | 704 scoped_ptr<SpdyHeaderBlock> headers( |
754 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 705 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
755 EXPECT_EQ(ERR_IO_PENDING, | 706 EXPECT_EQ(ERR_IO_PENDING, |
756 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 707 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
757 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 708 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
758 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 709 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 // Given an unstall function, runs a test to make sure that a | 754 // Given an unstall function, runs a test to make sure that a |
804 // request/response (i.e., an HTTP-like) stream resumes after a stall | 755 // request/response (i.e., an HTTP-like) stream resumes after a stall |
805 // and unstall. | 756 // and unstall. |
806 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( | 757 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( |
807 const UnstallFunction& unstall_function) { | 758 const UnstallFunction& unstall_function) { |
808 GURL url(kStreamUrl); | 759 GURL url(kStreamUrl); |
809 | 760 |
810 session_ = | 761 session_ = |
811 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 762 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
812 | 763 |
813 scoped_ptr<SpdyFrame> req( | 764 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
814 spdy_util_.ConstructSpdyPost( | 765 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
815 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
816 AddWrite(*req); | 766 AddWrite(*req); |
817 | 767 |
818 scoped_ptr<SpdyFrame> body( | 768 scoped_ptr<SpdyFrame> body( |
819 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); | 769 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); |
820 AddWrite(*body); | 770 AddWrite(*body); |
821 | 771 |
822 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 772 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
823 AddRead(*resp); | 773 AddRead(*resp); |
824 | 774 |
825 AddReadEOF(); | 775 AddReadEOF(); |
826 | 776 |
827 DeterministicSocketData data(GetReads(), GetNumReads(), | 777 DeterministicSocketData data( |
828 GetWrites(), GetNumWrites()); | 778 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
829 MockConnect connect_data(SYNCHRONOUS, OK); | 779 MockConnect connect_data(SYNCHRONOUS, OK); |
830 data.set_connect_data(connect_data); | 780 data.set_connect_data(connect_data); |
831 | 781 |
832 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 782 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
833 | 783 |
834 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 784 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
835 | 785 |
836 base::WeakPtr<SpdyStream> stream = | 786 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
837 CreateStreamSynchronously( | 787 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
838 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
839 ASSERT_TRUE(stream.get() != NULL); | 788 ASSERT_TRUE(stream.get() != NULL); |
840 | 789 |
841 StreamDelegateWithBody delegate(stream, kPostBodyStringPiece); | 790 StreamDelegateWithBody delegate(stream, kPostBodyStringPiece); |
842 stream->SetDelegate(&delegate); | 791 stream->SetDelegate(&delegate); |
843 | 792 |
844 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 793 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
845 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 794 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
846 | 795 |
847 scoped_ptr<SpdyHeaderBlock> headers( | 796 scoped_ptr<SpdyHeaderBlock> headers( |
848 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 797 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 // Given an unstall function, runs a test to make sure that a | 839 // Given an unstall function, runs a test to make sure that a |
891 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall | 840 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall |
892 // and unstall. | 841 // and unstall. |
893 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( | 842 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( |
894 const UnstallFunction& unstall_function) { | 843 const UnstallFunction& unstall_function) { |
895 GURL url(kStreamUrl); | 844 GURL url(kStreamUrl); |
896 | 845 |
897 session_ = | 846 session_ = |
898 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 847 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
899 | 848 |
900 scoped_ptr<SpdyFrame> req( | 849 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
901 spdy_util_.ConstructSpdyPost( | 850 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
902 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | |
903 AddWrite(*req); | 851 AddWrite(*req); |
904 | 852 |
905 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 853 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
906 AddRead(*resp); | 854 AddRead(*resp); |
907 | 855 |
908 scoped_ptr<SpdyFrame> msg( | 856 scoped_ptr<SpdyFrame> msg( |
909 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 857 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
910 AddWrite(*msg); | 858 AddWrite(*msg); |
911 | 859 |
912 scoped_ptr<SpdyFrame> echo( | 860 scoped_ptr<SpdyFrame> echo( |
913 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 861 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
914 AddRead(*echo); | 862 AddRead(*echo); |
915 | 863 |
916 AddReadEOF(); | 864 AddReadEOF(); |
917 | 865 |
918 DeterministicSocketData data(GetReads(), GetNumReads(), | 866 DeterministicSocketData data( |
919 GetWrites(), GetNumWrites()); | 867 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
920 MockConnect connect_data(SYNCHRONOUS, OK); | 868 MockConnect connect_data(SYNCHRONOUS, OK); |
921 data.set_connect_data(connect_data); | 869 data.set_connect_data(connect_data); |
922 | 870 |
923 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 871 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
924 | 872 |
925 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 873 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
926 | 874 |
927 base::WeakPtr<SpdyStream> stream = | 875 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
928 CreateStreamSynchronously( | 876 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); |
929 SPDY_BIDIRECTIONAL_STREAM, session, url, LOWEST, BoundNetLog()); | |
930 ASSERT_TRUE(stream.get() != NULL); | 877 ASSERT_TRUE(stream.get() != NULL); |
931 | 878 |
932 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); | 879 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); |
933 stream->SetDelegate(&delegate); | 880 stream->SetDelegate(&delegate); |
934 | 881 |
935 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 882 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
936 | 883 |
937 scoped_ptr<SpdyHeaderBlock> headers( | 884 scoped_ptr<SpdyHeaderBlock> headers( |
938 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 885 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
939 EXPECT_EQ(ERR_IO_PENDING, | 886 EXPECT_EQ(ERR_IO_PENDING, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 TEST_P(SpdyStreamTest, ReceivedBytes) { | 933 TEST_P(SpdyStreamTest, ReceivedBytes) { |
987 GURL url(kStreamUrl); | 934 GURL url(kStreamUrl); |
988 | 935 |
989 session_ = | 936 session_ = |
990 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 937 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
991 | 938 |
992 scoped_ptr<SpdyFrame> syn( | 939 scoped_ptr<SpdyFrame> syn( |
993 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 940 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
994 AddWrite(*syn); | 941 AddWrite(*syn); |
995 | 942 |
996 scoped_ptr<SpdyFrame> | 943 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
997 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
998 AddRead(*reply); | 944 AddRead(*reply); |
999 | 945 |
1000 scoped_ptr<SpdyFrame> msg( | 946 scoped_ptr<SpdyFrame> msg( |
1001 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 947 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
1002 AddRead(*msg); | 948 AddRead(*msg); |
1003 | 949 |
1004 AddReadEOF(); | 950 AddReadEOF(); |
1005 | 951 |
1006 DeterministicSocketData data(GetReads(), GetNumReads(), | 952 DeterministicSocketData data( |
1007 GetWrites(), GetNumWrites()); | 953 GetReads(), GetNumReads(), GetWrites(), GetNumWrites()); |
1008 MockConnect connect_data(SYNCHRONOUS, OK); | 954 MockConnect connect_data(SYNCHRONOUS, OK); |
1009 data.set_connect_data(connect_data); | 955 data.set_connect_data(connect_data); |
1010 | 956 |
1011 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 957 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1012 | 958 |
1013 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); | 959 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); |
1014 | 960 |
1015 base::WeakPtr<SpdyStream> stream = | 961 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
1016 CreateStreamSynchronously( | 962 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
1017 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); | |
1018 ASSERT_TRUE(stream.get() != NULL); | 963 ASSERT_TRUE(stream.get() != NULL); |
1019 | 964 |
1020 StreamDelegateDoNothing delegate(stream); | 965 StreamDelegateDoNothing delegate(stream); |
1021 stream->SetDelegate(&delegate); | 966 stream->SetDelegate(&delegate); |
1022 | 967 |
1023 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 968 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
1024 | 969 |
1025 scoped_ptr<SpdyHeaderBlock> headers( | 970 scoped_ptr<SpdyHeaderBlock> headers( |
1026 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 971 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
1027 EXPECT_EQ(ERR_IO_PENDING, | 972 EXPECT_EQ(ERR_IO_PENDING, |
1028 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 973 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
1029 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 974 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
1030 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 975 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
1031 | 976 |
1032 int64 reply_frame_len = reply->size(); | 977 int64 reply_frame_len = reply->size(); |
1033 int64 data_header_len = spdy_util_.CreateFramer(false) | 978 int64 data_header_len = |
1034 ->GetDataFrameMinimumSize(); | 979 spdy_util_.CreateFramer(false)->GetDataFrameMinimumSize(); |
1035 int64 data_frame_len = data_header_len + kPostBodyLength; | 980 int64 data_frame_len = data_header_len + kPostBodyLength; |
1036 int64 response_len = reply_frame_len + data_frame_len; | 981 int64 response_len = reply_frame_len + data_frame_len; |
1037 | 982 |
1038 EXPECT_EQ(0, stream->raw_received_bytes()); | 983 EXPECT_EQ(0, stream->raw_received_bytes()); |
1039 data.RunFor(1); // SYN | 984 data.RunFor(1); // SYN |
1040 EXPECT_EQ(0, stream->raw_received_bytes()); | 985 EXPECT_EQ(0, stream->raw_received_bytes()); |
1041 data.RunFor(1); // REPLY | 986 data.RunFor(1); // REPLY |
1042 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); | 987 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); |
1043 data.RunFor(1); // DATA | 988 data.RunFor(1); // DATA |
1044 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 989 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
1045 data.RunFor(1); // FIN | 990 data.RunFor(1); // FIN |
1046 | 991 |
1047 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 992 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
1048 } | 993 } |
1049 | 994 |
1050 } // namespace | 995 } // namespace |
1051 | 996 |
1052 } // namespace test | 997 } // namespace test |
1053 | 998 |
1054 } // namespace net | 999 } // namespace net |
OLD | NEW |