Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
| 7 #include "base/synchronization/waitable_event.h" | 7 #include "base/synchronization/waitable_event.h" |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
| 10 #include "chrome/browser/ssl/ssl_client_auth_requestor_mock.h" | 10 #include "chrome/browser/ssl/ssl_client_auth_requestor_mock.h" |
| 11 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
| 12 #include "chrome/browser/ui/browser_window.h" | 12 #include "chrome/browser/ui/browser_window.h" |
| 13 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 13 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 14 #include "chrome/browser/ui/views/ssl_client_certificate_selector.h" | 14 #include "chrome/browser/ui/views/ssl_client_certificate_selector.h" |
| 15 #include "chrome/test/base/in_process_browser_test.h" | 15 #include "chrome/test/base/in_process_browser_test.h" |
| 16 #include "chrome/test/base/interactive_test_utils.h" | 16 #include "chrome/test/base/interactive_test_utils.h" |
| 17 #include "chrome/test/base/ui_test_utils.h" | 17 #include "chrome/test/base/ui_test_utils.h" |
| 18 #include "content/public/browser/client_certificate_delegate.h" | 18 #include "content/public/browser/client_certificate_delegate.h" |
| 19 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
| 20 #include "content/public/test/browser_test_utils.h" | 20 #include "content/public/test/browser_test_utils.h" |
| 21 #include "net/base/request_priority.h" | 21 #include "net/base/request_priority.h" |
| 22 #include "net/cert/x509_certificate.h" | 22 #include "net/cert/x509_certificate.h" |
| 23 #include "net/http/http_transaction_factory.h" | 23 #include "net/http/http_transaction_factory.h" |
| 24 #include "net/ssl/client_cert_identity_test_util.h" | |
| 24 #include "net/ssl/ssl_cert_request_info.h" | 25 #include "net/ssl/ssl_cert_request_info.h" |
| 25 #include "net/test/cert_test_util.h" | 26 #include "net/test/cert_test_util.h" |
| 26 #include "net/test/test_data_directory.h" | 27 #include "net/test/test_data_directory.h" |
| 27 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 28 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 28 #include "net/url_request/url_request.h" | 29 #include "net/url_request/url_request.h" |
| 29 #include "net/url_request/url_request_context.h" | 30 #include "net/url_request/url_request_context.h" |
| 30 #include "net/url_request/url_request_context_getter.h" | 31 #include "net/url_request/url_request_context_getter.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
| 32 #include "ui/views/test/widget_test.h" | 33 #include "ui/views/test/widget_test.h" |
| 33 | 34 |
| 34 #if defined(USE_NSS_CERTS) | |
| 35 #include "crypto/scoped_test_nss_db.h" | |
| 36 #endif | |
| 37 | |
| 38 using ::testing::Mock; | 35 using ::testing::Mock; |
| 39 using ::testing::StrictMock; | 36 using ::testing::StrictMock; |
| 40 using content::BrowserThread; | 37 using content::BrowserThread; |
| 41 | 38 |
| 42 // We don't have a way to do end-to-end SSL client auth testing, so this test | 39 // We don't have a way to do end-to-end SSL client auth testing, so this test |
| 43 // creates a certificate selector_ manually with a mocked | 40 // creates a certificate selector_ manually with a mocked |
| 44 // SSLClientAuthHandler. | 41 // SSLClientAuthHandler. |
| 45 | 42 |
| 46 class SSLClientCertificateSelectorTest : public InProcessBrowserTest { | 43 class SSLClientCertificateSelectorTest : public InProcessBrowserTest { |
| 47 public: | 44 public: |
| 48 SSLClientCertificateSelectorTest() | 45 SSLClientCertificateSelectorTest() |
| 49 : io_loop_finished_event_( | 46 : io_loop_finished_event_( |
| 50 base::WaitableEvent::ResetPolicy::AUTOMATIC, | 47 base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 51 base::WaitableEvent::InitialState::NOT_SIGNALED), | 48 base::WaitableEvent::InitialState::NOT_SIGNALED), |
| 52 url_request_(NULL), | 49 url_request_(NULL), |
| 53 selector_(NULL) {} | 50 selector_(NULL) {} |
| 54 | 51 |
| 55 void SetUpInProcessBrowserTestFixture() override { | 52 void SetUpInProcessBrowserTestFixture() override { |
| 56 base::FilePath certs_dir = net::GetTestCertsDirectory(); | 53 base::FilePath certs_dir = net::GetTestCertsDirectory(); |
| 57 | 54 |
| 58 #if defined(USE_NSS_CERTS) | 55 cert_identity_1_ = net::FakeClientCertIdentity::CreateFromCertAndKeyFiles( |
| 59 // If USE_NSS_CERTS, the selector tries to unlock the slot where the | 56 certs_dir, "client_1.pem", "client_1.pk8"); |
| 60 // private key of each certificate is stored. If no private key is found, | 57 ASSERT_TRUE(cert_identity_1_); |
| 61 // the slot would be null and the unlock will crash. | 58 cert_identity_2_ = net::FakeClientCertIdentity::CreateFromCertAndKeyFiles( |
| 62 ASSERT_TRUE(test_nssdb_.is_open()); | 59 certs_dir, "client_2.pem", "client_2.pk8"); |
| 63 client_cert_1_ = net::ImportClientCertAndKeyFromFile( | 60 ASSERT_TRUE(cert_identity_2_); |
| 64 certs_dir, "client_1.pem", "client_1.pk8", test_nssdb_.slot()); | |
| 65 client_cert_2_ = net::ImportClientCertAndKeyFromFile( | |
| 66 certs_dir, "client_2.pem", "client_2.pk8", test_nssdb_.slot()); | |
| 67 #else | |
| 68 // No unlock is attempted if !USE_NSS_CERTS. Thus, there is no need to | |
| 69 // import a private key. | |
| 70 client_cert_1_ = net::ImportCertFromFile(certs_dir, "client_1.pem"); | |
| 71 client_cert_2_ = net::ImportCertFromFile(certs_dir, "client_2.pem"); | |
| 72 #endif | |
| 73 ASSERT_NE(nullptr, client_cert_1_.get()); | |
| 74 ASSERT_NE(nullptr, client_cert_2_.get()); | |
| 75 | 61 |
| 76 cert_request_info_ = new net::SSLCertRequestInfo; | 62 cert_request_info_ = new net::SSLCertRequestInfo; |
| 77 cert_request_info_->host_and_port = net::HostPortPair("foo", 123); | 63 cert_request_info_->host_and_port = net::HostPortPair("foo", 123); |
| 78 client_certs_.push_back(client_cert_1_); | |
| 79 client_certs_.push_back(client_cert_2_); | |
| 80 } | 64 } |
| 81 | 65 |
| 82 void SetUpOnMainThread() override { | 66 void SetUpOnMainThread() override { |
| 83 url_request_context_getter_ = browser()->profile()->GetRequestContext(); | 67 url_request_context_getter_ = browser()->profile()->GetRequestContext(); |
| 84 | 68 |
| 85 BrowserThread::PostTask( | 69 BrowserThread::PostTask( |
| 86 BrowserThread::IO, FROM_HERE, | 70 BrowserThread::IO, FROM_HERE, |
| 87 base::BindOnce(&SSLClientCertificateSelectorTest::SetUpOnIOThread, | 71 base::BindOnce(&SSLClientCertificateSelectorTest::SetUpOnIOThread, |
| 88 base::Unretained(this))); | 72 base::Unretained(this))); |
| 89 | 73 |
| 90 io_loop_finished_event_.Wait(); | 74 io_loop_finished_event_.Wait(); |
| 91 | 75 |
| 92 content::WaitForLoadStop( | 76 content::WaitForLoadStop( |
| 93 browser()->tab_strip_model()->GetActiveWebContents()); | 77 browser()->tab_strip_model()->GetActiveWebContents()); |
| 78 net::ClientCertIdentityList cert_identity_list; | |
|
davidben
2017/06/07 23:06:17
Nit: Are we allowed to write something like this t
mattm
2017/06/08 21:47:56
(Answered on the other comment, but doesn't work d
| |
| 79 cert_identity_list.push_back(cert_identity_1_->Copy()); | |
| 80 cert_identity_list.push_back(cert_identity_2_->Copy()); | |
| 94 selector_ = new SSLClientCertificateSelector( | 81 selector_ = new SSLClientCertificateSelector( |
| 95 browser()->tab_strip_model()->GetActiveWebContents(), | 82 browser()->tab_strip_model()->GetActiveWebContents(), |
| 96 auth_requestor_->cert_request_info_, client_certs_, | 83 auth_requestor_->cert_request_info_, std::move(cert_identity_list), |
| 97 auth_requestor_->CreateDelegate()); | 84 auth_requestor_->CreateDelegate()); |
| 98 selector_->Init(); | 85 selector_->Init(); |
| 99 selector_->Show(); | 86 selector_->Show(); |
| 100 | 87 |
| 101 EXPECT_EQ(client_cert_1_.get(), selector_->GetSelectedCert()); | 88 ASSERT_TRUE(selector_->GetSelectedCert()); |
| 89 EXPECT_EQ(cert_identity_1_->certificate(), | |
| 90 selector_->GetSelectedCert()->certificate()); | |
| 102 } | 91 } |
| 103 | 92 |
| 104 virtual void SetUpOnIOThread() { | 93 virtual void SetUpOnIOThread() { |
| 105 url_request_ = MakeURLRequest(url_request_context_getter_.get()).release(); | 94 url_request_ = MakeURLRequest(url_request_context_getter_.get()).release(); |
| 106 | 95 |
| 107 auth_requestor_ = new StrictMock<SSLClientAuthRequestorMock>( | 96 auth_requestor_ = new StrictMock<SSLClientAuthRequestorMock>( |
| 108 url_request_, | 97 url_request_, |
| 109 cert_request_info_); | 98 cert_request_info_); |
| 110 | 99 |
| 111 io_loop_finished_event_.Signal(); | 100 io_loop_finished_event_.Signal(); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 136 return context_getter->GetURLRequestContext()->CreateRequest( | 125 return context_getter->GetURLRequestContext()->CreateRequest( |
| 137 GURL("https://example"), net::DEFAULT_PRIORITY, NULL, | 126 GURL("https://example"), net::DEFAULT_PRIORITY, NULL, |
| 138 TRAFFIC_ANNOTATION_FOR_TESTS); | 127 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 139 } | 128 } |
| 140 | 129 |
| 141 base::WaitableEvent io_loop_finished_event_; | 130 base::WaitableEvent io_loop_finished_event_; |
| 142 | 131 |
| 143 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | 132 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
| 144 net::URLRequest* url_request_; | 133 net::URLRequest* url_request_; |
| 145 | 134 |
| 146 scoped_refptr<net::X509Certificate> client_cert_1_; | 135 std::unique_ptr<net::FakeClientCertIdentity> cert_identity_1_; |
| 147 scoped_refptr<net::X509Certificate> client_cert_2_; | 136 std::unique_ptr<net::FakeClientCertIdentity> cert_identity_2_; |
| 148 net::CertificateList client_certs_; | |
| 149 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_; | 137 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_; |
| 150 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_; | 138 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_; |
| 151 // The selector will be deleted when a cert is selected or the tab is closed. | 139 // The selector will be deleted when a cert is selected or the tab is closed. |
| 152 SSLClientCertificateSelector* selector_; | 140 SSLClientCertificateSelector* selector_; |
| 153 #if defined(USE_NSS_CERTS) | |
| 154 crypto::ScopedTestNSSDB test_nssdb_; | |
| 155 #endif | |
| 156 }; | 141 }; |
| 157 | 142 |
| 158 class SSLClientCertificateSelectorMultiTabTest | 143 class SSLClientCertificateSelectorMultiTabTest |
| 159 : public SSLClientCertificateSelectorTest { | 144 : public SSLClientCertificateSelectorTest { |
| 160 public: | 145 public: |
| 161 void SetUpInProcessBrowserTestFixture() override { | 146 void SetUpInProcessBrowserTestFixture() override { |
| 162 SSLClientCertificateSelectorTest::SetUpInProcessBrowserTestFixture(); | 147 SSLClientCertificateSelectorTest::SetUpInProcessBrowserTestFixture(); |
| 163 | 148 |
| 164 cert_request_info_1_ = new net::SSLCertRequestInfo; | 149 cert_request_info_1_ = new net::SSLCertRequestInfo; |
| 165 cert_request_info_1_->host_and_port = net::HostPortPair("bar", 123); | 150 cert_request_info_1_->host_and_port = net::HostPortPair("bar", 123); |
| 166 client_certs_1_.push_back(client_cert_1_); | |
| 167 client_certs_1_.push_back(client_cert_2_); | |
| 168 | 151 |
| 169 cert_request_info_2_ = new net::SSLCertRequestInfo; | 152 cert_request_info_2_ = new net::SSLCertRequestInfo; |
| 170 cert_request_info_2_->host_and_port = net::HostPortPair("bar", 123); | 153 cert_request_info_2_->host_and_port = net::HostPortPair("bar", 123); |
| 171 client_certs_2_.push_back(client_cert_1_); | |
| 172 client_certs_2_.push_back(client_cert_2_); | |
| 173 } | 154 } |
| 174 | 155 |
| 175 void SetUpOnMainThread() override { | 156 void SetUpOnMainThread() override { |
| 176 // Also calls SetUpOnIOThread. | 157 // Also calls SetUpOnIOThread. |
| 177 SSLClientCertificateSelectorTest::SetUpOnMainThread(); | 158 SSLClientCertificateSelectorTest::SetUpOnMainThread(); |
| 178 | 159 |
| 179 AddTabAtIndex(1, GURL("about:blank"), ui::PAGE_TRANSITION_LINK); | 160 AddTabAtIndex(1, GURL("about:blank"), ui::PAGE_TRANSITION_LINK); |
| 180 AddTabAtIndex(2, GURL("about:blank"), ui::PAGE_TRANSITION_LINK); | 161 AddTabAtIndex(2, GURL("about:blank"), ui::PAGE_TRANSITION_LINK); |
| 181 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(0)); | 162 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(0)); |
| 182 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(1)); | 163 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(1)); |
| 183 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(2)); | 164 ASSERT_TRUE(NULL != browser()->tab_strip_model()->GetWebContentsAt(2)); |
| 184 content::WaitForLoadStop(browser()->tab_strip_model()->GetWebContentsAt(1)); | 165 content::WaitForLoadStop(browser()->tab_strip_model()->GetWebContentsAt(1)); |
| 185 content::WaitForLoadStop(browser()->tab_strip_model()->GetWebContentsAt(2)); | 166 content::WaitForLoadStop(browser()->tab_strip_model()->GetWebContentsAt(2)); |
| 186 | 167 |
| 168 net::ClientCertIdentityList cert_identity_list_1; | |
| 169 cert_identity_list_1.push_back(cert_identity_1_->Copy()); | |
| 170 cert_identity_list_1.push_back(cert_identity_2_->Copy()); | |
| 187 selector_1_ = new SSLClientCertificateSelector( | 171 selector_1_ = new SSLClientCertificateSelector( |
| 188 browser()->tab_strip_model()->GetWebContentsAt(1), | 172 browser()->tab_strip_model()->GetWebContentsAt(1), |
| 189 auth_requestor_1_->cert_request_info_, client_certs_1_, | 173 auth_requestor_1_->cert_request_info_, std::move(cert_identity_list_1), |
| 190 auth_requestor_1_->CreateDelegate()); | 174 auth_requestor_1_->CreateDelegate()); |
| 191 selector_1_->Init(); | 175 selector_1_->Init(); |
| 192 selector_1_->Show(); | 176 selector_1_->Show(); |
| 177 | |
| 178 net::ClientCertIdentityList cert_identity_list_2; | |
| 179 cert_identity_list_2.push_back(cert_identity_1_->Copy()); | |
| 180 cert_identity_list_2.push_back(cert_identity_2_->Copy()); | |
| 193 selector_2_ = new SSLClientCertificateSelector( | 181 selector_2_ = new SSLClientCertificateSelector( |
| 194 browser()->tab_strip_model()->GetWebContentsAt(2), | 182 browser()->tab_strip_model()->GetWebContentsAt(2), |
| 195 auth_requestor_2_->cert_request_info_, client_certs_2_, | 183 auth_requestor_2_->cert_request_info_, std::move(cert_identity_list_2), |
| 196 auth_requestor_2_->CreateDelegate()); | 184 auth_requestor_2_->CreateDelegate()); |
| 197 selector_2_->Init(); | 185 selector_2_->Init(); |
| 198 selector_2_->Show(); | 186 selector_2_->Show(); |
| 199 | 187 |
| 200 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); | 188 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); |
| 201 EXPECT_EQ(client_cert_1_.get(), selector_1_->GetSelectedCert()); | 189 ASSERT_TRUE(selector_1_->GetSelectedCert()); |
| 202 EXPECT_EQ(client_cert_1_.get(), selector_2_->GetSelectedCert()); | 190 EXPECT_EQ(cert_identity_1_->certificate(), |
| 191 selector_1_->GetSelectedCert()->certificate()); | |
| 192 ASSERT_TRUE(selector_2_->GetSelectedCert()); | |
| 193 EXPECT_EQ(cert_identity_1_->certificate(), | |
| 194 selector_2_->GetSelectedCert()->certificate()); | |
| 203 } | 195 } |
| 204 | 196 |
| 205 void SetUpOnIOThread() override { | 197 void SetUpOnIOThread() override { |
| 206 url_request_1_ = | 198 url_request_1_ = |
| 207 MakeURLRequest(url_request_context_getter_.get()).release(); | 199 MakeURLRequest(url_request_context_getter_.get()).release(); |
| 208 url_request_2_ = | 200 url_request_2_ = |
| 209 MakeURLRequest(url_request_context_getter_.get()).release(); | 201 MakeURLRequest(url_request_context_getter_.get()).release(); |
| 210 | 202 |
| 211 auth_requestor_1_ = new StrictMock<SSLClientAuthRequestorMock>( | 203 auth_requestor_1_ = new StrictMock<SSLClientAuthRequestorMock>( |
| 212 url_request_1_, | 204 url_request_1_, |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 228 delete url_request_1_; | 220 delete url_request_1_; |
| 229 delete url_request_2_; | 221 delete url_request_2_; |
| 230 SSLClientCertificateSelectorTest::CleanUpOnIOThread(); | 222 SSLClientCertificateSelectorTest::CleanUpOnIOThread(); |
| 231 } | 223 } |
| 232 | 224 |
| 233 protected: | 225 protected: |
| 234 net::URLRequest* url_request_1_; | 226 net::URLRequest* url_request_1_; |
| 235 net::URLRequest* url_request_2_; | 227 net::URLRequest* url_request_2_; |
| 236 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_1_; | 228 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_1_; |
| 237 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_2_; | 229 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_2_; |
| 238 net::CertificateList client_certs_1_; | |
| 239 net::CertificateList client_certs_2_; | |
| 240 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_1_; | 230 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_1_; |
| 241 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_2_; | 231 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_2_; |
| 242 SSLClientCertificateSelector* selector_1_; | 232 SSLClientCertificateSelector* selector_1_; |
| 243 SSLClientCertificateSelector* selector_2_; | 233 SSLClientCertificateSelector* selector_2_; |
| 244 }; | 234 }; |
| 245 | 235 |
| 246 class SSLClientCertificateSelectorMultiProfileTest | 236 class SSLClientCertificateSelectorMultiProfileTest |
| 247 : public SSLClientCertificateSelectorTest { | 237 : public SSLClientCertificateSelectorTest { |
| 248 public: | 238 public: |
| 249 void SetUpInProcessBrowserTestFixture() override { | 239 void SetUpInProcessBrowserTestFixture() override { |
| 250 SSLClientCertificateSelectorTest::SetUpInProcessBrowserTestFixture(); | 240 SSLClientCertificateSelectorTest::SetUpInProcessBrowserTestFixture(); |
| 251 | 241 |
| 252 cert_request_info_1_ = new net::SSLCertRequestInfo; | 242 cert_request_info_1_ = new net::SSLCertRequestInfo; |
| 253 cert_request_info_1_->host_and_port = net::HostPortPair("foo", 123); | 243 cert_request_info_1_->host_and_port = net::HostPortPair("foo", 123); |
| 254 client_certs_1_.push_back(client_cert_1_); | |
| 255 client_certs_1_.push_back(client_cert_2_); | |
| 256 } | 244 } |
| 257 | 245 |
| 258 void SetUpOnMainThread() override { | 246 void SetUpOnMainThread() override { |
| 259 browser_1_ = CreateIncognitoBrowser(); | 247 browser_1_ = CreateIncognitoBrowser(); |
| 260 url_request_context_getter_1_ = browser_1_->profile()->GetRequestContext(); | 248 url_request_context_getter_1_ = browser_1_->profile()->GetRequestContext(); |
| 261 | 249 |
| 262 // Also calls SetUpOnIOThread. | 250 // Also calls SetUpOnIOThread. |
| 263 SSLClientCertificateSelectorTest::SetUpOnMainThread(); | 251 SSLClientCertificateSelectorTest::SetUpOnMainThread(); |
| 264 | 252 |
| 253 net::ClientCertIdentityList cert_identity_list; | |
| 254 cert_identity_list.push_back(cert_identity_1_->Copy()); | |
| 255 cert_identity_list.push_back(cert_identity_2_->Copy()); | |
| 265 selector_1_ = new SSLClientCertificateSelector( | 256 selector_1_ = new SSLClientCertificateSelector( |
| 266 browser_1_->tab_strip_model()->GetActiveWebContents(), | 257 browser_1_->tab_strip_model()->GetActiveWebContents(), |
| 267 auth_requestor_1_->cert_request_info_, client_certs_1_, | 258 auth_requestor_1_->cert_request_info_, std::move(cert_identity_list), |
| 268 auth_requestor_1_->CreateDelegate()); | 259 auth_requestor_1_->CreateDelegate()); |
| 269 selector_1_->Init(); | 260 selector_1_->Init(); |
| 270 selector_1_->Show(); | 261 selector_1_->Show(); |
| 271 | 262 |
| 272 gfx::NativeWindow window = browser_1_->window()->GetNativeWindow(); | 263 gfx::NativeWindow window = browser_1_->window()->GetNativeWindow(); |
| 273 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); | 264 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); |
| 274 ASSERT_NE(nullptr, widget); | 265 ASSERT_NE(nullptr, widget); |
| 275 views::test::WidgetActivationWaiter waiter(widget, true); | 266 views::test::WidgetActivationWaiter waiter(widget, true); |
| 276 waiter.Wait(); | 267 waiter.Wait(); |
| 277 | 268 |
| 278 EXPECT_EQ(client_cert_1_.get(), selector_1_->GetSelectedCert()); | 269 ASSERT_TRUE(selector_1_->GetSelectedCert()); |
| 270 EXPECT_EQ(cert_identity_1_->certificate(), | |
| 271 selector_1_->GetSelectedCert()->certificate()); | |
| 279 } | 272 } |
| 280 | 273 |
| 281 void SetUpOnIOThread() override { | 274 void SetUpOnIOThread() override { |
| 282 url_request_1_ = | 275 url_request_1_ = |
| 283 MakeURLRequest(url_request_context_getter_1_.get()).release(); | 276 MakeURLRequest(url_request_context_getter_1_.get()).release(); |
| 284 | 277 |
| 285 auth_requestor_1_ = new StrictMock<SSLClientAuthRequestorMock>( | 278 auth_requestor_1_ = new StrictMock<SSLClientAuthRequestorMock>( |
| 286 url_request_1_, | 279 url_request_1_, |
| 287 cert_request_info_1_); | 280 cert_request_info_1_); |
| 288 | 281 |
| 289 SSLClientCertificateSelectorTest::SetUpOnIOThread(); | 282 SSLClientCertificateSelectorTest::SetUpOnIOThread(); |
| 290 } | 283 } |
| 291 | 284 |
| 292 void TearDownOnMainThread() override { | 285 void TearDownOnMainThread() override { |
| 293 auth_requestor_1_ = NULL; | 286 auth_requestor_1_ = NULL; |
| 294 SSLClientCertificateSelectorTest::TearDownOnMainThread(); | 287 SSLClientCertificateSelectorTest::TearDownOnMainThread(); |
| 295 } | 288 } |
| 296 | 289 |
| 297 void CleanUpOnIOThread() override { | 290 void CleanUpOnIOThread() override { |
| 298 delete url_request_1_; | 291 delete url_request_1_; |
| 299 SSLClientCertificateSelectorTest::CleanUpOnIOThread(); | 292 SSLClientCertificateSelectorTest::CleanUpOnIOThread(); |
| 300 } | 293 } |
| 301 | 294 |
| 302 protected: | 295 protected: |
| 303 Browser* browser_1_; | 296 Browser* browser_1_; |
| 304 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_1_; | 297 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_1_; |
| 305 net::URLRequest* url_request_1_; | 298 net::URLRequest* url_request_1_; |
| 306 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_1_; | 299 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_1_; |
| 307 net::CertificateList client_certs_1_; | |
| 308 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_1_; | 300 scoped_refptr<StrictMock<SSLClientAuthRequestorMock> > auth_requestor_1_; |
| 309 SSLClientCertificateSelector* selector_1_; | 301 SSLClientCertificateSelector* selector_1_; |
| 310 }; | 302 }; |
| 311 | 303 |
| 312 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, SelectNone) { | 304 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, SelectNone) { |
| 313 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); | 305 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); |
| 314 | 306 |
| 315 // Let the mock get checked on destruction. | 307 // Let the mock get checked on destruction. |
| 316 } | 308 } |
| 317 | 309 |
| 318 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, Escape) { | 310 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, Escape) { |
| 319 EXPECT_CALL(*auth_requestor_.get(), CertificateSelected(NULL)); | 311 EXPECT_CALL(*auth_requestor_.get(), CertificateSelected(nullptr, nullptr)); |
| 320 | 312 |
| 321 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 313 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 322 browser(), ui::VKEY_ESCAPE, false, false, false, false)); | 314 browser(), ui::VKEY_ESCAPE, false, false, false, false)); |
| 323 | 315 |
| 324 Mock::VerifyAndClear(auth_requestor_.get()); | 316 Mock::VerifyAndClear(auth_requestor_.get()); |
| 325 } | 317 } |
| 326 | 318 |
| 327 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, SelectDefault) { | 319 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorTest, SelectDefault) { |
| 328 EXPECT_CALL(*auth_requestor_.get(), | 320 EXPECT_CALL(*auth_requestor_.get(), |
| 329 CertificateSelected(client_cert_1_.get())); | 321 CertificateSelected(cert_identity_1_->certificate(), |
| 322 cert_identity_1_->ssl_private_key())); | |
| 330 | 323 |
| 331 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 324 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 332 browser(), ui::VKEY_RETURN, false, false, false, false)); | 325 browser(), ui::VKEY_RETURN, false, false, false, false)); |
| 333 | 326 |
| 334 Mock::VerifyAndClear(auth_requestor_.get()); | 327 Mock::VerifyAndClear(auth_requestor_.get()); |
| 335 } | 328 } |
| 336 | 329 |
| 337 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiTabTest, Escape) { | 330 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiTabTest, Escape) { |
| 338 // auth_requestor_1_ should get selected automatically by the | 331 // auth_requestor_1_ should get selected automatically by the |
| 339 // SSLClientAuthObserver when selector_2_ is accepted, since both 1 & 2 have | 332 // SSLClientAuthObserver when selector_2_ is accepted, since both 1 & 2 have |
| 340 // the same host:port. | 333 // the same host:port. |
| 341 EXPECT_CALL(*auth_requestor_1_.get(), CertificateSelected(NULL)); | 334 EXPECT_CALL(*auth_requestor_1_.get(), CertificateSelected(nullptr, nullptr)); |
| 342 EXPECT_CALL(*auth_requestor_2_.get(), CertificateSelected(NULL)); | 335 EXPECT_CALL(*auth_requestor_2_.get(), CertificateSelected(nullptr, nullptr)); |
| 343 | 336 |
| 344 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 337 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 345 browser(), ui::VKEY_ESCAPE, false, false, false, false)); | 338 browser(), ui::VKEY_ESCAPE, false, false, false, false)); |
| 346 | 339 |
| 347 Mock::VerifyAndClear(auth_requestor_.get()); | 340 Mock::VerifyAndClear(auth_requestor_.get()); |
| 348 Mock::VerifyAndClear(auth_requestor_1_.get()); | 341 Mock::VerifyAndClear(auth_requestor_1_.get()); |
| 349 Mock::VerifyAndClear(auth_requestor_2_.get()); | 342 Mock::VerifyAndClear(auth_requestor_2_.get()); |
| 350 | 343 |
| 351 // Now let the default selection for auth_requestor_ mock get checked on | 344 // Now let the default selection for auth_requestor_ mock get checked on |
| 352 // destruction. | 345 // destruction. |
| 353 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); | 346 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); |
| 354 } | 347 } |
| 355 | 348 |
| 356 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiTabTest, SelectSecond) { | 349 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiTabTest, SelectSecond) { |
| 357 // auth_requestor_1_ should get selected automatically by the | 350 // auth_requestor_1_ should get selected automatically by the |
| 358 // SSLClientAuthObserver when selector_2_ is accepted, since both 1 & 2 have | 351 // SSLClientAuthObserver when selector_2_ is accepted, since both 1 & 2 have |
| 359 // the same host:port. | 352 // the same host:port. |
| 360 EXPECT_CALL(*auth_requestor_1_.get(), | 353 EXPECT_CALL(*auth_requestor_1_.get(), |
| 361 CertificateSelected(client_cert_2_.get())); | 354 CertificateSelected(cert_identity_2_->certificate(), |
| 355 cert_identity_2_->ssl_private_key())); | |
| 362 EXPECT_CALL(*auth_requestor_2_.get(), | 356 EXPECT_CALL(*auth_requestor_2_.get(), |
| 363 CertificateSelected(client_cert_2_.get())); | 357 CertificateSelected(cert_identity_2_->certificate(), |
| 358 cert_identity_2_->ssl_private_key())); | |
| 364 | 359 |
| 365 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 360 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 366 browser(), ui::VKEY_DOWN, false, false, false, false)); | 361 browser(), ui::VKEY_DOWN, false, false, false, false)); |
| 367 | 362 |
| 368 EXPECT_EQ(client_cert_1_.get(), selector_->GetSelectedCert()); | 363 ASSERT_TRUE(selector_->GetSelectedCert()); |
| 369 EXPECT_EQ(client_cert_1_.get(), selector_1_->GetSelectedCert()); | 364 EXPECT_EQ(cert_identity_1_->certificate(), |
| 370 EXPECT_EQ(client_cert_2_.get(), selector_2_->GetSelectedCert()); | 365 selector_->GetSelectedCert()->certificate()); |
| 366 ASSERT_TRUE(selector_1_->GetSelectedCert()); | |
| 367 EXPECT_EQ(cert_identity_1_->certificate(), | |
| 368 selector_1_->GetSelectedCert()->certificate()); | |
| 369 ASSERT_TRUE(selector_2_->GetSelectedCert()); | |
| 370 EXPECT_EQ(cert_identity_2_->certificate(), | |
| 371 selector_2_->GetSelectedCert()->certificate()); | |
| 371 | 372 |
| 372 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 373 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 373 browser(), ui::VKEY_RETURN, false, false, false, false)); | 374 browser(), ui::VKEY_RETURN, false, false, false, false)); |
| 374 | 375 |
| 375 Mock::VerifyAndClear(auth_requestor_.get()); | 376 Mock::VerifyAndClear(auth_requestor_.get()); |
| 376 Mock::VerifyAndClear(auth_requestor_1_.get()); | 377 Mock::VerifyAndClear(auth_requestor_1_.get()); |
| 377 Mock::VerifyAndClear(auth_requestor_2_.get()); | 378 Mock::VerifyAndClear(auth_requestor_2_.get()); |
| 378 | 379 |
| 379 // Now let the default selection for auth_requestor_ mock get checked on | 380 // Now let the default selection for auth_requestor_ mock get checked on |
| 380 // destruction. | 381 // destruction. |
| 381 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); | 382 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); |
| 382 } | 383 } |
| 383 | 384 |
| 384 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiProfileTest, Escape) { | 385 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiProfileTest, Escape) { |
| 385 EXPECT_CALL(*auth_requestor_1_.get(), CertificateSelected(NULL)); | 386 EXPECT_CALL(*auth_requestor_1_.get(), CertificateSelected(nullptr, nullptr)); |
| 386 | 387 |
| 387 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 388 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 388 browser_1_, ui::VKEY_ESCAPE, false, false, false, false)); | 389 browser_1_, ui::VKEY_ESCAPE, false, false, false, false)); |
| 389 | 390 |
| 390 Mock::VerifyAndClear(auth_requestor_.get()); | 391 Mock::VerifyAndClear(auth_requestor_.get()); |
| 391 Mock::VerifyAndClear(auth_requestor_1_.get()); | 392 Mock::VerifyAndClear(auth_requestor_1_.get()); |
| 392 | 393 |
| 393 // Now let the default selection for auth_requestor_ mock get checked on | 394 // Now let the default selection for auth_requestor_ mock get checked on |
| 394 // destruction. | 395 // destruction. |
| 395 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); | 396 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); |
| 396 } | 397 } |
| 397 | 398 |
| 398 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiProfileTest, | 399 IN_PROC_BROWSER_TEST_F(SSLClientCertificateSelectorMultiProfileTest, |
| 399 SelectDefault) { | 400 SelectDefault) { |
| 400 EXPECT_CALL(*auth_requestor_1_.get(), | 401 EXPECT_CALL(*auth_requestor_1_.get(), |
| 401 CertificateSelected(client_cert_1_.get())); | 402 CertificateSelected(cert_identity_1_->certificate(), |
| 403 cert_identity_1_->ssl_private_key())); | |
| 402 | 404 |
| 403 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 405 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
| 404 browser_1_, ui::VKEY_RETURN, false, false, false, false)); | 406 browser_1_, ui::VKEY_RETURN, false, false, false, false)); |
| 405 | 407 |
| 406 Mock::VerifyAndClear(auth_requestor_.get()); | 408 Mock::VerifyAndClear(auth_requestor_.get()); |
| 407 Mock::VerifyAndClear(auth_requestor_1_.get()); | 409 Mock::VerifyAndClear(auth_requestor_1_.get()); |
| 408 | 410 |
| 409 // Now let the default selection for auth_requestor_ mock get checked on | 411 // Now let the default selection for auth_requestor_ mock get checked on |
| 410 // destruction. | 412 // destruction. |
| 411 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); | 413 EXPECT_CALL(*auth_requestor_.get(), CancelCertificateSelection()); |
| 412 } | 414 } |
| OLD | NEW |