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