| 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 "net/spdy/spdy_proxy_client_socket.h" | 5 #include "net/spdy/spdy_proxy_client_socket.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 | 62 |
| 63 class SpdyProxyClientSocketTest | 63 class SpdyProxyClientSocketTest |
| 64 : public PlatformTest, | 64 : public PlatformTest, |
| 65 public testing::WithParamInterface<NextProto> { | 65 public testing::WithParamInterface<NextProto> { |
| 66 public: | 66 public: |
| 67 SpdyProxyClientSocketTest(); | 67 SpdyProxyClientSocketTest(); |
| 68 | 68 |
| 69 virtual void TearDown(); | 69 virtual void TearDown(); |
| 70 | 70 |
| 71 protected: | 71 protected: |
| 72 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, | 72 void Initialize(MockRead* reads, |
| 73 size_t reads_count, |
| 74 MockWrite* writes, |
| 73 size_t writes_count); | 75 size_t writes_count); |
| 74 void PopulateConnectRequestIR(SpdySynStreamIR* syn_ir); | 76 void PopulateConnectRequestIR(SpdySynStreamIR* syn_ir); |
| 75 void PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, const char* status); | 77 void PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, const char* status); |
| 76 SpdyFrame* ConstructConnectRequestFrame(); | 78 SpdyFrame* ConstructConnectRequestFrame(); |
| 77 SpdyFrame* ConstructConnectAuthRequestFrame(); | 79 SpdyFrame* ConstructConnectAuthRequestFrame(); |
| 78 SpdyFrame* ConstructConnectReplyFrame(); | 80 SpdyFrame* ConstructConnectReplyFrame(); |
| 79 SpdyFrame* ConstructConnectAuthReplyFrame(); | 81 SpdyFrame* ConstructConnectAuthReplyFrame(); |
| 80 SpdyFrame* ConstructConnectRedirectReplyFrame(); | 82 SpdyFrame* ConstructConnectRedirectReplyFrame(); |
| 81 SpdyFrame* ConstructConnectErrorReplyFrame(); | 83 SpdyFrame* ConstructConnectErrorReplyFrame(); |
| 82 SpdyFrame* ConstructBodyFrame(const char* data, int length); | 84 SpdyFrame* ConstructBodyFrame(const char* data, int length); |
| 83 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); | 85 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
| 84 void AssertConnectSucceeds(); | 86 void AssertConnectSucceeds(); |
| 85 void AssertConnectFails(int result); | 87 void AssertConnectFails(int result); |
| 86 void AssertConnectionEstablished(); | 88 void AssertConnectionEstablished(); |
| 87 void AssertSyncReadEquals(const char* data, int len); | 89 void AssertSyncReadEquals(const char* data, int len); |
| 88 void AssertAsyncReadEquals(const char* data, int len); | 90 void AssertAsyncReadEquals(const char* data, int len); |
| 89 void AssertReadStarts(const char* data, int len); | 91 void AssertReadStarts(const char* data, int len); |
| 90 void AssertReadReturns(const char* data, int len); | 92 void AssertReadReturns(const char* data, int len); |
| 91 void AssertAsyncWriteSucceeds(const char* data, int len); | 93 void AssertAsyncWriteSucceeds(const char* data, int len); |
| 92 void AssertWriteReturns(const char* data, int len, int rv); | 94 void AssertWriteReturns(const char* data, int len, int rv); |
| 93 void AssertWriteLength(int len); | 95 void AssertWriteLength(int len); |
| 94 void AssertAsyncWriteWithReadsSucceeds(const char* data, int len, | 96 void AssertAsyncWriteWithReadsSucceeds(const char* data, |
| 95 int num_reads); | 97 int len, |
| 98 int num_reads); |
| 96 | 99 |
| 97 void AddAuthToCache() { | 100 void AddAuthToCache() { |
| 98 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 101 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
| 99 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 102 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
| 100 session_->http_auth_cache()->Add(GURL(kProxyUrl), | 103 session_->http_auth_cache()->Add(GURL(kProxyUrl), |
| 101 "MyRealm1", | 104 "MyRealm1", |
| 102 HttpAuth::AUTH_SCHEME_BASIC, | 105 HttpAuth::AUTH_SCHEME_BASIC, |
| 103 "Basic realm=MyRealm1", | 106 "Basic realm=MyRealm1", |
| 104 AuthCredentials(kFoo, kBar), | 107 AuthCredentials(kFoo, kBar), |
| 105 "/"); | 108 "/"); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 132 std::string user_agent_; | 135 std::string user_agent_; |
| 133 GURL url_; | 136 GURL url_; |
| 134 HostPortPair proxy_host_port_; | 137 HostPortPair proxy_host_port_; |
| 135 HostPortPair endpoint_host_port_pair_; | 138 HostPortPair endpoint_host_port_pair_; |
| 136 ProxyServer proxy_; | 139 ProxyServer proxy_; |
| 137 SpdySessionKey endpoint_spdy_session_key_; | 140 SpdySessionKey endpoint_spdy_session_key_; |
| 138 | 141 |
| 139 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); | 142 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); |
| 140 }; | 143 }; |
| 141 | 144 |
| 142 INSTANTIATE_TEST_CASE_P( | 145 INSTANTIATE_TEST_CASE_P(NextProto, |
| 143 NextProto, | 146 SpdyProxyClientSocketTest, |
| 144 SpdyProxyClientSocketTest, | 147 testing::Values(kProtoDeprecatedSPDY2, |
| 145 testing::Values(kProtoDeprecatedSPDY2, | 148 kProtoSPDY3, |
| 146 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); | 149 kProtoSPDY31, |
| 150 kProtoSPDY4)); |
| 147 | 151 |
| 148 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() | 152 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() |
| 149 : spdy_util_(GetParam()), | 153 : spdy_util_(GetParam()), |
| 150 session_(NULL), | 154 session_(NULL), |
| 151 read_buf_(NULL), | 155 read_buf_(NULL), |
| 152 session_deps_(GetParam()), | 156 session_deps_(GetParam()), |
| 153 connect_data_(SYNCHRONOUS, OK), | 157 connect_data_(SYNCHRONOUS, OK), |
| 154 framer_(spdy_util_.spdy_version(), false), | 158 framer_(spdy_util_.spdy_version(), false), |
| 155 user_agent_(kUserAgent), | 159 user_agent_(kUserAgent), |
| 156 url_(kRequestUrl), | 160 url_(kRequestUrl), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 167 sock_.reset(NULL); | 171 sock_.reset(NULL); |
| 168 if (session_.get() != NULL) | 172 if (session_.get() != NULL) |
| 169 session_->spdy_session_pool()->CloseAllSessions(); | 173 session_->spdy_session_pool()->CloseAllSessions(); |
| 170 | 174 |
| 171 // Empty the current queue. | 175 // Empty the current queue. |
| 172 base::MessageLoop::current()->RunUntilIdle(); | 176 base::MessageLoop::current()->RunUntilIdle(); |
| 173 PlatformTest::TearDown(); | 177 PlatformTest::TearDown(); |
| 174 } | 178 } |
| 175 | 179 |
| 176 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, | 180 void SpdyProxyClientSocketTest::Initialize(MockRead* reads, |
| 177 size_t reads_count, | 181 size_t reads_count, |
| 178 MockWrite* writes, | 182 MockWrite* writes, |
| 179 size_t writes_count) { | 183 size_t writes_count) { |
| 180 data_.reset(new DeterministicSocketData(reads, reads_count, | 184 data_.reset( |
| 181 writes, writes_count)); | 185 new DeterministicSocketData(reads, reads_count, writes, writes_count)); |
| 182 data_->set_connect_data(connect_data_); | 186 data_->set_connect_data(connect_data_); |
| 183 data_->SetStop(2); | 187 data_->SetStop(2); |
| 184 | 188 |
| 185 session_deps_.deterministic_socket_factory->AddSocketDataProvider( | 189 session_deps_.deterministic_socket_factory->AddSocketDataProvider( |
| 186 data_.get()); | 190 data_.get()); |
| 187 session_deps_.host_resolver->set_synchronous_mode(true); | 191 session_deps_.host_resolver->set_synchronous_mode(true); |
| 188 | 192 |
| 189 session_ = SpdySessionDependencies::SpdyCreateSessionDeterministic( | 193 session_ = |
| 190 &session_deps_); | 194 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 191 | 195 |
| 192 // Creates the SPDY session and stream. | 196 // Creates the SPDY session and stream. |
| 193 spdy_session_ = | 197 spdy_session_ = CreateInsecureSpdySession( |
| 194 CreateInsecureSpdySession( | 198 session_, endpoint_spdy_session_key_, BoundNetLog()); |
| 195 session_, endpoint_spdy_session_key_, BoundNetLog()); | |
| 196 base::WeakPtr<SpdyStream> spdy_stream( | 199 base::WeakPtr<SpdyStream> spdy_stream( |
| 197 CreateStreamSynchronously( | 200 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
| 198 SPDY_BIDIRECTIONAL_STREAM, spdy_session_, url_, LOWEST, | 201 spdy_session_, |
| 199 net_log_.bound())); | 202 url_, |
| 203 LOWEST, |
| 204 net_log_.bound())); |
| 200 ASSERT_TRUE(spdy_stream.get() != NULL); | 205 ASSERT_TRUE(spdy_stream.get() != NULL); |
| 201 | 206 |
| 202 // Create the SpdyProxyClientSocket. | 207 // Create the SpdyProxyClientSocket. |
| 203 sock_.reset( | 208 sock_.reset(new SpdyProxyClientSocket(spdy_stream, |
| 204 new SpdyProxyClientSocket(spdy_stream, user_agent_, | 209 user_agent_, |
| 205 endpoint_host_port_pair_, url_, | 210 endpoint_host_port_pair_, |
| 206 proxy_host_port_, net_log_.bound(), | 211 url_, |
| 207 session_->http_auth_cache(), | 212 proxy_host_port_, |
| 208 session_->http_auth_handler_factory())); | 213 net_log_.bound(), |
| 214 session_->http_auth_cache(), |
| 215 session_->http_auth_handler_factory())); |
| 209 } | 216 } |
| 210 | 217 |
| 211 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( | 218 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( |
| 212 const char* data, int size) { | 219 const char* data, |
| 220 int size) { |
| 213 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); | 221 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); |
| 214 memcpy(buf->data(), data, size); | 222 memcpy(buf->data(), data, size); |
| 215 return buf; | 223 return buf; |
| 216 } | 224 } |
| 217 | 225 |
| 218 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { | 226 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { |
| 219 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); | 227 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback())); |
| 220 data_->Run(); | 228 data_->Run(); |
| 221 ASSERT_EQ(OK, read_callback_.WaitForResult()); | 229 ASSERT_EQ(OK, read_callback_.WaitForResult()); |
| 222 } | 230 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 235 | 243 |
| 236 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, | 244 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, |
| 237 int len) { | 245 int len) { |
| 238 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 246 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
| 239 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); | 247 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); |
| 240 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 248 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
| 241 ASSERT_TRUE(sock_->IsConnected()); | 249 ASSERT_TRUE(sock_->IsConnected()); |
| 242 } | 250 } |
| 243 | 251 |
| 244 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, | 252 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, |
| 245 int len) { | 253 int len) { |
| 246 data_->StopAfter(1); | 254 data_->StopAfter(1); |
| 247 // Issue the read, which will be completed asynchronously | 255 // Issue the read, which will be completed asynchronously |
| 248 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 256 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
| 249 ASSERT_EQ(ERR_IO_PENDING, | 257 ASSERT_EQ(ERR_IO_PENDING, |
| 250 sock_->Read(buf.get(), len, read_callback_.callback())); | 258 sock_->Read(buf.get(), len, read_callback_.callback())); |
| 251 EXPECT_TRUE(sock_->IsConnected()); | 259 EXPECT_TRUE(sock_->IsConnected()); |
| 252 data_->Run(); | 260 data_->Run(); |
| 253 | 261 |
| 254 EXPECT_TRUE(sock_->IsConnected()); | 262 EXPECT_TRUE(sock_->IsConnected()); |
| 255 | 263 |
| 256 // Now the read will return | 264 // Now the read will return |
| 257 EXPECT_EQ(len, read_callback_.WaitForResult()); | 265 EXPECT_EQ(len, read_callback_.WaitForResult()); |
| 258 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 266 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); |
| 259 } | 267 } |
| 260 | 268 |
| 261 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, | 269 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { |
| 262 int len) { | |
| 263 data_->StopAfter(1); | 270 data_->StopAfter(1); |
| 264 // Issue the read, which will be completed asynchronously | 271 // Issue the read, which will be completed asynchronously |
| 265 read_buf_ = new IOBuffer(len); | 272 read_buf_ = new IOBuffer(len); |
| 266 ASSERT_EQ(ERR_IO_PENDING, | 273 ASSERT_EQ(ERR_IO_PENDING, |
| 267 sock_->Read(read_buf_.get(), len, read_callback_.callback())); | 274 sock_->Read(read_buf_.get(), len, read_callback_.callback())); |
| 268 EXPECT_TRUE(sock_->IsConnected()); | 275 EXPECT_TRUE(sock_->IsConnected()); |
| 269 } | 276 } |
| 270 | 277 |
| 271 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, | 278 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { |
| 272 int len) { | |
| 273 EXPECT_TRUE(sock_->IsConnected()); | 279 EXPECT_TRUE(sock_->IsConnected()); |
| 274 | 280 |
| 275 // Now the read will return | 281 // Now the read will return |
| 276 EXPECT_EQ(len, read_callback_.WaitForResult()); | 282 EXPECT_EQ(len, read_callback_.WaitForResult()); |
| 277 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); | 283 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); |
| 278 } | 284 } |
| 279 | 285 |
| 280 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, | 286 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, |
| 281 int len) { | 287 int len) { |
| 282 AssertWriteReturns(data, len, ERR_IO_PENDING); | 288 AssertWriteReturns(data, len, ERR_IO_PENDING); |
| 283 data_->RunFor(1); | 289 data_->RunFor(1); |
| 284 AssertWriteLength(len); | 290 AssertWriteLength(len); |
| 285 } | 291 } |
| 286 | 292 |
| 287 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, | 293 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, |
| 288 int len, | 294 int len, |
| 289 int rv) { | 295 int rv) { |
| 290 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 296 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
| 291 EXPECT_EQ(rv, | 297 EXPECT_EQ(rv, |
| 292 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 298 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 293 } | 299 } |
| 294 | 300 |
| 295 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { | 301 void SpdyProxyClientSocketTest::AssertWriteLength(int len) { |
| 296 EXPECT_EQ(len, write_callback_.WaitForResult()); | 302 EXPECT_EQ(len, write_callback_.WaitForResult()); |
| 297 } | 303 } |
| 298 | 304 |
| 299 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( | 305 void SpdyProxyClientSocketTest::AssertAsyncWriteWithReadsSucceeds( |
| 300 const char* data, int len, int num_reads) { | 306 const char* data, |
| 307 int len, |
| 308 int num_reads) { |
| 301 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); | 309 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len)); |
| 302 | 310 |
| 303 EXPECT_EQ(ERR_IO_PENDING, | 311 EXPECT_EQ(ERR_IO_PENDING, |
| 304 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 312 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 305 | 313 |
| 306 for (int i = 0; i < num_reads; i++) { | 314 for (int i = 0; i < num_reads; i++) { |
| 307 Run(1); | 315 Run(1); |
| 308 AssertSyncReadEquals(kMsg2, kLen2); | 316 AssertSyncReadEquals(kMsg2, kLen2); |
| 309 } | 317 } |
| 310 | 318 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 321 spdy_util_.MaybeAddVersionHeader(syn_ir); | 329 spdy_util_.MaybeAddVersionHeader(syn_ir); |
| 322 } | 330 } |
| 323 | 331 |
| 324 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, | 332 void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdySynReplyIR* reply_ir, |
| 325 const char* status) { | 333 const char* status) { |
| 326 reply_ir->SetHeader(spdy_util_.GetStatusKey(), status); | 334 reply_ir->SetHeader(spdy_util_.GetStatusKey(), status); |
| 327 spdy_util_.MaybeAddVersionHeader(reply_ir); | 335 spdy_util_.MaybeAddVersionHeader(reply_ir); |
| 328 } | 336 } |
| 329 | 337 |
| 330 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. | 338 // Constructs a standard SPDY SYN_STREAM frame for a CONNECT request. |
| 331 SpdyFrame* | 339 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectRequestFrame() { |
| 332 SpdyProxyClientSocketTest::ConstructConnectRequestFrame() { | |
| 333 SpdySynStreamIR syn_ir(kStreamId); | 340 SpdySynStreamIR syn_ir(kStreamId); |
| 334 PopulateConnectRequestIR(&syn_ir); | 341 PopulateConnectRequestIR(&syn_ir); |
| 335 return spdy_util_.CreateFramer(false)->SerializeFrame(syn_ir); | 342 return spdy_util_.CreateFramer(false)->SerializeFrame(syn_ir); |
| 336 } | 343 } |
| 337 | 344 |
| 338 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes | 345 // Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes |
| 339 // Proxy-Authorization headers. | 346 // Proxy-Authorization headers. |
| 340 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() { | 347 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() { |
| 341 SpdySynStreamIR syn_ir(kStreamId); | 348 SpdySynStreamIR syn_ir(kStreamId); |
| 342 PopulateConnectRequestIR(&syn_ir); | 349 PopulateConnectRequestIR(&syn_ir); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 369 return framer_.SerializeFrame(reply_ir); | 376 return framer_.SerializeFrame(reply_ir); |
| 370 } | 377 } |
| 371 | 378 |
| 372 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. | 379 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. |
| 373 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { | 380 SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { |
| 374 SpdySynReplyIR reply_ir(kStreamId); | 381 SpdySynReplyIR reply_ir(kStreamId); |
| 375 PopulateConnectReplyIR(&reply_ir, "500"); | 382 PopulateConnectReplyIR(&reply_ir, "500"); |
| 376 return framer_.SerializeFrame(reply_ir); | 383 return framer_.SerializeFrame(reply_ir); |
| 377 } | 384 } |
| 378 | 385 |
| 379 SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame( | 386 SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(const char* data, |
| 380 const char* data, | 387 int length) { |
| 381 int length) { | |
| 382 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE); | 388 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE); |
| 383 } | 389 } |
| 384 | 390 |
| 385 // ----------- Connect | 391 // ----------- Connect |
| 386 | 392 |
| 387 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { | 393 TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { |
| 388 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 394 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 389 MockWrite writes[] = { | 395 MockWrite writes[] = { |
| 390 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 396 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 391 }; | 397 }; |
| 392 | 398 |
| 393 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 399 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 394 MockRead reads[] = { | 400 MockRead reads[] = { |
| 395 CreateMockRead(*resp, 1, ASYNC), | 401 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 396 MockRead(ASYNC, 0, 2), // EOF | |
| 397 }; | 402 }; |
| 398 | 403 |
| 399 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 404 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 400 | 405 |
| 401 ASSERT_FALSE(sock_->IsConnected()); | 406 ASSERT_FALSE(sock_->IsConnected()); |
| 402 | 407 |
| 403 AssertConnectSucceeds(); | 408 AssertConnectSucceeds(); |
| 404 | 409 |
| 405 AssertConnectionEstablished(); | 410 AssertConnectionEstablished(); |
| 406 } | 411 } |
| 407 | 412 |
| 408 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { | 413 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
| 409 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 414 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 410 MockWrite writes[] = { | 415 MockWrite writes[] = { |
| 411 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 416 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 412 }; | 417 }; |
| 413 | 418 |
| 414 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 419 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 415 MockRead reads[] = { | 420 MockRead reads[] = { |
| 416 CreateMockRead(*resp, 1, ASYNC), | 421 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 417 MockRead(ASYNC, 0, 2), // EOF | |
| 418 }; | 422 }; |
| 419 | 423 |
| 420 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 424 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 421 | 425 |
| 422 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 426 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
| 423 | 427 |
| 424 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 428 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 425 ASSERT_TRUE(response != NULL); | 429 ASSERT_TRUE(response != NULL); |
| 426 ASSERT_EQ(407, response->headers->response_code()); | 430 ASSERT_EQ(407, response->headers->response_code()); |
| 427 } | 431 } |
| 428 | 432 |
| 429 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { | 433 TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
| 430 scoped_ptr<SpdyFrame> conn(ConstructConnectAuthRequestFrame()); | 434 scoped_ptr<SpdyFrame> conn(ConstructConnectAuthRequestFrame()); |
| 431 MockWrite writes[] = { | 435 MockWrite writes[] = { |
| 432 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 436 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 433 }; | 437 }; |
| 434 | 438 |
| 435 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 439 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 436 MockRead reads[] = { | 440 MockRead reads[] = { |
| 437 CreateMockRead(*resp, 1, ASYNC), | 441 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 438 MockRead(ASYNC, 0, 2), // EOF | |
| 439 }; | 442 }; |
| 440 | 443 |
| 441 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 444 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 442 AddAuthToCache(); | 445 AddAuthToCache(); |
| 443 | 446 |
| 444 AssertConnectSucceeds(); | 447 AssertConnectSucceeds(); |
| 445 | 448 |
| 446 AssertConnectionEstablished(); | 449 AssertConnectionEstablished(); |
| 447 } | 450 } |
| 448 | 451 |
| 449 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { | 452 TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) { |
| 450 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 453 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 451 MockWrite writes[] = { | 454 MockWrite writes[] = { |
| 452 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 455 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 453 }; | 456 }; |
| 454 | 457 |
| 455 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); | 458 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame()); |
| 456 MockRead reads[] = { | 459 MockRead reads[] = { |
| 457 CreateMockRead(*resp, 1, ASYNC), | 460 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 458 MockRead(ASYNC, 0, 2), // EOF | |
| 459 }; | 461 }; |
| 460 | 462 |
| 461 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 463 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 462 | 464 |
| 463 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 465 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
| 464 | 466 |
| 465 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 467 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 466 ASSERT_TRUE(response != NULL); | 468 ASSERT_TRUE(response != NULL); |
| 467 | 469 |
| 468 const HttpResponseHeaders* headers = response->headers.get(); | 470 const HttpResponseHeaders* headers = response->headers.get(); |
| 469 ASSERT_EQ(302, headers->response_code()); | 471 ASSERT_EQ(302, headers->response_code()); |
| 470 ASSERT_FALSE(headers->HasHeader("set-cookie")); | 472 ASSERT_FALSE(headers->HasHeader("set-cookie")); |
| 471 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); | 473 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); |
| 472 | 474 |
| 473 std::string location; | 475 std::string location; |
| 474 ASSERT_TRUE(headers->IsRedirect(&location)); | 476 ASSERT_TRUE(headers->IsRedirect(&location)); |
| 475 ASSERT_EQ(location, kRedirectUrl); | 477 ASSERT_EQ(location, kRedirectUrl); |
| 476 } | 478 } |
| 477 | 479 |
| 478 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { | 480 TEST_P(SpdyProxyClientSocketTest, ConnectFails) { |
| 479 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 481 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 480 MockWrite writes[] = { | 482 MockWrite writes[] = { |
| 481 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 483 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 482 }; | 484 }; |
| 483 | 485 |
| 484 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 486 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 485 MockRead reads[] = { | 487 MockRead reads[] = { |
| 486 MockRead(ASYNC, 0, 1), // EOF | 488 MockRead(ASYNC, 0, 1), // EOF |
| 487 }; | 489 }; |
| 488 | 490 |
| 489 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 491 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 490 | 492 |
| 491 ASSERT_FALSE(sock_->IsConnected()); | 493 ASSERT_FALSE(sock_->IsConnected()); |
| 492 | 494 |
| 493 AssertConnectFails(ERR_CONNECTION_CLOSED); | 495 AssertConnectFails(ERR_CONNECTION_CLOSED); |
| 494 | 496 |
| 495 ASSERT_FALSE(sock_->IsConnected()); | 497 ASSERT_FALSE(sock_->IsConnected()); |
| 496 } | 498 } |
| 497 | 499 |
| 498 // ----------- WasEverUsed | 500 // ----------- WasEverUsed |
| 499 | 501 |
| 500 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { | 502 TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { |
| 501 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 503 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 502 MockWrite writes[] = { | 504 MockWrite writes[] = { |
| 503 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 505 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 504 }; | 506 }; |
| 505 | 507 |
| 506 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 508 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 507 MockRead reads[] = { | 509 MockRead reads[] = { |
| 508 CreateMockRead(*resp, 1, ASYNC), | 510 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 509 MockRead(ASYNC, 0, 2), // EOF | |
| 510 }; | 511 }; |
| 511 | 512 |
| 512 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 513 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 513 | 514 |
| 514 EXPECT_FALSE(sock_->WasEverUsed()); | 515 EXPECT_FALSE(sock_->WasEverUsed()); |
| 515 AssertConnectSucceeds(); | 516 AssertConnectSucceeds(); |
| 516 EXPECT_TRUE(sock_->WasEverUsed()); | 517 EXPECT_TRUE(sock_->WasEverUsed()); |
| 517 sock_->Disconnect(); | 518 sock_->Disconnect(); |
| 518 EXPECT_TRUE(sock_->WasEverUsed()); | 519 EXPECT_TRUE(sock_->WasEverUsed()); |
| 519 } | 520 } |
| 520 | 521 |
| 521 // ----------- GetPeerAddress | 522 // ----------- GetPeerAddress |
| 522 | 523 |
| 523 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { | 524 TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { |
| 524 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 525 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 525 MockWrite writes[] = { | 526 MockWrite writes[] = { |
| 526 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 527 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 527 }; | 528 }; |
| 528 | 529 |
| 529 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 530 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 530 MockRead reads[] = { | 531 MockRead reads[] = { |
| 531 CreateMockRead(*resp, 1, ASYNC), | 532 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 532 MockRead(ASYNC, 0, 2), // EOF | |
| 533 }; | 533 }; |
| 534 | 534 |
| 535 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 535 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 536 | 536 |
| 537 net::IPEndPoint addr; | 537 net::IPEndPoint addr; |
| 538 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 538 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 539 | 539 |
| 540 AssertConnectSucceeds(); | 540 AssertConnectSucceeds(); |
| 541 EXPECT_TRUE(sock_->IsConnected()); | 541 EXPECT_TRUE(sock_->IsConnected()); |
| 542 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); | 542 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); |
| 543 | 543 |
| 544 Run(1); | 544 Run(1); |
| 545 | 545 |
| 546 EXPECT_FALSE(sock_->IsConnected()); | 546 EXPECT_FALSE(sock_->IsConnected()); |
| 547 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 547 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 548 | 548 |
| 549 sock_->Disconnect(); | 549 sock_->Disconnect(); |
| 550 | 550 |
| 551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 552 } | 552 } |
| 553 | 553 |
| 554 // ----------- Write | 554 // ----------- Write |
| 555 | 555 |
| 556 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { | 556 TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { |
| 557 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 557 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 558 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 558 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 559 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 559 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 560 MockWrite writes[] = { | 560 MockWrite writes[] = { |
| 561 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 561 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 562 CreateMockWrite(*msg1, 2, SYNCHRONOUS), | 562 CreateMockWrite(*msg1, 2, SYNCHRONOUS), |
| 563 CreateMockWrite(*msg2, 3, SYNCHRONOUS), | 563 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
| 564 }; | 564 }; |
| 565 | 565 |
| 566 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 566 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 567 MockRead reads[] = { | 567 MockRead reads[] = { |
| 568 CreateMockRead(*resp, 1, ASYNC), | 568 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 569 MockRead(ASYNC, 0, 4), // EOF | |
| 570 }; | 569 }; |
| 571 | 570 |
| 572 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 571 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 573 | 572 |
| 574 AssertConnectSucceeds(); | 573 AssertConnectSucceeds(); |
| 575 | 574 |
| 576 AssertAsyncWriteSucceeds(kMsg1, kLen1); | 575 AssertAsyncWriteSucceeds(kMsg1, kLen1); |
| 577 AssertAsyncWriteSucceeds(kMsg2, kLen2); | 576 AssertAsyncWriteSucceeds(kMsg2, kLen2); |
| 578 } | 577 } |
| 579 | 578 |
| 580 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { | 579 TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { |
| 581 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 580 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 582 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 581 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 583 scoped_ptr<SpdyFrame> chunk(ConstructBodyFrame(chunk_data.data(), | 582 scoped_ptr<SpdyFrame> chunk( |
| 584 chunk_data.length())); | 583 ConstructBodyFrame(chunk_data.data(), chunk_data.length())); |
| 585 MockWrite writes[] = { | 584 MockWrite writes[] = {CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 586 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 585 CreateMockWrite(*chunk, 2, SYNCHRONOUS), |
| 587 CreateMockWrite(*chunk, 2, SYNCHRONOUS), | 586 CreateMockWrite(*chunk, 3, SYNCHRONOUS), |
| 588 CreateMockWrite(*chunk, 3, SYNCHRONOUS), | 587 CreateMockWrite(*chunk, 4, SYNCHRONOUS)}; |
| 589 CreateMockWrite(*chunk, 4, SYNCHRONOUS) | |
| 590 }; | |
| 591 | 588 |
| 592 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 589 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 593 MockRead reads[] = { | 590 MockRead reads[] = { |
| 594 CreateMockRead(*resp, 1, ASYNC), | 591 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 5), // EOF |
| 595 MockRead(ASYNC, 0, 5), // EOF | |
| 596 }; | 592 }; |
| 597 | 593 |
| 598 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 594 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 599 | 595 |
| 600 AssertConnectSucceeds(); | 596 AssertConnectSucceeds(); |
| 601 | 597 |
| 602 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); | 598 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); |
| 603 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), | 599 scoped_refptr<IOBufferWithSize> buf( |
| 604 big_data.length())); | 600 CreateBuffer(big_data.data(), big_data.length())); |
| 605 | 601 |
| 606 EXPECT_EQ(ERR_IO_PENDING, | 602 EXPECT_EQ(ERR_IO_PENDING, |
| 607 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 603 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 608 data_->RunFor(3); | 604 data_->RunFor(3); |
| 609 | 605 |
| 610 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); | 606 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); |
| 611 } | 607 } |
| 612 | 608 |
| 613 // ----------- Read | 609 // ----------- Read |
| 614 | 610 |
| 615 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { | 611 TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { |
| 616 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 612 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 617 MockWrite writes[] = { | 613 MockWrite writes[] = { |
| 618 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 614 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 619 }; | 615 }; |
| 620 | 616 |
| 621 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 617 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 622 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 618 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 623 MockRead reads[] = { | 619 MockRead reads[] = { |
| 624 CreateMockRead(*resp, 1, ASYNC), | 620 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 625 CreateMockRead(*msg1, 2, ASYNC), | 621 MockRead(ASYNC, 0, 3), // EOF |
| 626 MockRead(ASYNC, 0, 3), // EOF | |
| 627 }; | 622 }; |
| 628 | 623 |
| 629 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 624 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 630 | 625 |
| 631 AssertConnectSucceeds(); | 626 AssertConnectSucceeds(); |
| 632 | 627 |
| 633 Run(1); // SpdySession consumes the next read and sends it to | 628 Run(1); // SpdySession consumes the next read and sends it to |
| 634 // sock_ to be buffered. | 629 // sock_ to be buffered. |
| 635 AssertSyncReadEquals(kMsg1, kLen1); | 630 AssertSyncReadEquals(kMsg1, kLen1); |
| 636 } | 631 } |
| 637 | 632 |
| 638 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { | 633 TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { |
| 639 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 634 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 640 MockWrite writes[] = { | 635 MockWrite writes[] = { |
| 641 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 636 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 642 }; | 637 }; |
| 643 | 638 |
| 644 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 639 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 645 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 640 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 646 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 641 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 647 MockRead reads[] = { | 642 MockRead reads[] = { |
| 648 CreateMockRead(*resp, 1, ASYNC), | 643 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 649 CreateMockRead(*msg1, 2, ASYNC), | 644 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 650 CreateMockRead(*msg2, 3, ASYNC), | |
| 651 MockRead(ASYNC, 0, 4), // EOF | |
| 652 }; | 645 }; |
| 653 | 646 |
| 654 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 647 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 655 | 648 |
| 656 AssertConnectSucceeds(); | 649 AssertConnectSucceeds(); |
| 657 | 650 |
| 658 Run(1); // SpdySession consumes the next read and sends it to | 651 Run(1); // SpdySession consumes the next read and sends it to |
| 659 // sock_ to be buffered. | 652 // sock_ to be buffered. |
| 660 AssertSyncReadEquals(kMsg1, kLen1); | 653 AssertSyncReadEquals(kMsg1, kLen1); |
| 661 Run(1); // SpdySession consumes the next read and sends it to | 654 Run(1); // SpdySession consumes the next read and sends it to |
| 662 // sock_ to be buffered. | 655 // sock_ to be buffered. |
| 663 AssertSyncReadEquals(kMsg2, kLen2); | 656 AssertSyncReadEquals(kMsg2, kLen2); |
| 664 } | 657 } |
| 665 | 658 |
| 666 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { | 659 TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { |
| 667 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 660 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 668 MockWrite writes[] = { | 661 MockWrite writes[] = { |
| 669 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 662 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 670 }; | 663 }; |
| 671 | 664 |
| 672 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 665 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 673 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 666 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 674 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 667 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 675 MockRead reads[] = { | 668 MockRead reads[] = { |
| 676 CreateMockRead(*resp, 1, ASYNC), | 669 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 677 CreateMockRead(*msg1, 2, ASYNC), | 670 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 678 CreateMockRead(*msg2, 3, ASYNC), | |
| 679 MockRead(ASYNC, 0, 4), // EOF | |
| 680 }; | 671 }; |
| 681 | 672 |
| 682 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 673 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 683 | 674 |
| 684 AssertConnectSucceeds(); | 675 AssertConnectSucceeds(); |
| 685 | 676 |
| 686 Run(2); // SpdySession consumes the next two reads and sends then to | 677 Run(2); // SpdySession consumes the next two reads and sends then to |
| 687 // sock_ to be buffered. | 678 // sock_ to be buffered. |
| 688 AssertSyncReadEquals(kMsg1, kLen1); | 679 AssertSyncReadEquals(kMsg1, kLen1); |
| 689 AssertSyncReadEquals(kMsg2, kLen2); | 680 AssertSyncReadEquals(kMsg2, kLen2); |
| 690 } | 681 } |
| 691 | 682 |
| 692 TEST_P(SpdyProxyClientSocketTest, | 683 TEST_P(SpdyProxyClientSocketTest, LargeReadWillMergeDataFromDifferentFrames) { |
| 693 LargeReadWillMergeDataFromDifferentFrames) { | |
| 694 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 684 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 695 MockWrite writes[] = { | 685 MockWrite writes[] = { |
| 696 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 686 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 697 }; | 687 }; |
| 698 | 688 |
| 699 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 689 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 700 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 690 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 701 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 691 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 702 MockRead reads[] = { | 692 MockRead reads[] = { |
| 703 CreateMockRead(*resp, 1, ASYNC), | 693 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg3, 2, ASYNC), |
| 704 CreateMockRead(*msg3, 2, ASYNC), | 694 CreateMockRead(*msg3, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 705 CreateMockRead(*msg3, 3, ASYNC), | |
| 706 MockRead(ASYNC, 0, 4), // EOF | |
| 707 }; | 695 }; |
| 708 | 696 |
| 709 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 697 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 710 | 698 |
| 711 AssertConnectSucceeds(); | 699 AssertConnectSucceeds(); |
| 712 | 700 |
| 713 Run(2); // SpdySession consumes the next two reads and sends then to | 701 Run(2); // SpdySession consumes the next two reads and sends then to |
| 714 // sock_ to be buffered. | 702 // sock_ to be buffered. |
| 715 // The payload from two data frames, each with kMsg3 will be combined | 703 // The payload from two data frames, each with kMsg3 will be combined |
| 716 // together into a single read(). | 704 // together into a single read(). |
| 717 AssertSyncReadEquals(kMsg33, kLen33); | 705 AssertSyncReadEquals(kMsg33, kLen33); |
| 718 } | 706 } |
| 719 | 707 |
| 720 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { | 708 TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { |
| 721 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 709 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 722 MockWrite writes[] = { | 710 MockWrite writes[] = { |
| 723 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 711 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 724 }; | 712 }; |
| 725 | 713 |
| 726 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 714 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 727 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 715 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 728 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 716 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 729 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 717 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 730 MockRead reads[] = { | 718 MockRead reads[] = { |
| 731 CreateMockRead(*resp, 1, ASYNC), | 719 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 732 CreateMockRead(*msg1, 2, ASYNC), | 720 CreateMockRead(*msg3, 3, ASYNC), CreateMockRead(*msg3, 4, ASYNC), |
| 733 CreateMockRead(*msg3, 3, ASYNC), | 721 CreateMockRead(*msg2, 5, ASYNC), MockRead(ASYNC, 0, 6), // EOF |
| 734 CreateMockRead(*msg3, 4, ASYNC), | |
| 735 CreateMockRead(*msg2, 5, ASYNC), | |
| 736 MockRead(ASYNC, 0, 6), // EOF | |
| 737 }; | 722 }; |
| 738 | 723 |
| 739 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 724 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 740 | 725 |
| 741 AssertConnectSucceeds(); | 726 AssertConnectSucceeds(); |
| 742 | 727 |
| 743 Run(4); // SpdySession consumes the next four reads and sends then to | 728 Run(4); // SpdySession consumes the next four reads and sends then to |
| 744 // sock_ to be buffered. | 729 // sock_ to be buffered. |
| 745 AssertSyncReadEquals(kMsg1, kLen1); | 730 AssertSyncReadEquals(kMsg1, kLen1); |
| 746 // The payload from two data frames, each with kMsg3 will be combined | 731 // The payload from two data frames, each with kMsg3 will be combined |
| 747 // together into a single read(). | 732 // together into a single read(). |
| 748 AssertSyncReadEquals(kMsg33, kLen33); | 733 AssertSyncReadEquals(kMsg33, kLen33); |
| 749 AssertSyncReadEquals(kMsg2, kLen2); | 734 AssertSyncReadEquals(kMsg2, kLen2); |
| 750 } | 735 } |
| 751 | 736 |
| 752 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { | 737 TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { |
| 753 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 738 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 754 MockWrite writes[] = { | 739 MockWrite writes[] = { |
| 755 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 740 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 756 }; | 741 }; |
| 757 | 742 |
| 758 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 743 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 759 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 744 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 760 scoped_ptr<SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); | 745 scoped_ptr<SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); |
| 761 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 746 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 762 MockRead reads[] = { | 747 MockRead reads[] = { |
| 763 CreateMockRead(*resp, 1, ASYNC), | 748 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 764 CreateMockRead(*msg1, 2, ASYNC), | 749 CreateMockRead(*msg33, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 765 CreateMockRead(*msg33, 3, ASYNC), | |
| 766 MockRead(ASYNC, 0, 4), // EOF | |
| 767 }; | 750 }; |
| 768 | 751 |
| 769 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 752 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 770 | 753 |
| 771 AssertConnectSucceeds(); | 754 AssertConnectSucceeds(); |
| 772 | 755 |
| 773 Run(2); // SpdySession consumes the next two reads and sends then to | 756 Run(2); // SpdySession consumes the next two reads and sends then to |
| 774 // sock_ to be buffered. | 757 // sock_ to be buffered. |
| 775 AssertSyncReadEquals(kMsg1, kLen1); | 758 AssertSyncReadEquals(kMsg1, kLen1); |
| 776 // The payload from the single large data frame will be read across | 759 // The payload from the single large data frame will be read across |
| 777 // two different reads. | 760 // two different reads. |
| 778 AssertSyncReadEquals(kMsg3, kLen3); | 761 AssertSyncReadEquals(kMsg3, kLen3); |
| 779 AssertSyncReadEquals(kMsg3, kLen3); | 762 AssertSyncReadEquals(kMsg3, kLen3); |
| 780 } | 763 } |
| 781 | 764 |
| 782 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { | 765 TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { |
| 783 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 766 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 784 MockWrite writes[] = { | 767 MockWrite writes[] = { |
| 785 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 768 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 786 }; | 769 }; |
| 787 | 770 |
| 788 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 771 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 789 scoped_ptr<SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); | 772 scoped_ptr<SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); |
| 790 MockRead reads[] = { | 773 MockRead reads[] = { |
| 791 CreateMockRead(*resp, 1, ASYNC), | 774 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg333, 2, ASYNC), |
| 792 CreateMockRead(*msg333, 2, ASYNC), | 775 MockRead(ASYNC, 0, 3), // EOF |
| 793 MockRead(ASYNC, 0, 3), // EOF | |
| 794 }; | 776 }; |
| 795 | 777 |
| 796 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 778 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 797 | 779 |
| 798 AssertConnectSucceeds(); | 780 AssertConnectSucceeds(); |
| 799 | 781 |
| 800 Run(1); // SpdySession consumes the next read and sends it to | 782 Run(1); // SpdySession consumes the next read and sends it to |
| 801 // sock_ to be buffered. | 783 // sock_ to be buffered. |
| 802 // The payload from the single large data frame will be read across | 784 // The payload from the single large data frame will be read across |
| 803 // two different reads. | 785 // two different reads. |
| 804 AssertSyncReadEquals(kMsg33, kLen33); | 786 AssertSyncReadEquals(kMsg33, kLen33); |
| 805 | 787 |
| 806 // Now attempt to do a read of more data than remains buffered | 788 // Now attempt to do a read of more data than remains buffered |
| 807 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); | 789 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); |
| 808 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); | 790 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); |
| 809 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); | 791 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); |
| 810 ASSERT_TRUE(sock_->IsConnected()); | 792 ASSERT_TRUE(sock_->IsConnected()); |
| 811 } | 793 } |
| 812 | 794 |
| 813 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) { | 795 TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) { |
| 814 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 796 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 815 MockWrite writes[] = { | 797 MockWrite writes[] = { |
| 816 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 798 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 817 }; | 799 }; |
| 818 | 800 |
| 819 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 801 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 820 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 802 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 821 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 803 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 822 MockRead reads[] = { | 804 MockRead reads[] = { |
| 823 CreateMockRead(*resp, 1, ASYNC), | 805 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 824 CreateMockRead(*msg1, 2, ASYNC), | 806 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 825 CreateMockRead(*msg2, 3, ASYNC), | |
| 826 MockRead(ASYNC, 0, 4), // EOF | |
| 827 }; | 807 }; |
| 828 | 808 |
| 829 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 809 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 830 | 810 |
| 831 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 811 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
| 832 | 812 |
| 833 Run(2); // SpdySession consumes the next two reads and sends then to | 813 Run(2); // SpdySession consumes the next two reads and sends then to |
| 834 // sock_ to be buffered. | 814 // sock_ to be buffered. |
| 835 AssertSyncReadEquals(kMsg1, kLen1); | 815 AssertSyncReadEquals(kMsg1, kLen1); |
| 836 AssertSyncReadEquals(kMsg2, kLen2); | 816 AssertSyncReadEquals(kMsg2, kLen2); |
| 837 } | 817 } |
| 838 | 818 |
| 839 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) { | 819 TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) { |
| 840 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 820 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 841 MockWrite writes[] = { | 821 MockWrite writes[] = { |
| 842 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 822 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 843 }; | 823 }; |
| 844 | 824 |
| 845 scoped_ptr<SpdyFrame> resp(ConstructConnectErrorReplyFrame()); | 825 scoped_ptr<SpdyFrame> resp(ConstructConnectErrorReplyFrame()); |
| 846 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 826 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 847 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 827 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 848 MockRead reads[] = { | 828 MockRead reads[] = { |
| 849 CreateMockRead(*resp, 1, ASYNC), | 829 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 850 CreateMockRead(*msg1, 2, ASYNC), | 830 CreateMockRead(*msg2, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF |
| 851 CreateMockRead(*msg2, 3, ASYNC), | |
| 852 MockRead(ASYNC, 0, 4), // EOF | |
| 853 }; | 831 }; |
| 854 | 832 |
| 855 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 833 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 856 | 834 |
| 857 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 835 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
| 858 } | 836 } |
| 859 | 837 |
| 860 // ----------- Reads and Writes | 838 // ----------- Reads and Writes |
| 861 | 839 |
| 862 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { | 840 TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { |
| 863 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 841 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 864 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 842 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 865 MockWrite writes[] = { | 843 MockWrite writes[] = { |
| 866 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 844 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 867 CreateMockWrite(*msg2, 3, SYNCHRONOUS), | 845 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
| 868 }; | 846 }; |
| 869 | 847 |
| 870 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 848 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 871 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 849 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 872 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 850 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 873 MockRead reads[] = { | 851 MockRead reads[] = { |
| 874 CreateMockRead(*resp, 1, ASYNC), | 852 CreateMockRead(*resp, 1, ASYNC), |
| 875 CreateMockRead(*msg1, 2, ASYNC), // sync read | 853 CreateMockRead(*msg1, 2, ASYNC), // sync read |
| 876 CreateMockRead(*msg3, 4, ASYNC), // async read | 854 CreateMockRead(*msg3, 4, ASYNC), // async read |
| 877 MockRead(ASYNC, 0, 5), // EOF | 855 MockRead(ASYNC, 0, 5), // EOF |
| 878 }; | 856 }; |
| 879 | 857 |
| 880 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 858 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 881 | 859 |
| 882 AssertConnectSucceeds(); | 860 AssertConnectSucceeds(); |
| 883 | 861 |
| 884 Run(1); | 862 Run(1); |
| 885 AssertSyncReadEquals(kMsg1, kLen1); | 863 AssertSyncReadEquals(kMsg1, kLen1); |
| 886 | 864 |
| 887 AssertReadStarts(kMsg3, kLen3); | 865 AssertReadStarts(kMsg3, kLen3); |
| 888 // Read should block until after the write succeeds | 866 // Read should block until after the write succeeds |
| 889 | 867 |
| 890 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step | 868 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step |
| 891 | 869 |
| 892 ASSERT_FALSE(read_callback_.have_result()); | 870 ASSERT_FALSE(read_callback_.have_result()); |
| 893 Run(1); | 871 Run(1); |
| 894 // Now the read will return | 872 // Now the read will return |
| 895 AssertReadReturns(kMsg3, kLen3); | 873 AssertReadReturns(kMsg3, kLen3); |
| 896 } | 874 } |
| 897 | 875 |
| 898 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { | 876 TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { |
| 899 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 877 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 900 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 878 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 901 MockWrite writes[] = { | 879 MockWrite writes[] = { |
| 902 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 880 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*msg2, 4, ASYNC), |
| 903 CreateMockWrite(*msg2, 4, ASYNC), | |
| 904 }; | 881 }; |
| 905 | 882 |
| 906 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 883 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 907 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 884 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 908 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 885 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 909 MockRead reads[] = { | 886 MockRead reads[] = { |
| 910 CreateMockRead(*resp, 1, ASYNC), | 887 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 911 CreateMockRead(*msg1, 2, ASYNC), | 888 CreateMockRead(*msg3, 3, ASYNC), MockRead(ASYNC, 0, 5), // EOF |
| 912 CreateMockRead(*msg3, 3, ASYNC), | |
| 913 MockRead(ASYNC, 0, 5), // EOF | |
| 914 }; | 889 }; |
| 915 | 890 |
| 916 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 891 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 917 | 892 |
| 918 AssertConnectSucceeds(); | 893 AssertConnectSucceeds(); |
| 919 | 894 |
| 920 Run(1); | 895 Run(1); |
| 921 AssertSyncReadEquals(kMsg1, kLen1); | 896 AssertSyncReadEquals(kMsg1, kLen1); |
| 922 // Write should block until the read completes | 897 // Write should block until the read completes |
| 923 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); | 898 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); |
| 924 | 899 |
| 925 AssertAsyncReadEquals(kMsg3, kLen3); | 900 AssertAsyncReadEquals(kMsg3, kLen3); |
| 926 | 901 |
| 927 ASSERT_FALSE(write_callback_.have_result()); | 902 ASSERT_FALSE(write_callback_.have_result()); |
| 928 | 903 |
| 929 // Now the write will complete | 904 // Now the write will complete |
| 930 Run(1); | 905 Run(1); |
| 931 AssertWriteLength(kLen2); | 906 AssertWriteLength(kLen2); |
| 932 } | 907 } |
| 933 | 908 |
| 934 // ----------- Reading/Writing on Closed socket | 909 // ----------- Reading/Writing on Closed socket |
| 935 | 910 |
| 936 // Reading from an already closed socket should return 0 | 911 // Reading from an already closed socket should return 0 |
| 937 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { | 912 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { |
| 938 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 913 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 939 MockWrite writes[] = { | 914 MockWrite writes[] = { |
| 940 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 915 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 941 }; | 916 }; |
| 942 | 917 |
| 943 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 918 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 944 MockRead reads[] = { | 919 MockRead reads[] = { |
| 945 CreateMockRead(*resp, 1, ASYNC), | 920 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 946 MockRead(ASYNC, 0, 2), // EOF | |
| 947 }; | 921 }; |
| 948 | 922 |
| 949 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 923 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 950 | 924 |
| 951 AssertConnectSucceeds(); | 925 AssertConnectSucceeds(); |
| 952 | 926 |
| 953 Run(1); | 927 Run(1); |
| 954 | 928 |
| 955 ASSERT_FALSE(sock_->IsConnected()); | 929 ASSERT_FALSE(sock_->IsConnected()); |
| 956 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 930 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 957 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 931 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 958 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 932 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 959 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | 933 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
| 960 } | 934 } |
| 961 | 935 |
| 962 // Read pending when socket is closed should return 0 | 936 // Read pending when socket is closed should return 0 |
| 963 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { | 937 TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
| 964 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 938 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 965 MockWrite writes[] = { | 939 MockWrite writes[] = { |
| 966 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 940 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 967 }; | 941 }; |
| 968 | 942 |
| 969 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 943 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 970 MockRead reads[] = { | 944 MockRead reads[] = { |
| 971 CreateMockRead(*resp, 1, ASYNC), | 945 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 972 MockRead(ASYNC, 0, 2), // EOF | |
| 973 }; | 946 }; |
| 974 | 947 |
| 975 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 948 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 976 | 949 |
| 977 AssertConnectSucceeds(); | 950 AssertConnectSucceeds(); |
| 978 | 951 |
| 979 AssertReadStarts(kMsg1, kLen1); | 952 AssertReadStarts(kMsg1, kLen1); |
| 980 | 953 |
| 981 Run(1); | 954 Run(1); |
| 982 | 955 |
| 983 ASSERT_EQ(0, read_callback_.WaitForResult()); | 956 ASSERT_EQ(0, read_callback_.WaitForResult()); |
| 984 } | 957 } |
| 985 | 958 |
| 986 // Reading from a disconnected socket is an error | 959 // Reading from a disconnected socket is an error |
| 987 TEST_P(SpdyProxyClientSocketTest, | 960 TEST_P(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { |
| 988 ReadOnDisconnectSocketReturnsNotConnected) { | |
| 989 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 961 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 990 MockWrite writes[] = { | 962 MockWrite writes[] = { |
| 991 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 963 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 992 }; | 964 }; |
| 993 | 965 |
| 994 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 966 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 995 MockRead reads[] = { | 967 MockRead reads[] = { |
| 996 CreateMockRead(*resp, 1, ASYNC), | 968 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 997 MockRead(ASYNC, 0, 2), // EOF | |
| 998 }; | 969 }; |
| 999 | 970 |
| 1000 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 971 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1001 | 972 |
| 1002 AssertConnectSucceeds(); | 973 AssertConnectSucceeds(); |
| 1003 | 974 |
| 1004 sock_->Disconnect(); | 975 sock_->Disconnect(); |
| 1005 | 976 |
| 1006 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 977 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1007 sock_->Read(NULL, 1, CompletionCallback())); | 978 sock_->Read(NULL, 1, CompletionCallback())); |
| 1008 } | 979 } |
| 1009 | 980 |
| 1010 // Reading buffered data from an already closed socket should return | 981 // Reading buffered data from an already closed socket should return |
| 1011 // buffered data, then 0. | 982 // buffered data, then 0. |
| 1012 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { | 983 TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
| 1013 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 984 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1014 MockWrite writes[] = { | 985 MockWrite writes[] = { |
| 1015 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 986 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1016 }; | 987 }; |
| 1017 | 988 |
| 1018 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 989 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1019 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 990 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1020 MockRead reads[] = { | 991 MockRead reads[] = { |
| 1021 CreateMockRead(*resp, 1, ASYNC), | 992 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 1022 CreateMockRead(*msg1, 2, ASYNC), | 993 MockRead(ASYNC, 0, 3), // EOF |
| 1023 MockRead(ASYNC, 0, 3), // EOF | |
| 1024 }; | 994 }; |
| 1025 | 995 |
| 1026 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 996 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1027 | 997 |
| 1028 AssertConnectSucceeds(); | 998 AssertConnectSucceeds(); |
| 1029 | 999 |
| 1030 Run(2); | 1000 Run(2); |
| 1031 | 1001 |
| 1032 ASSERT_FALSE(sock_->IsConnected()); | 1002 ASSERT_FALSE(sock_->IsConnected()); |
| 1033 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1003 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
| 1034 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); | 1004 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); |
| 1035 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); | 1005 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); |
| 1036 | 1006 |
| 1037 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1007 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 1038 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1008 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 1039 sock_->Disconnect(); | 1009 sock_->Disconnect(); |
| 1040 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1010 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1041 sock_->Read(NULL, 1, CompletionCallback())); | 1011 sock_->Read(NULL, 1, CompletionCallback())); |
| 1042 } | 1012 } |
| 1043 | 1013 |
| 1044 // Calling Write() on a closed socket is an error | 1014 // Calling Write() on a closed socket is an error |
| 1045 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1015 TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
| 1046 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1016 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1047 MockWrite writes[] = { | 1017 MockWrite writes[] = { |
| 1048 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1018 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1049 }; | 1019 }; |
| 1050 | 1020 |
| 1051 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1021 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1052 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1022 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1053 MockRead reads[] = { | 1023 MockRead reads[] = { |
| 1054 CreateMockRead(*resp, 1, ASYNC), | 1024 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 1055 MockRead(ASYNC, 0, 2), // EOF | |
| 1056 }; | 1025 }; |
| 1057 | 1026 |
| 1058 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1027 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1059 | 1028 |
| 1060 AssertConnectSucceeds(); | 1029 AssertConnectSucceeds(); |
| 1061 | 1030 |
| 1062 Run(1); // Read EOF which will close the stream | 1031 Run(1); // Read EOF which will close the stream |
| 1063 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1032 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1064 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1033 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1065 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1034 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
| 1066 } | 1035 } |
| 1067 | 1036 |
| 1068 // Calling Write() on a disconnected socket is an error | 1037 // Calling Write() on a disconnected socket is an error |
| 1069 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { | 1038 TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
| 1070 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1039 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1071 MockWrite writes[] = { | 1040 MockWrite writes[] = { |
| 1072 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1041 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1073 }; | 1042 }; |
| 1074 | 1043 |
| 1075 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1044 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1076 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1045 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1077 MockRead reads[] = { | 1046 MockRead reads[] = { |
| 1078 CreateMockRead(*resp, 1, ASYNC), | 1047 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 1079 MockRead(ASYNC, 0, 2), // EOF | |
| 1080 }; | 1048 }; |
| 1081 | 1049 |
| 1082 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1050 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1083 | 1051 |
| 1084 AssertConnectSucceeds(); | 1052 AssertConnectSucceeds(); |
| 1085 | 1053 |
| 1086 sock_->Disconnect(); | 1054 sock_->Disconnect(); |
| 1087 | 1055 |
| 1088 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1056 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1089 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1057 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1090 sock_->Write(buf.get(), buf->size(), CompletionCallback())); | 1058 sock_->Write(buf.get(), buf->size(), CompletionCallback())); |
| 1091 } | 1059 } |
| 1092 | 1060 |
| 1093 // If the socket is closed with a pending Write(), the callback | 1061 // If the socket is closed with a pending Write(), the callback |
| 1094 // should be called with ERR_CONNECTION_CLOSED. | 1062 // should be called with ERR_CONNECTION_CLOSED. |
| 1095 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { | 1063 TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) { |
| 1096 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1064 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1097 MockWrite writes[] = { | 1065 MockWrite writes[] = { |
| 1098 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1066 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 2), |
| 1099 MockWrite(ASYNC, ERR_ABORTED, 2), | |
| 1100 }; | 1067 }; |
| 1101 | 1068 |
| 1102 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1069 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1103 MockRead reads[] = { | 1070 MockRead reads[] = { |
| 1104 CreateMockRead(*resp, 1, ASYNC), | 1071 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF |
| 1105 MockRead(ASYNC, 0, 3), // EOF | |
| 1106 }; | 1072 }; |
| 1107 | 1073 |
| 1108 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1074 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1109 | 1075 |
| 1110 AssertConnectSucceeds(); | 1076 AssertConnectSucceeds(); |
| 1111 | 1077 |
| 1112 EXPECT_TRUE(sock_->IsConnected()); | 1078 EXPECT_TRUE(sock_->IsConnected()); |
| 1113 | 1079 |
| 1114 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1080 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1115 EXPECT_EQ(ERR_IO_PENDING, | 1081 EXPECT_EQ(ERR_IO_PENDING, |
| 1116 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1082 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 1117 | 1083 |
| 1118 CloseSpdySession(ERR_ABORTED, std::string()); | 1084 CloseSpdySession(ERR_ABORTED, std::string()); |
| 1119 | 1085 |
| 1120 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); | 1086 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
| 1121 } | 1087 } |
| 1122 | 1088 |
| 1123 // If the socket is Disconnected with a pending Write(), the callback | 1089 // If the socket is Disconnected with a pending Write(), the callback |
| 1124 // should not be called. | 1090 // should not be called. |
| 1125 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1091 TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
| 1126 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1092 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1127 MockWrite writes[] = { | 1093 MockWrite writes[] = { |
| 1128 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1094 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1129 MockWrite(SYNCHRONOUS, 0, 2), // EOF | 1095 MockWrite(SYNCHRONOUS, 0, 2), // EOF |
| 1130 }; | 1096 }; |
| 1131 | 1097 |
| 1132 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1098 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1133 MockRead reads[] = { | 1099 MockRead reads[] = { |
| 1134 CreateMockRead(*resp, 1, ASYNC), | 1100 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), // EOF |
| 1135 MockRead(ASYNC, 0, 3), // EOF | |
| 1136 }; | 1101 }; |
| 1137 | 1102 |
| 1138 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1103 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1139 | 1104 |
| 1140 AssertConnectSucceeds(); | 1105 AssertConnectSucceeds(); |
| 1141 | 1106 |
| 1142 EXPECT_TRUE(sock_->IsConnected()); | 1107 EXPECT_TRUE(sock_->IsConnected()); |
| 1143 | 1108 |
| 1144 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1109 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1145 EXPECT_EQ(ERR_IO_PENDING, | 1110 EXPECT_EQ(ERR_IO_PENDING, |
| 1146 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1111 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
| 1147 | 1112 |
| 1148 sock_->Disconnect(); | 1113 sock_->Disconnect(); |
| 1149 | 1114 |
| 1150 EXPECT_FALSE(sock_->IsConnected()); | 1115 EXPECT_FALSE(sock_->IsConnected()); |
| 1151 EXPECT_FALSE(write_callback_.have_result()); | 1116 EXPECT_FALSE(write_callback_.have_result()); |
| 1152 } | 1117 } |
| 1153 | 1118 |
| 1154 // If the socket is Disconnected with a pending Read(), the callback | 1119 // If the socket is Disconnected with a pending Read(), the callback |
| 1155 // should not be called. | 1120 // should not be called. |
| 1156 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1121 TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
| 1157 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1122 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1158 MockWrite writes[] = { | 1123 MockWrite writes[] = { |
| 1159 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1124 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1160 }; | 1125 }; |
| 1161 | 1126 |
| 1162 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1127 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1163 MockRead reads[] = { | 1128 MockRead reads[] = { |
| 1164 CreateMockRead(*resp, 1, ASYNC), | 1129 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), // EOF |
| 1165 MockRead(ASYNC, 0, 2), // EOF | |
| 1166 }; | 1130 }; |
| 1167 | 1131 |
| 1168 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1132 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1169 | 1133 |
| 1170 AssertConnectSucceeds(); | 1134 AssertConnectSucceeds(); |
| 1171 | 1135 |
| 1172 EXPECT_TRUE(sock_->IsConnected()); | 1136 EXPECT_TRUE(sock_->IsConnected()); |
| 1173 | 1137 |
| 1174 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1138 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
| 1175 ASSERT_EQ(ERR_IO_PENDING, | 1139 ASSERT_EQ(ERR_IO_PENDING, |
| 1176 sock_->Read(buf.get(), kLen1, read_callback_.callback())); | 1140 sock_->Read(buf.get(), kLen1, read_callback_.callback())); |
| 1177 | 1141 |
| 1178 sock_->Disconnect(); | 1142 sock_->Disconnect(); |
| 1179 | 1143 |
| 1180 EXPECT_FALSE(sock_->IsConnected()); | 1144 EXPECT_FALSE(sock_->IsConnected()); |
| 1181 EXPECT_FALSE(read_callback_.have_result()); | 1145 EXPECT_FALSE(read_callback_.have_result()); |
| 1182 } | 1146 } |
| 1183 | 1147 |
| 1184 // If the socket is Reset when both a read and write are pending, | 1148 // If the socket is Reset when both a read and write are pending, |
| 1185 // both should be called back. | 1149 // both should be called back. |
| 1186 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { | 1150 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { |
| 1187 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1151 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1188 MockWrite writes[] = { | 1152 MockWrite writes[] = { |
| 1189 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1153 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 3), |
| 1190 MockWrite(ASYNC, ERR_ABORTED, 3), | |
| 1191 }; | 1154 }; |
| 1192 | 1155 |
| 1193 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1156 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1194 scoped_ptr<SpdyFrame> rst( | 1157 scoped_ptr<SpdyFrame> rst( |
| 1195 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1158 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1196 MockRead reads[] = { | 1159 MockRead reads[] = { |
| 1197 CreateMockRead(*resp, 1, ASYNC), | 1160 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*rst, 2, ASYNC), |
| 1198 CreateMockRead(*rst, 2, ASYNC), | 1161 MockRead(ASYNC, 0, 4) // EOF |
| 1199 MockRead(ASYNC, 0, 4) // EOF | |
| 1200 }; | 1162 }; |
| 1201 | 1163 |
| 1202 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1164 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1203 | 1165 |
| 1204 AssertConnectSucceeds(); | 1166 AssertConnectSucceeds(); |
| 1205 | 1167 |
| 1206 EXPECT_TRUE(sock_->IsConnected()); | 1168 EXPECT_TRUE(sock_->IsConnected()); |
| 1207 | 1169 |
| 1208 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1170 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
| 1209 ASSERT_EQ(ERR_IO_PENDING, | 1171 ASSERT_EQ(ERR_IO_PENDING, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1220 EXPECT_TRUE(sock_.get()); | 1182 EXPECT_TRUE(sock_.get()); |
| 1221 EXPECT_TRUE(read_callback_.have_result()); | 1183 EXPECT_TRUE(read_callback_.have_result()); |
| 1222 EXPECT_TRUE(write_callback_.have_result()); | 1184 EXPECT_TRUE(write_callback_.have_result()); |
| 1223 } | 1185 } |
| 1224 | 1186 |
| 1225 // Makes sure the proxy client socket's source gets the expected NetLog events | 1187 // Makes sure the proxy client socket's source gets the expected NetLog events |
| 1226 // and only the expected NetLog events (No SpdySession events). | 1188 // and only the expected NetLog events (No SpdySession events). |
| 1227 TEST_P(SpdyProxyClientSocketTest, NetLog) { | 1189 TEST_P(SpdyProxyClientSocketTest, NetLog) { |
| 1228 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1190 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1229 MockWrite writes[] = { | 1191 MockWrite writes[] = { |
| 1230 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1192 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1231 }; | 1193 }; |
| 1232 | 1194 |
| 1233 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1195 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1234 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1196 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1235 MockRead reads[] = { | 1197 MockRead reads[] = { |
| 1236 CreateMockRead(*resp, 1, ASYNC), | 1198 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*msg1, 2, ASYNC), |
| 1237 CreateMockRead(*msg1, 2, ASYNC), | 1199 MockRead(ASYNC, 0, 3), // EOF |
| 1238 MockRead(ASYNC, 0, 3), // EOF | |
| 1239 }; | 1200 }; |
| 1240 | 1201 |
| 1241 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1202 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1242 | 1203 |
| 1243 AssertConnectSucceeds(); | 1204 AssertConnectSucceeds(); |
| 1244 | 1205 |
| 1245 Run(1); // SpdySession consumes the next read and sends it to | 1206 Run(1); // SpdySession consumes the next read and sends it to |
| 1246 // sock_ to be buffered. | 1207 // sock_ to be buffered. |
| 1247 AssertSyncReadEquals(kMsg1, kLen1); | 1208 AssertSyncReadEquals(kMsg1, kLen1); |
| 1248 | 1209 |
| 1249 NetLog::Source sock_source = sock_->NetLog().source(); | 1210 NetLog::Source sock_source = sock_->NetLog().source(); |
| 1250 sock_.reset(); | 1211 sock_.reset(); |
| 1251 | 1212 |
| 1252 CapturingNetLog::CapturedEntryList entry_list; | 1213 CapturingNetLog::CapturedEntryList entry_list; |
| 1253 net_log_.GetEntriesForSource(sock_source, &entry_list); | 1214 net_log_.GetEntriesForSource(sock_source, &entry_list); |
| 1254 | 1215 |
| 1255 ASSERT_EQ(entry_list.size(), 10u); | 1216 ASSERT_EQ(entry_list.size(), 10u); |
| 1256 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE)); | 1217 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE)); |
| 1257 EXPECT_TRUE(LogContainsEvent(entry_list, 1, | 1218 EXPECT_TRUE(LogContainsEvent(entry_list, |
| 1258 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION, | 1219 1, |
| 1259 NetLog::PHASE_NONE)); | 1220 NetLog::TYPE_SPDY_PROXY_CLIENT_SESSION, |
| 1260 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 2, | 1221 NetLog::PHASE_NONE)); |
| 1261 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); | 1222 EXPECT_TRUE(LogContainsBeginEvent( |
| 1262 EXPECT_TRUE(LogContainsEvent(entry_list, 3, | 1223 entry_list, 2, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); |
| 1263 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 1224 EXPECT_TRUE( |
| 1264 NetLog::PHASE_NONE)); | 1225 LogContainsEvent(entry_list, |
| 1265 EXPECT_TRUE(LogContainsEndEvent(entry_list, 4, | 1226 3, |
| 1266 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); | 1227 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
| 1267 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 5, | 1228 NetLog::PHASE_NONE)); |
| 1268 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1229 EXPECT_TRUE(LogContainsEndEvent( |
| 1269 EXPECT_TRUE(LogContainsEvent(entry_list, 6, | 1230 entry_list, 4, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST)); |
| 1270 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 1231 EXPECT_TRUE(LogContainsBeginEvent( |
| 1271 NetLog::PHASE_NONE)); | 1232 entry_list, 5, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
| 1272 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7, | 1233 EXPECT_TRUE(LogContainsEvent( |
| 1273 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); | 1234 entry_list, |
| 1274 EXPECT_TRUE(LogContainsEvent(entry_list, 8, | 1235 6, |
| 1275 NetLog::TYPE_SOCKET_BYTES_RECEIVED, | 1236 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
| 1276 NetLog::PHASE_NONE)); | 1237 NetLog::PHASE_NONE)); |
| 1238 EXPECT_TRUE(LogContainsEndEvent( |
| 1239 entry_list, 7, NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS)); |
| 1240 EXPECT_TRUE(LogContainsEvent( |
| 1241 entry_list, 8, NetLog::TYPE_SOCKET_BYTES_RECEIVED, NetLog::PHASE_NONE)); |
| 1277 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); | 1242 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE)); |
| 1278 } | 1243 } |
| 1279 | 1244 |
| 1280 // CompletionCallback that causes the SpdyProxyClientSocket to be | 1245 // CompletionCallback that causes the SpdyProxyClientSocket to be |
| 1281 // deleted when Run is invoked. | 1246 // deleted when Run is invoked. |
| 1282 class DeleteSockCallback : public TestCompletionCallbackBase { | 1247 class DeleteSockCallback : public TestCompletionCallbackBase { |
| 1283 public: | 1248 public: |
| 1284 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) | 1249 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock) |
| 1285 : sock_(sock), | 1250 : sock_(sock), |
| 1286 callback_(base::Bind(&DeleteSockCallback::OnComplete, | 1251 callback_(base::Bind(&DeleteSockCallback::OnComplete, |
| 1287 base::Unretained(this))) { | 1252 base::Unretained(this))) {} |
| 1288 } | |
| 1289 | 1253 |
| 1290 virtual ~DeleteSockCallback() { | 1254 virtual ~DeleteSockCallback() {} |
| 1291 } | |
| 1292 | 1255 |
| 1293 const CompletionCallback& callback() const { return callback_; } | 1256 const CompletionCallback& callback() const { return callback_; } |
| 1294 | 1257 |
| 1295 private: | 1258 private: |
| 1296 void OnComplete(int result) { | 1259 void OnComplete(int result) { |
| 1297 sock_->reset(NULL); | 1260 sock_->reset(NULL); |
| 1298 SetResult(result); | 1261 SetResult(result); |
| 1299 } | 1262 } |
| 1300 | 1263 |
| 1301 scoped_ptr<SpdyProxyClientSocket>* sock_; | 1264 scoped_ptr<SpdyProxyClientSocket>* sock_; |
| 1302 CompletionCallback callback_; | 1265 CompletionCallback callback_; |
| 1303 | 1266 |
| 1304 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); | 1267 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); |
| 1305 }; | 1268 }; |
| 1306 | 1269 |
| 1307 // If the socket is Reset when both a read and write are pending, and the | 1270 // If the socket is Reset when both a read and write are pending, and the |
| 1308 // read callback causes the socket to be deleted, the write callback should | 1271 // read callback causes the socket to be deleted, the write callback should |
| 1309 // not be called. | 1272 // not be called. |
| 1310 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { | 1273 TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { |
| 1311 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); | 1274 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1312 MockWrite writes[] = { | 1275 MockWrite writes[] = { |
| 1313 CreateMockWrite(*conn, 0, SYNCHRONOUS), | 1276 CreateMockWrite(*conn, 0, SYNCHRONOUS), MockWrite(ASYNC, ERR_ABORTED, 3), |
| 1314 MockWrite(ASYNC, ERR_ABORTED, 3), | |
| 1315 }; | 1277 }; |
| 1316 | 1278 |
| 1317 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); | 1279 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1318 scoped_ptr<SpdyFrame> rst( | 1280 scoped_ptr<SpdyFrame> rst( |
| 1319 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1281 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1320 MockRead reads[] = { | 1282 MockRead reads[] = { |
| 1321 CreateMockRead(*resp, 1, ASYNC), | 1283 CreateMockRead(*resp, 1, ASYNC), CreateMockRead(*rst, 2, ASYNC), |
| 1322 CreateMockRead(*rst, 2, ASYNC), | 1284 MockRead(ASYNC, 0, 4), // EOF |
| 1323 MockRead(ASYNC, 0, 4), // EOF | |
| 1324 }; | 1285 }; |
| 1325 | 1286 |
| 1326 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1287 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1327 | 1288 |
| 1328 AssertConnectSucceeds(); | 1289 AssertConnectSucceeds(); |
| 1329 | 1290 |
| 1330 EXPECT_TRUE(sock_->IsConnected()); | 1291 EXPECT_TRUE(sock_->IsConnected()); |
| 1331 | 1292 |
| 1332 DeleteSockCallback read_callback(&sock_); | 1293 DeleteSockCallback read_callback(&sock_); |
| 1333 | 1294 |
| 1334 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1295 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
| 1335 ASSERT_EQ(ERR_IO_PENDING, | 1296 ASSERT_EQ(ERR_IO_PENDING, |
| 1336 sock_->Read(read_buf.get(), kLen1, read_callback.callback())); | 1297 sock_->Read(read_buf.get(), kLen1, read_callback.callback())); |
| 1337 | 1298 |
| 1338 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); | 1299 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); |
| 1339 EXPECT_EQ( | 1300 EXPECT_EQ( |
| 1340 ERR_IO_PENDING, | 1301 ERR_IO_PENDING, |
| 1341 sock_->Write( | 1302 sock_->Write( |
| 1342 write_buf.get(), write_buf->size(), write_callback_.callback())); | 1303 write_buf.get(), write_buf->size(), write_callback_.callback())); |
| 1343 | 1304 |
| 1344 Run(1); | 1305 Run(1); |
| 1345 | 1306 |
| 1346 EXPECT_FALSE(sock_.get()); | 1307 EXPECT_FALSE(sock_.get()); |
| 1347 EXPECT_TRUE(read_callback.have_result()); | 1308 EXPECT_TRUE(read_callback.have_result()); |
| 1348 EXPECT_FALSE(write_callback_.have_result()); | 1309 EXPECT_FALSE(write_callback_.have_result()); |
| 1349 } | 1310 } |
| 1350 | 1311 |
| 1351 } // namespace net | 1312 } // namespace net |
| OLD | NEW |