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/socket/ssl_client_socket.h" | 5 #include "net/socket/ssl_client_socket.h" |
6 | 6 |
7 #include "net/base/address_list.h" | 7 #include "net/base/address_list.h" |
8 #include "net/base/host_resolver.h" | 8 #include "net/base/host_resolver.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
11 #include "net/base/ssl_config_service.h" | 11 #include "net/base/ssl_config_service.h" |
12 #include "net/base/test_completion_callback.h" | 12 #include "net/base/test_completion_callback.h" |
13 #include "net/socket/client_socket_factory.h" | 13 #include "net/socket/client_socket_factory.h" |
14 #include "net/socket/ssl_test_util.h" | 14 #include "net/socket/ssl_test_util.h" |
15 #include "net/socket/tcp_client_socket.h" | 15 #include "net/socket/tcp_client_socket.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "testing/platform_test.h" | 17 #include "testing/platform_test.h" |
18 | 18 |
19 //----------------------------------------------------------------------------- | 19 //----------------------------------------------------------------------------- |
20 | 20 |
21 const net::SSLConfig kDefaultSSLConfig; | 21 const net::SSLConfig kDefaultSSLConfig; |
22 | 22 |
23 class SSLClientSocketTest : public PlatformTest { | 23 class SSLClientSocketTest : public PlatformTest { |
24 public: | 24 public: |
25 SSLClientSocketTest() | 25 SSLClientSocketTest() |
26 : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()) { | 26 : resolver_(net::CreateSystemHostResolver()), |
| 27 socket_factory_(net::ClientSocketFactory::GetDefaultFactory()) { |
27 } | 28 } |
28 | 29 |
29 void StartOKServer() { | 30 void StartOKServer() { |
30 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, | 31 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, |
31 server_.kHostName, server_.kOKHTTPSPort, | 32 server_.kHostName, server_.kOKHTTPSPort, |
32 FilePath(), server_.GetOKCertPath(), std::wstring()); | 33 FilePath(), server_.GetOKCertPath(), std::wstring()); |
33 ASSERT_TRUE(success); | 34 ASSERT_TRUE(success); |
34 } | 35 } |
35 | 36 |
36 void StartMismatchedServer() { | 37 void StartMismatchedServer() { |
37 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, | 38 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, |
38 server_.kMismatchedHostName, server_.kOKHTTPSPort, | 39 server_.kMismatchedHostName, server_.kOKHTTPSPort, |
39 FilePath(), server_.GetOKCertPath(), std::wstring()); | 40 FilePath(), server_.GetOKCertPath(), std::wstring()); |
40 ASSERT_TRUE(success); | 41 ASSERT_TRUE(success); |
41 } | 42 } |
42 | 43 |
43 void StartExpiredServer() { | 44 void StartExpiredServer() { |
44 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, | 45 bool success = server_.Start(net::TestServerLauncher::ProtoHTTP, |
45 server_.kHostName, server_.kBadHTTPSPort, | 46 server_.kHostName, server_.kBadHTTPSPort, |
46 FilePath(), server_.GetExpiredCertPath(), std::wstring()); | 47 FilePath(), server_.GetExpiredCertPath(), std::wstring()); |
47 ASSERT_TRUE(success); | 48 ASSERT_TRUE(success); |
48 } | 49 } |
49 | 50 |
50 protected: | 51 protected: |
| 52 scoped_refptr<net::HostResolver> resolver_; |
51 net::ClientSocketFactory* socket_factory_; | 53 net::ClientSocketFactory* socket_factory_; |
52 net::TestServerLauncher server_; | 54 net::TestServerLauncher server_; |
53 }; | 55 }; |
54 | 56 |
55 //----------------------------------------------------------------------------- | 57 //----------------------------------------------------------------------------- |
56 | 58 |
57 #if defined(OS_MACOSX) | 59 #if defined(OS_MACOSX) |
58 // Status 6/19/09: | 60 // Status 6/19/09: |
59 // | 61 // |
60 // If these tests are enabled on OSX, we choke at the point | 62 // If these tests are enabled on OSX, we choke at the point |
(...skipping 18 matching lines...) Expand all Loading... |
79 #define MAYBE_ConnectMismatched ConnectMismatched | 81 #define MAYBE_ConnectMismatched ConnectMismatched |
80 #define MAYBE_Read Read | 82 #define MAYBE_Read Read |
81 #define MAYBE_Read_SmallChunks Read_SmallChunks | 83 #define MAYBE_Read_SmallChunks Read_SmallChunks |
82 #define MAYBE_Read_Interrupted Read_Interrupted | 84 #define MAYBE_Read_Interrupted Read_Interrupted |
83 #endif | 85 #endif |
84 | 86 |
85 TEST_F(SSLClientSocketTest, MAYBE_Connect) { | 87 TEST_F(SSLClientSocketTest, MAYBE_Connect) { |
86 StartOKServer(); | 88 StartOKServer(); |
87 | 89 |
88 net::AddressList addr; | 90 net::AddressList addr; |
89 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
90 TestCompletionCallback callback; | 91 TestCompletionCallback callback; |
91 | 92 |
92 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); | 93 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); |
93 int rv = resolver->Resolve(info, &addr, NULL, NULL); | 94 int rv = resolver_->Resolve(info, &addr, NULL, NULL); |
94 EXPECT_EQ(net::OK, rv); | 95 EXPECT_EQ(net::OK, rv); |
95 | 96 |
96 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 97 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
97 rv = transport->Connect(&callback); | 98 rv = transport->Connect(&callback); |
98 if (rv == net::ERR_IO_PENDING) | 99 if (rv == net::ERR_IO_PENDING) |
99 rv = callback.WaitForResult(); | 100 rv = callback.WaitForResult(); |
100 EXPECT_EQ(net::OK, rv); | 101 EXPECT_EQ(net::OK, rv); |
101 | 102 |
102 scoped_ptr<net::SSLClientSocket> sock( | 103 scoped_ptr<net::SSLClientSocket> sock( |
103 socket_factory_->CreateSSLClientSocket(transport, | 104 socket_factory_->CreateSSLClientSocket(transport, |
(...skipping 13 matching lines...) Expand all Loading... |
117 EXPECT_TRUE(sock->IsConnected()); | 118 EXPECT_TRUE(sock->IsConnected()); |
118 | 119 |
119 sock->Disconnect(); | 120 sock->Disconnect(); |
120 EXPECT_FALSE(sock->IsConnected()); | 121 EXPECT_FALSE(sock->IsConnected()); |
121 } | 122 } |
122 | 123 |
123 TEST_F(SSLClientSocketTest, MAYBE_ConnectExpired) { | 124 TEST_F(SSLClientSocketTest, MAYBE_ConnectExpired) { |
124 StartExpiredServer(); | 125 StartExpiredServer(); |
125 | 126 |
126 net::AddressList addr; | 127 net::AddressList addr; |
127 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
128 TestCompletionCallback callback; | 128 TestCompletionCallback callback; |
129 | 129 |
130 net::HostResolver::RequestInfo info(server_.kHostName, server_.kBadHTTPSPort); | 130 net::HostResolver::RequestInfo info(server_.kHostName, server_.kBadHTTPSPort); |
131 int rv = resolver->Resolve(info, &addr, NULL, NULL); | 131 int rv = resolver_->Resolve(info, &addr, NULL, NULL); |
132 EXPECT_EQ(net::OK, rv); | 132 EXPECT_EQ(net::OK, rv); |
133 | 133 |
134 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 134 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
135 rv = transport->Connect(&callback); | 135 rv = transport->Connect(&callback); |
136 if (rv == net::ERR_IO_PENDING) | 136 if (rv == net::ERR_IO_PENDING) |
137 rv = callback.WaitForResult(); | 137 rv = callback.WaitForResult(); |
138 EXPECT_EQ(net::OK, rv); | 138 EXPECT_EQ(net::OK, rv); |
139 | 139 |
140 scoped_ptr<net::SSLClientSocket> sock( | 140 scoped_ptr<net::SSLClientSocket> sock( |
141 socket_factory_->CreateSSLClientSocket(transport, | 141 socket_factory_->CreateSSLClientSocket(transport, |
(...skipping 12 matching lines...) Expand all Loading... |
154 | 154 |
155 // We cannot test sock->IsConnected(), as the NSS implementation disconnects | 155 // We cannot test sock->IsConnected(), as the NSS implementation disconnects |
156 // the socket when it encounters an error, whereas other implementations | 156 // the socket when it encounters an error, whereas other implementations |
157 // leave it connected. | 157 // leave it connected. |
158 } | 158 } |
159 | 159 |
160 TEST_F(SSLClientSocketTest, MAYBE_ConnectMismatched) { | 160 TEST_F(SSLClientSocketTest, MAYBE_ConnectMismatched) { |
161 StartMismatchedServer(); | 161 StartMismatchedServer(); |
162 | 162 |
163 net::AddressList addr; | 163 net::AddressList addr; |
164 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
165 TestCompletionCallback callback; | 164 TestCompletionCallback callback; |
166 | 165 |
167 net::HostResolver::RequestInfo info(server_.kMismatchedHostName, | 166 net::HostResolver::RequestInfo info(server_.kMismatchedHostName, |
168 server_.kOKHTTPSPort); | 167 server_.kOKHTTPSPort); |
169 int rv = resolver->Resolve(info, &addr, NULL, NULL); | 168 int rv = resolver_->Resolve(info, &addr, NULL, NULL); |
170 EXPECT_EQ(net::OK, rv); | 169 EXPECT_EQ(net::OK, rv); |
171 | 170 |
172 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 171 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
173 rv = transport->Connect(&callback); | 172 rv = transport->Connect(&callback); |
174 if (rv == net::ERR_IO_PENDING) | 173 if (rv == net::ERR_IO_PENDING) |
175 rv = callback.WaitForResult(); | 174 rv = callback.WaitForResult(); |
176 EXPECT_EQ(net::OK, rv); | 175 EXPECT_EQ(net::OK, rv); |
177 | 176 |
178 scoped_ptr<net::SSLClientSocket> sock( | 177 scoped_ptr<net::SSLClientSocket> sock( |
179 socket_factory_->CreateSSLClientSocket(transport, | 178 socket_factory_->CreateSSLClientSocket(transport, |
(...skipping 17 matching lines...) Expand all Loading... |
197 | 196 |
198 // TODO(wtc): Add unit tests for IsConnectedAndIdle: | 197 // TODO(wtc): Add unit tests for IsConnectedAndIdle: |
199 // - Server closes an SSL connection (with a close_notify alert message). | 198 // - Server closes an SSL connection (with a close_notify alert message). |
200 // - Server closes the underlying TCP connection directly. | 199 // - Server closes the underlying TCP connection directly. |
201 // - Server sends data unexpectedly. | 200 // - Server sends data unexpectedly. |
202 | 201 |
203 TEST_F(SSLClientSocketTest, MAYBE_Read) { | 202 TEST_F(SSLClientSocketTest, MAYBE_Read) { |
204 StartOKServer(); | 203 StartOKServer(); |
205 | 204 |
206 net::AddressList addr; | 205 net::AddressList addr; |
207 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
208 TestCompletionCallback callback; | 206 TestCompletionCallback callback; |
209 | 207 |
210 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); | 208 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); |
211 int rv = resolver->Resolve(info, &addr, &callback, NULL); | 209 int rv = resolver_->Resolve(info, &addr, &callback, NULL); |
212 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 210 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
213 | 211 |
214 rv = callback.WaitForResult(); | 212 rv = callback.WaitForResult(); |
215 EXPECT_EQ(net::OK, rv); | 213 EXPECT_EQ(net::OK, rv); |
216 | 214 |
217 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 215 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
218 rv = transport->Connect(&callback); | 216 rv = transport->Connect(&callback); |
219 if (rv == net::ERR_IO_PENDING) | 217 if (rv == net::ERR_IO_PENDING) |
220 rv = callback.WaitForResult(); | 218 rv = callback.WaitForResult(); |
221 EXPECT_EQ(net::OK, rv); | 219 EXPECT_EQ(net::OK, rv); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 EXPECT_GE(rv, 0); | 256 EXPECT_GE(rv, 0); |
259 if (rv <= 0) | 257 if (rv <= 0) |
260 break; | 258 break; |
261 } | 259 } |
262 } | 260 } |
263 | 261 |
264 TEST_F(SSLClientSocketTest, MAYBE_Read_SmallChunks) { | 262 TEST_F(SSLClientSocketTest, MAYBE_Read_SmallChunks) { |
265 StartOKServer(); | 263 StartOKServer(); |
266 | 264 |
267 net::AddressList addr; | 265 net::AddressList addr; |
268 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
269 TestCompletionCallback callback; | 266 TestCompletionCallback callback; |
270 | 267 |
271 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); | 268 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); |
272 int rv = resolver->Resolve(info, &addr, NULL, NULL); | 269 int rv = resolver_->Resolve(info, &addr, NULL, NULL); |
273 EXPECT_EQ(net::OK, rv); | 270 EXPECT_EQ(net::OK, rv); |
274 | 271 |
275 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 272 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
276 rv = transport->Connect(&callback); | 273 rv = transport->Connect(&callback); |
277 if (rv == net::ERR_IO_PENDING) | 274 if (rv == net::ERR_IO_PENDING) |
278 rv = callback.WaitForResult(); | 275 rv = callback.WaitForResult(); |
279 EXPECT_EQ(net::OK, rv); | 276 EXPECT_EQ(net::OK, rv); |
280 | 277 |
281 scoped_ptr<net::SSLClientSocket> sock( | 278 scoped_ptr<net::SSLClientSocket> sock( |
282 socket_factory_->CreateSSLClientSocket(transport, | 279 socket_factory_->CreateSSLClientSocket(transport, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 EXPECT_GE(rv, 0); | 311 EXPECT_GE(rv, 0); |
315 if (rv <= 0) | 312 if (rv <= 0) |
316 break; | 313 break; |
317 } | 314 } |
318 } | 315 } |
319 | 316 |
320 TEST_F(SSLClientSocketTest, MAYBE_Read_Interrupted) { | 317 TEST_F(SSLClientSocketTest, MAYBE_Read_Interrupted) { |
321 StartOKServer(); | 318 StartOKServer(); |
322 | 319 |
323 net::AddressList addr; | 320 net::AddressList addr; |
324 scoped_refptr<net::HostResolver> resolver(new net::HostResolver); | |
325 TestCompletionCallback callback; | 321 TestCompletionCallback callback; |
326 | 322 |
327 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); | 323 net::HostResolver::RequestInfo info(server_.kHostName, server_.kOKHTTPSPort); |
328 int rv = resolver->Resolve(info, &addr, NULL, NULL); | 324 int rv = resolver_->Resolve(info, &addr, NULL, NULL); |
329 EXPECT_EQ(net::OK, rv); | 325 EXPECT_EQ(net::OK, rv); |
330 | 326 |
331 net::ClientSocket *transport = new net::TCPClientSocket(addr); | 327 net::ClientSocket *transport = new net::TCPClientSocket(addr); |
332 rv = transport->Connect(&callback); | 328 rv = transport->Connect(&callback); |
333 if (rv == net::ERR_IO_PENDING) | 329 if (rv == net::ERR_IO_PENDING) |
334 rv = callback.WaitForResult(); | 330 rv = callback.WaitForResult(); |
335 EXPECT_EQ(net::OK, rv); | 331 EXPECT_EQ(net::OK, rv); |
336 | 332 |
337 scoped_ptr<net::SSLClientSocket> sock( | 333 scoped_ptr<net::SSLClientSocket> sock( |
338 socket_factory_->CreateSSLClientSocket(transport, | 334 socket_factory_->CreateSSLClientSocket(transport, |
(...skipping 23 matching lines...) Expand all Loading... |
362 // Do a partial read and then exit. This test should not crash! | 358 // Do a partial read and then exit. This test should not crash! |
363 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(512); | 359 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(512); |
364 rv = sock->Read(buf, 512, &callback); | 360 rv = sock->Read(buf, 512, &callback); |
365 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 361 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
366 | 362 |
367 if (rv == net::ERR_IO_PENDING) | 363 if (rv == net::ERR_IO_PENDING) |
368 rv = callback.WaitForResult(); | 364 rv = callback.WaitForResult(); |
369 | 365 |
370 EXPECT_NE(rv, 0); | 366 EXPECT_NE(rv, 0); |
371 } | 367 } |
OLD | NEW |