blob: 442d8bbe1c831f0f75946f961cc2054ada04d3d8 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ssl/connection_help_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/cert_verify_result.h"
#include "net/dns/mock_host_resolver.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/gurl.h"
class ConnectionHelpTabHelperTest : public InProcessBrowserTest {
public:
ConnectionHelpTabHelperTest()
: https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
https_expired_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
ConnectionHelpTabHelperTest(const ConnectionHelpTabHelperTest&) = delete;
ConnectionHelpTabHelperTest& operator=(const ConnectionHelpTabHelperTest&) =
delete;
void SetUpOnMainThread() override {
https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
https_expired_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
https_server_.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
https_expired_server_.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
ASSERT_TRUE(https_server_.Start());
ASSERT_TRUE(https_expired_server_.Start());
}
protected:
void SetHelpCenterUrl(Browser* browser, const GURL& url) {
ConnectionHelpTabHelper::FromWebContents(
browser->tab_strip_model()->GetActiveWebContents())
->SetHelpCenterUrlForTesting(url);
}
net::EmbeddedTestServer* https_server() { return &https_server_; }
net::EmbeddedTestServer* https_expired_server() {
return &https_expired_server_;
}
private:
net::EmbeddedTestServer https_server_;
net::EmbeddedTestServer https_expired_server_;
};
// Tests that the chrome://connection-help redirect is not triggered for an
// interstitial on a site that is not the help center.
IN_PROC_BROWSER_TEST_F(ConnectionHelpTabHelperTest,
InterstitialOnNonSupportURL) {
GURL expired_non_support_url = https_expired_server()->GetURL("/title2.html");
GURL good_support_url = https_server()->GetURL("/title2.html");
SetHelpCenterUrl(browser(), good_support_url);
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), expired_non_support_url));
std::u16string tab_title;
ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
EXPECT_EQ(base::UTF16ToUTF8(tab_title), "Privacy error");
}
// Tests that the chrome://connection-help redirect is not triggered for the
// help center URL if there was no interstitial.
IN_PROC_BROWSER_TEST_F(ConnectionHelpTabHelperTest,
SupportURLWithNoInterstitial) {
GURL good_support_url = https_server()->GetURL("/title2.html");
SetHelpCenterUrl(browser(), good_support_url);
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), good_support_url));
std::u16string tab_title;
ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
EXPECT_EQ(base::UTF16ToUTF8(tab_title), "Title Of Awesomeness");
}
// Tests that the chrome://connection-help redirect is triggered for the help
// center URL if there was an interstitial.
IN_PROC_BROWSER_TEST_F(ConnectionHelpTabHelperTest, InterstitialOnSupportURL) {
GURL expired_url = https_expired_server()->GetURL("/title2.html");
SetHelpCenterUrl(browser(), expired_url);
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), expired_url));
std::u16string tab_title;
ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
EXPECT_EQ(base::UTF16ToUTF8(tab_title),
l10n_util::GetStringUTF8(IDS_CONNECTION_HELP_TITLE));
}
// Tests that if the help content site is opened with an error code that refers
// to a certificate error, the certificate error section is automatically
// expanded.
IN_PROC_BROWSER_TEST_F(ConnectionHelpTabHelperTest,
CorrectlyExpandsCertErrorSection) {
GURL expired_url = https_expired_server()->GetURL("/title2.html#-200");
GURL::Replacements replacements;
replacements.ClearRef();
SetHelpCenterUrl(browser(), expired_url.ReplaceComponents(replacements));
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), expired_url));
// Check that we got redirected to the offline help content.
std::u16string tab_title;
ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
EXPECT_EQ(base::UTF16ToUTF8(tab_title),
l10n_util::GetStringUTF8(IDS_CONNECTION_HELP_TITLE));
// Check that the cert error details section is not hidden.
std::string cert_error_is_hidden_js =
"var certSection = document.getElementById('details-certerror'); "
"certSection.className == 'hidden';";
EXPECT_EQ(false, content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
cert_error_is_hidden_js));
}
// Tests that if the help content site is opened with an error code that refers
// to an expired certificate, the clock section is automatically expanded.
IN_PROC_BROWSER_TEST_F(ConnectionHelpTabHelperTest,
CorrectlyExpandsClockSection) {
GURL expired_url = https_expired_server()->GetURL("/title2.html#-201");
GURL::Replacements replacements;
replacements.ClearRef();
SetHelpCenterUrl(browser(), expired_url.ReplaceComponents(replacements));
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), expired_url));
// Check that we got redirected to the offline help content.
std::u16string tab_title;
ui_test_utils::GetCurrentTabTitle(browser(), &tab_title);
EXPECT_EQ(base::UTF16ToUTF8(tab_title),
l10n_util::GetStringUTF8(IDS_CONNECTION_HELP_TITLE));
// Check that the clock details section is not hidden.
std::string clock_is_hidden_js =
"var clockSection = document.getElementById('details-clock'); "
"clockSection.className == 'hidden';";
EXPECT_EQ(false, content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
clock_is_hidden_js));
}