-
Notifications
You must be signed in to change notification settings - Fork 6.6k
/
test_launcher_utils.cc
151 lines (126 loc) · 5.9 KB
/
test_launcher_utils.cc
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// 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 "build/chromeos_buildflags.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 "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.
command_line->AppendSwitch(switches::kNoFirstRun);
// No default browser check, it would create an info-bar (if we are not the
// default browser) that could conflicts with some tests expectations.
command_line->AppendSwitch(switches::kNoDefaultBrowserCheck);
// 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_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS_ASH)
// 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(switches::kPasswordStore))
command_line->AppendSwitchASCII(switches::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);
}
void RemoveCommandLineSwitch(const base::CommandLine& in_command_line,
const std::string& switch_to_remove,
base::CommandLine* out_command_line) {
const base::CommandLine::SwitchMap& switch_map =
in_command_line.GetSwitches();
for (auto i = switch_map.begin(); i != switch_map.end(); ++i) {
const std::string& switch_name = i->first;
if (switch_name == switch_to_remove)
continue;
out_command_line->AppendSwitchNative(switch_name, i->second);
}
}
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