Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: net/spdy/spdy_stream_spdy3_unittest.cc

Issue 12743006: [SPDY] Refactor tests in preparation for a fix for a session flow control bug (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_stream_spdy2_unittest.cc ('k') | net/spdy/spdy_test_util_spdy2.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "net/base/completion_callback.h" 8 #include "net/base/completion_callback.h"
9 #include "net/base/net_log_unittest.h" 9 #include "net/base/net_log_unittest.h"
10 #include "net/spdy/buffered_spdy_framer.h" 10 #include "net/spdy/buffered_spdy_framer.h"
(...skipping 10 matching lines...) Expand all
21 using namespace net::test_spdy3; 21 using namespace net::test_spdy3;
22 22
23 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc 23 // TODO(ukai): factor out common part with spdy_http_stream_unittest.cc
24 // 24 //
25 namespace net { 25 namespace net {
26 26
27 namespace test { 27 namespace test {
28 28
29 namespace { 29 namespace {
30 30
31 const SpdyHeaderInfo kSynStartHeader = { 31 const char kStreamUrl[] = "http://www.google.com/";
32 SYN_STREAM, 32 const char kPostBody[] = "\0hello!\xff";
33 1, 33 const size_t kPostBodyLength = arraysize(kPostBody);
34 0,
35 ConvertRequestPriorityToSpdyPriority(LOWEST, 3),
36 0,
37 CONTROL_FLAG_NONE,
38 false,
39 RST_STREAM_INVALID,
40 NULL,
41 0,
42 DATA_FLAG_NONE
43 };
44
45 const char* const kGetHeaders[] = {
46 ":method",
47 "GET",
48 ":scheme",
49 "http",
50 ":host",
51 "www.google.com",
52 ":path",
53 "/",
54 ":version",
55 "HTTP/1.1",
56 };
57
58 // TODO(akalin): Factor out the two functions below (duplicated in
59 // spdy_stream_spdy2_unittest.cc). The main sticking point is the
60 // different definitions of the SpdyHeaderInfo struct in
61 // spdy_test_util_spdy{2,3}.h.
62
63 scoped_ptr<SpdyFrame> ConstructSpdyGetRequest() {
64 return scoped_ptr<SpdyFrame>(
65 ConstructSpdyPacket(
66 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2));
67 }
68
69 scoped_ptr<SpdyHeaderBlock> ConstructSpdyGetHeaderBlock() {
70 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock);
71 for (size_t i = 0; i < arraysize(kGetHeaders) / 2; ++i) {
72 (*headers)[kGetHeaders[2*i]] = kGetHeaders[2*i+1];
73 }
74 return headers.Pass();
75 }
76
77 scoped_ptr<SpdyFrame> ConstructSpdyBodyFrame(const char* data, int length) {
78 BufferedSpdyFramer framer(kSpdyVersion3, false);
79 return scoped_ptr<SpdyFrame>(
80 framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE));
81 }
82 34
83 class SpdyStreamSpdy3Test : public testing::Test { 35 class SpdyStreamSpdy3Test : public testing::Test {
84 protected: 36 protected:
85 SpdyStreamSpdy3Test() : host_port_pair_("www.google.com", 80) { 37 SpdyStreamSpdy3Test() : host_port_pair_("www.google.com", 80) {
86 } 38 }
87 39
88 scoped_refptr<SpdySession> CreateSpdySession() { 40 scoped_refptr<SpdySession> CreateSpdySession() {
89 HostPortProxyPair pair(host_port_pair_, ProxyServer::Direct()); 41 HostPortProxyPair pair(host_port_pair_, ProxyServer::Direct());
90 scoped_refptr<SpdySession> session( 42 scoped_refptr<SpdySession> session(
91 session_->spdy_session_pool()->Get(pair, BoundNetLog())); 43 session_->spdy_session_pool()->Get(pair, BoundNetLog()));
(...skipping 18 matching lines...) Expand all
110 virtual void TearDown() { 62 virtual void TearDown() {
111 MessageLoop::current()->RunUntilIdle(); 63 MessageLoop::current()->RunUntilIdle();
112 } 64 }
113 65
114 HostPortPair host_port_pair_; 66 HostPortPair host_port_pair_;
115 SpdySessionDependencies session_deps_; 67 SpdySessionDependencies session_deps_;
116 scoped_refptr<HttpNetworkSession> session_; 68 scoped_refptr<HttpNetworkSession> session_;
117 }; 69 };
118 70
119 TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) { 71 TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) {
72 GURL url(kStreamUrl);
120 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 73 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
121 74
122 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 75 scoped_ptr<SpdyFrame> req(
123 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8); 76 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
77 scoped_ptr<SpdyFrame> msg(
78 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
124 MockWrite writes[] = { 79 MockWrite writes[] = {
125 CreateMockWrite(*req), 80 CreateMockWrite(*req),
126 CreateMockWrite(*msg), 81 CreateMockWrite(*msg),
127 }; 82 };
128 writes[0].sequence_number = 0; 83 writes[0].sequence_number = 0;
129 writes[1].sequence_number = 2; 84 writes[1].sequence_number = 2;
130 85
131 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 86 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
132 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8); 87 scoped_ptr<SpdyFrame> echo(
88 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
133 MockRead reads[] = { 89 MockRead reads[] = {
134 CreateMockRead(*resp), 90 CreateMockRead(*resp),
135 CreateMockRead(*echo), 91 CreateMockRead(*echo),
136 MockRead(ASYNC, 0, 0), // EOF 92 MockRead(ASYNC, 0, 0), // EOF
137 }; 93 };
138 reads[0].sequence_number = 1; 94 reads[0].sequence_number = 1;
139 reads[1].sequence_number = 3; 95 reads[1].sequence_number = 3;
140 reads[2].sequence_number = 4; 96 reads[2].sequence_number = 4;
141 97
142 OrderedSocketData data(reads, arraysize(reads), 98 OrderedSocketData data(reads, arraysize(reads),
143 writes, arraysize(writes)); 99 writes, arraysize(writes));
144 MockConnect connect_data(SYNCHRONOUS, OK); 100 MockConnect connect_data(SYNCHRONOUS, OK);
145 data.set_connect_data(connect_data); 101 data.set_connect_data(connect_data);
146 102
147 session_deps_.socket_factory->AddSocketDataProvider(&data); 103 session_deps_.socket_factory->AddSocketDataProvider(&data);
148 104
149 scoped_refptr<SpdySession> session(CreateSpdySession()); 105 scoped_refptr<SpdySession> session(CreateSpdySession());
150 const char kStreamUrl[] = "http://www.google.com/";
151 GURL url(kStreamUrl);
152 106
153 InitializeSpdySession(session, host_port_pair_); 107 InitializeSpdySession(session, host_port_pair_);
154 108
155 scoped_refptr<SpdyStream> stream = 109 scoped_refptr<SpdyStream> stream =
156 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 110 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
157 ASSERT_TRUE(stream.get() != NULL); 111 ASSERT_TRUE(stream.get() != NULL);
158 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); 112 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength));
159 memcpy(buf->data(), "\0hello!\xff", 8); 113 memcpy(buf->data(), kPostBody, kPostBodyLength);
160 114
161 StreamDelegateSendImmediate delegate( 115 StreamDelegateSendImmediate delegate(
162 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); 116 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get());
163 stream->SetDelegate(&delegate); 117 stream->SetDelegate(&delegate);
164 118
165 EXPECT_FALSE(stream->HasUrl()); 119 EXPECT_FALSE(stream->HasUrl());
166 120
167 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 121 stream->set_spdy_headers(
122 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
168 EXPECT_TRUE(stream->HasUrl()); 123 EXPECT_TRUE(stream->HasUrl());
169 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 124 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
170 125
171 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 126 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
172 127
173 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 128 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
174 129
175 EXPECT_TRUE(delegate.send_headers_completed()); 130 EXPECT_TRUE(delegate.send_headers_completed());
176 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 131 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
177 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 132 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
178 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate.received_data()); 133 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data());
179 EXPECT_EQ(8, delegate.data_sent()); 134 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent());
180 } 135 }
181 136
182 TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) { 137 TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) {
183 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 138 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
184 139
185 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream( 140 scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocketSynStream(
186 1, 141 1,
187 "/chat", 142 "/chat",
188 "server.example.com", 143 "server.example.com",
189 "http://example.com")); 144 "http://example.com"));
190 scoped_ptr<SpdyFrame> expected_headers(ConstructSpdyWebSocketHeadersFrame( 145 scoped_ptr<SpdyFrame> expected_headers(ConstructSpdyWebSocketHeadersFrame(
191 1, "6", true)); 146 1, "6", true));
192 scoped_ptr<SpdyFrame> expected_message = ConstructSpdyBodyFrame("hello!", 6); 147 scoped_ptr<SpdyFrame> expected_message(
148 ConstructSpdyBodyFrame(1, "hello!", 6, false));
193 MockWrite writes[] = { 149 MockWrite writes[] = {
194 CreateMockWrite(*expected_request), 150 CreateMockWrite(*expected_request),
195 CreateMockWrite(*expected_headers), 151 CreateMockWrite(*expected_headers),
196 CreateMockWrite(*expected_message) 152 CreateMockWrite(*expected_message)
197 }; 153 };
198 writes[0].sequence_number = 0; 154 writes[0].sequence_number = 0;
199 writes[1].sequence_number = 2; 155 writes[1].sequence_number = 2;
200 writes[1].sequence_number = 3; 156 writes[1].sequence_number = 3;
201 157
202 scoped_ptr<SpdyFrame> response( 158 scoped_ptr<SpdyFrame> response(
203 ConstructSpdyWebSocketSynReply(1)); 159 ConstructSpdyWebSocketSynReply(1));
204 MockRead reads[] = { 160 MockRead reads[] = {
205 CreateMockRead(*response), 161 CreateMockRead(*response),
206 MockRead(ASYNC, 0, 0), // EOF 162 MockRead(ASYNC, 0, 0), // EOF
207 }; 163 };
208 reads[0].sequence_number = 1; 164 reads[0].sequence_number = 1;
209 reads[1].sequence_number = 4; 165 reads[1].sequence_number = 4;
210 166
211 OrderedSocketData data(reads, arraysize(reads), 167 OrderedSocketData data(reads, arraysize(reads),
212 writes, arraysize(writes)); 168 writes, arraysize(writes));
213 MockConnect connect_data(SYNCHRONOUS, OK); 169 MockConnect connect_data(SYNCHRONOUS, OK);
214 data.set_connect_data(connect_data); 170 data.set_connect_data(connect_data);
215 171
216 session_deps_.socket_factory->AddSocketDataProvider(&data); 172 session_deps_.socket_factory->AddSocketDataProvider(&data);
217 173
218 scoped_refptr<SpdySession> session(CreateSpdySession()); 174 scoped_refptr<SpdySession> session(CreateSpdySession());
219 const char kStreamUrl[] = "ws://server.example.com/chat"; 175 GURL url("ws://server.example.com/chat");
220 GURL url(kStreamUrl);
221 176
222 HostPortPair host_port_pair("server.example.com", 80); 177 HostPortPair host_port_pair("server.example.com", 80);
223 InitializeSpdySession(session, host_port_pair); 178 InitializeSpdySession(session, host_port_pair);
224 179
225 scoped_refptr<SpdyStream> stream = 180 scoped_refptr<SpdyStream> stream =
226 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); 181 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog());
227 ASSERT_TRUE(stream.get() != NULL); 182 ASSERT_TRUE(stream.get() != NULL);
228 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(6)); 183 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(6));
229 memcpy(buf->data(), "hello!", 6); 184 memcpy(buf->data(), "hello!", 6);
230 TestCompletionCallback callback; 185 TestCompletionCallback callback;
(...skipping 22 matching lines...) Expand all
253 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 208 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
254 209
255 EXPECT_TRUE(delegate.send_headers_completed()); 210 EXPECT_TRUE(delegate.send_headers_completed());
256 EXPECT_EQ("101", delegate.GetResponseHeaderValue(":status")); 211 EXPECT_EQ("101", delegate.GetResponseHeaderValue(":status"));
257 EXPECT_EQ(1, delegate.headers_sent()); 212 EXPECT_EQ(1, delegate.headers_sent());
258 EXPECT_EQ(std::string(), delegate.received_data()); 213 EXPECT_EQ(std::string(), delegate.received_data());
259 EXPECT_EQ(6, delegate.data_sent()); 214 EXPECT_EQ(6, delegate.data_sent());
260 } 215 }
261 216
262 TEST_F(SpdyStreamSpdy3Test, PushedStream) { 217 TEST_F(SpdyStreamSpdy3Test, PushedStream) {
263 const char kStreamUrl[] = "http://www.google.com/";
264
265 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 218 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
266 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); 219 scoped_refptr<SpdySession> spdy_session(CreateSpdySession());
267 220
268 MockRead reads[] = { 221 MockRead reads[] = {
269 MockRead(ASYNC, 0, 0), // EOF 222 MockRead(ASYNC, 0, 0), // EOF
270 }; 223 };
271 224
272 OrderedSocketData data(reads, arraysize(reads), NULL, 0); 225 OrderedSocketData data(reads, arraysize(reads), NULL, 0);
273 MockConnect connect_data(SYNCHRONOUS, OK); 226 MockConnect connect_data(SYNCHRONOUS, OK);
274 data.set_connect_data(connect_data); 227 data.set_connect_data(connect_data);
(...skipping 25 matching lines...) Expand all
300 response[":version"] = "OK"; 253 response[":version"] = "OK";
301 stream->OnHeaders(headers); 254 stream->OnHeaders(headers);
302 255
303 stream->set_response_received(); 256 stream->set_response_received();
304 EXPECT_TRUE(stream->response_received()); 257 EXPECT_TRUE(stream->response_received());
305 EXPECT_TRUE(stream->HasUrl()); 258 EXPECT_TRUE(stream->HasUrl());
306 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 259 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
307 } 260 }
308 261
309 TEST_F(SpdyStreamSpdy3Test, StreamError) { 262 TEST_F(SpdyStreamSpdy3Test, StreamError) {
263 GURL url(kStreamUrl);
264
310 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 265 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
311 266
312 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 267 scoped_ptr<SpdyFrame> req(
313 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8); 268 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
269 scoped_ptr<SpdyFrame> msg(
270 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
314 MockWrite writes[] = { 271 MockWrite writes[] = {
315 CreateMockWrite(*req), 272 CreateMockWrite(*req),
316 CreateMockWrite(*msg), 273 CreateMockWrite(*msg),
317 }; 274 };
318 writes[0].sequence_number = 0; 275 writes[0].sequence_number = 0;
319 writes[1].sequence_number = 2; 276 writes[1].sequence_number = 2;
320 277
321 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 278 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
322 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8); 279 scoped_ptr<SpdyFrame> echo(
280 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
323 MockRead reads[] = { 281 MockRead reads[] = {
324 CreateMockRead(*resp), 282 CreateMockRead(*resp),
325 CreateMockRead(*echo), 283 CreateMockRead(*echo),
326 MockRead(ASYNC, 0, 0), // EOF 284 MockRead(ASYNC, 0, 0), // EOF
327 }; 285 };
328 reads[0].sequence_number = 1; 286 reads[0].sequence_number = 1;
329 reads[1].sequence_number = 3; 287 reads[1].sequence_number = 3;
330 reads[2].sequence_number = 4; 288 reads[2].sequence_number = 4;
331 289
332 CapturingBoundNetLog log; 290 CapturingBoundNetLog log;
333 291
334 OrderedSocketData data(reads, arraysize(reads), 292 OrderedSocketData data(reads, arraysize(reads),
335 writes, arraysize(writes)); 293 writes, arraysize(writes));
336 MockConnect connect_data(SYNCHRONOUS, OK); 294 MockConnect connect_data(SYNCHRONOUS, OK);
337 data.set_connect_data(connect_data); 295 data.set_connect_data(connect_data);
338 296
339 session_deps_.socket_factory->AddSocketDataProvider(&data); 297 session_deps_.socket_factory->AddSocketDataProvider(&data);
340 298
341 scoped_refptr<SpdySession> session(CreateSpdySession()); 299 scoped_refptr<SpdySession> session(CreateSpdySession());
342 const char kStreamUrl[] = "http://www.google.com/";
343 GURL url(kStreamUrl);
344 300
345 InitializeSpdySession(session, host_port_pair_); 301 InitializeSpdySession(session, host_port_pair_);
346 302
347 scoped_refptr<SpdyStream> stream = 303 scoped_refptr<SpdyStream> stream =
348 CreateStreamSynchronously(session, url, LOWEST, log.bound()); 304 CreateStreamSynchronously(session, url, LOWEST, log.bound());
349 ASSERT_TRUE(stream.get() != NULL); 305 ASSERT_TRUE(stream.get() != NULL);
350 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); 306 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength));
351 memcpy(buf->data(), "\0hello!\xff", 8); 307 memcpy(buf->data(), kPostBody, kPostBodyLength);
352 308
353 StreamDelegateSendImmediate delegate( 309 StreamDelegateSendImmediate delegate(
354 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); 310 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get());
355 stream->SetDelegate(&delegate); 311 stream->SetDelegate(&delegate);
356 312
357 EXPECT_FALSE(stream->HasUrl()); 313 EXPECT_FALSE(stream->HasUrl());
358 314
359 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 315 stream->set_spdy_headers(
316 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
360 EXPECT_TRUE(stream->HasUrl()); 317 EXPECT_TRUE(stream->HasUrl());
361 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 318 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
362 319
363 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 320 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
364 321
365 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 322 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
366 323
367 const SpdyStreamId stream_id = stream->stream_id(); 324 const SpdyStreamId stream_id = stream->stream_id();
368 325
369 EXPECT_TRUE(delegate.send_headers_completed()); 326 EXPECT_TRUE(delegate.send_headers_completed());
370 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 327 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
371 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 328 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
372 EXPECT_EQ(std::string("\0hello!\xff", 8), delegate.received_data()); 329 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data());
373 EXPECT_EQ(8, delegate.data_sent()); 330 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent());
374 331
375 // Check that the NetLog was filled reasonably. 332 // Check that the NetLog was filled reasonably.
376 net::CapturingNetLog::CapturedEntryList entries; 333 net::CapturingNetLog::CapturedEntryList entries;
377 log.GetEntries(&entries); 334 log.GetEntries(&entries);
378 EXPECT_LT(0u, entries.size()); 335 EXPECT_LT(0u, entries.size());
379 336
380 // Check that we logged SPDY_STREAM_ERROR correctly. 337 // Check that we logged SPDY_STREAM_ERROR correctly.
381 int pos = net::ExpectLogContainsSomewhere( 338 int pos = net::ExpectLogContainsSomewhere(
382 entries, 0, 339 entries, 0,
383 net::NetLog::TYPE_SPDY_STREAM_ERROR, 340 net::NetLog::TYPE_SPDY_STREAM_ERROR,
(...skipping 25 matching lines...) Expand all
409 366
410 CapturingBoundNetLog log; 367 CapturingBoundNetLog log;
411 368
412 OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 369 OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
413 MockConnect connect_data(SYNCHRONOUS, OK); 370 MockConnect connect_data(SYNCHRONOUS, OK);
414 data.set_connect_data(connect_data); 371 data.set_connect_data(connect_data);
415 372
416 session_deps_.socket_factory->AddSocketDataProvider(&data); 373 session_deps_.socket_factory->AddSocketDataProvider(&data);
417 374
418 scoped_refptr<SpdySession> session(CreateSpdySession()); 375 scoped_refptr<SpdySession> session(CreateSpdySession());
419 const char kStreamUrl[] = "http://www.google.com/";
420 GURL url(kStreamUrl); 376 GURL url(kStreamUrl);
421 377
422 InitializeSpdySession(session, host_port_pair_); 378 InitializeSpdySession(session, host_port_pair_);
423 379
424 scoped_refptr<SpdyStream> stream = 380 scoped_refptr<SpdyStream> stream =
425 CreateStreamSynchronously(session, url, LOWEST, log.bound()); 381 CreateStreamSynchronously(session, url, LOWEST, log.bound());
426 ASSERT_TRUE(stream.get() != NULL); 382 ASSERT_TRUE(stream.get() != NULL);
427 383
428 scoped_ptr<StreamDelegateSendImmediate> delegate( 384 scoped_ptr<StreamDelegateSendImmediate> delegate(
429 new StreamDelegateSendImmediate( 385 new StreamDelegateSendImmediate(
430 stream.get(), scoped_ptr<SpdyHeaderBlock>(), 386 stream.get(), scoped_ptr<SpdyHeaderBlock>(),
431 new IOBufferWithSize(8))); 387 new IOBufferWithSize(kPostBodyLength)));
432 stream->SetDelegate(delegate.get()); 388 stream->SetDelegate(delegate.get());
433 389
434 EXPECT_FALSE(stream->HasUrl()); 390 EXPECT_FALSE(stream->HasUrl());
435 EXPECT_EQ(0u, stream->stream_id()); 391 EXPECT_EQ(0u, stream->stream_id());
436 EXPECT_FALSE(stream->closed()); 392 EXPECT_FALSE(stream->closed());
437 393
438 int32 old_send_window_size = stream->send_window_size(); 394 int32 old_send_window_size = stream->send_window_size();
439 ASSERT_GT(old_send_window_size, 0); 395 ASSERT_GT(old_send_window_size, 0);
440 int32 delta_window_size = kint32max - old_send_window_size + 1; 396 int32 delta_window_size = kint32max - old_send_window_size + 1;
441 stream->IncreaseSendWindowSize(delta_window_size); 397 stream->IncreaseSendWindowSize(delta_window_size);
442 EXPECT_EQ(old_send_window_size, stream->send_window_size()); 398 EXPECT_EQ(old_send_window_size, stream->send_window_size());
443 399
444 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate->WaitForClose()); 400 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate->WaitForClose());
445 } 401 }
446 402
447 // Cause a stall by reducing the flow control recv window to 0. The 403 // Cause a stall by reducing the flow control send window to 0. The
448 // stream should resume when that window is then increased. 404 // stream should resume when that window is then increased.
449 TEST_F(SpdyStreamSpdy3Test, ResumeAfterRecvWindowSizeIncrease) { 405 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncrease) {
406 GURL url(kStreamUrl);
407
450 session_ = 408 session_ =
451 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); 409 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_);
452 410
453 const char kBodyData[] = "Body data"; 411 scoped_ptr<SpdyFrame> req(
454 const size_t kBodyDataSize = arraysize(kBodyData); 412 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
455 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 413 scoped_ptr<SpdyFrame> msg(
456 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize); 414 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
457 MockWrite writes[] = { 415 MockWrite writes[] = {
458 CreateMockWrite(*req, 0), 416 CreateMockWrite(*req, 0),
459 CreateMockWrite(*msg, 2), 417 CreateMockWrite(*msg, 2),
460 }; 418 };
461 419
462 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 420 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
463 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize); 421 scoped_ptr<SpdyFrame> echo(
422 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
464 MockRead reads[] = { 423 MockRead reads[] = {
465 CreateMockRead(*resp, 1), 424 CreateMockRead(*resp, 1),
466 CreateMockRead(*echo, 3), 425 CreateMockRead(*echo, 3),
467 MockRead(ASYNC, 0, 0, 4), // EOF 426 MockRead(ASYNC, 0, 0, 4), // EOF
468 }; 427 };
469 428
470 DeterministicSocketData data(reads, arraysize(reads), 429 DeterministicSocketData data(reads, arraysize(reads),
471 writes, arraysize(writes)); 430 writes, arraysize(writes));
472 MockConnect connect_data(SYNCHRONOUS, OK); 431 MockConnect connect_data(SYNCHRONOUS, OK);
473 data.set_connect_data(connect_data); 432 data.set_connect_data(connect_data);
474 433
475 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); 434 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
476 435
477 scoped_refptr<SpdySession> session(CreateSpdySession()); 436 scoped_refptr<SpdySession> session(CreateSpdySession());
478 const char kStreamUrl[] = "http://www.google.com/";
479 GURL url(kStreamUrl);
480 437
481 InitializeSpdySession(session, host_port_pair_); 438 InitializeSpdySession(session, host_port_pair_);
482 439
483 scoped_refptr<SpdyStream> stream = 440 scoped_refptr<SpdyStream> stream =
484 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 441 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
485 ASSERT_TRUE(stream.get() != NULL); 442 ASSERT_TRUE(stream.get() != NULL);
486 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); 443 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength));
487 memcpy(buf->data(), kBodyData, kBodyDataSize); 444 memcpy(buf->data(), kPostBody, kPostBodyLength);
488 445
489 StreamDelegateWithBody delegate(stream.get(), buf); 446 StreamDelegateWithBody delegate(stream.get(), buf);
490 stream->SetDelegate(&delegate); 447 stream->SetDelegate(&delegate);
491 448
492 EXPECT_FALSE(stream->HasUrl()); 449 EXPECT_FALSE(stream->HasUrl());
493 450
494 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 451 stream->set_spdy_headers(
452 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
495 EXPECT_TRUE(stream->HasUrl()); 453 EXPECT_TRUE(stream->HasUrl());
496 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 454 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
497 455
498 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 456 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
499 457
500 data.RunFor(2); 458 data.RunFor(2);
501 459
502 EXPECT_FALSE(stream->stalled_by_flow_control()); 460 EXPECT_FALSE(stream->stalled_by_flow_control());
503 461
504 // Reduce the send window size to 0 to stall. 462 // Reduce the send window size to 0 to stall.
505 while (stream->send_window_size() > 0) { 463 while (stream->send_window_size() > 0) {
506 stream->DecreaseSendWindowSize( 464 stream->DecreaseSendWindowSize(
507 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); 465 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size()));
508 } 466 }
509 467
510 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); 468 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE);
511 469
512 EXPECT_TRUE(stream->stalled_by_flow_control()); 470 EXPECT_TRUE(stream->stalled_by_flow_control());
513 471
514 stream->IncreaseSendWindowSize(kBodyDataSize); 472 stream->IncreaseSendWindowSize(kPostBodyLength);
515 473
516 EXPECT_FALSE(stream->stalled_by_flow_control()); 474 EXPECT_FALSE(stream->stalled_by_flow_control());
517 475
518 data.RunFor(3); 476 data.RunFor(3);
519 477
520 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 478 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
521 479
522 EXPECT_TRUE(delegate.send_headers_completed()); 480 EXPECT_TRUE(delegate.send_headers_completed());
523 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 481 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
524 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 482 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
525 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); 483 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data());
526 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); 484 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.body_data_sent());
527 } 485 }
528 486
529 // Cause a stall by reducing the flow control recv window to 0. The 487 // Cause a stall by reducing the flow control send window to 0. The
530 // stream should resume when that window is then adjusted positively. 488 // stream should resume when that window is then adjusted positively.
531 TEST_F(SpdyStreamSpdy3Test, ResumeAfterRecvWindowSizeAdjust) { 489 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjust) {
490 GURL url(kStreamUrl);
491
532 session_ = 492 session_ =
533 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); 493 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_);
534 494
535 const char kBodyData[] = "Body data"; 495 scoped_ptr<SpdyFrame> req(
536 const size_t kBodyDataSize = arraysize(kBodyData); 496 ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
537 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest();
538 scoped_ptr<SpdyFrame> msg( 497 scoped_ptr<SpdyFrame> msg(
539 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize)); 498 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
540 MockWrite writes[] = { 499 MockWrite writes[] = {
541 CreateMockWrite(*req, 0), 500 CreateMockWrite(*req, 0),
542 CreateMockWrite(*msg, 2), 501 CreateMockWrite(*msg, 2),
543 }; 502 };
544 503
545 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 504 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
546 scoped_ptr<SpdyFrame> echo( 505 scoped_ptr<SpdyFrame> echo(
547 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize)); 506 ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false));
548 MockRead reads[] = { 507 MockRead reads[] = {
549 CreateMockRead(*resp, 1), 508 CreateMockRead(*resp, 1),
550 CreateMockRead(*echo, 3), 509 CreateMockRead(*echo, 3),
551 MockRead(ASYNC, 0, 0, 4), // EOF 510 MockRead(ASYNC, 0, 0, 4), // EOF
552 }; 511 };
553 512
554 DeterministicSocketData data(reads, arraysize(reads), 513 DeterministicSocketData data(reads, arraysize(reads),
555 writes, arraysize(writes)); 514 writes, arraysize(writes));
556 MockConnect connect_data(SYNCHRONOUS, OK); 515 MockConnect connect_data(SYNCHRONOUS, OK);
557 data.set_connect_data(connect_data); 516 data.set_connect_data(connect_data);
558 517
559 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); 518 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
560 519
561 scoped_refptr<SpdySession> session(CreateSpdySession()); 520 scoped_refptr<SpdySession> session(CreateSpdySession());
562 const char kStreamUrl[] = "http://www.google.com/";
563 GURL url(kStreamUrl);
564 521
565 InitializeSpdySession(session, host_port_pair_); 522 InitializeSpdySession(session, host_port_pair_);
566 523
567 scoped_refptr<SpdyStream> stream = 524 scoped_refptr<SpdyStream> stream =
568 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 525 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
569 ASSERT_TRUE(stream.get() != NULL); 526 ASSERT_TRUE(stream.get() != NULL);
570 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); 527 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kPostBodyLength));
571 memcpy(buf->data(), kBodyData, kBodyDataSize); 528 memcpy(buf->data(), kPostBody, kPostBodyLength);
572 529
573 StreamDelegateWithBody delegate(stream.get(), buf); 530 StreamDelegateWithBody delegate(stream.get(), buf);
574 stream->SetDelegate(&delegate); 531 stream->SetDelegate(&delegate);
575 532
576 EXPECT_FALSE(stream->HasUrl()); 533 EXPECT_FALSE(stream->HasUrl());
577 534
578 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 535 stream->set_spdy_headers(
536 ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
579 EXPECT_TRUE(stream->HasUrl()); 537 EXPECT_TRUE(stream->HasUrl());
580 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 538 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
581 539
582 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 540 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
583 541
584 data.RunFor(2); 542 data.RunFor(2);
585 543
586 EXPECT_FALSE(stream->stalled_by_flow_control()); 544 EXPECT_FALSE(stream->stalled_by_flow_control());
587 545
588 // Reduce the send window size to 0 to stall. 546 // Reduce the send window size to 0 to stall.
589 while (stream->send_window_size() > 0) { 547 while (stream->send_window_size() > 0) {
590 stream->DecreaseSendWindowSize( 548 stream->DecreaseSendWindowSize(
591 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); 549 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size()));
592 } 550 }
593 551
594 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); 552 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE);
595 553
596 EXPECT_TRUE(stream->stalled_by_flow_control()); 554 EXPECT_TRUE(stream->stalled_by_flow_control());
597 555
598 stream->AdjustSendWindowSize(-static_cast<int>(kBodyDataSize)); 556 stream->AdjustSendWindowSize(-static_cast<int>(kPostBodyLength));
599 557
600 EXPECT_TRUE(stream->stalled_by_flow_control()); 558 EXPECT_TRUE(stream->stalled_by_flow_control());
601 559
602 stream->AdjustSendWindowSize(kBodyDataSize); 560 stream->AdjustSendWindowSize(kPostBodyLength);
603 561
604 EXPECT_TRUE(stream->stalled_by_flow_control()); 562 EXPECT_TRUE(stream->stalled_by_flow_control());
605 563
606 stream->AdjustSendWindowSize(kBodyDataSize); 564 stream->AdjustSendWindowSize(kPostBodyLength);
607 565
608 EXPECT_FALSE(stream->stalled_by_flow_control()); 566 EXPECT_FALSE(stream->stalled_by_flow_control());
609 567
610 data.RunFor(3); 568 data.RunFor(3);
611 569
612 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 570 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
613 571
614 EXPECT_TRUE(delegate.send_headers_completed()); 572 EXPECT_TRUE(delegate.send_headers_completed());
615 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 573 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
616 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 574 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
617 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); 575 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), delegate.received_data());
618 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); 576 EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.body_data_sent());
619 } 577 }
620 578
621 } // namespace 579 } // namespace
622 580
623 } // namespace test 581 } // namespace test
624 582
625 } // namespace net 583 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_stream_spdy2_unittest.cc ('k') | net/spdy/spdy_test_util_spdy2.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698