121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be 321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file. 421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_verifier.h" 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/callback.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/file_path.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/stringprintf.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_test_util.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/net_errors.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/test_completion_callback.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/x509_certificate.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace net { 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass TestTimeService : public CertVerifier::TimeService { 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // CertVerifier::TimeService methods: 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual base::Time Now() { return current_time_; } 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void set_current_time(base::Time now) { current_time_ = now; } 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time current_time_; 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass CertVerifierTest : public testing::Test { 3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ExplodingCallback : public CallbackRunner<Tuple1<int> > { 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void RunWithParams(const Tuple1<int>& params) { 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FAIL(); 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests a cache hit, which should results in synchronous completion. 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(CertVerifierTest, CacheHit) { 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestTimeService* time_service = new TestTimeService; 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time current_time = base::Time::Now(); 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier verifier(time_service); 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<X509Certificate> google_cert( 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error; 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result; 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle; 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.requests()); 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Synchronous completion. 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(ERR_IO_PENDING, error); 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle == NULL); 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(2u, verifier.requests()); 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.cache_hits()); 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests an inflight join. 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(CertVerifierTest, InflightJoin) { 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestTimeService* time_service = new TestTimeService; 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time current_time = base::Time::Now(); 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier verifier(time_service); 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<X509Certificate> google_cert( 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error; 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result; 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle; 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result2; 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback2; 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle2; 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result2, 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback2, &request_handle2); 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle2 != NULL); 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback2.WaitForResult(); 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(2u, verifier.requests()); 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.inflight_joins()); 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests cache entry expiration. 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(CertVerifierTest, ExpiredCacheEntry) { 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestTimeService* time_service = new TestTimeService; 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time current_time = base::Time::Now(); 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier verifier(time_service); 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<X509Certificate> google_cert( 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error; 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result; 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle; 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.requests()); 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Before expiration, should have a cache hit. 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Synchronous completion. 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(ERR_IO_PENDING, error); 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle == NULL); 14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(2u, verifier.requests()); 14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.cache_hits()); 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 15121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // After expiration, should not have a cache hit. 15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.GetCacheSize()); 15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen current_time += base::TimeDelta::FromMinutes(60); 15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 16021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.GetCacheSize()); 16121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(3u, verifier.requests()); 16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.cache_hits()); 16521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 16621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 16721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests a full cache. 16921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(CertVerifierTest, FullCache) { 17021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestTimeService* time_service = new TestTimeService; 17121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::Time current_time = base::Time::Now(); 17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier verifier(time_service); 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<X509Certificate> google_cert( 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error; 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result; 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle; 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.requests()); 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const unsigned kCacheSize = 256; 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (unsigned i = 0; i < kCacheSize; i++) { 19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string hostname = base::StringPrintf("www%d.example.com", i + 1); 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, hostname, 0, &verify_result, 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(kCacheSize + 1, verifier.requests()); 20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); 21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen current_time += base::TimeDelta::FromMinutes(60); 21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen time_service->set_current_time(current_time); 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www999.example.com", 0, &verify_result, 21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(kCacheSize, verifier.GetCacheSize()); 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(1u, verifier.GetCacheSize()); 22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(IsCertificateError(error)); 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(kCacheSize + 2, verifier.requests()); 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.cache_hits()); 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(0u, verifier.inflight_joins()); 22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Tests that the callback of a canceled request is never made. 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(CertVerifierTest, CancelRequest) { 22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier verifier; 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<X509Certificate> google_cert( 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error; 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifyResult verify_result; 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExplodingCallback exploding_callback; 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier::RequestHandle request_handle; 23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &exploding_callback, &request_handle); 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen verifier.CancelRequest(request_handle); 24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Issue a few more requests to the worker pool and wait for their 24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // completion, so that the task of the canceled request (which runs on a 24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // worker thread) is likely to complete by the end of this test. 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (int i = 0; i < 5; ++i) { 25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = verifier.Verify(google_cert, "www2.example.com", 0, &verify_result, 25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &callback, &request_handle); 25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(request_handle != NULL); 25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen error = callback.WaitForResult(); 25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen verifier.ClearCache(); 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Tests that a canceled request is not leaked. 26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(CertVerifierTest, CancelRequestThenQuit) { 26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CertVerifier verifier; 26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FilePath certs_dir = GetTestCertsDirectory(); 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<X509Certificate> google_cert( 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ImportCertFromFile(certs_dir, "google.single.der")); 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert); 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int error; 27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CertVerifyResult verify_result; 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestCompletionCallback callback; 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CertVerifier::RequestHandle request_handle; 27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen error = verifier.Verify(google_cert, "www.example.com", 0, &verify_result, 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &callback, &request_handle); 27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(ERR_IO_PENDING, error); 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(request_handle != NULL); 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen verifier.CancelRequest(request_handle); 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Destroy |verifier| by going out of scope. 28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace net 283