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