| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/base/address_list.h" | 5 #include "net/base/address_list.h" |
| 6 #include "net/base/client_socket_factory.h" | 6 #include "net/base/client_socket_factory.h" |
| 7 #include "net/base/host_resolver.h" | 7 #include "net/base/host_resolver.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "net/base/ssl_client_socket.h" | 9 #include "net/base/ssl_client_socket.h" |
| 10 #include "net/base/ssl_config_service.h" | 10 #include "net/base/ssl_config_service.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 StartOKServer(); | 72 StartOKServer(); |
| 73 | 73 |
| 74 net::AddressList addr; | 74 net::AddressList addr; |
| 75 net::HostResolver resolver; | 75 net::HostResolver resolver; |
| 76 TestCompletionCallback callback; | 76 TestCompletionCallback callback; |
| 77 | 77 |
| 78 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, | 78 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, |
| 79 &addr, NULL); | 79 &addr, NULL); |
| 80 EXPECT_EQ(net::OK, rv); | 80 EXPECT_EQ(net::OK, rv); |
| 81 | 81 |
| 82 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 83 rv = transport->Connect(&callback); |
| 84 if (rv == net::ERR_IO_PENDING) |
| 85 rv = callback.WaitForResult(); |
| 86 EXPECT_EQ(net::OK, rv); |
| 87 |
| 82 scoped_ptr<net::SSLClientSocket> sock( | 88 scoped_ptr<net::SSLClientSocket> sock( |
| 83 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 89 socket_factory_->CreateSSLClientSocket(transport, |
| 84 server_.kHostName, kDefaultSSLConfig)); | 90 server_.kHostName, kDefaultSSLConfig)); |
| 85 | 91 |
| 86 EXPECT_FALSE(sock->IsConnected()); | 92 EXPECT_FALSE(sock->IsConnected()); |
| 87 | 93 |
| 88 rv = sock->Connect(&callback); | 94 rv = sock->Connect(&callback); |
| 89 if (rv != net::OK) { | 95 if (rv != net::OK) { |
| 90 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 96 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 91 EXPECT_FALSE(sock->IsConnected()); | 97 EXPECT_FALSE(sock->IsConnected()); |
| 92 | 98 |
| 93 rv = callback.WaitForResult(); | 99 rv = callback.WaitForResult(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 104 StartExpiredServer(); | 110 StartExpiredServer(); |
| 105 | 111 |
| 106 net::AddressList addr; | 112 net::AddressList addr; |
| 107 net::HostResolver resolver; | 113 net::HostResolver resolver; |
| 108 TestCompletionCallback callback; | 114 TestCompletionCallback callback; |
| 109 | 115 |
| 110 int rv = resolver.Resolve(server_.kHostName, server_.kBadHTTPSPort, | 116 int rv = resolver.Resolve(server_.kHostName, server_.kBadHTTPSPort, |
| 111 &addr, NULL); | 117 &addr, NULL); |
| 112 EXPECT_EQ(net::OK, rv); | 118 EXPECT_EQ(net::OK, rv); |
| 113 | 119 |
| 120 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 121 rv = transport->Connect(&callback); |
| 122 if (rv == net::ERR_IO_PENDING) |
| 123 rv = callback.WaitForResult(); |
| 124 EXPECT_EQ(net::OK, rv); |
| 125 |
| 114 scoped_ptr<net::SSLClientSocket> sock( | 126 scoped_ptr<net::SSLClientSocket> sock( |
| 115 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 127 socket_factory_->CreateSSLClientSocket(transport, |
| 116 server_.kHostName, kDefaultSSLConfig)); | 128 server_.kHostName, kDefaultSSLConfig)); |
| 117 | 129 |
| 118 EXPECT_FALSE(sock->IsConnected()); | 130 EXPECT_FALSE(sock->IsConnected()); |
| 119 | 131 |
| 120 rv = sock->Connect(&callback); | 132 rv = sock->Connect(&callback); |
| 121 if (rv != net::OK) { | 133 if (rv != net::OK) { |
| 122 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 134 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 123 EXPECT_FALSE(sock->IsConnected()); | 135 EXPECT_FALSE(sock->IsConnected()); |
| 124 | 136 |
| 125 rv = callback.WaitForResult(); | 137 rv = callback.WaitForResult(); |
| 126 EXPECT_EQ(net::ERR_CERT_DATE_INVALID, rv); | 138 EXPECT_EQ(net::ERR_CERT_DATE_INVALID, rv); |
| 127 } | 139 } |
| 128 | 140 |
| 129 EXPECT_TRUE(sock->IsConnected()); | 141 // We cannot test sock->IsConnected(), as the NSS implementation disconnects |
| 142 // the socket when it encounters an error, whereas other implementations |
| 143 // leave it connected. |
| 130 } | 144 } |
| 131 | 145 |
| 132 TEST_F(SSLClientSocketTest, MAYBE_ConnectMismatched) { | 146 TEST_F(SSLClientSocketTest, MAYBE_ConnectMismatched) { |
| 133 StartMismatchedServer(); | 147 StartMismatchedServer(); |
| 134 | 148 |
| 135 net::AddressList addr; | 149 net::AddressList addr; |
| 136 net::HostResolver resolver; | 150 net::HostResolver resolver; |
| 137 TestCompletionCallback callback; | 151 TestCompletionCallback callback; |
| 138 | 152 |
| 139 int rv = resolver.Resolve(server_.kMismatchedHostName, server_.kOKHTTPSPort, | 153 int rv = resolver.Resolve(server_.kMismatchedHostName, server_.kOKHTTPSPort, |
| 140 &addr, NULL); | 154 &addr, NULL); |
| 141 EXPECT_EQ(net::OK, rv); | 155 EXPECT_EQ(net::OK, rv); |
| 142 | 156 |
| 157 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 158 rv = transport->Connect(&callback); |
| 159 if (rv == net::ERR_IO_PENDING) |
| 160 rv = callback.WaitForResult(); |
| 161 EXPECT_EQ(net::OK, rv); |
| 162 |
| 143 scoped_ptr<net::SSLClientSocket> sock( | 163 scoped_ptr<net::SSLClientSocket> sock( |
| 144 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 164 socket_factory_->CreateSSLClientSocket(transport, |
| 145 server_.kMismatchedHostName, kDefaultSSLConfig)); | 165 server_.kMismatchedHostName, kDefaultSSLConfig)); |
| 146 | 166 |
| 147 EXPECT_FALSE(sock->IsConnected()); | 167 EXPECT_FALSE(sock->IsConnected()); |
| 148 | 168 |
| 149 rv = sock->Connect(&callback); | 169 rv = sock->Connect(&callback); |
| 150 if (rv != net::ERR_CERT_COMMON_NAME_INVALID) { | 170 if (rv != net::ERR_CERT_COMMON_NAME_INVALID) { |
| 151 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 171 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 152 EXPECT_FALSE(sock->IsConnected()); | 172 EXPECT_FALSE(sock->IsConnected()); |
| 153 | 173 |
| 154 rv = callback.WaitForResult(); | 174 rv = callback.WaitForResult(); |
| 155 EXPECT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, rv); | 175 EXPECT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, rv); |
| 156 } | 176 } |
| 157 | 177 |
| 158 // The Windows code happens to keep the connection | 178 // We cannot test sock->IsConnected(), as the NSS implementation disconnects |
| 159 // open now in spite of an error. The designers of | 179 // the socket when it encounters an error, whereas other implementations |
| 160 // this API intended to also allow the connection | 180 // leave it connected. |
| 161 // to be closed on error, in which case the caller | |
| 162 // should call ReconnectIgnoringLastError, but | |
| 163 // that's currently unimplemented. | |
| 164 EXPECT_TRUE(sock->IsConnected()); | |
| 165 } | 181 } |
| 166 | 182 |
| 167 // TODO(wtc): Add unit tests for IsConnectedAndIdle: | 183 // TODO(wtc): Add unit tests for IsConnectedAndIdle: |
| 168 // - Server closes an SSL connection (with a close_notify alert message). | 184 // - Server closes an SSL connection (with a close_notify alert message). |
| 169 // - Server closes the underlying TCP connection directly. | 185 // - Server closes the underlying TCP connection directly. |
| 170 // - Server sends data unexpectedly. | 186 // - Server sends data unexpectedly. |
| 171 | 187 |
| 172 TEST_F(SSLClientSocketTest, MAYBE_Read) { | 188 TEST_F(SSLClientSocketTest, MAYBE_Read) { |
| 173 StartOKServer(); | 189 StartOKServer(); |
| 174 | 190 |
| 175 net::AddressList addr; | 191 net::AddressList addr; |
| 176 net::HostResolver resolver; | 192 net::HostResolver resolver; |
| 177 TestCompletionCallback callback; | 193 TestCompletionCallback callback; |
| 178 | 194 |
| 179 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, | 195 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, |
| 180 &addr, &callback); | 196 &addr, &callback); |
| 181 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 197 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
| 182 | 198 |
| 183 rv = callback.WaitForResult(); | 199 rv = callback.WaitForResult(); |
| 184 EXPECT_EQ(net::OK, rv); | 200 EXPECT_EQ(net::OK, rv); |
| 185 | 201 |
| 202 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 203 rv = transport->Connect(&callback); |
| 204 if (rv == net::ERR_IO_PENDING) |
| 205 rv = callback.WaitForResult(); |
| 206 EXPECT_EQ(net::OK, rv); |
| 207 |
| 186 scoped_ptr<net::SSLClientSocket> sock( | 208 scoped_ptr<net::SSLClientSocket> sock( |
| 187 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 209 socket_factory_->CreateSSLClientSocket(transport, |
| 188 server_.kHostName, | 210 server_.kHostName, |
| 189 kDefaultSSLConfig)); | 211 kDefaultSSLConfig)); |
| 190 | 212 |
| 191 rv = sock->Connect(&callback); | 213 rv = sock->Connect(&callback); |
| 192 if (rv != net::OK) { | 214 if (rv != net::OK) { |
| 193 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 215 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 194 | 216 |
| 195 rv = callback.WaitForResult(); | 217 rv = callback.WaitForResult(); |
| 196 EXPECT_EQ(net::OK, rv); | 218 EXPECT_EQ(net::OK, rv); |
| 197 } | 219 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 224 StartOKServer(); | 246 StartOKServer(); |
| 225 | 247 |
| 226 net::AddressList addr; | 248 net::AddressList addr; |
| 227 net::HostResolver resolver; | 249 net::HostResolver resolver; |
| 228 TestCompletionCallback callback; | 250 TestCompletionCallback callback; |
| 229 | 251 |
| 230 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, | 252 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, |
| 231 &addr, NULL); | 253 &addr, NULL); |
| 232 EXPECT_EQ(net::OK, rv); | 254 EXPECT_EQ(net::OK, rv); |
| 233 | 255 |
| 256 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 257 rv = transport->Connect(&callback); |
| 258 if (rv == net::ERR_IO_PENDING) |
| 259 rv = callback.WaitForResult(); |
| 260 EXPECT_EQ(net::OK, rv); |
| 261 |
| 234 scoped_ptr<net::SSLClientSocket> sock( | 262 scoped_ptr<net::SSLClientSocket> sock( |
| 235 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 263 socket_factory_->CreateSSLClientSocket(transport, |
| 236 server_.kHostName, kDefaultSSLConfig)); | 264 server_.kHostName, kDefaultSSLConfig)); |
| 237 | 265 |
| 238 rv = sock->Connect(&callback); | 266 rv = sock->Connect(&callback); |
| 239 if (rv != net::OK) { | 267 if (rv != net::OK) { |
| 240 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 268 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 241 | 269 |
| 242 rv = callback.WaitForResult(); | 270 rv = callback.WaitForResult(); |
| 243 EXPECT_EQ(net::OK, rv); | 271 EXPECT_EQ(net::OK, rv); |
| 244 } | 272 } |
| 245 | 273 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 270 StartOKServer(); | 298 StartOKServer(); |
| 271 | 299 |
| 272 net::AddressList addr; | 300 net::AddressList addr; |
| 273 net::HostResolver resolver; | 301 net::HostResolver resolver; |
| 274 TestCompletionCallback callback; | 302 TestCompletionCallback callback; |
| 275 | 303 |
| 276 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, | 304 int rv = resolver.Resolve(server_.kHostName, server_.kOKHTTPSPort, |
| 277 &addr, NULL); | 305 &addr, NULL); |
| 278 EXPECT_EQ(net::OK, rv); | 306 EXPECT_EQ(net::OK, rv); |
| 279 | 307 |
| 308 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
| 309 rv = transport->Connect(&callback); |
| 310 if (rv == net::ERR_IO_PENDING) |
| 311 rv = callback.WaitForResult(); |
| 312 EXPECT_EQ(net::OK, rv); |
| 313 |
| 280 scoped_ptr<net::SSLClientSocket> sock( | 314 scoped_ptr<net::SSLClientSocket> sock( |
| 281 socket_factory_->CreateSSLClientSocket(new net::TCPClientSocket(addr), | 315 socket_factory_->CreateSSLClientSocket(transport, |
| 282 server_.kHostName, kDefaultSSLConfig)); | 316 server_.kHostName, kDefaultSSLConfig)); |
| 283 | 317 |
| 284 rv = sock->Connect(&callback); | 318 rv = sock->Connect(&callback); |
| 285 if (rv != net::OK) { | 319 if (rv != net::OK) { |
| 286 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 320 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
| 287 | 321 |
| 288 rv = callback.WaitForResult(); | 322 rv = callback.WaitForResult(); |
| 289 EXPECT_EQ(net::OK, rv); | 323 EXPECT_EQ(net::OK, rv); |
| 290 } | 324 } |
| 291 | 325 |
| 292 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 326 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 293 rv = sock->Write(request_text, arraysize(request_text) - 1, &callback); | 327 rv = sock->Write(request_text, arraysize(request_text) - 1, &callback); |
| 294 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 328 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 295 | 329 |
| 296 if (rv == net::ERR_IO_PENDING) { | 330 if (rv == net::ERR_IO_PENDING) { |
| 297 rv = callback.WaitForResult(); | 331 rv = callback.WaitForResult(); |
| 298 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 332 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
| 299 } | 333 } |
| 300 | 334 |
| 301 // Do a partial read and then exit. This test should not crash! | 335 // Do a partial read and then exit. This test should not crash! |
| 302 char buf[512]; | 336 char buf[512]; |
| 303 rv = sock->Read(buf, sizeof(buf), &callback); | 337 rv = sock->Read(buf, sizeof(buf), &callback); |
| 304 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 338 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 305 | 339 |
| 306 if (rv == net::ERR_IO_PENDING) | 340 if (rv == net::ERR_IO_PENDING) |
| 307 rv = callback.WaitForResult(); | 341 rv = callback.WaitForResult(); |
| 308 | 342 |
| 309 EXPECT_NE(rv, 0); | 343 EXPECT_NE(rv, 0); |
| 310 } | 344 } |
| OLD | NEW |