| 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 10 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |