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

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: 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
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 24 matching lines...) Expand all
35 ConvertRequestPriorityToSpdyPriority(LOWEST, 3), 35 ConvertRequestPriorityToSpdyPriority(LOWEST, 3),
36 0, 36 0,
37 CONTROL_FLAG_NONE, 37 CONTROL_FLAG_NONE,
38 false, 38 false,
39 RST_STREAM_INVALID, 39 RST_STREAM_INVALID,
40 NULL, 40 NULL,
41 0, 41 0,
42 DATA_FLAG_NONE 42 DATA_FLAG_NONE
43 }; 43 };
44 44
45 const char* const kGetHeaders[] = { 45 // TODO(akalin): Merge with ConstructSpdyGet(). (The sticking point is
46 ":method", 46 // CONTROL_FLAG_NONE vs. CONTROL_FLAG_FIN.)
47 "GET", 47 scoped_ptr<SpdyFrame> ConstructSpdyGetRequest(const char* url) {
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>( 48 return scoped_ptr<SpdyFrame>(
65 ConstructSpdyPacket( 49 ConstructSpdyPacket(kSynStartHeader, ConstructHeaderBlock(url)));
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 } 50 }
76 51
77 scoped_ptr<SpdyFrame> ConstructSpdyBodyFrame(const char* data, int length) { 52 scoped_ptr<SpdyFrame> ConstructSpdyBodyFrame(const char* data, int length) {
78 BufferedSpdyFramer framer(kSpdyVersion3, false); 53 BufferedSpdyFramer framer(kSpdyVersion3, false);
79 return scoped_ptr<SpdyFrame>( 54 return scoped_ptr<SpdyFrame>(
80 framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE)); 55 framer.CreateDataFrame(1, data, length, DATA_FLAG_NONE));
81 } 56 }
82 57
83 class SpdyStreamSpdy3Test : public testing::Test { 58 class SpdyStreamSpdy3Test : public testing::Test {
84 protected: 59 protected:
(...skipping 25 matching lines...) Expand all
110 virtual void TearDown() { 85 virtual void TearDown() {
111 MessageLoop::current()->RunUntilIdle(); 86 MessageLoop::current()->RunUntilIdle();
112 } 87 }
113 88
114 HostPortPair host_port_pair_; 89 HostPortPair host_port_pair_;
115 SpdySessionDependencies session_deps_; 90 SpdySessionDependencies session_deps_;
116 scoped_refptr<HttpNetworkSession> session_; 91 scoped_refptr<HttpNetworkSession> session_;
117 }; 92 };
118 93
119 TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) { 94 TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) {
95 const char kStreamUrl[] = "http://www.google.com/";
96 GURL url(kStreamUrl);
120 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 97 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
121 98
122 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 99 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(kStreamUrl);
123 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8); 100 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8);
124 MockWrite writes[] = { 101 MockWrite writes[] = {
125 CreateMockWrite(*req), 102 CreateMockWrite(*req),
126 CreateMockWrite(*msg), 103 CreateMockWrite(*msg),
127 }; 104 };
128 writes[0].sequence_number = 0; 105 writes[0].sequence_number = 0;
129 writes[1].sequence_number = 2; 106 writes[1].sequence_number = 2;
130 107
131 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 108 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
132 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8); 109 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8);
133 MockRead reads[] = { 110 MockRead reads[] = {
134 CreateMockRead(*resp), 111 CreateMockRead(*resp),
135 CreateMockRead(*echo), 112 CreateMockRead(*echo),
136 MockRead(ASYNC, 0, 0), // EOF 113 MockRead(ASYNC, 0, 0), // EOF
137 }; 114 };
138 reads[0].sequence_number = 1; 115 reads[0].sequence_number = 1;
139 reads[1].sequence_number = 3; 116 reads[1].sequence_number = 3;
140 reads[2].sequence_number = 4; 117 reads[2].sequence_number = 4;
141 118
142 OrderedSocketData data(reads, arraysize(reads), 119 OrderedSocketData data(reads, arraysize(reads),
143 writes, arraysize(writes)); 120 writes, arraysize(writes));
144 MockConnect connect_data(SYNCHRONOUS, OK); 121 MockConnect connect_data(SYNCHRONOUS, OK);
145 data.set_connect_data(connect_data); 122 data.set_connect_data(connect_data);
146 123
147 session_deps_.socket_factory->AddSocketDataProvider(&data); 124 session_deps_.socket_factory->AddSocketDataProvider(&data);
148 125
149 scoped_refptr<SpdySession> session(CreateSpdySession()); 126 scoped_refptr<SpdySession> session(CreateSpdySession());
150 const char kStreamUrl[] = "http://www.google.com/";
151 GURL url(kStreamUrl);
152 127
153 InitializeSpdySession(session, host_port_pair_); 128 InitializeSpdySession(session, host_port_pair_);
154 129
155 scoped_refptr<SpdyStream> stream = 130 scoped_refptr<SpdyStream> stream =
156 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 131 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
157 ASSERT_TRUE(stream.get() != NULL); 132 ASSERT_TRUE(stream.get() != NULL);
158 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); 133 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8));
159 memcpy(buf->data(), "\0hello!\xff", 8); 134 memcpy(buf->data(), "\0hello!\xff", 8);
160 135
161 StreamDelegateSendImmediate delegate( 136 StreamDelegateSendImmediate delegate(
162 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); 137 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get());
163 stream->SetDelegate(&delegate); 138 stream->SetDelegate(&delegate);
164 139
165 EXPECT_FALSE(stream->HasUrl()); 140 EXPECT_FALSE(stream->HasUrl());
166 141
167 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 142 stream->set_spdy_headers(ConstructHeaderBlock(kStreamUrl));
168 EXPECT_TRUE(stream->HasUrl()); 143 EXPECT_TRUE(stream->HasUrl());
169 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 144 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
170 145
171 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 146 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
172 147
173 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 148 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
174 149
175 EXPECT_TRUE(delegate.send_headers_completed()); 150 EXPECT_TRUE(delegate.send_headers_completed());
176 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 151 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
177 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 152 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 response[":version"] = "OK"; 275 response[":version"] = "OK";
301 stream->OnHeaders(headers); 276 stream->OnHeaders(headers);
302 277
303 stream->set_response_received(); 278 stream->set_response_received();
304 EXPECT_TRUE(stream->response_received()); 279 EXPECT_TRUE(stream->response_received());
305 EXPECT_TRUE(stream->HasUrl()); 280 EXPECT_TRUE(stream->HasUrl());
306 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 281 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
307 } 282 }
308 283
309 TEST_F(SpdyStreamSpdy3Test, StreamError) { 284 TEST_F(SpdyStreamSpdy3Test, StreamError) {
285 const char kStreamUrl[] = "http://www.google.com/";
286 GURL url(kStreamUrl);
287
310 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 288 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
311 289
312 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 290 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(kStreamUrl);
313 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8); 291 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame("\0hello!\xff", 8);
314 MockWrite writes[] = { 292 MockWrite writes[] = {
315 CreateMockWrite(*req), 293 CreateMockWrite(*req),
316 CreateMockWrite(*msg), 294 CreateMockWrite(*msg),
317 }; 295 };
318 writes[0].sequence_number = 0; 296 writes[0].sequence_number = 0;
319 writes[1].sequence_number = 2; 297 writes[1].sequence_number = 2;
320 298
321 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 299 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
322 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8); 300 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame("\0hello!\xff", 8);
323 MockRead reads[] = { 301 MockRead reads[] = {
324 CreateMockRead(*resp), 302 CreateMockRead(*resp),
325 CreateMockRead(*echo), 303 CreateMockRead(*echo),
326 MockRead(ASYNC, 0, 0), // EOF 304 MockRead(ASYNC, 0, 0), // EOF
327 }; 305 };
328 reads[0].sequence_number = 1; 306 reads[0].sequence_number = 1;
329 reads[1].sequence_number = 3; 307 reads[1].sequence_number = 3;
330 reads[2].sequence_number = 4; 308 reads[2].sequence_number = 4;
331 309
332 CapturingBoundNetLog log; 310 CapturingBoundNetLog log;
333 311
334 OrderedSocketData data(reads, arraysize(reads), 312 OrderedSocketData data(reads, arraysize(reads),
335 writes, arraysize(writes)); 313 writes, arraysize(writes));
336 MockConnect connect_data(SYNCHRONOUS, OK); 314 MockConnect connect_data(SYNCHRONOUS, OK);
337 data.set_connect_data(connect_data); 315 data.set_connect_data(connect_data);
338 316
339 session_deps_.socket_factory->AddSocketDataProvider(&data); 317 session_deps_.socket_factory->AddSocketDataProvider(&data);
340 318
341 scoped_refptr<SpdySession> session(CreateSpdySession()); 319 scoped_refptr<SpdySession> session(CreateSpdySession());
342 const char kStreamUrl[] = "http://www.google.com/";
343 GURL url(kStreamUrl);
344 320
345 InitializeSpdySession(session, host_port_pair_); 321 InitializeSpdySession(session, host_port_pair_);
346 322
347 scoped_refptr<SpdyStream> stream = 323 scoped_refptr<SpdyStream> stream =
348 CreateStreamSynchronously(session, url, LOWEST, log.bound()); 324 CreateStreamSynchronously(session, url, LOWEST, log.bound());
349 ASSERT_TRUE(stream.get() != NULL); 325 ASSERT_TRUE(stream.get() != NULL);
350 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); 326 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8));
351 memcpy(buf->data(), "\0hello!\xff", 8); 327 memcpy(buf->data(), "\0hello!\xff", 8);
352 328
353 StreamDelegateSendImmediate delegate( 329 StreamDelegateSendImmediate delegate(
354 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); 330 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get());
355 stream->SetDelegate(&delegate); 331 stream->SetDelegate(&delegate);
356 332
357 EXPECT_FALSE(stream->HasUrl()); 333 EXPECT_FALSE(stream->HasUrl());
358 334
359 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 335 stream->set_spdy_headers(ConstructHeaderBlock(kStreamUrl));
360 EXPECT_TRUE(stream->HasUrl()); 336 EXPECT_TRUE(stream->HasUrl());
361 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 337 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
362 338
363 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 339 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
364 340
365 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 341 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
366 342
367 const SpdyStreamId stream_id = stream->stream_id(); 343 const SpdyStreamId stream_id = stream->stream_id();
368 344
369 EXPECT_TRUE(delegate.send_headers_completed()); 345 EXPECT_TRUE(delegate.send_headers_completed());
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 413
438 int32 old_send_window_size = stream->send_window_size(); 414 int32 old_send_window_size = stream->send_window_size();
439 ASSERT_GT(old_send_window_size, 0); 415 ASSERT_GT(old_send_window_size, 0);
440 int32 delta_window_size = kint32max - old_send_window_size + 1; 416 int32 delta_window_size = kint32max - old_send_window_size + 1;
441 stream->IncreaseSendWindowSize(delta_window_size); 417 stream->IncreaseSendWindowSize(delta_window_size);
442 EXPECT_EQ(old_send_window_size, stream->send_window_size()); 418 EXPECT_EQ(old_send_window_size, stream->send_window_size());
443 419
444 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate->WaitForClose()); 420 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate->WaitForClose());
445 } 421 }
446 422
447 // Cause a stall by reducing the flow control recv window to 0. The 423 // Cause a stall by reducing the flow control send window to 0. The
448 // stream should resume when that window is then increased. 424 // stream should resume when that window is then increased.
449 TEST_F(SpdyStreamSpdy3Test, ResumeAfterRecvWindowSizeIncrease) { 425 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncrease) {
426 const char kStreamUrl[] = "http://www.google.com/";
427 GURL url(kStreamUrl);
428
450 session_ = 429 session_ =
451 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); 430 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_);
452 431
453 const char kBodyData[] = "Body data"; 432 const char kBodyData[] = "Body data";
454 const size_t kBodyDataSize = arraysize(kBodyData); 433 const size_t kBodyDataSize = arraysize(kBodyData);
455 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 434 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(kStreamUrl);
456 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize); 435 scoped_ptr<SpdyFrame> msg = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize);
457 MockWrite writes[] = { 436 MockWrite writes[] = {
458 CreateMockWrite(*req, 0), 437 CreateMockWrite(*req, 0),
459 CreateMockWrite(*msg, 2), 438 CreateMockWrite(*msg, 2),
460 }; 439 };
461 440
462 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 441 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
463 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize); 442 scoped_ptr<SpdyFrame> echo = ConstructSpdyBodyFrame(kBodyData, kBodyDataSize);
464 MockRead reads[] = { 443 MockRead reads[] = {
465 CreateMockRead(*resp, 1), 444 CreateMockRead(*resp, 1),
466 CreateMockRead(*echo, 3), 445 CreateMockRead(*echo, 3),
467 MockRead(ASYNC, 0, 0, 4), // EOF 446 MockRead(ASYNC, 0, 0, 4), // EOF
468 }; 447 };
469 448
470 DeterministicSocketData data(reads, arraysize(reads), 449 DeterministicSocketData data(reads, arraysize(reads),
471 writes, arraysize(writes)); 450 writes, arraysize(writes));
472 MockConnect connect_data(SYNCHRONOUS, OK); 451 MockConnect connect_data(SYNCHRONOUS, OK);
473 data.set_connect_data(connect_data); 452 data.set_connect_data(connect_data);
474 453
475 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); 454 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
476 455
477 scoped_refptr<SpdySession> session(CreateSpdySession()); 456 scoped_refptr<SpdySession> session(CreateSpdySession());
478 const char kStreamUrl[] = "http://www.google.com/";
479 GURL url(kStreamUrl);
480 457
481 InitializeSpdySession(session, host_port_pair_); 458 InitializeSpdySession(session, host_port_pair_);
482 459
483 scoped_refptr<SpdyStream> stream = 460 scoped_refptr<SpdyStream> stream =
484 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 461 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
485 ASSERT_TRUE(stream.get() != NULL); 462 ASSERT_TRUE(stream.get() != NULL);
486 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); 463 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize));
487 memcpy(buf->data(), kBodyData, kBodyDataSize); 464 memcpy(buf->data(), kBodyData, kBodyDataSize);
488 465
489 StreamDelegateWithBody delegate(stream.get(), buf); 466 StreamDelegateWithBody delegate(stream.get(), buf);
490 stream->SetDelegate(&delegate); 467 stream->SetDelegate(&delegate);
491 468
492 EXPECT_FALSE(stream->HasUrl()); 469 EXPECT_FALSE(stream->HasUrl());
493 470
494 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 471 stream->set_spdy_headers(ConstructHeaderBlock(kStreamUrl));
495 EXPECT_TRUE(stream->HasUrl()); 472 EXPECT_TRUE(stream->HasUrl());
496 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 473 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
497 474
498 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 475 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
499 476
500 data.RunFor(2); 477 data.RunFor(2);
501 478
502 EXPECT_FALSE(stream->stalled_by_flow_control()); 479 EXPECT_FALSE(stream->stalled_by_flow_control());
503 480
504 // Reduce the send window size to 0 to stall. 481 // Reduce the send window size to 0 to stall.
(...skipping 14 matching lines...) Expand all
519 496
520 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); 497 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
521 498
522 EXPECT_TRUE(delegate.send_headers_completed()); 499 EXPECT_TRUE(delegate.send_headers_completed());
523 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); 500 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
524 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 501 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
525 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); 502 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data());
526 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); 503 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent());
527 } 504 }
528 505
529 // Cause a stall by reducing the flow control recv window to 0. The 506 // Cause a stall by reducing the flow control send window to 0. The
530 // stream should resume when that window is then adjusted positively. 507 // stream should resume when that window is then adjusted positively.
531 TEST_F(SpdyStreamSpdy3Test, ResumeAfterRecvWindowSizeAdjust) { 508 TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjust) {
509 const char kStreamUrl[] = "http://www.google.com/";
510 GURL url(kStreamUrl);
511
532 session_ = 512 session_ =
533 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); 513 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_);
534 514
535 const char kBodyData[] = "Body data"; 515 const char kBodyData[] = "Body data";
536 const size_t kBodyDataSize = arraysize(kBodyData); 516 const size_t kBodyDataSize = arraysize(kBodyData);
537 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(); 517 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(kStreamUrl);
538 scoped_ptr<SpdyFrame> msg( 518 scoped_ptr<SpdyFrame> msg(
539 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize)); 519 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize));
540 MockWrite writes[] = { 520 MockWrite writes[] = {
541 CreateMockWrite(*req, 0), 521 CreateMockWrite(*req, 0),
542 CreateMockWrite(*msg, 2), 522 CreateMockWrite(*msg, 2),
543 }; 523 };
544 524
545 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 525 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
546 scoped_ptr<SpdyFrame> echo( 526 scoped_ptr<SpdyFrame> echo(
547 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize)); 527 ConstructSpdyBodyFrame(kBodyData, kBodyDataSize));
548 MockRead reads[] = { 528 MockRead reads[] = {
549 CreateMockRead(*resp, 1), 529 CreateMockRead(*resp, 1),
550 CreateMockRead(*echo, 3), 530 CreateMockRead(*echo, 3),
551 MockRead(ASYNC, 0, 0, 4), // EOF 531 MockRead(ASYNC, 0, 0, 4), // EOF
552 }; 532 };
553 533
554 DeterministicSocketData data(reads, arraysize(reads), 534 DeterministicSocketData data(reads, arraysize(reads),
555 writes, arraysize(writes)); 535 writes, arraysize(writes));
556 MockConnect connect_data(SYNCHRONOUS, OK); 536 MockConnect connect_data(SYNCHRONOUS, OK);
557 data.set_connect_data(connect_data); 537 data.set_connect_data(connect_data);
558 538
559 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); 539 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
560 540
561 scoped_refptr<SpdySession> session(CreateSpdySession()); 541 scoped_refptr<SpdySession> session(CreateSpdySession());
562 const char kStreamUrl[] = "http://www.google.com/";
563 GURL url(kStreamUrl);
564 542
565 InitializeSpdySession(session, host_port_pair_); 543 InitializeSpdySession(session, host_port_pair_);
566 544
567 scoped_refptr<SpdyStream> stream = 545 scoped_refptr<SpdyStream> stream =
568 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); 546 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
569 ASSERT_TRUE(stream.get() != NULL); 547 ASSERT_TRUE(stream.get() != NULL);
570 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); 548 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize));
571 memcpy(buf->data(), kBodyData, kBodyDataSize); 549 memcpy(buf->data(), kBodyData, kBodyDataSize);
572 550
573 StreamDelegateWithBody delegate(stream.get(), buf); 551 StreamDelegateWithBody delegate(stream.get(), buf);
574 stream->SetDelegate(&delegate); 552 stream->SetDelegate(&delegate);
575 553
576 EXPECT_FALSE(stream->HasUrl()); 554 EXPECT_FALSE(stream->HasUrl());
577 555
578 stream->set_spdy_headers(ConstructSpdyGetHeaderBlock()); 556 stream->set_spdy_headers(ConstructHeaderBlock(kStreamUrl));
579 EXPECT_TRUE(stream->HasUrl()); 557 EXPECT_TRUE(stream->HasUrl());
580 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); 558 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
581 559
582 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); 560 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
583 561
584 data.RunFor(2); 562 data.RunFor(2);
585 563
586 EXPECT_FALSE(stream->stalled_by_flow_control()); 564 EXPECT_FALSE(stream->stalled_by_flow_control());
587 565
588 // Reduce the send window size to 0 to stall. 566 // Reduce the send window size to 0 to stall.
(...skipping 27 matching lines...) Expand all
616 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); 594 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
617 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); 595 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data());
618 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); 596 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent());
619 } 597 }
620 598
621 } // namespace 599 } // namespace
622 600
623 } // namespace test 601 } // namespace test
624 602
625 } // namespace net 603 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698