OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/cert_verifier.h" | 5 #include "net/base/cert_verifier.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "net/base/cert_test_util.h" | 10 #include "net/base/cert_test_util.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 FilePath certs_dir = GetTestCertsDirectory(); | 43 FilePath certs_dir = GetTestCertsDirectory(); |
44 scoped_refptr<X509Certificate> test_cert( | 44 scoped_refptr<X509Certificate> test_cert( |
45 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 45 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
46 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 46 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
47 | 47 |
48 int error; | 48 int error; |
49 CertVerifyResult verify_result; | 49 CertVerifyResult verify_result; |
50 TestCompletionCallback callback; | 50 TestCompletionCallback callback; |
51 CertVerifier::RequestHandle request_handle; | 51 CertVerifier::RequestHandle request_handle; |
52 | 52 |
53 error = verifier.Verify(test_cert, "www.example.com", 0, &verify_result, | 53 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, |
54 callback.callback(), &request_handle, BoundNetLog()); | 54 callback.callback(), &request_handle, BoundNetLog()); |
55 ASSERT_EQ(ERR_IO_PENDING, error); | 55 ASSERT_EQ(ERR_IO_PENDING, error); |
56 ASSERT_TRUE(request_handle != NULL); | 56 ASSERT_TRUE(request_handle != NULL); |
57 error = callback.WaitForResult(); | 57 error = callback.WaitForResult(); |
58 ASSERT_TRUE(IsCertificateError(error)); | 58 ASSERT_TRUE(IsCertificateError(error)); |
59 ASSERT_EQ(1u, verifier.requests()); | 59 ASSERT_EQ(1u, verifier.requests()); |
60 ASSERT_EQ(0u, verifier.cache_hits()); | 60 ASSERT_EQ(0u, verifier.cache_hits()); |
61 ASSERT_EQ(0u, verifier.inflight_joins()); | 61 ASSERT_EQ(0u, verifier.inflight_joins()); |
62 | 62 |
63 error = verifier.Verify(test_cert, "www.example.com", 0, &verify_result, | 63 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, |
64 callback.callback(), &request_handle, BoundNetLog()); | 64 callback.callback(), &request_handle, BoundNetLog()); |
65 // Synchronous completion. | 65 // Synchronous completion. |
66 ASSERT_NE(ERR_IO_PENDING, error); | 66 ASSERT_NE(ERR_IO_PENDING, error); |
67 ASSERT_TRUE(IsCertificateError(error)); | 67 ASSERT_TRUE(IsCertificateError(error)); |
68 ASSERT_TRUE(request_handle == NULL); | 68 ASSERT_TRUE(request_handle == NULL); |
69 ASSERT_EQ(2u, verifier.requests()); | 69 ASSERT_EQ(2u, verifier.requests()); |
70 ASSERT_EQ(1u, verifier.cache_hits()); | 70 ASSERT_EQ(1u, verifier.cache_hits()); |
71 ASSERT_EQ(0u, verifier.inflight_joins()); | 71 ASSERT_EQ(0u, verifier.inflight_joins()); |
72 } | 72 } |
73 | 73 |
(...skipping 10 matching lines...) Expand all Loading... |
84 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 84 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
85 | 85 |
86 int error; | 86 int error; |
87 CertVerifyResult verify_result; | 87 CertVerifyResult verify_result; |
88 TestCompletionCallback callback; | 88 TestCompletionCallback callback; |
89 CertVerifier::RequestHandle request_handle; | 89 CertVerifier::RequestHandle request_handle; |
90 CertVerifyResult verify_result2; | 90 CertVerifyResult verify_result2; |
91 TestCompletionCallback callback2; | 91 TestCompletionCallback callback2; |
92 CertVerifier::RequestHandle request_handle2; | 92 CertVerifier::RequestHandle request_handle2; |
93 | 93 |
94 error = verifier.Verify(test_cert, "www.example.com", 0, &verify_result, | 94 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, |
95 callback.callback(), &request_handle, BoundNetLog()); | 95 callback.callback(), &request_handle, BoundNetLog()); |
96 ASSERT_EQ(ERR_IO_PENDING, error); | 96 ASSERT_EQ(ERR_IO_PENDING, error); |
97 ASSERT_TRUE(request_handle != NULL); | 97 ASSERT_TRUE(request_handle != NULL); |
98 error = verifier.Verify( | 98 error = verifier.Verify( |
99 test_cert, "www.example.com", 0, &verify_result2, | 99 test_cert, "www.example.com", 0, NULL, &verify_result2, |
100 callback2.callback(), &request_handle2, BoundNetLog()); | 100 callback2.callback(), &request_handle2, BoundNetLog()); |
101 ASSERT_EQ(ERR_IO_PENDING, error); | 101 ASSERT_EQ(ERR_IO_PENDING, error); |
102 ASSERT_TRUE(request_handle2 != NULL); | 102 ASSERT_TRUE(request_handle2 != NULL); |
103 error = callback.WaitForResult(); | 103 error = callback.WaitForResult(); |
104 ASSERT_TRUE(IsCertificateError(error)); | 104 ASSERT_TRUE(IsCertificateError(error)); |
105 error = callback2.WaitForResult(); | 105 error = callback2.WaitForResult(); |
106 ASSERT_TRUE(IsCertificateError(error)); | 106 ASSERT_TRUE(IsCertificateError(error)); |
107 ASSERT_EQ(2u, verifier.requests()); | 107 ASSERT_EQ(2u, verifier.requests()); |
108 ASSERT_EQ(0u, verifier.cache_hits()); | 108 ASSERT_EQ(0u, verifier.cache_hits()); |
109 ASSERT_EQ(1u, verifier.inflight_joins()); | 109 ASSERT_EQ(1u, verifier.inflight_joins()); |
(...skipping 10 matching lines...) Expand all Loading... |
120 scoped_refptr<X509Certificate> test_cert( | 120 scoped_refptr<X509Certificate> test_cert( |
121 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 121 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
122 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 122 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
123 | 123 |
124 int error; | 124 int error; |
125 CertVerifyResult verify_result; | 125 CertVerifyResult verify_result; |
126 TestCompletionCallback callback; | 126 TestCompletionCallback callback; |
127 CertVerifier::RequestHandle request_handle; | 127 CertVerifier::RequestHandle request_handle; |
128 | 128 |
129 error = verifier.Verify( | 129 error = verifier.Verify( |
130 test_cert, "www.example.com", 0, &verify_result, | 130 test_cert, "www.example.com", 0, NULL, &verify_result, |
131 callback.callback(), &request_handle, BoundNetLog()); | 131 callback.callback(), &request_handle, BoundNetLog()); |
132 ASSERT_EQ(ERR_IO_PENDING, error); | 132 ASSERT_EQ(ERR_IO_PENDING, error); |
133 ASSERT_TRUE(request_handle != NULL); | 133 ASSERT_TRUE(request_handle != NULL); |
134 error = callback.WaitForResult(); | 134 error = callback.WaitForResult(); |
135 ASSERT_TRUE(IsCertificateError(error)); | 135 ASSERT_TRUE(IsCertificateError(error)); |
136 ASSERT_EQ(1u, verifier.requests()); | 136 ASSERT_EQ(1u, verifier.requests()); |
137 ASSERT_EQ(0u, verifier.cache_hits()); | 137 ASSERT_EQ(0u, verifier.cache_hits()); |
138 ASSERT_EQ(0u, verifier.inflight_joins()); | 138 ASSERT_EQ(0u, verifier.inflight_joins()); |
139 | 139 |
140 // Before expiration, should have a cache hit. | 140 // Before expiration, should have a cache hit. |
141 error = verifier.Verify( | 141 error = verifier.Verify( |
142 test_cert, "www.example.com", 0, &verify_result, | 142 test_cert, "www.example.com", 0, NULL, &verify_result, |
143 callback.callback(), &request_handle, BoundNetLog()); | 143 callback.callback(), &request_handle, BoundNetLog()); |
144 // Synchronous completion. | 144 // Synchronous completion. |
145 ASSERT_NE(ERR_IO_PENDING, error); | 145 ASSERT_NE(ERR_IO_PENDING, error); |
146 ASSERT_TRUE(IsCertificateError(error)); | 146 ASSERT_TRUE(IsCertificateError(error)); |
147 ASSERT_TRUE(request_handle == NULL); | 147 ASSERT_TRUE(request_handle == NULL); |
148 ASSERT_EQ(2u, verifier.requests()); | 148 ASSERT_EQ(2u, verifier.requests()); |
149 ASSERT_EQ(1u, verifier.cache_hits()); | 149 ASSERT_EQ(1u, verifier.cache_hits()); |
150 ASSERT_EQ(0u, verifier.inflight_joins()); | 150 ASSERT_EQ(0u, verifier.inflight_joins()); |
151 | 151 |
152 // After expiration, should not have a cache hit. | 152 // After expiration, should not have a cache hit. |
153 ASSERT_EQ(1u, verifier.GetCacheSize()); | 153 ASSERT_EQ(1u, verifier.GetCacheSize()); |
154 current_time += base::TimeDelta::FromMinutes(60); | 154 current_time += base::TimeDelta::FromMinutes(60); |
155 time_service->set_current_time(current_time); | 155 time_service->set_current_time(current_time); |
156 error = verifier.Verify( | 156 error = verifier.Verify( |
157 test_cert, "www.example.com", 0, &verify_result, | 157 test_cert, "www.example.com", 0, NULL, &verify_result, |
158 callback.callback(), &request_handle, BoundNetLog()); | 158 callback.callback(), &request_handle, BoundNetLog()); |
159 ASSERT_EQ(ERR_IO_PENDING, error); | 159 ASSERT_EQ(ERR_IO_PENDING, error); |
160 ASSERT_TRUE(request_handle != NULL); | 160 ASSERT_TRUE(request_handle != NULL); |
161 ASSERT_EQ(0u, verifier.GetCacheSize()); | 161 ASSERT_EQ(0u, verifier.GetCacheSize()); |
162 error = callback.WaitForResult(); | 162 error = callback.WaitForResult(); |
163 ASSERT_TRUE(IsCertificateError(error)); | 163 ASSERT_TRUE(IsCertificateError(error)); |
164 ASSERT_EQ(3u, verifier.requests()); | 164 ASSERT_EQ(3u, verifier.requests()); |
165 ASSERT_EQ(1u, verifier.cache_hits()); | 165 ASSERT_EQ(1u, verifier.cache_hits()); |
166 ASSERT_EQ(0u, verifier.inflight_joins()); | 166 ASSERT_EQ(0u, verifier.inflight_joins()); |
167 } | 167 } |
(...skipping 14 matching lines...) Expand all Loading... |
182 scoped_refptr<X509Certificate> test_cert( | 182 scoped_refptr<X509Certificate> test_cert( |
183 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 183 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
184 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 184 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
185 | 185 |
186 int error; | 186 int error; |
187 CertVerifyResult verify_result; | 187 CertVerifyResult verify_result; |
188 TestCompletionCallback callback; | 188 TestCompletionCallback callback; |
189 CertVerifier::RequestHandle request_handle; | 189 CertVerifier::RequestHandle request_handle; |
190 | 190 |
191 error = verifier.Verify( | 191 error = verifier.Verify( |
192 test_cert, "www.example.com", 0, &verify_result, | 192 test_cert, "www.example.com", 0, NULL, &verify_result, |
193 callback.callback(), &request_handle, BoundNetLog()); | 193 callback.callback(), &request_handle, BoundNetLog()); |
194 ASSERT_EQ(ERR_IO_PENDING, error); | 194 ASSERT_EQ(ERR_IO_PENDING, error); |
195 ASSERT_TRUE(request_handle != NULL); | 195 ASSERT_TRUE(request_handle != NULL); |
196 error = callback.WaitForResult(); | 196 error = callback.WaitForResult(); |
197 ASSERT_TRUE(IsCertificateError(error)); | 197 ASSERT_TRUE(IsCertificateError(error)); |
198 ASSERT_EQ(1u, verifier.requests()); | 198 ASSERT_EQ(1u, verifier.requests()); |
199 ASSERT_EQ(0u, verifier.cache_hits()); | 199 ASSERT_EQ(0u, verifier.cache_hits()); |
200 ASSERT_EQ(0u, verifier.inflight_joins()); | 200 ASSERT_EQ(0u, verifier.inflight_joins()); |
201 | 201 |
202 for (unsigned i = 0; i < kCacheSize; i++) { | 202 for (unsigned i = 0; i < kCacheSize; i++) { |
203 std::string hostname = base::StringPrintf("www%d.example.com", i + 1); | 203 std::string hostname = base::StringPrintf("www%d.example.com", i + 1); |
204 error = verifier.Verify( | 204 error = verifier.Verify( |
205 test_cert, hostname, 0, &verify_result, | 205 test_cert, hostname, 0, NULL, &verify_result, |
206 callback.callback(), &request_handle, BoundNetLog()); | 206 callback.callback(), &request_handle, BoundNetLog()); |
207 ASSERT_EQ(ERR_IO_PENDING, error); | 207 ASSERT_EQ(ERR_IO_PENDING, error); |
208 ASSERT_TRUE(request_handle != NULL); | 208 ASSERT_TRUE(request_handle != NULL); |
209 error = callback.WaitForResult(); | 209 error = callback.WaitForResult(); |
210 ASSERT_TRUE(IsCertificateError(error)); | 210 ASSERT_TRUE(IsCertificateError(error)); |
211 } | 211 } |
212 ASSERT_EQ(kCacheSize + 1, verifier.requests()); | 212 ASSERT_EQ(kCacheSize + 1, verifier.requests()); |
213 ASSERT_EQ(0u, verifier.cache_hits()); | 213 ASSERT_EQ(0u, verifier.cache_hits()); |
214 ASSERT_EQ(0u, verifier.inflight_joins()); | 214 ASSERT_EQ(0u, verifier.inflight_joins()); |
215 | 215 |
216 ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); | 216 ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); |
217 current_time += base::TimeDelta::FromMinutes(60); | 217 current_time += base::TimeDelta::FromMinutes(60); |
218 time_service->set_current_time(current_time); | 218 time_service->set_current_time(current_time); |
219 error = verifier.Verify( | 219 error = verifier.Verify( |
220 test_cert, "www999.example.com", 0, &verify_result, | 220 test_cert, "www999.example.com", 0, NULL, &verify_result, |
221 callback.callback(), &request_handle, BoundNetLog()); | 221 callback.callback(), &request_handle, BoundNetLog()); |
222 ASSERT_EQ(ERR_IO_PENDING, error); | 222 ASSERT_EQ(ERR_IO_PENDING, error); |
223 ASSERT_TRUE(request_handle != NULL); | 223 ASSERT_TRUE(request_handle != NULL); |
224 ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); | 224 ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); |
225 error = callback.WaitForResult(); | 225 error = callback.WaitForResult(); |
226 ASSERT_EQ(1u, verifier.GetCacheSize()); | 226 ASSERT_EQ(1u, verifier.GetCacheSize()); |
227 ASSERT_TRUE(IsCertificateError(error)); | 227 ASSERT_TRUE(IsCertificateError(error)); |
228 ASSERT_EQ(kCacheSize + 2, verifier.requests()); | 228 ASSERT_EQ(kCacheSize + 2, verifier.requests()); |
229 ASSERT_EQ(0u, verifier.cache_hits()); | 229 ASSERT_EQ(0u, verifier.cache_hits()); |
230 ASSERT_EQ(0u, verifier.inflight_joins()); | 230 ASSERT_EQ(0u, verifier.inflight_joins()); |
231 } | 231 } |
232 | 232 |
233 // Tests that the callback of a canceled request is never made. | 233 // Tests that the callback of a canceled request is never made. |
234 TEST(CertVerifierTest, CancelRequest) { | 234 TEST(CertVerifierTest, CancelRequest) { |
235 CertVerifier verifier; | 235 CertVerifier verifier; |
236 | 236 |
237 FilePath certs_dir = GetTestCertsDirectory(); | 237 FilePath certs_dir = GetTestCertsDirectory(); |
238 scoped_refptr<X509Certificate> test_cert( | 238 scoped_refptr<X509Certificate> test_cert( |
239 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 239 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
240 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 240 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
241 | 241 |
242 int error; | 242 int error; |
243 CertVerifyResult verify_result; | 243 CertVerifyResult verify_result; |
244 CertVerifier::RequestHandle request_handle; | 244 CertVerifier::RequestHandle request_handle; |
245 | 245 |
246 error = verifier.Verify( | 246 error = verifier.Verify( |
247 test_cert, "www.example.com", 0, &verify_result, | 247 test_cert, "www.example.com", 0, NULL, &verify_result, |
248 base::Bind(&FailTest), &request_handle, BoundNetLog()); | 248 base::Bind(&FailTest), &request_handle, BoundNetLog()); |
249 ASSERT_EQ(ERR_IO_PENDING, error); | 249 ASSERT_EQ(ERR_IO_PENDING, error); |
250 ASSERT_TRUE(request_handle != NULL); | 250 ASSERT_TRUE(request_handle != NULL); |
251 verifier.CancelRequest(request_handle); | 251 verifier.CancelRequest(request_handle); |
252 | 252 |
253 // Issue a few more requests to the worker pool and wait for their | 253 // Issue a few more requests to the worker pool and wait for their |
254 // completion, so that the task of the canceled request (which runs on a | 254 // completion, so that the task of the canceled request (which runs on a |
255 // worker thread) is likely to complete by the end of this test. | 255 // worker thread) is likely to complete by the end of this test. |
256 TestCompletionCallback callback; | 256 TestCompletionCallback callback; |
257 for (int i = 0; i < 5; ++i) { | 257 for (int i = 0; i < 5; ++i) { |
258 error = verifier.Verify( | 258 error = verifier.Verify( |
259 test_cert, "www2.example.com", 0, &verify_result, | 259 test_cert, "www2.example.com", 0, NULL, &verify_result, |
260 callback.callback(), &request_handle, BoundNetLog()); | 260 callback.callback(), &request_handle, BoundNetLog()); |
261 ASSERT_EQ(ERR_IO_PENDING, error); | 261 ASSERT_EQ(ERR_IO_PENDING, error); |
262 ASSERT_TRUE(request_handle != NULL); | 262 ASSERT_TRUE(request_handle != NULL); |
263 error = callback.WaitForResult(); | 263 error = callback.WaitForResult(); |
264 verifier.ClearCache(); | 264 verifier.ClearCache(); |
265 } | 265 } |
266 } | 266 } |
267 | 267 |
268 // Tests that a canceled request is not leaked. | 268 // Tests that a canceled request is not leaked. |
269 TEST(CertVerifierTest, CancelRequestThenQuit) { | 269 TEST(CertVerifierTest, CancelRequestThenQuit) { |
270 CertVerifier verifier; | 270 CertVerifier verifier; |
271 | 271 |
272 FilePath certs_dir = GetTestCertsDirectory(); | 272 FilePath certs_dir = GetTestCertsDirectory(); |
273 scoped_refptr<X509Certificate> test_cert( | 273 scoped_refptr<X509Certificate> test_cert( |
274 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 274 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
275 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 275 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
276 | 276 |
277 int error; | 277 int error; |
278 CertVerifyResult verify_result; | 278 CertVerifyResult verify_result; |
279 TestCompletionCallback callback; | 279 TestCompletionCallback callback; |
280 CertVerifier::RequestHandle request_handle; | 280 CertVerifier::RequestHandle request_handle; |
281 | 281 |
282 error = verifier.Verify(test_cert, "www.example.com", 0, &verify_result, | 282 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, |
283 callback.callback(), &request_handle, BoundNetLog()); | 283 callback.callback(), &request_handle, BoundNetLog()); |
284 ASSERT_EQ(ERR_IO_PENDING, error); | 284 ASSERT_EQ(ERR_IO_PENDING, error); |
285 ASSERT_TRUE(request_handle != NULL); | 285 ASSERT_TRUE(request_handle != NULL); |
286 verifier.CancelRequest(request_handle); | 286 verifier.CancelRequest(request_handle); |
287 // Destroy |verifier| by going out of scope. | 287 // Destroy |verifier| by going out of scope. |
288 } | 288 } |
289 | 289 |
290 } // namespace | 290 } // namespace |
291 | 291 |
292 } // namespace net | 292 } // namespace net |
OLD | NEW |