Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: chrome/test/ui/ui_test.cc

Issue 2856047: GTTF: Make ui_tests more reliable by using a temporary profile directory (Closed)
Patch Set: PathService Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/test/ui/ui_test.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/test/ui/ui_test.h" 5 #include "chrome/test/ui/ui_test.h"
6 6
7 #if defined(OS_POSIX) 7 #if defined(OS_POSIX)
8 #include <signal.h> 8 #include <signal.h>
9 #include <sys/types.h> 9 #include <sys/types.h>
10 #endif 10 #endif
11 11
12 #include <set> 12 #include <set>
13 #include <vector> 13 #include <vector>
14 14
15 #include "app/sql/connection.h" 15 #include "app/sql/connection.h"
16 #include "base/base_switches.h" 16 #include "base/base_switches.h"
17 #include "base/command_line.h" 17 #include "base/command_line.h"
18 #include "base/file_path.h" 18 #include "base/file_path.h"
19 #include "base/file_util.h" 19 #include "base/file_util.h"
20 #include "base/path_service.h" 20 #include "base/path_service.h"
21 #include "base/platform_thread.h" 21 #include "base/platform_thread.h"
22 #include "base/process_util.h" 22 #include "base/process_util.h"
23 #include "base/scoped_ptr.h" 23 #include "base/scoped_ptr.h"
24 #include "base/scoped_temp_dir.h"
24 #include "base/string_util.h" 25 #include "base/string_util.h"
25 #include "base/test/test_file_util.h" 26 #include "base/test/test_file_util.h"
26 #include "base/time.h" 27 #include "base/time.h"
27 #include "chrome/app/chrome_dll_resource.h" 28 #include "chrome/app/chrome_dll_resource.h"
28 #include "chrome/browser/net/url_fixer_upper.h" 29 #include "chrome/browser/net/url_fixer_upper.h"
29 #include "chrome/common/chrome_constants.h" 30 #include "chrome/common/chrome_constants.h"
30 #include "chrome/common/chrome_paths.h" 31 #include "chrome/common/chrome_paths.h"
31 #include "chrome/common/chrome_switches.h" 32 #include "chrome/common/chrome_switches.h"
32 #include "chrome/common/debug_flags.h" 33 #include "chrome/common/debug_flags.h"
33 #include "chrome/common/logging_chrome.h" 34 #include "chrome/common/logging_chrome.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 clear_profile_(true), 119 clear_profile_(true),
119 include_testing_id_(true), 120 include_testing_id_(true),
120 enable_file_cookies_(true), 121 enable_file_cookies_(true),
121 profile_type_(UITestBase::DEFAULT_THEME), 122 profile_type_(UITestBase::DEFAULT_THEME),
122 shutdown_type_(UITestBase::WINDOW_CLOSE), 123 shutdown_type_(UITestBase::WINDOW_CLOSE),
123 test_start_time_(Time::NowFromSystemTime()), 124 test_start_time_(Time::NowFromSystemTime()),
124 command_execution_timeout_ms_(kCommandExecutionTimeout), 125 command_execution_timeout_ms_(kCommandExecutionTimeout),
125 action_timeout_ms_(kWaitForActionMsec), 126 action_timeout_ms_(kWaitForActionMsec),
126 action_max_timeout_ms_(kWaitForActionMaxMsec), 127 action_max_timeout_ms_(kWaitForActionMaxMsec),
127 sleep_timeout_ms_(kWaitForActionMsec), 128 sleep_timeout_ms_(kWaitForActionMsec),
128 terminate_timeout_ms_(kWaitForTerminateMsec) { 129 terminate_timeout_ms_(kWaitForTerminateMsec),
130 temp_profile_dir_(new ScopedTempDir()) {
129 PathService::Get(chrome::DIR_APP, &browser_directory_); 131 PathService::Get(chrome::DIR_APP, &browser_directory_);
130 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_); 132 PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_);
131 } 133 }
132 134
133 UITestBase::UITestBase(MessageLoop::Type msg_loop_type) 135 UITestBase::UITestBase(MessageLoop::Type msg_loop_type)
134 : launch_arguments_(CommandLine::ARGUMENTS_ONLY), 136 : launch_arguments_(CommandLine::ARGUMENTS_ONLY),
135 expected_errors_(0), 137 expected_errors_(0),
136 expected_crashes_(0), 138 expected_crashes_(0),
137 homepage_(L"about:blank"), 139 homepage_(L"about:blank"),
138 wait_for_initial_loads_(true), 140 wait_for_initial_loads_(true),
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 354
353 void UITestBase::StopHttpServer() { 355 void UITestBase::StopHttpServer() {
354 scoped_ptr<CommandLine> cmd_line(CreateHttpServerCommandLine()); 356 scoped_ptr<CommandLine> cmd_line(CreateHttpServerCommandLine());
355 ASSERT_TRUE(cmd_line.get()); 357 ASSERT_TRUE(cmd_line.get());
356 cmd_line->AppendSwitchWithValue("server", "stop"); 358 cmd_line->AppendSwitchWithValue("server", "stop");
357 RunCommand(*cmd_line.get()); 359 RunCommand(*cmd_line.get());
358 } 360 }
359 361
360 void UITestBase::LaunchBrowser(const CommandLine& arguments, 362 void UITestBase::LaunchBrowser(const CommandLine& arguments,
361 bool clear_profile) { 363 bool clear_profile) {
362 #if defined(OS_POSIX) 364 if (clear_profile || !temp_profile_dir_->IsValid()) {
363 const char* alternative_userdir = getenv("CHROME_UI_TESTS_USER_DATA_DIR"); 365 temp_profile_dir_.reset(new ScopedTempDir());
364 #else 366 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir());
365 const FilePath::StringType::value_type* const alternative_userdir = NULL;
366 #endif
367 367
368 if (alternative_userdir) { 368 // Update the information about user data directory location on the ui_test
369 user_data_dir_ = FilePath(alternative_userdir); 369 // side. Using PathService seems to be the most reliable, consistent way
370 } else { 370 // to do that.
371 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_); 371 ASSERT_TRUE(PathService::Override(chrome::DIR_USER_DATA, user_data_dir()));
372 } 372 }
373 373
374 // Clear user data directory to make sure test environment is consistent
375 // We balk on really short (absolute) user_data_dir directory names, because
376 // we're worried that they'd accidentally be root or something.
377 ASSERT_LT(10, static_cast<int>(user_data_dir_.value().size())) <<
378 "The user data directory name passed into this test was too "
379 "short to delete safely. Please check the user-data-dir "
380 "argument and try again.";
381 if (clear_profile)
382 ASSERT_TRUE(file_util::DieFileDie(user_data_dir_, true));
383
384 if (!template_user_data_.empty()) { 374 if (!template_user_data_.empty()) {
385 // Recursively copy the template directory to the user_data_dir. 375 // Recursively copy the template directory to the user_data_dir.
386 ASSERT_TRUE(file_util::CopyRecursiveDirNoCache( 376 ASSERT_TRUE(file_util::CopyRecursiveDirNoCache(
387 template_user_data_, 377 template_user_data_,
388 user_data_dir_)); 378 user_data_dir()));
389 // If we're using the complex theme data, we need to write the 379 // If we're using the complex theme data, we need to write the
390 // user_data_dir_ to our preferences file. 380 // user_data_dir_ to our preferences file.
391 if (profile_type_ == UITestBase::COMPLEX_THEME) { 381 if (profile_type_ == UITestBase::COMPLEX_THEME) {
392 RewritePreferencesFile(user_data_dir_); 382 RewritePreferencesFile(user_data_dir());
393 } 383 }
394 384
395 // Update the history file to include recent dates. 385 // Update the history file to include recent dates.
396 UpdateHistoryDates(); 386 UpdateHistoryDates();
397 } 387 }
398 388
399 ASSERT_TRUE(LaunchBrowserHelper(arguments, false, &process_)); 389 ASSERT_TRUE(LaunchBrowserHelper(arguments, false, &process_));
400 process_id_ = base::GetProcId(process_); 390 process_id_ = base::GetProcId(process_);
401 } 391 }
402 392
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 // Rewrite prefs file. 1007 // Rewrite prefs file.
1018 std::vector<string16> subst; 1008 std::vector<string16> subst;
1019 subst.push_back(WideToUTF16(user_data_dir_w)); 1009 subst.push_back(WideToUTF16(user_data_dir_w));
1020 const std::string prefs_string = 1010 const std::string prefs_string =
1021 UTF16ToASCII(ReplaceStringPlaceholders(format_string, subst, NULL)); 1011 UTF16ToASCII(ReplaceStringPlaceholders(format_string, subst, NULL));
1022 EXPECT_TRUE(file_util::WriteFile(pref_path, prefs_string.c_str(), 1012 EXPECT_TRUE(file_util::WriteFile(pref_path, prefs_string.c_str(),
1023 prefs_string.size())); 1013 prefs_string.size()));
1024 file_util::EvictFileFromSystemCache(pref_path); 1014 file_util::EvictFileFromSystemCache(pref_path);
1025 } 1015 }
1026 1016
1017 FilePath UITestBase::user_data_dir() const {
1018 EXPECT_TRUE(temp_profile_dir_->IsValid());
1019 return temp_profile_dir_->path();
1020 }
1021
1027 // static 1022 // static
1028 FilePath UITestBase::ComputeTypicalUserDataSource(ProfileType profile_type) { 1023 FilePath UITestBase::ComputeTypicalUserDataSource(ProfileType profile_type) {
1029 FilePath source_history_file; 1024 FilePath source_history_file;
1030 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, 1025 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA,
1031 &source_history_file)); 1026 &source_history_file));
1032 source_history_file = source_history_file.AppendASCII("profiles"); 1027 source_history_file = source_history_file.AppendASCII("profiles");
1033 switch (profile_type) { 1028 switch (profile_type) {
1034 case UITestBase::DEFAULT_THEME: 1029 case UITestBase::DEFAULT_THEME:
1035 source_history_file = source_history_file.AppendASCII("typical_history"); 1030 source_history_file = source_history_file.AppendASCII("typical_history");
1036 break; 1031 break;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 command_line.AppendSwitch(switches::kNoFirstRun); 1114 command_line.AppendSwitch(switches::kNoFirstRun);
1120 1115
1121 // No default browser check, it would create an info-bar (if we are not the 1116 // No default browser check, it would create an info-bar (if we are not the
1122 // default browser) that could conflicts with some tests expectations. 1117 // default browser) that could conflicts with some tests expectations.
1123 command_line.AppendSwitch(switches::kNoDefaultBrowserCheck); 1118 command_line.AppendSwitch(switches::kNoDefaultBrowserCheck);
1124 1119
1125 // This is a UI test. 1120 // This is a UI test.
1126 command_line.AppendSwitchWithValue(switches::kTestType, 1121 command_line.AppendSwitchWithValue(switches::kTestType,
1127 ASCIIToWide(kUITestType)); 1122 ASCIIToWide(kUITestType));
1128 1123
1124 // Tell the browser to use a temporary directory just for this test.
1125 command_line.AppendSwitchWithValue(switches::kUserDataDir,
1126 user_data_dir().ToWStringHack());
1127
1129 // We need cookies on file:// for things like the page cycler. 1128 // We need cookies on file:// for things like the page cycler.
1130 if (enable_file_cookies_) 1129 if (enable_file_cookies_)
1131 command_line.AppendSwitch(switches::kEnableFileCookies); 1130 command_line.AppendSwitch(switches::kEnableFileCookies);
1132 1131
1133 if (dom_automation_enabled_) 1132 if (dom_automation_enabled_)
1134 command_line.AppendSwitch(switches::kDomAutomationController); 1133 command_line.AppendSwitch(switches::kDomAutomationController);
1135 1134
1136 if (include_testing_id_) { 1135 if (include_testing_id_) {
1137 command_line.AppendSwitchWithValue(switches::kTestingChannelID, 1136 command_line.AppendSwitchWithValue(switches::kTestingChannelID,
1138 ASCIIToWide(server_->channel_id())); 1137 ASCIIToWide(server_->channel_id()));
(...skipping 16 matching lines...) Expand all
1155 if (silent_dump_on_dcheck_) 1154 if (silent_dump_on_dcheck_)
1156 command_line.AppendSwitch(switches::kSilentDumpOnDCHECK); 1155 command_line.AppendSwitch(switches::kSilentDumpOnDCHECK);
1157 if (disable_breakpad_) 1156 if (disable_breakpad_)
1158 command_line.AppendSwitch(switches::kDisableBreakpad); 1157 command_line.AppendSwitch(switches::kDisableBreakpad);
1159 if (!homepage_.empty()) 1158 if (!homepage_.empty())
1160 command_line.AppendSwitchWithValue(switches::kHomePage, 1159 command_line.AppendSwitchWithValue(switches::kHomePage,
1161 homepage_); 1160 homepage_);
1162 // Don't try to fetch web resources during UI testing. 1161 // Don't try to fetch web resources during UI testing.
1163 command_line.AppendSwitch(switches::kDisableWebResources); 1162 command_line.AppendSwitch(switches::kDisableWebResources);
1164 1163
1165 if (!user_data_dir_.empty())
1166 command_line.AppendSwitchWithValue(switches::kUserDataDir,
1167 user_data_dir_.ToWStringHack());
1168 if (!js_flags_.empty()) 1164 if (!js_flags_.empty())
1169 command_line.AppendSwitchWithValue(switches::kJavaScriptFlags, 1165 command_line.AppendSwitchWithValue(switches::kJavaScriptFlags,
1170 js_flags_); 1166 js_flags_);
1171 if (!log_level_.empty()) 1167 if (!log_level_.empty())
1172 command_line.AppendSwitchWithValue(switches::kLoggingLevel, log_level_); 1168 command_line.AppendSwitchWithValue(switches::kLoggingLevel, log_level_);
1173 1169
1174 command_line.AppendSwitch(switches::kMetricsRecordingOnly); 1170 command_line.AppendSwitch(switches::kMetricsRecordingOnly);
1175 1171
1176 if (!CommandLine::ForCurrentProcess()->HasSwitch(kEnableErrorDialogs)) 1172 if (!CommandLine::ForCurrentProcess()->HasSwitch(kEnableErrorDialogs))
1177 command_line.AppendSwitch(switches::kEnableLogging); 1173 command_line.AppendSwitch(switches::kEnableLogging);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 #endif 1220 #endif
1225 1221
1226 return started; 1222 return started;
1227 } 1223 }
1228 1224
1229 void UITestBase::UpdateHistoryDates() { 1225 void UITestBase::UpdateHistoryDates() {
1230 // Migrate the times in the segment_usage table to yesterday so we get 1226 // Migrate the times in the segment_usage table to yesterday so we get
1231 // actual thumbnails on the NTP. 1227 // actual thumbnails on the NTP.
1232 sql::Connection db; 1228 sql::Connection db;
1233 FilePath history = 1229 FilePath history =
1234 user_data_dir_.AppendASCII("Default").AppendASCII("History"); 1230 user_data_dir().AppendASCII("Default").AppendASCII("History");
1235 // Not all test profiles have a history file. 1231 // Not all test profiles have a history file.
1236 if (!file_util::PathExists(history)) 1232 if (!file_util::PathExists(history))
1237 return; 1233 return;
1238 1234
1239 ASSERT_TRUE(db.Open(history)); 1235 ASSERT_TRUE(db.Open(history));
1240 Time yesterday = Time::Now() - TimeDelta::FromDays(1); 1236 Time yesterday = Time::Now() - TimeDelta::FromDays(1);
1241 std::string yesterday_str = Int64ToString(yesterday.ToInternalValue()); 1237 std::string yesterday_str = Int64ToString(yesterday.ToInternalValue());
1242 std::string query = StringPrintf( 1238 std::string query = StringPrintf(
1243 "UPDATE segment_usage " 1239 "UPDATE segment_usage "
1244 "SET time_slot = %s " 1240 "SET time_slot = %s "
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 set_ui_test_name(ASCIIToWide(test_name)); 1522 set_ui_test_name(ASCIIToWide(test_name));
1527 } 1523 }
1528 UITestBase::SetUp(); 1524 UITestBase::SetUp();
1529 PlatformTest::SetUp(); 1525 PlatformTest::SetUp();
1530 } 1526 }
1531 1527
1532 void UITest::TearDown() { 1528 void UITest::TearDown() {
1533 UITestBase::TearDown(); 1529 UITestBase::TearDown();
1534 PlatformTest::TearDown(); 1530 PlatformTest::TearDown();
1535 } 1531 }
OLDNEW
« no previous file with comments | « chrome/test/ui/ui_test.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698