Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(643)

Side by Side Diff: net/base/ssl_client_socket_unittest.cc

Issue 43115: Change the bad-certificate handler for SSL (using NSS) to return an... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698