Home | History | Annotate | Download | only in browsing_data
      1 // Copyright 2014 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 "chrome/browser/browsing_data/browsing_data_channel_id_helper.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/run_loop.h"
      9 #include "chrome/test/base/testing_profile.h"
     10 #include "content/public/browser/browser_thread.h"
     11 #include "content/public/test/test_browser_thread_bundle.h"
     12 #include "net/ssl/channel_id_service.h"
     13 #include "net/url_request/url_request_context.h"
     14 #include "net/url_request/url_request_context_getter.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 using content::BrowserThread;
     18 
     19 class BrowsingDataChannelIDHelperTest
     20     : public testing::Test,
     21       public net::SSLConfigService::Observer {
     22  public:
     23   BrowsingDataChannelIDHelperTest() : ssl_config_changed_count_(0) {
     24   }
     25 
     26   virtual void SetUp() OVERRIDE {
     27     testing_profile_.reset(new TestingProfile());
     28 
     29     testing_profile_->GetSSLConfigService()->AddObserver(this);
     30   }
     31 
     32   virtual void TearDown() OVERRIDE {
     33     testing_profile_->GetSSLConfigService()->RemoveObserver(this);
     34   }
     35 
     36   void CreateChannelIDsForTest() {
     37     net::URLRequestContext* context =
     38         testing_profile_->GetRequestContext()->GetURLRequestContext();
     39     net::ChannelIDStore* channel_id_store =
     40         context->channel_id_service()->GetChannelIDStore();
     41     channel_id_store->SetChannelID("https://www.google.com:443",
     42                                    base::Time(), base::Time(),
     43                                    "key", "cert");
     44     channel_id_store->SetChannelID("https://www.youtube.com:443",
     45                                    base::Time(), base::Time(),
     46                                    "key", "cert");
     47   }
     48 
     49   void FetchCallback(
     50       const net::ChannelIDStore::ChannelIDList& channel_ids) {
     51     DCHECK_CURRENTLY_ON(BrowserThread::UI);
     52     channel_id_list_ = channel_ids;
     53   }
     54 
     55   // net::SSLConfigService::Observer implementation:
     56   virtual void OnSSLConfigChanged() OVERRIDE {
     57     ssl_config_changed_count_++;
     58   }
     59 
     60  protected:
     61   content::TestBrowserThreadBundle thread_bundle_;
     62   scoped_ptr<TestingProfile> testing_profile_;
     63 
     64   net::ChannelIDStore::ChannelIDList channel_id_list_;
     65 
     66   int ssl_config_changed_count_;
     67 };
     68 
     69 TEST_F(BrowsingDataChannelIDHelperTest, FetchData) {
     70   CreateChannelIDsForTest();
     71   scoped_refptr<BrowsingDataChannelIDHelper> helper(
     72       BrowsingDataChannelIDHelper::Create(
     73           testing_profile_->GetRequestContext()));
     74 
     75   helper->StartFetching(
     76       base::Bind(&BrowsingDataChannelIDHelperTest::FetchCallback,
     77                  base::Unretained(this)));
     78 
     79   // Blocks until BrowsingDataChannelIDHelperTest::FetchCallback is
     80   // notified.
     81   base::RunLoop().RunUntilIdle();
     82 
     83   ASSERT_EQ(2UL, channel_id_list_.size());
     84   net::ChannelIDStore::ChannelIDList::const_iterator it =
     85       channel_id_list_.begin();
     86 
     87   // Correct because fetching channel_id_list_ will get them out in the
     88   // same order CreateChannelIDsForTest put them in.
     89   ASSERT_TRUE(it != channel_id_list_.end());
     90   EXPECT_EQ("https://www.google.com:443", it->server_identifier());
     91 
     92   ASSERT_TRUE(++it != channel_id_list_.end());
     93   EXPECT_EQ("https://www.youtube.com:443", it->server_identifier());
     94 
     95   ASSERT_TRUE(++it == channel_id_list_.end());
     96 
     97   EXPECT_EQ(0, ssl_config_changed_count_);
     98 }
     99 
    100 TEST_F(BrowsingDataChannelIDHelperTest, DeleteChannelID) {
    101   CreateChannelIDsForTest();
    102   scoped_refptr<BrowsingDataChannelIDHelper> helper(
    103       BrowsingDataChannelIDHelper::Create(
    104           testing_profile_->GetRequestContext()));
    105 
    106   helper->DeleteChannelID("https://www.google.com:443");
    107 
    108   helper->StartFetching(
    109       base::Bind(&BrowsingDataChannelIDHelperTest::FetchCallback,
    110                  base::Unretained(this)));
    111   base::RunLoop().RunUntilIdle();
    112 
    113   EXPECT_EQ(1, ssl_config_changed_count_);
    114   ASSERT_EQ(1UL, channel_id_list_.size());
    115   net::ChannelIDStore::ChannelIDList::const_iterator it =
    116       channel_id_list_.begin();
    117 
    118   ASSERT_TRUE(it != channel_id_list_.end());
    119   EXPECT_EQ("https://www.youtube.com:443", it->server_identifier());
    120 
    121   ASSERT_TRUE(++it == channel_id_list_.end());
    122 
    123   helper->DeleteChannelID("https://www.youtube.com:443");
    124 
    125   helper->StartFetching(
    126       base::Bind(&BrowsingDataChannelIDHelperTest::FetchCallback,
    127                  base::Unretained(this)));
    128   base::RunLoop().RunUntilIdle();
    129 
    130   EXPECT_EQ(2, ssl_config_changed_count_);
    131   ASSERT_EQ(0UL, channel_id_list_.size());
    132 }
    133 
    134 TEST_F(BrowsingDataChannelIDHelperTest, CannedEmpty) {
    135   std::string origin = "https://www.google.com";
    136 
    137   scoped_refptr<CannedBrowsingDataChannelIDHelper> helper(
    138       new CannedBrowsingDataChannelIDHelper());
    139 
    140   ASSERT_TRUE(helper->empty());
    141   helper->AddChannelID(net::ChannelIDStore::ChannelID(
    142       origin, base::Time(), base::Time(), "key", "cert"));
    143   ASSERT_FALSE(helper->empty());
    144   helper->Reset();
    145   ASSERT_TRUE(helper->empty());
    146 }
    147