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

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

Issue 9584041: Create stubs for system certificate validation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move system stubs into patch 4 for svn history preservation Created 8 years, 9 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/multi_threaded_cert_verifier.cc ('k') | net/base/single_request_cert_verifier.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/multi_threaded_cert_verifier.h" 5 #include "net/base/multi_threaded_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/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
11 #include "net/base/cert_test_util.h" 11 #include "net/base/cert_test_util.h"
12 #include "net/base/cert_verify_proc.h"
13 #include "net/base/cert_verify_result.h"
12 #include "net/base/net_errors.h" 14 #include "net/base/net_errors.h"
13 #include "net/base/net_log.h" 15 #include "net/base/net_log.h"
14 #include "net/base/test_completion_callback.h" 16 #include "net/base/test_completion_callback.h"
15 #include "net/base/x509_certificate.h" 17 #include "net/base/x509_certificate.h"
16 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
17 19
18 namespace net { 20 namespace net {
19 21
20 namespace { 22 namespace {
21 23
22 void FailTest(int /* result */) { 24 void FailTest(int /* result */) {
23 FAIL(); 25 FAIL();
24 } 26 }
25 27
26 } // namespace; 28 class MockCertVerifyProc : public CertVerifyProc {
29 public:
30 MockCertVerifyProc() {}
31
32 private:
33 virtual ~MockCertVerifyProc() {}
34
35 // CertVerifyProc implementation
36 virtual int VerifyInternal(X509Certificate* cert,
37 const std::string& hostname,
38 int flags,
39 CRLSet* crl_set,
40 CertVerifyResult* verify_result) OVERRIDE {
41 verify_result->Reset();
42 verify_result->verified_cert = cert;
43 verify_result->cert_status = CERT_STATUS_COMMON_NAME_INVALID;
44 return ERR_CERT_COMMON_NAME_INVALID;
45 }
46 };
47
48 } // namespace
49
50 class MultiThreadedCertVerifierTest : public ::testing::Test {
51 public:
52 MultiThreadedCertVerifierTest() {
53 verifier_.SetCertVerifyProc(new MockCertVerifyProc());
54 }
55 virtual ~MultiThreadedCertVerifierTest() {}
56
57 protected:
58 MultiThreadedCertVerifier verifier_;
59 };
27 60
28 // Tests a cache hit, which should result in synchronous completion. 61 // Tests a cache hit, which should result in synchronous completion.
29 #if defined(OS_MACOSX) 62 #if defined(OS_MACOSX)
30 // http://crbug.com/117372 63 // http://crbug.com/117372
31 #define MAYBE_CacheHit FAILS_CacheHit 64 #define MAYBE_CacheHit FAILS_CacheHit
32 #else 65 #else
33 #define MAYBE_CacheHit CacheHit 66 #define MAYBE_CacheHit CacheHit
34 #endif // defined(OS_MACOSX) 67 #endif // defined(OS_MACOSX)
35 TEST(MultiThreadedCertVerifierTest, MAYBE_CacheHit) { 68 TEST_F(MultiThreadedCertVerifierTest, MAYBE_CacheHit) {
36 MultiThreadedCertVerifier verifier;
37
38 FilePath certs_dir = GetTestCertsDirectory(); 69 FilePath certs_dir = GetTestCertsDirectory();
39 scoped_refptr<X509Certificate> test_cert( 70 scoped_refptr<X509Certificate> test_cert(
40 ImportCertFromFile(certs_dir, "ok_cert.pem")); 71 ImportCertFromFile(certs_dir, "ok_cert.pem"));
41 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 72 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
42 73
43 int error; 74 int error;
44 CertVerifyResult verify_result; 75 CertVerifyResult verify_result;
45 TestCompletionCallback callback; 76 TestCompletionCallback callback;
46 CertVerifier::RequestHandle request_handle; 77 CertVerifier::RequestHandle request_handle;
47 78
48 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, 79 error = verifier_.Verify(test_cert, "www.example.com", 0, NULL,
49 callback.callback(), &request_handle, BoundNetLog()); 80 &verify_result, callback.callback(),
81 &request_handle, BoundNetLog());
50 ASSERT_EQ(ERR_IO_PENDING, error); 82 ASSERT_EQ(ERR_IO_PENDING, error);
51 ASSERT_TRUE(request_handle != NULL); 83 ASSERT_TRUE(request_handle != NULL);
52 error = callback.WaitForResult(); 84 error = callback.WaitForResult();
53 ASSERT_TRUE(IsCertificateError(error)); 85 ASSERT_TRUE(IsCertificateError(error));
54 ASSERT_EQ(1u, verifier.requests()); 86 ASSERT_EQ(1u, verifier_.requests());
55 ASSERT_EQ(0u, verifier.cache_hits()); 87 ASSERT_EQ(0u, verifier_.cache_hits());
56 ASSERT_EQ(0u, verifier.inflight_joins()); 88 ASSERT_EQ(0u, verifier_.inflight_joins());
57 ASSERT_EQ(1u, verifier.GetCacheSize()); 89 ASSERT_EQ(1u, verifier_.GetCacheSize());
58 90
59 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, 91 error = verifier_.Verify(test_cert, "www.example.com", 0, NULL,
60 callback.callback(), &request_handle, BoundNetLog()); 92 &verify_result, callback.callback(),
93 &request_handle, BoundNetLog());
61 // Synchronous completion. 94 // Synchronous completion.
62 ASSERT_NE(ERR_IO_PENDING, error); 95 ASSERT_NE(ERR_IO_PENDING, error);
63 ASSERT_TRUE(IsCertificateError(error)); 96 ASSERT_TRUE(IsCertificateError(error));
64 ASSERT_TRUE(request_handle == NULL); 97 ASSERT_TRUE(request_handle == NULL);
65 ASSERT_EQ(2u, verifier.requests()); 98 ASSERT_EQ(2u, verifier_.requests());
66 ASSERT_EQ(1u, verifier.cache_hits()); 99 ASSERT_EQ(1u, verifier_.cache_hits());
67 ASSERT_EQ(0u, verifier.inflight_joins()); 100 ASSERT_EQ(0u, verifier_.inflight_joins());
68 ASSERT_EQ(1u, verifier.GetCacheSize()); 101 ASSERT_EQ(1u, verifier_.GetCacheSize());
69 } 102 }
70 103
71 // Tests the same server certificate with different intermediate CA 104 // Tests the same server certificate with different intermediate CA
72 // certificates. These should be treated as different certificate chains even 105 // certificates. These should be treated as different certificate chains even
73 // though the two X509Certificate objects contain the same server certificate. 106 // though the two X509Certificate objects contain the same server certificate.
74 TEST(MultiThreadedCertVerifierTest, DifferentCACerts) { 107 TEST_F(MultiThreadedCertVerifierTest, DifferentCACerts) {
75 MultiThreadedCertVerifier verifier;
76
77 FilePath certs_dir = GetTestCertsDirectory(); 108 FilePath certs_dir = GetTestCertsDirectory();
78 109
79 scoped_refptr<X509Certificate> server_cert = 110 scoped_refptr<X509Certificate> server_cert =
80 ImportCertFromFile(certs_dir, "salesforce_com_test.pem"); 111 ImportCertFromFile(certs_dir, "salesforce_com_test.pem");
81 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert); 112 ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert);
82 113
83 scoped_refptr<X509Certificate> intermediate_cert1 = 114 scoped_refptr<X509Certificate> intermediate_cert1 =
84 ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2011.pem"); 115 ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2011.pem");
85 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert1); 116 ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert1);
86 117
(...skipping 11 matching lines...) Expand all
98 intermediates.push_back(intermediate_cert2->os_cert_handle()); 129 intermediates.push_back(intermediate_cert2->os_cert_handle());
99 scoped_refptr<X509Certificate> cert_chain2 = 130 scoped_refptr<X509Certificate> cert_chain2 =
100 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), 131 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
101 intermediates); 132 intermediates);
102 133
103 int error; 134 int error;
104 CertVerifyResult verify_result; 135 CertVerifyResult verify_result;
105 TestCompletionCallback callback; 136 TestCompletionCallback callback;
106 CertVerifier::RequestHandle request_handle; 137 CertVerifier::RequestHandle request_handle;
107 138
108 error = verifier.Verify(cert_chain1, "www.example.com", 0, NULL, 139 error = verifier_.Verify(cert_chain1, "www.example.com", 0, NULL,
109 &verify_result, callback.callback(), 140 &verify_result, callback.callback(),
110 &request_handle, BoundNetLog()); 141 &request_handle, BoundNetLog());
111 ASSERT_EQ(ERR_IO_PENDING, error); 142 ASSERT_EQ(ERR_IO_PENDING, error);
112 ASSERT_TRUE(request_handle != NULL); 143 ASSERT_TRUE(request_handle != NULL);
113 error = callback.WaitForResult(); 144 error = callback.WaitForResult();
114 ASSERT_TRUE(IsCertificateError(error)); 145 ASSERT_TRUE(IsCertificateError(error));
115 ASSERT_EQ(1u, verifier.requests()); 146 ASSERT_EQ(1u, verifier_.requests());
116 ASSERT_EQ(0u, verifier.cache_hits()); 147 ASSERT_EQ(0u, verifier_.cache_hits());
117 ASSERT_EQ(0u, verifier.inflight_joins()); 148 ASSERT_EQ(0u, verifier_.inflight_joins());
118 ASSERT_EQ(1u, verifier.GetCacheSize()); 149 ASSERT_EQ(1u, verifier_.GetCacheSize());
119 150
120 error = verifier.Verify(cert_chain2, "www.example.com", 0, NULL, 151 error = verifier_.Verify(cert_chain2, "www.example.com", 0, NULL,
121 &verify_result, callback.callback(), 152 &verify_result, callback.callback(),
122 &request_handle, BoundNetLog()); 153 &request_handle, BoundNetLog());
123 ASSERT_EQ(ERR_IO_PENDING, error); 154 ASSERT_EQ(ERR_IO_PENDING, error);
124 ASSERT_TRUE(request_handle != NULL); 155 ASSERT_TRUE(request_handle != NULL);
125 error = callback.WaitForResult(); 156 error = callback.WaitForResult();
126 ASSERT_TRUE(IsCertificateError(error)); 157 ASSERT_TRUE(IsCertificateError(error));
127 ASSERT_EQ(2u, verifier.requests()); 158 ASSERT_EQ(2u, verifier_.requests());
128 ASSERT_EQ(0u, verifier.cache_hits()); 159 ASSERT_EQ(0u, verifier_.cache_hits());
129 ASSERT_EQ(0u, verifier.inflight_joins()); 160 ASSERT_EQ(0u, verifier_.inflight_joins());
130 ASSERT_EQ(2u, verifier.GetCacheSize()); 161 ASSERT_EQ(2u, verifier_.GetCacheSize());
131 } 162 }
132 163
133 // Tests an inflight join. 164 // Tests an inflight join.
134 TEST(MultiThreadedCertVerifierTest, InflightJoin) { 165 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) {
135 MultiThreadedCertVerifier verifier;
136
137 FilePath certs_dir = GetTestCertsDirectory(); 166 FilePath certs_dir = GetTestCertsDirectory();
138 scoped_refptr<X509Certificate> test_cert( 167 scoped_refptr<X509Certificate> test_cert(
139 ImportCertFromFile(certs_dir, "ok_cert.pem")); 168 ImportCertFromFile(certs_dir, "ok_cert.pem"));
140 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 169 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
141 170
142 int error; 171 int error;
143 CertVerifyResult verify_result; 172 CertVerifyResult verify_result;
144 TestCompletionCallback callback; 173 TestCompletionCallback callback;
145 CertVerifier::RequestHandle request_handle; 174 CertVerifier::RequestHandle request_handle;
146 CertVerifyResult verify_result2; 175 CertVerifyResult verify_result2;
147 TestCompletionCallback callback2; 176 TestCompletionCallback callback2;
148 CertVerifier::RequestHandle request_handle2; 177 CertVerifier::RequestHandle request_handle2;
149 178
150 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, 179 error = verifier_.Verify(test_cert, "www.example.com", 0, NULL,
151 callback.callback(), &request_handle, BoundNetLog()); 180 &verify_result, callback.callback(),
181 &request_handle, BoundNetLog());
152 ASSERT_EQ(ERR_IO_PENDING, error); 182 ASSERT_EQ(ERR_IO_PENDING, error);
153 ASSERT_TRUE(request_handle != NULL); 183 ASSERT_TRUE(request_handle != NULL);
154 error = verifier.Verify( 184 error = verifier_.Verify(
155 test_cert, "www.example.com", 0, NULL, &verify_result2, 185 test_cert, "www.example.com", 0, NULL, &verify_result2,
156 callback2.callback(), &request_handle2, BoundNetLog()); 186 callback2.callback(), &request_handle2, BoundNetLog());
157 ASSERT_EQ(ERR_IO_PENDING, error); 187 ASSERT_EQ(ERR_IO_PENDING, error);
158 ASSERT_TRUE(request_handle2 != NULL); 188 ASSERT_TRUE(request_handle2 != NULL);
159 error = callback.WaitForResult(); 189 error = callback.WaitForResult();
160 ASSERT_TRUE(IsCertificateError(error)); 190 ASSERT_TRUE(IsCertificateError(error));
161 error = callback2.WaitForResult(); 191 error = callback2.WaitForResult();
162 ASSERT_TRUE(IsCertificateError(error)); 192 ASSERT_TRUE(IsCertificateError(error));
163 ASSERT_EQ(2u, verifier.requests()); 193 ASSERT_EQ(2u, verifier_.requests());
164 ASSERT_EQ(0u, verifier.cache_hits()); 194 ASSERT_EQ(0u, verifier_.cache_hits());
165 ASSERT_EQ(1u, verifier.inflight_joins()); 195 ASSERT_EQ(1u, verifier_.inflight_joins());
166 } 196 }
167 197
168 // Tests that the callback of a canceled request is never made. 198 // Tests that the callback of a canceled request is never made.
169 TEST(MultiThreadedCertVerifierTest, CancelRequest) { 199 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) {
170 MultiThreadedCertVerifier verifier;
171
172 FilePath certs_dir = GetTestCertsDirectory(); 200 FilePath certs_dir = GetTestCertsDirectory();
173 scoped_refptr<X509Certificate> test_cert( 201 scoped_refptr<X509Certificate> test_cert(
174 ImportCertFromFile(certs_dir, "ok_cert.pem")); 202 ImportCertFromFile(certs_dir, "ok_cert.pem"));
175 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 203 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
176 204
177 int error; 205 int error;
178 CertVerifyResult verify_result; 206 CertVerifyResult verify_result;
179 CertVerifier::RequestHandle request_handle; 207 CertVerifier::RequestHandle request_handle;
180 208
181 error = verifier.Verify( 209 error = verifier_.Verify(
182 test_cert, "www.example.com", 0, NULL, &verify_result, 210 test_cert, "www.example.com", 0, NULL, &verify_result,
183 base::Bind(&FailTest), &request_handle, BoundNetLog()); 211 base::Bind(&FailTest), &request_handle, BoundNetLog());
184 ASSERT_EQ(ERR_IO_PENDING, error); 212 ASSERT_EQ(ERR_IO_PENDING, error);
185 ASSERT_TRUE(request_handle != NULL); 213 ASSERT_TRUE(request_handle != NULL);
186 verifier.CancelRequest(request_handle); 214 verifier_.CancelRequest(request_handle);
187 215
188 // Issue a few more requests to the worker pool and wait for their 216 // Issue a few more requests to the worker pool and wait for their
189 // completion, so that the task of the canceled request (which runs on a 217 // completion, so that the task of the canceled request (which runs on a
190 // worker thread) is likely to complete by the end of this test. 218 // worker thread) is likely to complete by the end of this test.
191 TestCompletionCallback callback; 219 TestCompletionCallback callback;
192 for (int i = 0; i < 5; ++i) { 220 for (int i = 0; i < 5; ++i) {
193 error = verifier.Verify( 221 error = verifier_.Verify(
194 test_cert, "www2.example.com", 0, NULL, &verify_result, 222 test_cert, "www2.example.com", 0, NULL, &verify_result,
195 callback.callback(), &request_handle, BoundNetLog()); 223 callback.callback(), &request_handle, BoundNetLog());
196 ASSERT_EQ(ERR_IO_PENDING, error); 224 ASSERT_EQ(ERR_IO_PENDING, error);
197 ASSERT_TRUE(request_handle != NULL); 225 ASSERT_TRUE(request_handle != NULL);
198 error = callback.WaitForResult(); 226 error = callback.WaitForResult();
199 verifier.ClearCache(); 227 verifier_.ClearCache();
200 } 228 }
201 } 229 }
202 230
203 // Tests that a canceled request is not leaked. 231 // Tests that a canceled request is not leaked.
204 TEST(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { 232 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) {
205 MultiThreadedCertVerifier verifier;
206
207 FilePath certs_dir = GetTestCertsDirectory(); 233 FilePath certs_dir = GetTestCertsDirectory();
208 scoped_refptr<X509Certificate> test_cert( 234 scoped_refptr<X509Certificate> test_cert(
209 ImportCertFromFile(certs_dir, "ok_cert.pem")); 235 ImportCertFromFile(certs_dir, "ok_cert.pem"));
210 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); 236 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
211 237
212 int error; 238 int error;
213 CertVerifyResult verify_result; 239 CertVerifyResult verify_result;
214 TestCompletionCallback callback; 240 TestCompletionCallback callback;
215 CertVerifier::RequestHandle request_handle; 241 CertVerifier::RequestHandle request_handle;
216 242
217 error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result, 243 error = verifier_.Verify(test_cert, "www.example.com", 0, NULL,
218 callback.callback(), &request_handle, BoundNetLog()); 244 &verify_result, callback.callback(),
245 &request_handle, BoundNetLog());
219 ASSERT_EQ(ERR_IO_PENDING, error); 246 ASSERT_EQ(ERR_IO_PENDING, error);
220 ASSERT_TRUE(request_handle != NULL); 247 ASSERT_TRUE(request_handle != NULL);
221 verifier.CancelRequest(request_handle); 248 verifier_.CancelRequest(request_handle);
222 // Destroy |verifier| by going out of scope. 249 // Destroy |verifier| by going out of scope.
223 } 250 }
224 251
225 TEST(MultiThreadedCertVerifierTest, RequestParamsComparators) { 252 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) {
226 SHA1Fingerprint a_key; 253 SHA1Fingerprint a_key;
227 memset(a_key.data, 'a', sizeof(a_key.data)); 254 memset(a_key.data, 'a', sizeof(a_key.data));
228 255
229 SHA1Fingerprint z_key; 256 SHA1Fingerprint z_key;
230 memset(z_key.data, 'z', sizeof(z_key.data)); 257 memset(z_key.data, 'z', sizeof(z_key.data));
231 258
232 struct { 259 struct {
233 // Keys to test 260 // Keys to test
234 MultiThreadedCertVerifier::RequestParams key1; 261 MultiThreadedCertVerifier::RequestParams key1;
235 MultiThreadedCertVerifier::RequestParams key2; 262 MultiThreadedCertVerifier::RequestParams key2;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 EXPECT_FALSE(key1 < key2); 326 EXPECT_FALSE(key1 < key2);
300 EXPECT_TRUE(key2 < key1); 327 EXPECT_TRUE(key2 < key1);
301 break; 328 break;
302 default: 329 default:
303 FAIL() << "Invalid expectation. Can be only -1, 0, 1"; 330 FAIL() << "Invalid expectation. Can be only -1, 0, 1";
304 } 331 }
305 } 332 }
306 } 333 }
307 334
308 } // namespace net 335 } // namespace net
OLDNEW
« no previous file with comments | « net/base/multi_threaded_cert_verifier.cc ('k') | net/base/single_request_cert_verifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698