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 <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 "/"); | 115 "/"); |
116 } | 116 } |
117 | 117 |
118 void ResumeAndRun() { | 118 void ResumeAndRun() { |
119 // Run until the pause, if the provider isn't paused yet. | 119 // Run until the pause, if the provider isn't paused yet. |
120 data_->RunUntilPaused(); | 120 data_->RunUntilPaused(); |
121 data_->Resume(); | 121 data_->Resume(); |
122 base::RunLoop().RunUntilIdle(); | 122 base::RunLoop().RunUntilIdle(); |
123 } | 123 } |
124 | 124 |
125 void CloseSpdySession(Error error, const std::string& description) { | 125 void CloseSpdySession(Error error, const SpdyString& description) { |
126 spdy_session_->CloseSessionOnError(error, description); | 126 spdy_session_->CloseSessionOnError(error, description); |
127 } | 127 } |
128 | 128 |
129 SpdyTestUtil spdy_util_; | 129 SpdyTestUtil spdy_util_; |
130 std::unique_ptr<SpdyProxyClientSocket> sock_; | 130 std::unique_ptr<SpdyProxyClientSocket> sock_; |
131 TestCompletionCallback read_callback_; | 131 TestCompletionCallback read_callback_; |
132 TestCompletionCallback write_callback_; | 132 TestCompletionCallback write_callback_; |
133 std::unique_ptr<SequencedSocketData> data_; | 133 std::unique_ptr<SequencedSocketData> data_; |
134 BoundTestNetLog net_log_; | 134 BoundTestNetLog net_log_; |
135 | 135 |
136 private: | 136 private: |
137 std::unique_ptr<HttpNetworkSession> session_; | 137 std::unique_ptr<HttpNetworkSession> session_; |
138 scoped_refptr<IOBuffer> read_buf_; | 138 scoped_refptr<IOBuffer> read_buf_; |
139 SpdySessionDependencies session_deps_; | 139 SpdySessionDependencies session_deps_; |
140 MockConnect connect_data_; | 140 MockConnect connect_data_; |
141 base::WeakPtr<SpdySession> spdy_session_; | 141 base::WeakPtr<SpdySession> spdy_session_; |
142 std::string user_agent_; | 142 SpdyString user_agent_; |
143 GURL url_; | 143 GURL url_; |
144 HostPortPair proxy_host_port_; | 144 HostPortPair proxy_host_port_; |
145 HostPortPair endpoint_host_port_pair_; | 145 HostPortPair endpoint_host_port_pair_; |
146 ProxyServer proxy_; | 146 ProxyServer proxy_; |
147 SpdySessionKey endpoint_spdy_session_key_; | 147 SpdySessionKey endpoint_spdy_session_key_; |
148 | 148 |
149 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); | 149 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest); |
150 }; | 150 }; |
151 | 151 |
152 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() | 152 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest() |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 void SpdyProxyClientSocketTest::AssertConnectionEstablished() { | 235 void SpdyProxyClientSocketTest::AssertConnectionEstablished() { |
236 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 236 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
237 ASSERT_TRUE(response != NULL); | 237 ASSERT_TRUE(response != NULL); |
238 ASSERT_EQ(200, response->headers->response_code()); | 238 ASSERT_EQ(200, response->headers->response_code()); |
239 } | 239 } |
240 | 240 |
241 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, | 241 void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data, |
242 int len) { | 242 int len) { |
243 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 243 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
244 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); | 244 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback())); |
245 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 245 ASSERT_EQ(SpdyString(data, len), SpdyString(buf->data(), len)); |
246 ASSERT_TRUE(sock_->IsConnected()); | 246 ASSERT_TRUE(sock_->IsConnected()); |
247 } | 247 } |
248 | 248 |
249 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, | 249 void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data, |
250 int len) { | 250 int len) { |
251 // Issue the read, which will be completed asynchronously | 251 // Issue the read, which will be completed asynchronously |
252 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); | 252 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); |
253 ASSERT_EQ(ERR_IO_PENDING, | 253 ASSERT_EQ(ERR_IO_PENDING, |
254 sock_->Read(buf.get(), len, read_callback_.callback())); | 254 sock_->Read(buf.get(), len, read_callback_.callback())); |
255 EXPECT_TRUE(sock_->IsConnected()); | 255 EXPECT_TRUE(sock_->IsConnected()); |
256 | 256 |
257 ResumeAndRun(); | 257 ResumeAndRun(); |
258 | 258 |
259 EXPECT_EQ(len, read_callback_.WaitForResult()); | 259 EXPECT_EQ(len, read_callback_.WaitForResult()); |
260 EXPECT_TRUE(sock_->IsConnected()); | 260 EXPECT_TRUE(sock_->IsConnected()); |
261 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len)); | 261 ASSERT_EQ(SpdyString(data, len), SpdyString(buf->data(), len)); |
262 } | 262 } |
263 | 263 |
264 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { | 264 void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) { |
265 // Issue the read, which will be completed asynchronously. | 265 // Issue the read, which will be completed asynchronously. |
266 read_buf_ = new IOBuffer(len); | 266 read_buf_ = new IOBuffer(len); |
267 ASSERT_EQ(ERR_IO_PENDING, | 267 ASSERT_EQ(ERR_IO_PENDING, |
268 sock_->Read(read_buf_.get(), len, read_callback_.callback())); | 268 sock_->Read(read_buf_.get(), len, read_callback_.callback())); |
269 EXPECT_TRUE(sock_->IsConnected()); | 269 EXPECT_TRUE(sock_->IsConnected()); |
270 } | 270 } |
271 | 271 |
272 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { | 272 void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) { |
273 EXPECT_TRUE(sock_->IsConnected()); | 273 EXPECT_TRUE(sock_->IsConnected()); |
274 | 274 |
275 // Now the read will return | 275 // Now the read will return |
276 EXPECT_EQ(len, read_callback_.WaitForResult()); | 276 EXPECT_EQ(len, read_callback_.WaitForResult()); |
277 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); | 277 ASSERT_EQ(SpdyString(data, len), SpdyString(read_buf_->data(), len)); |
278 } | 278 } |
279 | 279 |
280 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, | 280 void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data, |
281 int len) { | 281 int len) { |
282 AssertWriteReturns(data, len, ERR_IO_PENDING); | 282 AssertWriteReturns(data, len, ERR_IO_PENDING); |
283 AssertWriteLength(len); | 283 AssertWriteLength(len); |
284 } | 284 } |
285 | 285 |
286 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, | 286 void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data, |
287 int len, | 287 int len, |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 447 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
448 | 448 |
449 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 449 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
450 ASSERT_TRUE(response != NULL); | 450 ASSERT_TRUE(response != NULL); |
451 | 451 |
452 const HttpResponseHeaders* headers = response->headers.get(); | 452 const HttpResponseHeaders* headers = response->headers.get(); |
453 ASSERT_EQ(302, headers->response_code()); | 453 ASSERT_EQ(302, headers->response_code()); |
454 ASSERT_FALSE(headers->HasHeader("set-cookie")); | 454 ASSERT_FALSE(headers->HasHeader("set-cookie")); |
455 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); | 455 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0")); |
456 | 456 |
457 std::string location; | 457 SpdyString location; |
458 ASSERT_TRUE(headers->IsRedirect(&location)); | 458 ASSERT_TRUE(headers->IsRedirect(&location)); |
459 ASSERT_EQ(location, kRedirectUrl); | 459 ASSERT_EQ(location, kRedirectUrl); |
460 | 460 |
461 // Let the RST_STREAM write while |rst| is in-scope. | 461 // Let the RST_STREAM write while |rst| is in-scope. |
462 base::RunLoop().RunUntilIdle(); | 462 base::RunLoop().RunUntilIdle(); |
463 } | 463 } |
464 | 464 |
465 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { | 465 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
466 SpdySerializedFrame conn(ConstructConnectRequestFrame()); | 466 SpdySerializedFrame conn(ConstructConnectRequestFrame()); |
467 MockWrite writes[] = { | 467 MockWrite writes[] = { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 | 561 |
562 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 562 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
563 | 563 |
564 AssertConnectSucceeds(); | 564 AssertConnectSucceeds(); |
565 | 565 |
566 AssertAsyncWriteSucceeds(kMsg1, kLen1); | 566 AssertAsyncWriteSucceeds(kMsg1, kLen1); |
567 AssertAsyncWriteSucceeds(kMsg2, kLen2); | 567 AssertAsyncWriteSucceeds(kMsg2, kLen2); |
568 } | 568 } |
569 | 569 |
570 TEST_F(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { | 570 TEST_F(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { |
571 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 571 SpdyString chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
572 SpdySerializedFrame conn(ConstructConnectRequestFrame()); | 572 SpdySerializedFrame conn(ConstructConnectRequestFrame()); |
573 SpdySerializedFrame chunk( | 573 SpdySerializedFrame chunk( |
574 ConstructBodyFrame(chunk_data.data(), chunk_data.length())); | 574 ConstructBodyFrame(chunk_data.data(), chunk_data.length())); |
575 MockWrite writes[] = {CreateMockWrite(conn, 0, SYNCHRONOUS), | 575 MockWrite writes[] = {CreateMockWrite(conn, 0, SYNCHRONOUS), |
576 CreateMockWrite(chunk, 3, SYNCHRONOUS), | 576 CreateMockWrite(chunk, 3, SYNCHRONOUS), |
577 CreateMockWrite(chunk, 4, SYNCHRONOUS), | 577 CreateMockWrite(chunk, 4, SYNCHRONOUS), |
578 CreateMockWrite(chunk, 5, SYNCHRONOUS)}; | 578 CreateMockWrite(chunk, 5, SYNCHRONOUS)}; |
579 | 579 |
580 SpdySerializedFrame resp(ConstructConnectReplyFrame()); | 580 SpdySerializedFrame resp(ConstructConnectReplyFrame()); |
581 MockRead reads[] = { | 581 MockRead reads[] = { |
582 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), | 582 CreateMockRead(resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2), |
583 }; | 583 }; |
584 | 584 |
585 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 585 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
586 | 586 |
587 AssertConnectSucceeds(); | 587 AssertConnectSucceeds(); |
588 | 588 |
589 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); | 589 SpdyString big_data(kMaxSpdyFrameChunkSize * 3, 'x'); |
590 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), | 590 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), |
591 big_data.length())); | 591 big_data.length())); |
592 | 592 |
593 EXPECT_EQ(ERR_IO_PENDING, | 593 EXPECT_EQ(ERR_IO_PENDING, |
594 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 594 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
595 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); | 595 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); |
596 } | 596 } |
597 | 597 |
598 // ----------- Read | 598 // ----------- Read |
599 | 599 |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 | 789 |
790 // SpdySession consumes the next read and sends it to sock_ to be buffered. | 790 // SpdySession consumes the next read and sends it to sock_ to be buffered. |
791 ResumeAndRun(); | 791 ResumeAndRun(); |
792 // The payload from the single large data frame will be read across | 792 // The payload from the single large data frame will be read across |
793 // two different reads. | 793 // two different reads. |
794 AssertSyncReadEquals(kMsg33, kLen33); | 794 AssertSyncReadEquals(kMsg33, kLen33); |
795 | 795 |
796 // Now attempt to do a read of more data than remains buffered | 796 // Now attempt to do a read of more data than remains buffered |
797 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); | 797 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); |
798 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); | 798 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback())); |
799 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); | 799 ASSERT_EQ(SpdyString(kMsg3, kLen3), SpdyString(buf->data(), kLen3)); |
800 ASSERT_TRUE(sock_->IsConnected()); | 800 ASSERT_TRUE(sock_->IsConnected()); |
801 } | 801 } |
802 | 802 |
803 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { | 803 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { |
804 SpdySerializedFrame conn(ConstructConnectRequestFrame()); | 804 SpdySerializedFrame conn(ConstructConnectRequestFrame()); |
805 MockWrite writes[] = { | 805 MockWrite writes[] = { |
806 CreateMockWrite(conn, 0, SYNCHRONOUS), | 806 CreateMockWrite(conn, 0, SYNCHRONOUS), |
807 }; | 807 }; |
808 | 808 |
809 SpdySerializedFrame resp(ConstructConnectAuthReplyFrame()); | 809 SpdySerializedFrame resp(ConstructConnectAuthReplyFrame()); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 | 1018 |
1019 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1019 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
1020 | 1020 |
1021 AssertConnectSucceeds(); | 1021 AssertConnectSucceeds(); |
1022 | 1022 |
1023 ResumeAndRun(); | 1023 ResumeAndRun(); |
1024 | 1024 |
1025 ASSERT_FALSE(sock_->IsConnected()); | 1025 ASSERT_FALSE(sock_->IsConnected()); |
1026 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1026 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
1027 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); | 1027 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback())); |
1028 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); | 1028 ASSERT_EQ(SpdyString(kMsg1, kLen1), SpdyString(buf->data(), kLen1)); |
1029 | 1029 |
1030 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1030 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1031 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1031 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
1032 sock_->Disconnect(); | 1032 sock_->Disconnect(); |
1033 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1033 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
1034 sock_->Read(NULL, 1, CompletionCallback())); | 1034 sock_->Read(NULL, 1, CompletionCallback())); |
1035 } | 1035 } |
1036 | 1036 |
1037 // Calling Write() on a closed socket is an error | 1037 // Calling Write() on a closed socket is an error |
1038 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1038 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 AssertConnectSucceeds(); | 1107 AssertConnectSucceeds(); |
1108 | 1108 |
1109 EXPECT_TRUE(sock_->IsConnected()); | 1109 EXPECT_TRUE(sock_->IsConnected()); |
1110 | 1110 |
1111 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1111 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
1112 EXPECT_EQ(ERR_IO_PENDING, | 1112 EXPECT_EQ(ERR_IO_PENDING, |
1113 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); | 1113 sock_->Write(buf.get(), buf->size(), write_callback_.callback())); |
1114 // Make sure the write actually starts. | 1114 // Make sure the write actually starts. |
1115 base::RunLoop().RunUntilIdle(); | 1115 base::RunLoop().RunUntilIdle(); |
1116 | 1116 |
1117 CloseSpdySession(ERR_ABORTED, std::string()); | 1117 CloseSpdySession(ERR_ABORTED, SpdyString()); |
1118 | 1118 |
1119 EXPECT_THAT(write_callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 1119 EXPECT_THAT(write_callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
1120 } | 1120 } |
1121 | 1121 |
1122 // If the socket is Disconnected with a pending Write(), the callback | 1122 // If the socket is Disconnected with a pending Write(), the callback |
1123 // should not be called. | 1123 // should not be called. |
1124 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1124 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
1125 SpdySerializedFrame conn(ConstructConnectRequestFrame()); | 1125 SpdySerializedFrame conn(ConstructConnectRequestFrame()); |
1126 SpdySerializedFrame rst( | 1126 SpdySerializedFrame rst( |
1127 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL)); | 1127 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL)); |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1355 | 1355 |
1356 EXPECT_FALSE(sock_.get()); | 1356 EXPECT_FALSE(sock_.get()); |
1357 EXPECT_TRUE(read_callback.have_result()); | 1357 EXPECT_TRUE(read_callback.have_result()); |
1358 EXPECT_FALSE(write_callback_.have_result()); | 1358 EXPECT_FALSE(write_callback_.have_result()); |
1359 | 1359 |
1360 // Let the RST_STREAM write while |rst| is in-scope. | 1360 // Let the RST_STREAM write while |rst| is in-scope. |
1361 base::RunLoop().RunUntilIdle(); | 1361 base::RunLoop().RunUntilIdle(); |
1362 } | 1362 } |
1363 | 1363 |
1364 } // namespace net | 1364 } // namespace net |
OLD | NEW |