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 |