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

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

Issue 11689002: Fix for spdy cancelling ServerBoundCertServiceRequest (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: NET_EXPORT the RequestHandle Created 7 years, 11 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
« no previous file with comments | « net/base/server_bound_cert_service.cc ('k') | net/socket/ssl_client_socket_nss.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/server_bound_cert_service.h" 5 #include "net/base/server_bound_cert_service.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 ServerBoundCertService::RequestHandle request_handle; 75 ServerBoundCertService::RequestHandle request_handle;
76 76
77 // Asynchronous completion. 77 // Asynchronous completion.
78 SSLClientCertType type1; 78 SSLClientCertType type1;
79 std::string private_key_info1, der_cert1; 79 std::string private_key_info1, der_cert1;
80 EXPECT_EQ(0, service_->cert_count()); 80 EXPECT_EQ(0, service_->cert_count());
81 error = service_->GetDomainBoundCert( 81 error = service_->GetDomainBoundCert(
82 origin, types, &type1, &private_key_info1, &der_cert1, 82 origin, types, &type1, &private_key_info1, &der_cert1,
83 callback.callback(), &request_handle); 83 callback.callback(), &request_handle);
84 EXPECT_EQ(ERR_IO_PENDING, error); 84 EXPECT_EQ(ERR_IO_PENDING, error);
85 EXPECT_TRUE(request_handle != NULL); 85 EXPECT_TRUE(request_handle.is_active());
86 error = callback.WaitForResult(); 86 error = callback.WaitForResult();
87 EXPECT_EQ(OK, error); 87 EXPECT_EQ(OK, error);
88 EXPECT_EQ(1, service_->cert_count()); 88 EXPECT_EQ(1, service_->cert_count());
89 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1); 89 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
90 EXPECT_FALSE(private_key_info1.empty()); 90 EXPECT_FALSE(private_key_info1.empty());
91 EXPECT_FALSE(der_cert1.empty()); 91 EXPECT_FALSE(der_cert1.empty());
92 EXPECT_FALSE(request_handle.is_active());
92 93
93 // Synchronous completion. 94 // Synchronous completion.
94 SSLClientCertType type2; 95 SSLClientCertType type2;
95 std::string private_key_info2, der_cert2; 96 std::string private_key_info2, der_cert2;
96 error = service_->GetDomainBoundCert( 97 error = service_->GetDomainBoundCert(
97 origin, types, &type2, &private_key_info2, &der_cert2, 98 origin, types, &type2, &private_key_info2, &der_cert2,
98 callback.callback(), &request_handle); 99 callback.callback(), &request_handle);
99 EXPECT_TRUE(request_handle == NULL); 100 EXPECT_FALSE(request_handle.is_active());
100 EXPECT_EQ(OK, error); 101 EXPECT_EQ(OK, error);
101 EXPECT_EQ(1, service_->cert_count()); 102 EXPECT_EQ(1, service_->cert_count());
102 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2); 103 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
103 EXPECT_EQ(private_key_info1, private_key_info2); 104 EXPECT_EQ(private_key_info1, private_key_info2);
104 EXPECT_EQ(der_cert1, der_cert2); 105 EXPECT_EQ(der_cert1, der_cert2);
105 106
106 EXPECT_EQ(2u, service_->requests()); 107 EXPECT_EQ(2u, service_->requests());
107 EXPECT_EQ(1u, service_->cert_store_hits()); 108 EXPECT_EQ(1u, service_->cert_store_hits());
108 EXPECT_EQ(0u, service_->inflight_joins()); 109 EXPECT_EQ(0u, service_->inflight_joins());
109 } 110 }
110 111
111 TEST_F(ServerBoundCertServiceTest, UnsupportedTypes) { 112 TEST_F(ServerBoundCertServiceTest, UnsupportedTypes) {
112 std::string origin("https://encrypted.google.com:443"); 113 std::string origin("https://encrypted.google.com:443");
113 114
114 int error; 115 int error;
115 std::vector<uint8> types; 116 std::vector<uint8> types;
116 TestCompletionCallback callback; 117 TestCompletionCallback callback;
117 ServerBoundCertService::RequestHandle request_handle; 118 ServerBoundCertService::RequestHandle request_handle;
118 119
119 // Empty requested_types. 120 // Empty requested_types.
120 SSLClientCertType type1; 121 SSLClientCertType type1;
121 std::string private_key_info1, der_cert1; 122 std::string private_key_info1, der_cert1;
122 error = service_->GetDomainBoundCert( 123 error = service_->GetDomainBoundCert(
123 origin, types, &type1, &private_key_info1, &der_cert1, 124 origin, types, &type1, &private_key_info1, &der_cert1,
124 callback.callback(), &request_handle); 125 callback.callback(), &request_handle);
125 EXPECT_EQ(ERR_INVALID_ARGUMENT, error); 126 EXPECT_EQ(ERR_INVALID_ARGUMENT, error);
126 EXPECT_TRUE(request_handle == NULL); 127 EXPECT_FALSE(request_handle.is_active());
127 128
128 // No supported types in requested_types. 129 // No supported types in requested_types.
129 types.push_back(CLIENT_CERT_RSA_SIGN); 130 types.push_back(CLIENT_CERT_RSA_SIGN);
130 types.push_back(2); 131 types.push_back(2);
131 types.push_back(3); 132 types.push_back(3);
132 error = service_->GetDomainBoundCert( 133 error = service_->GetDomainBoundCert(
133 origin, types, &type1, &private_key_info1, &der_cert1, 134 origin, types, &type1, &private_key_info1, &der_cert1,
134 callback.callback(), &request_handle); 135 callback.callback(), &request_handle);
135 EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error); 136 EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error);
136 EXPECT_TRUE(request_handle == NULL); 137 EXPECT_FALSE(request_handle.is_active());
137 138
138 // Supported types after unsupported ones in requested_types. 139 // Supported types after unsupported ones in requested_types.
139 types.push_back(CLIENT_CERT_ECDSA_SIGN); 140 types.push_back(CLIENT_CERT_ECDSA_SIGN);
140 // Asynchronous completion. 141 // Asynchronous completion.
141 EXPECT_EQ(0, service_->cert_count()); 142 EXPECT_EQ(0, service_->cert_count());
142 error = service_->GetDomainBoundCert( 143 error = service_->GetDomainBoundCert(
143 origin, types, &type1, &private_key_info1, &der_cert1, 144 origin, types, &type1, &private_key_info1, &der_cert1,
144 callback.callback(), &request_handle); 145 callback.callback(), &request_handle);
145 EXPECT_EQ(ERR_IO_PENDING, error); 146 EXPECT_EQ(ERR_IO_PENDING, error);
146 EXPECT_TRUE(request_handle != NULL); 147 EXPECT_TRUE(request_handle.is_active());
147 error = callback.WaitForResult(); 148 error = callback.WaitForResult();
148 EXPECT_EQ(OK, error); 149 EXPECT_EQ(OK, error);
149 EXPECT_EQ(1, service_->cert_count()); 150 EXPECT_EQ(1, service_->cert_count());
150 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1); 151 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
151 EXPECT_FALSE(private_key_info1.empty()); 152 EXPECT_FALSE(private_key_info1.empty());
152 EXPECT_FALSE(der_cert1.empty()); 153 EXPECT_FALSE(der_cert1.empty());
153 154
154 // Now that the cert is created, doing requests for unsupported types 155 // Now that the cert is created, doing requests for unsupported types
155 // shouldn't affect the created cert. 156 // shouldn't affect the created cert.
156 // Empty requested_types. 157 // Empty requested_types.
157 types.clear(); 158 types.clear();
158 SSLClientCertType type2; 159 SSLClientCertType type2;
159 std::string private_key_info2, der_cert2; 160 std::string private_key_info2, der_cert2;
160 error = service_->GetDomainBoundCert( 161 error = service_->GetDomainBoundCert(
161 origin, types, &type2, &private_key_info2, &der_cert2, 162 origin, types, &type2, &private_key_info2, &der_cert2,
162 callback.callback(), &request_handle); 163 callback.callback(), &request_handle);
163 EXPECT_EQ(ERR_INVALID_ARGUMENT, error); 164 EXPECT_EQ(ERR_INVALID_ARGUMENT, error);
164 EXPECT_TRUE(request_handle == NULL); 165 EXPECT_FALSE(request_handle.is_active());
165 166
166 // No supported types in requested_types. 167 // No supported types in requested_types.
167 types.push_back(CLIENT_CERT_RSA_SIGN); 168 types.push_back(CLIENT_CERT_RSA_SIGN);
168 types.push_back(2); 169 types.push_back(2);
169 types.push_back(3); 170 types.push_back(3);
170 error = service_->GetDomainBoundCert( 171 error = service_->GetDomainBoundCert(
171 origin, types, &type2, &private_key_info2, &der_cert2, 172 origin, types, &type2, &private_key_info2, &der_cert2,
172 callback.callback(), &request_handle); 173 callback.callback(), &request_handle);
173 EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error); 174 EXPECT_EQ(ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, error);
174 EXPECT_TRUE(request_handle == NULL); 175 EXPECT_FALSE(request_handle.is_active());
175 176
176 // If we request EC, the cert we created before should still be there. 177 // If we request EC, the cert we created before should still be there.
177 types.push_back(CLIENT_CERT_ECDSA_SIGN); 178 types.push_back(CLIENT_CERT_ECDSA_SIGN);
178 error = service_->GetDomainBoundCert( 179 error = service_->GetDomainBoundCert(
179 origin, types, &type2, &private_key_info2, &der_cert2, 180 origin, types, &type2, &private_key_info2, &der_cert2,
180 callback.callback(), &request_handle); 181 callback.callback(), &request_handle);
181 EXPECT_TRUE(request_handle == NULL); 182 EXPECT_FALSE(request_handle.is_active());
182 EXPECT_EQ(OK, error); 183 EXPECT_EQ(OK, error);
183 EXPECT_EQ(1, service_->cert_count()); 184 EXPECT_EQ(1, service_->cert_count());
184 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2); 185 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
185 EXPECT_EQ(private_key_info1, private_key_info2); 186 EXPECT_EQ(private_key_info1, private_key_info2);
186 EXPECT_EQ(der_cert1, der_cert2); 187 EXPECT_EQ(der_cert1, der_cert2);
187 } 188 }
188 189
189 TEST_F(ServerBoundCertServiceTest, StoreCerts) { 190 TEST_F(ServerBoundCertServiceTest, StoreCerts) {
190 int error; 191 int error;
191 std::vector<uint8> types; 192 std::vector<uint8> types;
192 types.push_back(CLIENT_CERT_ECDSA_SIGN); 193 types.push_back(CLIENT_CERT_ECDSA_SIGN);
193 TestCompletionCallback callback; 194 TestCompletionCallback callback;
194 ServerBoundCertService::RequestHandle request_handle; 195 ServerBoundCertService::RequestHandle request_handle;
195 196
196 std::string origin1("https://encrypted.google.com:443"); 197 std::string origin1("https://encrypted.google.com:443");
197 SSLClientCertType type1; 198 SSLClientCertType type1;
198 std::string private_key_info1, der_cert1; 199 std::string private_key_info1, der_cert1;
199 EXPECT_EQ(0, service_->cert_count()); 200 EXPECT_EQ(0, service_->cert_count());
200 error = service_->GetDomainBoundCert( 201 error = service_->GetDomainBoundCert(
201 origin1, types, &type1, &private_key_info1, &der_cert1, 202 origin1, types, &type1, &private_key_info1, &der_cert1,
202 callback.callback(), &request_handle); 203 callback.callback(), &request_handle);
203 EXPECT_EQ(ERR_IO_PENDING, error); 204 EXPECT_EQ(ERR_IO_PENDING, error);
204 EXPECT_TRUE(request_handle != NULL); 205 EXPECT_TRUE(request_handle.is_active());
205 error = callback.WaitForResult(); 206 error = callback.WaitForResult();
206 EXPECT_EQ(OK, error); 207 EXPECT_EQ(OK, error);
207 EXPECT_EQ(1, service_->cert_count()); 208 EXPECT_EQ(1, service_->cert_count());
208 209
209 std::string origin2("https://www.verisign.com:443"); 210 std::string origin2("https://www.verisign.com:443");
210 SSLClientCertType type2; 211 SSLClientCertType type2;
211 std::string private_key_info2, der_cert2; 212 std::string private_key_info2, der_cert2;
212 error = service_->GetDomainBoundCert( 213 error = service_->GetDomainBoundCert(
213 origin2, types, &type2, &private_key_info2, &der_cert2, 214 origin2, types, &type2, &private_key_info2, &der_cert2,
214 callback.callback(), &request_handle); 215 callback.callback(), &request_handle);
215 EXPECT_EQ(ERR_IO_PENDING, error); 216 EXPECT_EQ(ERR_IO_PENDING, error);
216 EXPECT_TRUE(request_handle != NULL); 217 EXPECT_TRUE(request_handle.is_active());
217 error = callback.WaitForResult(); 218 error = callback.WaitForResult();
218 EXPECT_EQ(OK, error); 219 EXPECT_EQ(OK, error);
219 EXPECT_EQ(2, service_->cert_count()); 220 EXPECT_EQ(2, service_->cert_count());
220 221
221 std::string origin3("https://www.twitter.com:443"); 222 std::string origin3("https://www.twitter.com:443");
222 SSLClientCertType type3; 223 SSLClientCertType type3;
223 std::string private_key_info3, der_cert3; 224 std::string private_key_info3, der_cert3;
224 error = service_->GetDomainBoundCert( 225 error = service_->GetDomainBoundCert(
225 origin3, types, &type3, &private_key_info3, &der_cert3, 226 origin3, types, &type3, &private_key_info3, &der_cert3,
226 callback.callback(), &request_handle); 227 callback.callback(), &request_handle);
227 EXPECT_EQ(ERR_IO_PENDING, error); 228 EXPECT_EQ(ERR_IO_PENDING, error);
228 EXPECT_TRUE(request_handle != NULL); 229 EXPECT_TRUE(request_handle.is_active());
229 error = callback.WaitForResult(); 230 error = callback.WaitForResult();
230 EXPECT_EQ(OK, error); 231 EXPECT_EQ(OK, error);
231 EXPECT_EQ(3, service_->cert_count()); 232 EXPECT_EQ(3, service_->cert_count());
232 233
233 EXPECT_NE(private_key_info1, private_key_info2); 234 EXPECT_NE(private_key_info1, private_key_info2);
234 EXPECT_NE(der_cert1, der_cert2); 235 EXPECT_NE(der_cert1, der_cert2);
235 EXPECT_NE(private_key_info1, private_key_info3); 236 EXPECT_NE(private_key_info1, private_key_info3);
236 EXPECT_NE(der_cert1, der_cert3); 237 EXPECT_NE(der_cert1, der_cert3);
237 EXPECT_NE(private_key_info2, private_key_info3); 238 EXPECT_NE(private_key_info2, private_key_info3);
238 EXPECT_NE(der_cert2, der_cert3); 239 EXPECT_NE(der_cert2, der_cert3);
(...skipping 16 matching lines...) Expand all
255 256
256 SSLClientCertType type2; 257 SSLClientCertType type2;
257 std::string private_key_info2, der_cert2; 258 std::string private_key_info2, der_cert2;
258 TestCompletionCallback callback2; 259 TestCompletionCallback callback2;
259 ServerBoundCertService::RequestHandle request_handle2; 260 ServerBoundCertService::RequestHandle request_handle2;
260 261
261 error = service_->GetDomainBoundCert( 262 error = service_->GetDomainBoundCert(
262 origin, types, &type1, &private_key_info1, &der_cert1, 263 origin, types, &type1, &private_key_info1, &der_cert1,
263 callback1.callback(), &request_handle1); 264 callback1.callback(), &request_handle1);
264 EXPECT_EQ(ERR_IO_PENDING, error); 265 EXPECT_EQ(ERR_IO_PENDING, error);
265 EXPECT_TRUE(request_handle1 != NULL); 266 EXPECT_TRUE(request_handle1.is_active());
266 // If we request RSA and EC in the 2nd request, should still join with the 267 // If we request RSA and EC in the 2nd request, should still join with the
267 // original request. 268 // original request.
268 types.insert(types.begin(), CLIENT_CERT_RSA_SIGN); 269 types.insert(types.begin(), CLIENT_CERT_RSA_SIGN);
269 error = service_->GetDomainBoundCert( 270 error = service_->GetDomainBoundCert(
270 origin, types, &type2, &private_key_info2, &der_cert2, 271 origin, types, &type2, &private_key_info2, &der_cert2,
271 callback2.callback(), &request_handle2); 272 callback2.callback(), &request_handle2);
272 EXPECT_EQ(ERR_IO_PENDING, error); 273 EXPECT_EQ(ERR_IO_PENDING, error);
273 EXPECT_TRUE(request_handle2 != NULL); 274 EXPECT_TRUE(request_handle2.is_active());
274 275
275 error = callback1.WaitForResult(); 276 error = callback1.WaitForResult();
276 EXPECT_EQ(OK, error); 277 EXPECT_EQ(OK, error);
277 error = callback2.WaitForResult(); 278 error = callback2.WaitForResult();
278 EXPECT_EQ(OK, error); 279 EXPECT_EQ(OK, error);
279 280
280 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1); 281 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
281 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2); 282 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
282 EXPECT_EQ(2u, service_->requests()); 283 EXPECT_EQ(2u, service_->requests());
283 EXPECT_EQ(0u, service_->cert_store_hits()); 284 EXPECT_EQ(0u, service_->cert_store_hits());
284 EXPECT_EQ(1u, service_->inflight_joins()); 285 EXPECT_EQ(1u, service_->inflight_joins());
285 } 286 }
286 287
287 TEST_F(ServerBoundCertServiceTest, ExtractValuesFromBytesEC) { 288 TEST_F(ServerBoundCertServiceTest, ExtractValuesFromBytesEC) {
288 std::string origin("https://encrypted.google.com:443"); 289 std::string origin("https://encrypted.google.com:443");
289 SSLClientCertType type; 290 SSLClientCertType type;
290 std::string private_key_info, der_cert; 291 std::string private_key_info, der_cert;
291 int error; 292 int error;
292 std::vector<uint8> types; 293 std::vector<uint8> types;
293 types.push_back(CLIENT_CERT_ECDSA_SIGN); 294 types.push_back(CLIENT_CERT_ECDSA_SIGN);
294 TestCompletionCallback callback; 295 TestCompletionCallback callback;
295 ServerBoundCertService::RequestHandle request_handle; 296 ServerBoundCertService::RequestHandle request_handle;
296 297
297 error = service_->GetDomainBoundCert( 298 error = service_->GetDomainBoundCert(
298 origin, types, &type, &private_key_info, &der_cert, callback.callback(), 299 origin, types, &type, &private_key_info, &der_cert, callback.callback(),
299 &request_handle); 300 &request_handle);
300 EXPECT_EQ(ERR_IO_PENDING, error); 301 EXPECT_EQ(ERR_IO_PENDING, error);
301 EXPECT_TRUE(request_handle != NULL); 302 EXPECT_TRUE(request_handle.is_active());
302 error = callback.WaitForResult(); 303 error = callback.WaitForResult();
303 EXPECT_EQ(OK, error); 304 EXPECT_EQ(OK, error);
304 305
305 base::StringPiece spki_piece; 306 base::StringPiece spki_piece;
306 ASSERT_TRUE(asn1::ExtractSPKIFromDERCert(der_cert, &spki_piece)); 307 ASSERT_TRUE(asn1::ExtractSPKIFromDERCert(der_cert, &spki_piece));
307 std::vector<uint8> spki( 308 std::vector<uint8> spki(
308 spki_piece.data(), 309 spki_piece.data(),
309 spki_piece.data() + spki_piece.size()); 310 spki_piece.data() + spki_piece.size());
310 311
311 // Check that we can retrieve the key from the bytes. 312 // Check that we can retrieve the key from the bytes.
(...skipping 20 matching lines...) Expand all
332 ServerBoundCertService::RequestHandle request_handle; 333 ServerBoundCertService::RequestHandle request_handle;
333 334
334 error = service_->GetDomainBoundCert(origin, 335 error = service_->GetDomainBoundCert(origin,
335 types, 336 types,
336 &type, 337 &type,
337 &private_key_info, 338 &private_key_info,
338 &der_cert, 339 &der_cert,
339 base::Bind(&FailTest), 340 base::Bind(&FailTest),
340 &request_handle); 341 &request_handle);
341 EXPECT_EQ(ERR_IO_PENDING, error); 342 EXPECT_EQ(ERR_IO_PENDING, error);
342 EXPECT_TRUE(request_handle != NULL); 343 EXPECT_TRUE(request_handle.is_active());
343 service_->CancelRequest(request_handle); 344 request_handle.Cancel();
345 EXPECT_FALSE(request_handle.is_active());
344 346
345 // Wait for generation to finish. 347 // Wait for generation to finish.
346 sequenced_worker_pool_->FlushForTesting(); 348 sequenced_worker_pool_->FlushForTesting();
349 // Wait for reply from ServerBoundCertServiceWorker to be posted back to the
350 // ServerBoundCertService.
351 MessageLoop::current()->RunUntilIdle();
352
353 // Even though the original request was cancelled, the service will still
354 // store the result, it just doesn't call the callback.
355 EXPECT_EQ(1, service_->cert_count());
356 }
357
358 // Tests that destructing the RequestHandle cancels the request.
359 TEST_F(ServerBoundCertServiceTest, CancelRequestByHandleDestruction) {
360 std::string origin("https://encrypted.google.com:443");
361 SSLClientCertType type;
362 std::string private_key_info, der_cert;
363 int error;
364 std::vector<uint8> types;
365 types.push_back(CLIENT_CERT_ECDSA_SIGN);
366 {
367 ServerBoundCertService::RequestHandle request_handle;
368
369 error = service_->GetDomainBoundCert(origin,
370 types,
371 &type,
372 &private_key_info,
373 &der_cert,
374 base::Bind(&FailTest),
375 &request_handle);
376 EXPECT_EQ(ERR_IO_PENDING, error);
377 EXPECT_TRUE(request_handle.is_active());
378 }
379
380 // Wait for generation to finish.
381 sequenced_worker_pool_->FlushForTesting();
347 // Wait for reply from ServerBoundCertServiceWorker to be posted back to the 382 // Wait for reply from ServerBoundCertServiceWorker to be posted back to the
348 // ServerBoundCertService. 383 // ServerBoundCertService.
349 MessageLoop::current()->RunUntilIdle(); 384 MessageLoop::current()->RunUntilIdle();
350 385
351 // Even though the original request was cancelled, the service will still 386 // Even though the original request was cancelled, the service will still
352 // store the result, it just doesn't call the callback. 387 // store the result, it just doesn't call the callback.
353 EXPECT_EQ(1, service_->cert_count()); 388 EXPECT_EQ(1, service_->cert_count());
354 } 389 }
355 390
356 TEST_F(ServerBoundCertServiceTest, DestructionWithPendingRequest) { 391 TEST_F(ServerBoundCertServiceTest, DestructionWithPendingRequest) {
357 std::string origin("https://encrypted.google.com:443"); 392 std::string origin("https://encrypted.google.com:443");
358 SSLClientCertType type; 393 SSLClientCertType type;
359 std::string private_key_info, der_cert; 394 std::string private_key_info, der_cert;
360 int error; 395 int error;
361 std::vector<uint8> types; 396 std::vector<uint8> types;
362 types.push_back(CLIENT_CERT_ECDSA_SIGN); 397 types.push_back(CLIENT_CERT_ECDSA_SIGN);
363 ServerBoundCertService::RequestHandle request_handle; 398 ServerBoundCertService::RequestHandle request_handle;
364 399
365 error = service_->GetDomainBoundCert(origin, 400 error = service_->GetDomainBoundCert(origin,
366 types, 401 types,
367 &type, 402 &type,
368 &private_key_info, 403 &private_key_info,
369 &der_cert, 404 &der_cert,
370 base::Bind(&FailTest), 405 base::Bind(&FailTest),
371 &request_handle); 406 &request_handle);
372 EXPECT_EQ(ERR_IO_PENDING, error); 407 EXPECT_EQ(ERR_IO_PENDING, error);
373 EXPECT_TRUE(request_handle != NULL); 408 EXPECT_TRUE(request_handle.is_active());
374 409
375 // Cancel request and destroy the ServerBoundCertService. 410 // Cancel request and destroy the ServerBoundCertService.
376 service_->CancelRequest(request_handle); 411 request_handle.Cancel();
377 service_.reset(); 412 service_.reset();
378 413
379 // Wait for generation to finish. 414 // Wait for generation to finish.
380 sequenced_worker_pool_->FlushForTesting(); 415 sequenced_worker_pool_->FlushForTesting();
381 // ServerBoundCertServiceWorker should not post anything back to the 416 // ServerBoundCertServiceWorker should not post anything back to the
382 // non-existant ServerBoundCertService, but run the loop just to be sure it 417 // non-existant ServerBoundCertService, but run the loop just to be sure it
383 // doesn't. 418 // doesn't.
384 MessageLoop::current()->RunUntilIdle(); 419 MessageLoop::current()->RunUntilIdle();
385 420
386 // If we got here without crashing or a valgrind error, it worked. 421 // If we got here without crashing or a valgrind error, it worked.
387 } 422 }
388 423
389 // Tests that simultaneous creation of different certs works. 424 // Tests that simultaneous creation of different certs works.
390 TEST_F(ServerBoundCertServiceTest, SimultaneousCreation) { 425 TEST_F(ServerBoundCertServiceTest, SimultaneousCreation) {
391 int error; 426 int error;
392 std::vector<uint8> types; 427 std::vector<uint8> types;
393 types.push_back(CLIENT_CERT_ECDSA_SIGN); 428 types.push_back(CLIENT_CERT_ECDSA_SIGN);
394 ServerBoundCertService::RequestHandle request_handle;
395 429
396 std::string origin1("https://encrypted.google.com:443"); 430 std::string origin1("https://encrypted.google.com:443");
397 SSLClientCertType type1; 431 SSLClientCertType type1;
398 std::string private_key_info1, der_cert1; 432 std::string private_key_info1, der_cert1;
399 TestCompletionCallback callback1; 433 TestCompletionCallback callback1;
434 ServerBoundCertService::RequestHandle request_handle1;
400 435
401 std::string origin2("https://foo.com:443"); 436 std::string origin2("https://foo.com:443");
402 SSLClientCertType type2; 437 SSLClientCertType type2;
403 std::string private_key_info2, der_cert2; 438 std::string private_key_info2, der_cert2;
404 TestCompletionCallback callback2; 439 TestCompletionCallback callback2;
440 ServerBoundCertService::RequestHandle request_handle2;
405 441
406 std::string origin3("https://bar.com:443"); 442 std::string origin3("https://bar.com:443");
407 SSLClientCertType type3; 443 SSLClientCertType type3;
408 std::string private_key_info3, der_cert3; 444 std::string private_key_info3, der_cert3;
409 TestCompletionCallback callback3; 445 TestCompletionCallback callback3;
446 ServerBoundCertService::RequestHandle request_handle3;
410 447
411 error = service_->GetDomainBoundCert(origin1, 448 error = service_->GetDomainBoundCert(origin1,
412 types, 449 types,
413 &type1, 450 &type1,
414 &private_key_info1, 451 &private_key_info1,
415 &der_cert1, 452 &der_cert1,
416 callback1.callback(), 453 callback1.callback(),
417 &request_handle); 454 &request_handle1);
418 EXPECT_EQ(ERR_IO_PENDING, error); 455 EXPECT_EQ(ERR_IO_PENDING, error);
419 EXPECT_TRUE(request_handle != NULL); 456 EXPECT_TRUE(request_handle1.is_active());
420 457
421 error = service_->GetDomainBoundCert(origin2, 458 error = service_->GetDomainBoundCert(origin2,
422 types, 459 types,
423 &type2, 460 &type2,
424 &private_key_info2, 461 &private_key_info2,
425 &der_cert2, 462 &der_cert2,
426 callback2.callback(), 463 callback2.callback(),
427 &request_handle); 464 &request_handle2);
428 EXPECT_EQ(ERR_IO_PENDING, error); 465 EXPECT_EQ(ERR_IO_PENDING, error);
429 EXPECT_TRUE(request_handle != NULL); 466 EXPECT_TRUE(request_handle2.is_active());
430 467
431 error = service_->GetDomainBoundCert(origin3, 468 error = service_->GetDomainBoundCert(origin3,
432 types, 469 types,
433 &type3, 470 &type3,
434 &private_key_info3, 471 &private_key_info3,
435 &der_cert3, 472 &der_cert3,
436 callback3.callback(), 473 callback3.callback(),
437 &request_handle); 474 &request_handle3);
438 EXPECT_EQ(ERR_IO_PENDING, error); 475 EXPECT_EQ(ERR_IO_PENDING, error);
439 EXPECT_TRUE(request_handle != NULL); 476 EXPECT_TRUE(request_handle3.is_active());
440 477
441 error = callback1.WaitForResult(); 478 error = callback1.WaitForResult();
442 EXPECT_EQ(OK, error); 479 EXPECT_EQ(OK, error);
443 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1); 480 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
444 EXPECT_FALSE(private_key_info1.empty()); 481 EXPECT_FALSE(private_key_info1.empty());
445 EXPECT_FALSE(der_cert1.empty()); 482 EXPECT_FALSE(der_cert1.empty());
446 483
447 error = callback2.WaitForResult(); 484 error = callback2.WaitForResult();
448 EXPECT_EQ(OK, error); 485 EXPECT_EQ(OK, error);
449 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2); 486 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 TestCompletionCallback callback; 528 TestCompletionCallback callback;
492 ServerBoundCertService::RequestHandle request_handle; 529 ServerBoundCertService::RequestHandle request_handle;
493 530
494 // Cert still valid - synchronous completion. 531 // Cert still valid - synchronous completion.
495 SSLClientCertType type1; 532 SSLClientCertType type1;
496 std::string private_key_info1, der_cert1; 533 std::string private_key_info1, der_cert1;
497 error = service_->GetDomainBoundCert( 534 error = service_->GetDomainBoundCert(
498 "https://good", types, &type1, &private_key_info1, &der_cert1, 535 "https://good", types, &type1, &private_key_info1, &der_cert1,
499 callback.callback(), &request_handle); 536 callback.callback(), &request_handle);
500 EXPECT_EQ(OK, error); 537 EXPECT_EQ(OK, error);
501 EXPECT_TRUE(request_handle == NULL); 538 EXPECT_FALSE(request_handle.is_active());
502 EXPECT_EQ(2, service_->cert_count()); 539 EXPECT_EQ(2, service_->cert_count());
503 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1); 540 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type1);
504 EXPECT_STREQ("a", private_key_info1.c_str()); 541 EXPECT_STREQ("a", private_key_info1.c_str());
505 EXPECT_STREQ("b", der_cert1.c_str()); 542 EXPECT_STREQ("b", der_cert1.c_str());
506 543
507 // Cert expired - New cert will be generated, asynchronous completion. 544 // Cert expired - New cert will be generated, asynchronous completion.
508 SSLClientCertType type2; 545 SSLClientCertType type2;
509 std::string private_key_info2, der_cert2; 546 std::string private_key_info2, der_cert2;
510 error = service_->GetDomainBoundCert( 547 error = service_->GetDomainBoundCert(
511 "https://expired", types, &type2, &private_key_info2, &der_cert2, 548 "https://expired", types, &type2, &private_key_info2, &der_cert2,
512 callback.callback(), &request_handle); 549 callback.callback(), &request_handle);
513 EXPECT_EQ(ERR_IO_PENDING, error); 550 EXPECT_EQ(ERR_IO_PENDING, error);
514 EXPECT_TRUE(request_handle != NULL); 551 EXPECT_TRUE(request_handle.is_active());
515 error = callback.WaitForResult(); 552 error = callback.WaitForResult();
516 EXPECT_EQ(OK, error); 553 EXPECT_EQ(OK, error);
517 EXPECT_EQ(2, service_->cert_count()); 554 EXPECT_EQ(2, service_->cert_count());
518 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2); 555 EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type2);
519 EXPECT_LT(1U, private_key_info2.size()); 556 EXPECT_LT(1U, private_key_info2.size());
520 EXPECT_LT(1U, der_cert2.size()); 557 EXPECT_LT(1U, der_cert2.size());
521 } 558 }
522 559
523 #endif // !defined(USE_OPENSSL) 560 #endif // !defined(USE_OPENSSL)
524 561
525 } // namespace 562 } // namespace
526 563
527 } // namespace net 564 } // namespace net
OLDNEW
« no previous file with comments | « net/base/server_bound_cert_service.cc ('k') | net/socket/ssl_client_socket_nss.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698