Chromium Code Reviews| Index: chrome/browser/ssl/ssl_error_handler_unittest.cc |
| diff --git a/chrome/browser/ssl/ssl_error_handler_unittest.cc b/chrome/browser/ssl/ssl_error_handler_unittest.cc |
| index e93908e9cf7847c2c9e4af7c9bdf3641b9bd0249..fc854c7bdd850472e3880c3e3527e09d0d514be9 100644 |
| --- a/chrome/browser/ssl/ssl_error_handler_unittest.cc |
| +++ b/chrome/browser/ssl/ssl_error_handler_unittest.cc |
| @@ -11,12 +11,15 @@ |
| #include "base/time/time.h" |
| #include "chrome/browser/captive_portal/captive_portal_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/ssl/common_name_mismatch_handler.h" |
| #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/captive_portal/captive_portal_testing_utils.h" |
| #include "content/public/browser/notification_service.h" |
| #include "net/base/net_errors.h" |
| +#include "net/cert/x509_certificate.h" |
| #include "net/ssl/ssl_info.h" |
| +#include "net/test/test_certificate_data.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| class TestSSLErrorHandler : public SSLErrorHandler { |
| @@ -33,8 +36,11 @@ class TestSSLErrorHandler : public SSLErrorHandler { |
| base::Callback<void(bool)>()), |
| profile_(profile), |
| captive_portal_checked_(false), |
| + suggested_url_exists_(false), |
| + suggested_url_checked_(false), |
| ssl_interstitial_shown_(false), |
| - captive_portal_interstitial_shown_(false) {} |
| + captive_portal_interstitial_shown_(false), |
| + common_name_mismatch_interstitial_shown_(false) {} |
| ~TestSSLErrorHandler() override { |
| } |
| @@ -52,6 +58,15 @@ class TestSSLErrorHandler : public SSLErrorHandler { |
| content::Details<CaptivePortalService::Results>(&results)); |
| } |
| + void SendSuggestedUrlCheckResult( |
| + const CommonNameMismatchHandler::SuggestedUrlCheckResult& result, |
| + const GURL& suggested_url) { |
| + CommonNameMismatchHandler::Results results; |
| + results.result = result; |
| + results.suggested_url = suggested_url; |
| + CommonNameMismatchHandlerCallback(results); |
| + } |
| + |
| bool IsTimerRunning() const { |
| return get_timer().IsRunning(); |
| } |
| @@ -68,10 +83,32 @@ class TestSSLErrorHandler : public SSLErrorHandler { |
| return captive_portal_interstitial_shown_; |
| } |
| + void SetSuggestedUrl(bool suggested_url_exists) { |
|
meacer
2015/07/28 01:18:07
SetSuggestedUrl -> SetSuggestedUrlExists
Bhanu Dev
2015/07/30 02:39:10
Done.
|
| + suggested_url_exists_ = suggested_url_exists; |
| + } |
| + |
| + bool GetSuggestedUrl(const GURL& request_url, |
| + const std::vector<std::string>& dns_names, |
| + GURL* suggested_url) override { |
| + if (!suggested_url_exists_) |
| + return false; |
| + *suggested_url = GURL("www.example.com"); |
| + return true; |
| + } |
| + |
| + bool suggested_url_checked() const { return suggested_url_checked_; } |
| + |
| + bool common_name_mismatch_interstitial_shown() const { |
| + return common_name_mismatch_interstitial_shown_; |
| + } |
| + |
| void Reset() { |
| captive_portal_checked_ = false; |
| + suggested_url_exists_ = false; |
| + suggested_url_checked_ = false; |
| ssl_interstitial_shown_ = false; |
| captive_portal_interstitial_shown_ = false; |
| + common_name_mismatch_interstitial_shown_ = false; |
| } |
| private: |
| @@ -79,18 +116,28 @@ class TestSSLErrorHandler : public SSLErrorHandler { |
| captive_portal_checked_ = true; |
| } |
| - void ShowSSLInterstitial() override { |
| - ssl_interstitial_shown_ = true; |
| + void ShowSSLInterstitial(const GURL& suggested_url) override { |
| + if (!suggested_url.is_empty()) |
| + common_name_mismatch_interstitial_shown_ = true; |
| + else |
| + ssl_interstitial_shown_ = true; |
| } |
| void ShowCaptivePortalInterstitial(const GURL& landing_url) override { |
| captive_portal_interstitial_shown_ = true; |
| } |
| + void CheckSuggestedUrl(const GURL& suggested_url) override { |
| + suggested_url_checked_ = true; |
| + } |
| + |
| Profile* profile_; |
| bool captive_portal_checked_; |
| + bool suggested_url_exists_; |
| + bool suggested_url_checked_; |
| bool ssl_interstitial_shown_; |
| bool captive_portal_interstitial_shown_; |
| + bool common_name_mismatch_interstitial_shown_; |
| DISALLOW_COPY_AND_ASSIGN(TestSSLErrorHandler); |
| }; |
| @@ -104,13 +151,16 @@ class SSLErrorHandlerTest : public ChromeRenderViewHostTestHarness { |
| void SetUp() override { |
| ChromeRenderViewHostTestHarness::SetUp(); |
| SSLErrorHandler::SetInterstitialDelayTypeForTest(SSLErrorHandler::NONE); |
| + ssl_info_.cert = net::X509Certificate::CreateFromBytes( |
| + reinterpret_cast<const char*>(google_der), sizeof(google_der)); |
| + ssl_info_.cert_status = net::CERT_STATUS_COMMON_NAME_INVALID; |
| error_handler_.reset(new TestSSLErrorHandler(profile(), |
| web_contents(), |
| ssl_info_)); |
| // Enable finch experiment for captive portal interstitials. |
| ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| "CaptivePortalInterstitial", "Enabled")); |
| -} |
| + } |
| void TearDown() override { |
| EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| @@ -191,11 +241,39 @@ TEST_F(SSLErrorHandlerTest, |
| EXPECT_FALSE(error_handler()->captive_portal_interstitial_shown()); |
| } |
| +TEST_F(SSLErrorHandlerTest, ShouldNotCheckSuggestedUrlIfNoSuggestedUrl) { |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(false); |
| + error_handler()->StartHandlingError(); |
| + |
| + EXPECT_TRUE(error_handler()->IsTimerRunning()); |
| + EXPECT_FALSE(error_handler()->suggested_url_checked()); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->ssl_interstitial_shown()); |
| +} |
| + |
| +TEST_F(SSLErrorHandlerTest, ShouldNotCheckCaptivePortalIfSuggestedUrlExists) { |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(true); |
| + error_handler()->StartHandlingError(); |
| + |
| + EXPECT_TRUE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->suggested_url_checked()); |
| + EXPECT_FALSE(error_handler()->captive_portal_checked()); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->ssl_interstitial_shown()); |
| +} |
| + |
| #else // #if !defined(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| TEST_F(SSLErrorHandlerTest, |
| ShouldShowSSLInterstitialOnCaptivePortalDetectionDisabled) { |
| EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(false); |
| error_handler()->StartHandlingError(); |
| EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| EXPECT_FALSE(error_handler()->captive_portal_checked()); |
| @@ -204,3 +282,64 @@ TEST_F(SSLErrorHandlerTest, |
| } |
| #endif // defined(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| + |
| +TEST_F(SSLErrorHandlerTest, |
| + ShouldShowSSLInterstitialOnTimerExpiredWhenSuggestedUrlExists) { |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(true); |
| + error_handler()->StartHandlingError(); |
| + |
| + EXPECT_TRUE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->suggested_url_checked()); |
| + EXPECT_FALSE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_FALSE(error_handler()->common_name_mismatch_interstitial_shown()); |
| + |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_FALSE(error_handler()->common_name_mismatch_interstitial_shown()); |
| +} |
| + |
| +TEST_F(SSLErrorHandlerTest, |
| + ShouldShowCommonNameMismatchInterstitialOnSuggestedUrlCheckResult) { |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(true); |
| + error_handler()->StartHandlingError(); |
| + |
| + EXPECT_TRUE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->suggested_url_checked()); |
| + EXPECT_FALSE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_FALSE(error_handler()->common_name_mismatch_interstitial_shown()); |
| + // Fake a valid suggested URL check result. |
| + // The URL returned by |SuggestedUrlCheckResult| can be different from |
| + // |suggested_url|, if there is a redirect. |
| + error_handler()->SendSuggestedUrlCheckResult( |
| + CommonNameMismatchHandler::SuggestedUrlCheckResult:: |
| + RESULT_SUGGESTED_URL_VALID, |
| + GURL("https://random.example.com")); |
| + |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + EXPECT_FALSE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_TRUE(error_handler()->common_name_mismatch_interstitial_shown()); |
| +} |
| + |
| +TEST_F(SSLErrorHandlerTest, ShouldShowSSLInterstitialOnInvalidUrlCheckResult) { |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + error_handler()->SetSuggestedUrl(true); |
| + error_handler()->StartHandlingError(); |
| + |
| + EXPECT_TRUE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->suggested_url_checked()); |
| + EXPECT_FALSE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_FALSE(error_handler()->common_name_mismatch_interstitial_shown()); |
| + // Fake an Invalid Suggested URL Check result. |
| + error_handler()->SendSuggestedUrlCheckResult( |
| + CommonNameMismatchHandler::SuggestedUrlCheckResult:: |
| + RESULT_SUGGESTED_URL_INVALID, |
| + GURL()); |
| + |
| + EXPECT_FALSE(error_handler()->IsTimerRunning()); |
| + EXPECT_TRUE(error_handler()->ssl_interstitial_shown()); |
| + EXPECT_FALSE(error_handler()->common_name_mismatch_interstitial_shown()); |
| +} |