| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/http/http_proxy_client_socket_pool.h" | 5 #include "net/http/http_proxy_client_socket_pool.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/string_util.h" | |
| 10 #include "net/base/mock_host_resolver.h" | |
| 11 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 12 #include "net/base/ssl_config_service_defaults.h" | |
| 13 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
| 14 #include "net/http/http_auth_handler_factory.h" | |
| 15 #include "net/http/http_network_session.h" | |
| 16 #include "net/http/http_proxy_client_socket.h" | 11 #include "net/http/http_proxy_client_socket.h" |
| 17 #include "net/proxy/proxy_service.h" | |
| 18 #include "net/socket/client_socket_handle.h" | 12 #include "net/socket/client_socket_handle.h" |
| 19 #include "net/socket/client_socket_pool_histograms.h" | 13 #include "net/socket/client_socket_pool_histograms.h" |
| 20 #include "net/socket/socket_test_util.h" | 14 #include "net/socket/socket_test_util.h" |
| 21 #include "net/spdy/spdy_session_pool.h" | |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 16 |
| 24 namespace net { | 17 namespace net { |
| 25 | 18 |
| 26 namespace { | 19 namespace { |
| 27 | 20 |
| 28 const int kMaxSockets = 32; | 21 const int kMaxSockets = 32; |
| 29 const int kMaxSocketsPerGroup = 6; | 22 const int kMaxSocketsPerGroup = 6; |
| 30 | 23 |
| 31 class HttpProxyClientSocketPoolTest : public ClientSocketPoolTest { | 24 class HttpProxyClientSocketPoolTest : public ClientSocketPoolTest { |
| 32 protected: | 25 protected: |
| 33 HttpProxyClientSocketPoolTest() | 26 HttpProxyClientSocketPoolTest() |
| 34 : ignored_tcp_socket_params_(new TCPSocketParams( | 27 : ignored_tcp_socket_params_(new TCPSocketParams( |
| 35 HostPortPair("proxy", 80), MEDIUM, GURL(), false)), | 28 HostPortPair("proxy", 80), MEDIUM, GURL(), false)), |
| 36 tcp_histograms_(new ClientSocketPoolHistograms("MockTCP")), | 29 tcp_histograms_(new ClientSocketPoolHistograms("MockTCP")), |
| 37 tcp_socket_pool_(new MockTCPClientSocketPool(kMaxSockets, | 30 tcp_socket_pool_(new MockTCPClientSocketPool(kMaxSockets, |
| 38 kMaxSocketsPerGroup, tcp_histograms_, &tcp_client_socket_factory_)), | 31 kMaxSocketsPerGroup, tcp_histograms_, &tcp_client_socket_factory_)), |
| 39 http_auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()), | |
| 40 session_(new HttpNetworkSession(new MockHostResolver, | |
| 41 ProxyService::CreateNull(), | |
| 42 &socket_factory_, | |
| 43 new SSLConfigServiceDefaults, | |
| 44 new SpdySessionPool(), | |
| 45 http_auth_handler_factory_.get(), | |
| 46 NULL, | |
| 47 NULL)), | |
| 48 notunnel_socket_params_(new HttpProxySocketParams( | 32 notunnel_socket_params_(new HttpProxySocketParams( |
| 49 ignored_tcp_socket_params_, GURL("http://host"), | 33 ignored_tcp_socket_params_, GURL("http://host"), |
| 50 HostPortPair("host", 80), NULL, false)), | 34 HostPortPair("host", 80), NULL, false)), |
| 35 auth_controller_(new MockHttpAuthController), |
| 51 tunnel_socket_params_(new HttpProxySocketParams( | 36 tunnel_socket_params_(new HttpProxySocketParams( |
| 52 ignored_tcp_socket_params_, GURL("http://host"), | 37 ignored_tcp_socket_params_, GURL("http://host"), |
| 53 HostPortPair("host", 80), session_, true)), | 38 HostPortPair("host", 80), auth_controller_, true)), |
| 54 http_proxy_histograms_( | 39 http_proxy_histograms_( |
| 55 new ClientSocketPoolHistograms("HttpProxyUnitTest")), | 40 new ClientSocketPoolHistograms("HttpProxyUnitTest")), |
| 56 pool_(new HttpProxyClientSocketPool(kMaxSockets, kMaxSocketsPerGroup, | 41 pool_(new HttpProxyClientSocketPool(kMaxSockets, kMaxSocketsPerGroup, |
| 57 http_proxy_histograms_, NULL, tcp_socket_pool_, NULL)) { | 42 http_proxy_histograms_, NULL, tcp_socket_pool_, NULL)) { |
| 58 } | 43 } |
| 59 | 44 |
| 60 void AddAuthToCache() { | |
| 61 const string16 kFoo(ASCIIToUTF16("foo")); | |
| 62 const string16 kBar(ASCIIToUTF16("bar")); | |
| 63 session_->auth_cache()->Add(GURL("http://proxy/"), "MyRealm1", "Basic", | |
| 64 "Basic realm=MyRealm1", kFoo, kBar, "/"); | |
| 65 } | |
| 66 | |
| 67 int StartRequest(const std::string& group_name, RequestPriority priority) { | 45 int StartRequest(const std::string& group_name, RequestPriority priority) { |
| 68 return StartRequestUsingPool( | 46 return StartRequestUsingPool( |
| 69 pool_, group_name, priority, tunnel_socket_params_); | 47 pool_, group_name, priority, tunnel_socket_params_); |
| 70 } | 48 } |
| 71 | 49 |
| 72 scoped_refptr<TCPSocketParams> ignored_tcp_socket_params_; | 50 scoped_refptr<TCPSocketParams> ignored_tcp_socket_params_; |
| 73 scoped_refptr<ClientSocketPoolHistograms> tcp_histograms_; | 51 scoped_refptr<ClientSocketPoolHistograms> tcp_histograms_; |
| 74 MockClientSocketFactory tcp_client_socket_factory_; | 52 MockClientSocketFactory tcp_client_socket_factory_; |
| 75 scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_; | 53 scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_; |
| 76 | 54 |
| 77 MockClientSocketFactory socket_factory_; | |
| 78 scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_; | |
| 79 scoped_refptr<HttpNetworkSession> session_; | |
| 80 scoped_refptr<HttpProxySocketParams> notunnel_socket_params_; | 55 scoped_refptr<HttpProxySocketParams> notunnel_socket_params_; |
| 56 scoped_refptr<MockHttpAuthController> auth_controller_; |
| 81 scoped_refptr<HttpProxySocketParams> tunnel_socket_params_; | 57 scoped_refptr<HttpProxySocketParams> tunnel_socket_params_; |
| 82 scoped_refptr<ClientSocketPoolHistograms> http_proxy_histograms_; | 58 scoped_refptr<ClientSocketPoolHistograms> http_proxy_histograms_; |
| 83 scoped_refptr<HttpProxyClientSocketPool> pool_; | 59 scoped_refptr<HttpProxyClientSocketPool> pool_; |
| 84 }; | 60 }; |
| 85 | 61 |
| 86 TEST_F(HttpProxyClientSocketPoolTest, NoTunnel) { | 62 TEST_F(HttpProxyClientSocketPoolTest, NoTunnel) { |
| 87 StaticSocketDataProvider data; | 63 StaticSocketDataProvider data; |
| 88 data.set_connect_data(MockConnect(false, 0)); | 64 data.set_connect_data(MockConnect(false, 0)); |
| 89 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 65 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 90 | 66 |
| 91 ClientSocketHandle handle; | 67 ClientSocketHandle handle; |
| 92 int rv = handle.Init("a", notunnel_socket_params_, LOW, NULL, pool_, | 68 int rv = handle.Init("a", notunnel_socket_params_, LOW, NULL, pool_, |
| 93 BoundNetLog()); | 69 BoundNetLog()); |
| 94 EXPECT_EQ(OK, rv); | 70 EXPECT_EQ(OK, rv); |
| 95 EXPECT_TRUE(handle.is_initialized()); | 71 EXPECT_TRUE(handle.is_initialized()); |
| 96 EXPECT_TRUE(handle.socket()); | 72 EXPECT_TRUE(handle.socket()); |
| 97 HttpProxyClientSocket* tunnel_socket = | 73 HttpProxyClientSocket* tunnel_socket = |
| 98 static_cast<HttpProxyClientSocket*>(handle.socket()); | 74 static_cast<HttpProxyClientSocket*>(handle.socket()); |
| 99 EXPECT_TRUE(tunnel_socket->IsConnected()); | 75 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth()); |
| 100 } | 76 } |
| 101 | 77 |
| 102 TEST_F(HttpProxyClientSocketPoolTest, NeedAuth) { | 78 TEST_F(HttpProxyClientSocketPoolTest, NeedAuth) { |
| 103 MockWrite writes[] = { | 79 MockWrite writes[] = { |
| 104 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | 80 MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
| 105 "Host: host\r\n" | 81 "Host: host\r\n" |
| 106 "Proxy-Connection: keep-alive\r\n\r\n"), | 82 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 107 }; | 83 }; |
| 108 MockRead reads[] = { | 84 MockRead reads[] = { |
| 109 // No credentials. | 85 // No credentials. |
| 110 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 86 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
| 111 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 87 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
| 112 MockRead("Content-Length: 10\r\n\r\n"), | 88 MockRead("Content-Length: 10\r\n\r\n"), |
| 113 MockRead("0123456789"), | 89 MockRead("0123456789"), |
| 114 }; | 90 }; |
| 115 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 91 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 116 arraysize(writes)); | 92 arraysize(writes)); |
| 117 | 93 |
| 118 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 94 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 95 MockHttpAuthControllerData auth_data[] = { |
| 96 MockHttpAuthControllerData(""), |
| 97 }; |
| 98 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); |
| 119 | 99 |
| 120 ClientSocketHandle handle; | 100 ClientSocketHandle handle; |
| 121 TestCompletionCallback callback; | 101 TestCompletionCallback callback; |
| 122 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 102 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 123 BoundNetLog()); | 103 BoundNetLog()); |
| 124 EXPECT_EQ(ERR_IO_PENDING, rv); | 104 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 125 EXPECT_FALSE(handle.is_initialized()); | 105 EXPECT_FALSE(handle.is_initialized()); |
| 126 EXPECT_FALSE(handle.socket()); | 106 EXPECT_FALSE(handle.socket()); |
| 127 | 107 |
| 128 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); | 108 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); |
| 129 EXPECT_TRUE(handle.is_initialized()); | 109 EXPECT_TRUE(handle.is_initialized()); |
| 130 EXPECT_TRUE(handle.socket()); | 110 EXPECT_TRUE(handle.socket()); |
| 131 HttpProxyClientSocket* tunnel_socket = | 111 HttpProxyClientSocket* tunnel_socket = |
| 132 static_cast<HttpProxyClientSocket*>(handle.socket()); | 112 static_cast<HttpProxyClientSocket*>(handle.socket()); |
| 133 EXPECT_FALSE(tunnel_socket->IsConnected()); | 113 EXPECT_TRUE(tunnel_socket->NeedsRestartWithAuth()); |
| 134 } | 114 } |
| 135 | 115 |
| 136 TEST_F(HttpProxyClientSocketPoolTest, HaveAuth) { | 116 TEST_F(HttpProxyClientSocketPoolTest, HaveAuth) { |
| 137 MockWrite writes[] = { | 117 MockWrite writes[] = { |
| 138 MockWrite(false, | 118 MockWrite(false, |
| 139 "CONNECT host:80 HTTP/1.1\r\n" | 119 "CONNECT host:80 HTTP/1.1\r\n" |
| 140 "Host: host\r\n" | 120 "Host: host\r\n" |
| 141 "Proxy-Connection: keep-alive\r\n" | 121 "Proxy-Connection: keep-alive\r\n" |
| 142 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 122 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
| 143 }; | 123 }; |
| 144 MockRead reads[] = { | 124 MockRead reads[] = { |
| 145 MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 125 MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 146 }; | 126 }; |
| 147 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 127 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 148 arraysize(writes)); | 128 arraysize(writes)); |
| 149 data.set_connect_data(MockConnect(false, 0)); | 129 data.set_connect_data(MockConnect(false, 0)); |
| 150 | 130 |
| 151 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 131 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 152 AddAuthToCache(); | 132 MockHttpAuthControllerData auth_data[] = { |
| 133 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="), |
| 134 }; |
| 135 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); |
| 153 | 136 |
| 154 ClientSocketHandle handle; | 137 ClientSocketHandle handle; |
| 155 TestCompletionCallback callback; | 138 TestCompletionCallback callback; |
| 156 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 139 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 157 BoundNetLog()); | 140 BoundNetLog()); |
| 158 EXPECT_EQ(OK, rv); | 141 EXPECT_EQ(OK, rv); |
| 159 EXPECT_TRUE(handle.is_initialized()); | 142 EXPECT_TRUE(handle.is_initialized()); |
| 160 EXPECT_TRUE(handle.socket()); | 143 EXPECT_TRUE(handle.socket()); |
| 161 HttpProxyClientSocket* tunnel_socket = | 144 HttpProxyClientSocket* tunnel_socket = |
| 162 static_cast<HttpProxyClientSocket*>(handle.socket()); | 145 static_cast<HttpProxyClientSocket*>(handle.socket()); |
| 163 EXPECT_TRUE(tunnel_socket->IsConnected()); | 146 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth()); |
| 164 } | 147 } |
| 165 | 148 |
| 166 TEST_F(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { | 149 TEST_F(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { |
| 167 MockWrite writes[] = { | 150 MockWrite writes[] = { |
| 168 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | 151 MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
| 169 "Host: host\r\n" | 152 "Host: host\r\n" |
| 170 "Proxy-Connection: keep-alive\r\n" | 153 "Proxy-Connection: keep-alive\r\n" |
| 171 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 154 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
| 172 }; | 155 }; |
| 173 MockRead reads[] = { | 156 MockRead reads[] = { |
| 174 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | 157 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 175 }; | 158 }; |
| 176 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 159 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 177 arraysize(writes)); | 160 arraysize(writes)); |
| 178 | 161 |
| 179 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 162 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 180 AddAuthToCache(); | 163 MockHttpAuthControllerData auth_data[] = { |
| 164 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="), |
| 165 }; |
| 166 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); |
| 181 | 167 |
| 182 ClientSocketHandle handle; | 168 ClientSocketHandle handle; |
| 183 TestCompletionCallback callback; | 169 TestCompletionCallback callback; |
| 184 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 170 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 185 BoundNetLog()); | 171 BoundNetLog()); |
| 186 EXPECT_EQ(ERR_IO_PENDING, rv); | 172 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 187 EXPECT_FALSE(handle.is_initialized()); | 173 EXPECT_FALSE(handle.is_initialized()); |
| 188 EXPECT_FALSE(handle.socket()); | 174 EXPECT_FALSE(handle.socket()); |
| 189 | 175 |
| 190 EXPECT_EQ(OK, callback.WaitForResult()); | 176 EXPECT_EQ(OK, callback.WaitForResult()); |
| 191 EXPECT_TRUE(handle.is_initialized()); | 177 EXPECT_TRUE(handle.is_initialized()); |
| 192 EXPECT_TRUE(handle.socket()); | 178 EXPECT_TRUE(handle.socket()); |
| 193 HttpProxyClientSocket* tunnel_socket = | 179 HttpProxyClientSocket* tunnel_socket = |
| 194 static_cast<HttpProxyClientSocket*>(handle.socket()); | 180 static_cast<HttpProxyClientSocket*>(handle.socket()); |
| 195 EXPECT_TRUE(tunnel_socket->IsConnected()); | 181 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth()); |
| 196 } | 182 } |
| 197 | 183 |
| 198 TEST_F(HttpProxyClientSocketPoolTest, TCPError) { | 184 TEST_F(HttpProxyClientSocketPoolTest, TCPError) { |
| 199 StaticSocketDataProvider data; | 185 StaticSocketDataProvider data; |
| 200 data.set_connect_data(MockConnect(true, ERR_CONNECTION_CLOSED)); | 186 data.set_connect_data(MockConnect(true, ERR_CONNECTION_CLOSED)); |
| 201 | 187 |
| 202 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 188 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 203 | 189 |
| 204 ClientSocketHandle handle; | 190 ClientSocketHandle handle; |
| 205 TestCompletionCallback callback; | 191 TestCompletionCallback callback; |
| 206 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 192 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 207 BoundNetLog()); | 193 BoundNetLog()); |
| 208 EXPECT_EQ(ERR_IO_PENDING, rv); | 194 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 209 EXPECT_FALSE(handle.is_initialized()); | 195 EXPECT_FALSE(handle.is_initialized()); |
| 210 EXPECT_FALSE(handle.socket()); | 196 EXPECT_FALSE(handle.socket()); |
| 211 | 197 |
| 212 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 198 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); |
| 213 EXPECT_FALSE(handle.is_initialized()); | 199 EXPECT_FALSE(handle.is_initialized()); |
| 214 EXPECT_FALSE(handle.socket()); | 200 EXPECT_FALSE(handle.socket()); |
| 215 } | 201 } |
| 216 | 202 |
| 217 TEST_F(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { | 203 TEST_F(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { |
| 218 MockWrite writes[] = { | 204 MockWrite writes[] = { |
| 219 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | 205 MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
| 220 "Host: host\r\n" | 206 "Host: host\r\n" |
| 221 "Proxy-Connection: keep-alive\r\n" | 207 "Proxy-Connection: keep-alive\r\n" |
| 222 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 208 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
| 223 }; | 209 }; |
| 224 MockRead reads[] = { | 210 MockRead reads[] = { |
| 225 MockRead("HTTP/1.1 200 Conn"), | 211 MockRead("HTTP/1.1 200 Conn"), |
| 226 MockRead(true, ERR_CONNECTION_CLOSED), | 212 MockRead(true, ERR_CONNECTION_CLOSED), |
| 227 }; | 213 }; |
| 228 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 214 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 229 arraysize(writes)); | 215 arraysize(writes)); |
| 230 | 216 |
| 231 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 217 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 232 AddAuthToCache(); | 218 MockHttpAuthControllerData auth_data[] = { |
| 219 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="), |
| 220 }; |
| 221 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); |
| 233 | 222 |
| 234 ClientSocketHandle handle; | 223 ClientSocketHandle handle; |
| 235 TestCompletionCallback callback; | 224 TestCompletionCallback callback; |
| 236 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 225 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 237 BoundNetLog()); | 226 BoundNetLog()); |
| 238 EXPECT_EQ(ERR_IO_PENDING, rv); | 227 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 239 EXPECT_FALSE(handle.is_initialized()); | 228 EXPECT_FALSE(handle.is_initialized()); |
| 240 EXPECT_FALSE(handle.socket()); | 229 EXPECT_FALSE(handle.socket()); |
| 241 | 230 |
| 242 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 231 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); |
| 243 EXPECT_FALSE(handle.is_initialized()); | 232 EXPECT_FALSE(handle.is_initialized()); |
| 244 EXPECT_FALSE(handle.socket()); | 233 EXPECT_FALSE(handle.socket()); |
| 245 } | 234 } |
| 246 | 235 |
| 247 TEST_F(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 236 TEST_F(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
| 248 MockWrite writes[] = { | 237 MockWrite writes[] = { |
| 249 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | 238 MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
| 250 "Host: host\r\n" | 239 "Host: host\r\n" |
| 251 "Proxy-Connection: keep-alive\r\n" | 240 "Proxy-Connection: keep-alive\r\n" |
| 252 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 241 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
| 253 }; | 242 }; |
| 254 MockRead reads[] = { | 243 MockRead reads[] = { |
| 255 MockRead("HTTP/1.1 304 Not Modified\r\n\r\n"), | 244 MockRead("HTTP/1.1 304 Not Modified\r\n\r\n"), |
| 256 }; | 245 }; |
| 257 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 246 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 258 arraysize(writes)); | 247 arraysize(writes)); |
| 259 | 248 |
| 260 tcp_client_socket_factory_.AddSocketDataProvider(&data); | 249 tcp_client_socket_factory_.AddSocketDataProvider(&data); |
| 261 AddAuthToCache(); | 250 MockHttpAuthControllerData auth_data[] = { |
| 251 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="), |
| 252 }; |
| 253 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); |
| 262 | 254 |
| 263 ClientSocketHandle handle; | 255 ClientSocketHandle handle; |
| 264 TestCompletionCallback callback; | 256 TestCompletionCallback callback; |
| 265 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, | 257 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, |
| 266 BoundNetLog()); | 258 BoundNetLog()); |
| 267 EXPECT_EQ(ERR_IO_PENDING, rv); | 259 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 268 EXPECT_FALSE(handle.is_initialized()); | 260 EXPECT_FALSE(handle.is_initialized()); |
| 269 EXPECT_FALSE(handle.socket()); | 261 EXPECT_FALSE(handle.socket()); |
| 270 | 262 |
| 271 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback.WaitForResult()); | 263 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback.WaitForResult()); |
| 272 EXPECT_FALSE(handle.is_initialized()); | 264 EXPECT_FALSE(handle.is_initialized()); |
| 273 EXPECT_FALSE(handle.socket()); | 265 EXPECT_FALSE(handle.socket()); |
| 274 } | 266 } |
| 275 | 267 |
| 276 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 268 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
| 277 | 269 |
| 278 } // namespace | 270 } // namespace |
| 279 | 271 |
| 280 } // namespace net | 272 } // namespace net |
| OLD | NEW |