#include "chrome/test/base/chrome_test_launcher.h"
#include <memory>
#include <string_view>
#include <utility>
#include "base/base_paths.h"
#include "base/command_line.h"
#include "base/debug/leak_annotations.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/process/process_metrics.h"
#include "base/run_loop.h"
#include "base/sampling_heap_profiler/poisson_allocation_sampler.h"
#include "base/strings/string_util.h"
#include "base/test/task_environment.h"
#include "base/test/test_file_util.h"
#include "base/test/test_switches.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/metrics/chrome_feature_list_creator.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/profiler/main_thread_stack_sampling_profiler.h"
#include "chrome/install_static/test/scoped_install_details.h"
#include "chrome/installer/util/taskbar_util.h"
#include "chrome/test/base/chrome_test_suite.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/utility/chrome_content_utility_client.h"
#include "components/crash/core/app/crashpad.h"
#include "content/public/app/content_main.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/network_service_test_helper.h"
#include "content/public/test/test_launcher.h"
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/service_factory.h"
#include "services/test/echo/echo_service.h"
#if BUILDFLAG(IS_MAC)
#include "base/apple/bundle_locations.h"
#include "chrome/browser/chrome_browser_application_mac.h"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
#include "chrome/app/chrome_crash_reporter_client.h"
#endif
#if BUILDFLAG(IS_WIN)
#include <Shlobj.h>
#include "base/debug/handle_hooks_win.h"
#include "base/win/registry.h"
#include "base/win/scoped_com_initializer.h"
#include "chrome/app/chrome_crash_reporter_client_win.h"
#include "chrome/install_static/install_util.h"
#include "chrome/installer/util/firewall_manager_win.h"
#endif
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \
(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
#include "chrome/browser/first_run/scoped_relaunch_chrome_browser_override.h"
#include "chrome/browser/upgrade_detector/installed_version_poller.h"
#include "testing/gtest/include/gtest/gtest.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/crosapi/crosapi_ash.h"
#include "chrome/browser/ash/crosapi/crosapi_manager.h"
#include "chrome/browser/ash/crosapi/test_controller_ash.h"
#include "chrome/browser/chrome_browser_main.h"
#include "chrome/browser/chrome_browser_main_extra_parts.h"
#endif
namespace {
#if BUILDFLAG(IS_CHROMEOS_ASH)
class TestControllerSetupMainExtraParts : public ChromeBrowserMainExtraParts {
public:
TestControllerSetupMainExtraParts() = default;
void PostBrowserStart() override {
crosapi::CrosapiManager::Get()->crosapi_ash()->SetTestControllerForTesting(
std::make_unique<crosapi::TestControllerAsh>());
}
void PostMainMessageLoopRun() override {
crosapi::CrosapiManager::Get()->crosapi_ash()->SetTestControllerForTesting(
nullptr);
}
};
#endif
}
int ChromeTestSuiteRunner::RunTestSuiteInternal(ChromeTestSuite* test_suite) { … }
int ChromeTestSuiteRunner::RunTestSuite(int argc, char** argv) { … }
#if BUILDFLAG(IS_WIN)
class ChromeTestLauncherDelegate::ScopedFirewallRules {
public:
ScopedFirewallRules() {
CHECK(com_initializer_.Succeeded());
base::FilePath exe_path;
CHECK(base::PathService::Get(base::FILE_EXE, &exe_path));
firewall_manager_ = installer::FirewallManager::Create(exe_path);
CHECK(firewall_manager_);
rules_added_ = firewall_manager_->AddFirewallRules();
LOG_IF(WARNING, !rules_added_)
<< "Failed to add Windows firewall rules -- Windows firewall dialogs "
"may appear.";
}
ScopedFirewallRules(const ScopedFirewallRules&) = delete;
ScopedFirewallRules& operator=(const ScopedFirewallRules&) = delete;
~ScopedFirewallRules() {
if (rules_added_)
firewall_manager_->RemoveFirewallRules();
}
private:
base::win::ScopedCOMInitializer com_initializer_;
std::unique_ptr<installer::FirewallManager> firewall_manager_;
bool rules_added_ = false;
};
#endif
namespace {
auto RunEchoService(mojo::PendingReceiver<echo::mojom::EchoService> receiver) { … }
}
ChromeTestLauncherDelegate::ChromeTestLauncherDelegate(
ChromeTestSuiteRunner* runner)
: … { … }
ChromeTestLauncherDelegate::~ChromeTestLauncherDelegate() { … }
int ChromeTestLauncherDelegate::RunTestSuite(int argc, char** argv) { … }
std::string
ChromeTestLauncherDelegate::GetUserDataDirectoryCommandLineSwitch() { … }
class BrowserTestChromeContentUtilityClient
: public ChromeContentUtilityClient { … };
content::ContentUtilityClient*
ChromeTestChromeMainDelegate::CreateContentUtilityClient() { … }
#if !BUILDFLAG(IS_ANDROID)
std::optional<int> ChromeTestChromeMainDelegate::PostEarlyInitialization(
InvokedIn invoked_in) { … }
#endif
#if BUILDFLAG(IS_WIN)
bool ChromeTestChromeMainDelegate::ShouldHandleConsoleControlEvents() {
return false;
}
#endif
void ChromeTestChromeMainDelegate::CreateThreadPool(std::string_view name) { … }
#if !BUILDFLAG(IS_ANDROID)
content::ContentMainDelegate*
ChromeTestLauncherDelegate::CreateContentMainDelegate() { … }
#endif
void ChromeTestLauncherDelegate::CreatedBrowserMainParts(
content::BrowserMainParts* browser_main_parts) { … }
void ChromeTestLauncherDelegate::PreSharding() { … }
void ChromeTestLauncherDelegate::OnDoneRunningTests() { … }
int LaunchChromeTests(size_t parallel_jobs,
content::TestLauncherDelegate* delegate,
int argc,
char** argv) { … }