1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// Copyright 2012 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/test/base/test_launcher_utils.h"
#include <memory>
#include "base/command_line.h"
#include "base/environment.h"
#include "base/feature_list.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/strings/string_number_conversions.h"
#include "build/build_config.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "components/os_crypt/sync/os_crypt_switches.h"
#include "components/password_manager/core/browser/password_manager_switches.h"
#include "content/public/common/content_switches.h"
#include "ui/display/display_switches.h"
#if defined(USE_AURA)
#include "ui/wm/core/wm_core_switches.h"
#endif
namespace test_launcher_utils {
void PrepareBrowserCommandLineForTests(base::CommandLine* command_line) {
// Don't show the first run ui and disable the default browser check.
command_line->AppendSwitch(switches::kNoFirstRun);
// Enable info level logging to stderr by default so that we can see when bad
// stuff happens, but honor the flags specified from the command line. Use the
// default logging level (INFO) instead of explicitly passing
// switches::kLoggingLevel. Passing the switch explicitly resulted in data
// races in tests that start async operations (that use logging) prior to
// initializing the browser: https://crbug.com/749066.
if (!command_line->HasSwitch(switches::kEnableLogging))
command_line->AppendSwitchASCII(switches::kEnableLogging, "stderr");
// Don't install default apps.
command_line->AppendSwitch(switches::kDisableDefaultApps);
#if defined(USE_AURA)
// Disable window animations under Ash as the animations effect the
// coordinates returned and result in flake.
command_line->AppendSwitch(
wm::switches::kWindowAnimationsDisabled);
#endif
#if BUILDFLAG(IS_LINUX)
// Don't use the native password stores on Linux since they may
// prompt for additional UI during tests and cause test failures or
// timeouts. Win, Mac and ChromeOS don't look at the kPasswordStore
// switch.
if (!command_line->HasSwitch(password_manager::kPasswordStore)) {
command_line->AppendSwitchASCII(password_manager::kPasswordStore, "basic");
}
#endif
#if BUILDFLAG(IS_MAC)
// Use mock keychain on mac to prevent blocking permissions dialogs.
command_line->AppendSwitch(os_crypt::switches::kUseMockKeychain);
#endif
command_line->AppendSwitch(switches::kDisableComponentUpdate);
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
// Changing the stack canary means we need to disable the stack guard on all
// functions that appear as ancestors in the call stack of RunZygote(). This
// is infeasible for tests, and changing the stack canary is unnecessary for
// tests as it is a security mitigation.
command_line->AppendSwitchASCII(switches::kChangeStackGuardOnFork,
switches::kChangeStackGuardOnForkDisabled);
#endif
}
void PrepareBrowserCommandLineForBrowserTests(base::CommandLine* command_line,
bool open_about_blank_on_launch) {
// This is a Browser test.
command_line->AppendSwitchASCII(switches::kTestType, "browser");
if (open_about_blank_on_launch && command_line->GetArgs().empty())
command_line->AppendArg(url::kAboutBlankURL);
}
bool CreateUserDataDir(base::ScopedTempDir* temp_dir) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
base::FilePath user_data_dir =
command_line->GetSwitchValuePath(switches::kUserDataDir);
if (user_data_dir.empty()) {
DCHECK(temp_dir);
if (temp_dir->CreateUniqueTempDir() && temp_dir->IsValid()) {
user_data_dir = temp_dir->GetPath();
} else {
LOG(ERROR) << "Could not create temporary user data directory \""
<< temp_dir->GetPath().value() << "\".";
return false;
}
}
return OverrideUserDataDir(user_data_dir);
}
bool OverrideUserDataDir(const base::FilePath& user_data_dir) {
bool success = true;
// base::PathService::Override() is the best way to change the user data
// directory. This matches what is done in ChromeMain().
success = base::PathService::Override(chrome::DIR_USER_DATA, user_data_dir);
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
// Make sure the cache directory is inside our clear profile. Otherwise
// the cache may contain data from earlier tests that could break the
// current test.
//
// Note: we use an environment variable here, because we have to pass the
// value to the child process. This is the simplest way to do it.
std::unique_ptr<base::Environment> env(base::Environment::Create());
success = success && env->SetVar("XDG_CACHE_HOME", user_data_dir.value());
// Also make sure that the machine policy directory is inside the clear
// profile. Otherwise the machine's policies could affect tests.
base::FilePath policy_files = user_data_dir.AppendASCII("policies");
success = success &&
base::PathService::Override(chrome::DIR_POLICY_FILES, policy_files);
#endif
return success;
}
} // namespace test_launcher_utils
|