| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |