chromium/chrome/browser/font_prewarmer_tab_helper_browsertest.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/font_prewarmer_tab_helper.h"

#include "base/command_line.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/google/core/common/google_switches.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "components/search_engines/testing_search_terms_data.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/controllable_http_response.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "ui/base/window_open_disposition.h"

class FontPrewarmerTabHelperTest : public InProcessBrowserTest {
 public:
  TemplateURLService* LoadTemplateUrlService() {
    TemplateURLService* service =
        TemplateURLServiceFactory::GetInstance()->GetForProfile(
            browser()->profile());
    if (service->loaded())
      return service;
    base::RunLoop run_loop;
    base::CallbackListSubscription subscription =
        service->RegisterOnLoadedCallback(
            base::BindLambdaForTesting([&]() { run_loop.Quit(); }));
    service->Load();
    run_loop.Run();
    return service;
  }

  // BrowserTest:
  void SetUp() override { InProcessBrowserTest::SetUp(); }

  void SetUpOnMainThread() override {
    // Setup the server to allow serving separate sites, so we can perform
    // cross-process navigation.
    host_resolver()->AddRule("*", "127.0.0.1");
  }

  void SetUpCommandLine(base::CommandLine* command_line) override {
    // Configure the test server to generate a certificate valid for
    // www.google.com.
    net::EmbeddedTestServer::ServerCertificateConfig https_server_cert_config;
    https_server_cert_config.dns_names = {"www.google.com"};
    https_server_.SetSSLConfig(https_server_cert_config);
    https_server_.RegisterRequestHandler(base::BindRepeating(
        &FontPrewarmerTabHelperTest::OnHandleRequest, base::Unretained(this)));

    // Needed for explicit ports to work (which embedded test uses).
    command_line->AppendSwitch(switches::kIgnoreGooglePortNumbers);
    ASSERT_TRUE(https_server_.Start());
    // Change the google url so that the default search engine picks up the
    // port used by the test server.
    command_line->AppendSwitchASCII(
        switches::kGoogleBaseURL,
        https_server_.GetURL("www.google.com", "/").spec().c_str());
    InProcessBrowserTest::SetUpCommandLine(command_line);
  }

 protected:
  std::string GetSearchResultsPageFontsPref() {
    return FontPrewarmerTabHelper::GetSearchResultsPageFontsPref();
  }

  std::vector<std::string> GetFontNames() {
    return FontPrewarmerTabHelper::GetFontNames(browser()->profile());
  }

  std::unique_ptr<net::test_server::HttpResponse> OnHandleRequest(
      const net::test_server::HttpRequest& request) {
    std::unique_ptr<net::test_server::BasicHttpResponse> response =
        std::make_unique<net::test_server::BasicHttpResponse>();
    response->set_content_type("text/html");
    response->set_code(net::HTTP_OK);
    response->set_content("<html><body style='font-family:Arial'>Hello");
    return response;
  }

  net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
};

IN_PROC_BROWSER_TEST_F(FontPrewarmerTabHelperTest, Basic) {
  TemplateURLService* service = LoadTemplateUrlService();
  ASSERT_TRUE(service);
  const GURL search_results_page_url =
      service->GetDefaultSearchProvider()->GenerateSearchURL(
          UIThreadSearchTermsData());
  ASSERT_TRUE(!search_results_page_url.is_empty());
  NavigateParams params(browser(), search_results_page_url,
                        ui::PAGE_TRANSITION_LINK);
  base::RunLoop run_loop;
  PrefChangeRegistrar prefs_registrar;
  prefs_registrar.Init(browser()->profile()->GetPrefs());
  prefs_registrar.Add(GetSearchResultsPageFontsPref(),
                      base::BindLambdaForTesting([&]() { run_loop.Quit(); }));
  Navigate(&params);
  run_loop.Run();
  auto font_names = GetFontNames();
  std::vector<std::string> expected = {"Arial"};
  EXPECT_EQ(expected, font_names);
}