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
3 // found in the LICENSE file.
5 #include "chrome/browser/browsing_data/browsing_data_server_bound_cert_helper.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/server_bound_cert_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"
17 using content::BrowserThread
;
19 class BrowsingDataServerBoundCertHelperTest
20 : public testing::Test
,
21 public net::SSLConfigService::Observer
{
23 BrowsingDataServerBoundCertHelperTest() : ssl_config_changed_count_(0) {
26 virtual void SetUp() OVERRIDE
{
27 testing_profile_
.reset(new TestingProfile());
29 testing_profile_
->GetSSLConfigService()->AddObserver(this);
32 virtual void TearDown() OVERRIDE
{
33 testing_profile_
->GetSSLConfigService()->RemoveObserver(this);
36 void CreateCertsForTest() {
37 net::URLRequestContext
* context
=
38 testing_profile_
->GetRequestContext()->GetURLRequestContext();
39 net::ServerBoundCertStore
* cert_store
=
40 context
->server_bound_cert_service()->GetCertStore();
41 cert_store
->SetServerBoundCert("https://www.google.com:443",
42 base::Time(), base::Time(),
44 cert_store
->SetServerBoundCert("https://www.youtube.com:443",
45 base::Time(), base::Time(),
50 const net::ServerBoundCertStore::ServerBoundCertList
& certs
) {
51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
52 server_bound_cert_list_
= certs
;
55 // net::SSLConfigService::Observer implementation:
56 virtual void OnSSLConfigChanged() OVERRIDE
{
57 ssl_config_changed_count_
++;
61 content::TestBrowserThreadBundle thread_bundle_
;
62 scoped_ptr
<TestingProfile
> testing_profile_
;
64 net::ServerBoundCertStore::ServerBoundCertList server_bound_cert_list_
;
66 int ssl_config_changed_count_
;
69 TEST_F(BrowsingDataServerBoundCertHelperTest
, FetchData
) {
71 scoped_refptr
<BrowsingDataServerBoundCertHelper
> helper(
72 BrowsingDataServerBoundCertHelper::Create(testing_profile_
.get()));
74 helper
->StartFetching(
75 base::Bind(&BrowsingDataServerBoundCertHelperTest::FetchCallback
,
76 base::Unretained(this)));
78 // Blocks until BrowsingDataServerBoundCertHelperTest::FetchCallback is
80 base::RunLoop().RunUntilIdle();
82 ASSERT_EQ(2UL, server_bound_cert_list_
.size());
83 net::ServerBoundCertStore::ServerBoundCertList::const_iterator it
=
84 server_bound_cert_list_
.begin();
86 // Correct because fetching server_bound_cert_list_ will get them out in the
87 // same order CreateCertsForTest put them in.
88 ASSERT_TRUE(it
!= server_bound_cert_list_
.end());
89 EXPECT_EQ("https://www.google.com:443", it
->server_identifier());
91 ASSERT_TRUE(++it
!= server_bound_cert_list_
.end());
92 EXPECT_EQ("https://www.youtube.com:443", it
->server_identifier());
94 ASSERT_TRUE(++it
== server_bound_cert_list_
.end());
96 EXPECT_EQ(0, ssl_config_changed_count_
);
99 TEST_F(BrowsingDataServerBoundCertHelperTest
, DeleteCert
) {
100 CreateCertsForTest();
101 scoped_refptr
<BrowsingDataServerBoundCertHelper
> helper(
102 BrowsingDataServerBoundCertHelper::Create(testing_profile_
.get()));
104 helper
->DeleteServerBoundCert("https://www.google.com:443");
106 helper
->StartFetching(
107 base::Bind(&BrowsingDataServerBoundCertHelperTest::FetchCallback
,
108 base::Unretained(this)));
109 base::RunLoop().RunUntilIdle();
111 EXPECT_EQ(1, ssl_config_changed_count_
);
112 ASSERT_EQ(1UL, server_bound_cert_list_
.size());
113 net::ServerBoundCertStore::ServerBoundCertList::const_iterator it
=
114 server_bound_cert_list_
.begin();
116 ASSERT_TRUE(it
!= server_bound_cert_list_
.end());
117 EXPECT_EQ("https://www.youtube.com:443", it
->server_identifier());
119 ASSERT_TRUE(++it
== server_bound_cert_list_
.end());
121 helper
->DeleteServerBoundCert("https://www.youtube.com:443");
123 helper
->StartFetching(
124 base::Bind(&BrowsingDataServerBoundCertHelperTest::FetchCallback
,
125 base::Unretained(this)));
126 base::RunLoop().RunUntilIdle();
128 EXPECT_EQ(2, ssl_config_changed_count_
);
129 ASSERT_EQ(0UL, server_bound_cert_list_
.size());
132 TEST_F(BrowsingDataServerBoundCertHelperTest
, CannedEmpty
) {
133 std::string origin
= "https://www.google.com";
135 scoped_refptr
<CannedBrowsingDataServerBoundCertHelper
> helper(
136 new CannedBrowsingDataServerBoundCertHelper());
138 ASSERT_TRUE(helper
->empty());
139 helper
->AddServerBoundCert(net::ServerBoundCertStore::ServerBoundCert(
140 origin
, base::Time(), base::Time(), "key", "cert"));
141 ASSERT_FALSE(helper
->empty());
143 ASSERT_TRUE(helper
->empty());