Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/base/ssl_client_auth_cache.h"
      6 
      7 #include "base/time.h"
      8 #include "net/base/x509_certificate.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace net {
     12 
     13 TEST(SSLClientAuthCacheTest, LookupAddRemove) {
     14   SSLClientAuthCache cache;
     15 
     16   base::Time start_date = base::Time::Now();
     17   base::Time expiration_date = start_date + base::TimeDelta::FromDays(1);
     18 
     19   std::string server1("foo1:443");
     20   scoped_refptr<X509Certificate> cert1(
     21       new X509Certificate("foo1", "CA", start_date, expiration_date));
     22 
     23   std::string server2("foo2:443");
     24   scoped_refptr<X509Certificate> cert2(
     25       new X509Certificate("foo2", "CA", start_date, expiration_date));
     26 
     27   std::string server3("foo3:443");
     28   scoped_refptr<X509Certificate> cert3(
     29     new X509Certificate("foo3", "CA", start_date, expiration_date));
     30 
     31   scoped_refptr<X509Certificate> cached_cert;
     32   // Lookup non-existent client certificate.
     33   cached_cert = NULL;
     34   EXPECT_FALSE(cache.Lookup(server1, &cached_cert));
     35 
     36   // Add client certificate for server1.
     37   cache.Add(server1, cert1);
     38   cached_cert = NULL;
     39   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
     40   EXPECT_EQ(cert1, cached_cert);
     41 
     42   // Add client certificate for server2.
     43   cache.Add(server2, cert2);
     44   cached_cert = NULL;
     45   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
     46   EXPECT_EQ(cert1, cached_cert.get());
     47   cached_cert = NULL;
     48   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
     49   EXPECT_EQ(cert2, cached_cert);
     50 
     51   // Overwrite the client certificate for server1.
     52   cache.Add(server1, cert3);
     53   cached_cert = NULL;
     54   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
     55   EXPECT_EQ(cert3, cached_cert);
     56   cached_cert = NULL;
     57   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
     58   EXPECT_EQ(cert2, cached_cert);
     59 
     60   // Remove client certificate of server1.
     61   cache.Remove(server1);
     62   cached_cert = NULL;
     63   EXPECT_FALSE(cache.Lookup(server1, &cached_cert));
     64   cached_cert = NULL;
     65   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
     66   EXPECT_EQ(cert2, cached_cert);
     67 
     68   // Remove non-existent client certificate.
     69   cache.Remove(server1);
     70   cached_cert = NULL;
     71   EXPECT_FALSE(cache.Lookup(server1, &cached_cert));
     72   cached_cert = NULL;
     73   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
     74   EXPECT_EQ(cert2, cached_cert);
     75 }
     76 
     77 // Check that if the server differs only by port number, it is considered
     78 // a separate server.
     79 TEST(SSLClientAuthCacheTest, LookupWithPort) {
     80   SSLClientAuthCache cache;
     81 
     82   base::Time start_date = base::Time::Now();
     83   base::Time expiration_date = start_date + base::TimeDelta::FromDays(1);
     84 
     85   std::string server1("foo:443");
     86   scoped_refptr<X509Certificate> cert1(
     87       new X509Certificate("foo", "CA", start_date, expiration_date));
     88 
     89   std::string server2("foo:8443");
     90   scoped_refptr<X509Certificate> cert2(
     91       new X509Certificate("foo", "CA", start_date, expiration_date));
     92 
     93   cache.Add(server1, cert1.get());
     94   cache.Add(server2, cert2.get());
     95 
     96   scoped_refptr<X509Certificate> cached_cert;
     97   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
     98   EXPECT_EQ(cert1.get(), cached_cert);
     99   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
    100   EXPECT_EQ(cert2.get(), cached_cert);
    101 }
    102 
    103 // Check that the a NULL certificate, indicating the user has declined to send
    104 // a certificate, is properly cached.
    105 TEST(SSLClientAuthCacheTest, LookupNullPreference) {
    106   SSLClientAuthCache cache;
    107   base::Time start_date = base::Time::Now();
    108   base::Time expiration_date = start_date + base::TimeDelta::FromDays(1);
    109 
    110   std::string server1("foo:443");
    111   scoped_refptr<X509Certificate> cert1(
    112       new X509Certificate("foo", "CA", start_date, expiration_date));
    113 
    114   cache.Add(server1, NULL);
    115 
    116   scoped_refptr<X509Certificate> cached_cert(cert1);
    117   // Make sure that |cached_cert| is updated to NULL, indicating the user
    118   // declined to send a certificate to |server1|.
    119   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
    120   EXPECT_EQ(NULL, cached_cert.get());
    121 
    122   // Remove the existing cached certificate.
    123   cache.Remove(server1);
    124   cached_cert = NULL;
    125   EXPECT_FALSE(cache.Lookup(server1, &cached_cert));
    126 
    127   // Add a new preference for a specific certificate.
    128   cache.Add(server1, cert1);
    129   cached_cert = NULL;
    130   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
    131   EXPECT_EQ(cert1, cached_cert);
    132 
    133   // Replace the specific preference with a NULL certificate.
    134   cache.Add(server1, NULL);
    135   cached_cert = NULL;
    136   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
    137   EXPECT_EQ(NULL, cached_cert.get());
    138 }
    139 
    140 // Check that the OnUserCertAdded() method removes all cache entries.
    141 TEST(SSLClientAuthCacheTest, OnUserCertAdded) {
    142   SSLClientAuthCache cache;
    143   base::Time start_date = base::Time::Now();
    144   base::Time expiration_date = start_date + base::TimeDelta::FromDays(1);
    145 
    146   std::string server1("foo:443");
    147   scoped_refptr<X509Certificate> cert1(
    148       new X509Certificate("foo", "CA", start_date, expiration_date));
    149 
    150   cache.Add(server1, cert1);
    151 
    152   std::string server2("foo2:443");
    153   cache.Add(server2, NULL);
    154 
    155   scoped_refptr<X509Certificate> cached_cert;
    156 
    157   // Demonstrate the set up is correct.
    158   EXPECT_TRUE(cache.Lookup(server1, &cached_cert));
    159   EXPECT_EQ(cert1, cached_cert);
    160 
    161   EXPECT_TRUE(cache.Lookup(server2, &cached_cert));
    162   EXPECT_EQ(NULL, cached_cert.get());
    163 
    164   cache.OnUserCertAdded(NULL);
    165 
    166   // Check that we no longer have entries for either server.
    167   EXPECT_FALSE(cache.Lookup(server1, &cached_cert));
    168   EXPECT_FALSE(cache.Lookup(server2, &cached_cert));
    169 }
    170 
    171 }  // namespace net
    172