| Index: chrome/test/reliability/automated_ui_tests.cc
|
| diff --git a/chrome/test/reliability/automated_ui_tests.cc b/chrome/test/reliability/automated_ui_tests.cc
|
| deleted file mode 100644
|
| index 5348e608a3a1ce7c802ac96e0f35801362ab30c6..0000000000000000000000000000000000000000
|
| --- a/chrome/test/reliability/automated_ui_tests.cc
|
| +++ /dev/null
|
| @@ -1,765 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <fstream>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/environment.h"
|
| -#include "base/file_util.h"
|
| -#include "base/file_version_info.h"
|
| -#include "base/files/file_enumerator.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/i18n/time_formatting.h"
|
| -#include "base/logging.h"
|
| -#include "base/path_service.h"
|
| -#include "base/rand_util.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "base/time/time.h"
|
| -#include "chrome/app/chrome_command_ids.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/character_encoding.h"
|
| -#include "chrome/browser/ui/view_ids.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_version_info.h"
|
| -#include "chrome/common/env_vars.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "chrome/test/automation/automation_proxy.h"
|
| -#include "chrome/test/automation/browser_proxy.h"
|
| -#include "chrome/test/automation/tab_proxy.h"
|
| -#include "chrome/test/automation/window_proxy.h"
|
| -#include "chrome/test/reliability/automated_ui_tests.h"
|
| -#include "chrome/test/ui/ui_test.h"
|
| -#include "ui/events/keycodes/keyboard_codes.h"
|
| -#include "url/gurl.h"
|
| -
|
| -#if defined(TOOLKIT_VIEWS)
|
| -#include "ui/views/view.h"
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -const char kReproSwitch[] = "key";
|
| -
|
| -const char kReproRepeatSwitch[] = "num-reproductions";
|
| -
|
| -const char kInputFilePathSwitch[] = "input";
|
| -
|
| -const char kOutputFilePathSwitch[] = "output";
|
| -
|
| -const char kDebugModeSwitch[] = "debug";
|
| -
|
| -const char kWaitSwitch[] = "wait-after-action";
|
| -
|
| -const char kTestLogFilePathSwitch[] = "testlog";
|
| -
|
| -const base::FilePath::CharType* const kDefaultInputFilePath =
|
| -FILE_PATH_LITERAL("automated_ui_tests.txt");
|
| -
|
| -const base::FilePath::CharType* const kDefaultOutputFilePath =
|
| -FILE_PATH_LITERAL("automated_ui_tests_error_report.txt");
|
| -
|
| -const base::FilePath::CharType* const kDefaultTestLogFilePath =
|
| -FILE_PATH_LITERAL("automated_ui_tests_log.txt");
|
| -
|
| -const int kDebuggingTimeoutMsec = 5000;
|
| -
|
| -// How many commands to run when testing a dialog box.
|
| -const int kTestDialogActionsToRun = 7;
|
| -
|
| -// String name of local chrome dll for looking up file information.
|
| -const wchar_t kChromeDll[] = L"chrome.dll";
|
| -
|
| -void SilentRuntimeReportHandler(const std::string& str) {
|
| -}
|
| -
|
| -base::FilePath GetInputFilePath() {
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| - if (parsed_command_line.HasSwitch(kInputFilePathSwitch)) {
|
| - return parsed_command_line.GetSwitchValuePath(kInputFilePathSwitch);
|
| - } else {
|
| - return base::FilePath(kDefaultInputFilePath);
|
| - }
|
| -}
|
| -
|
| -base::FilePath GetOutputFilePath() {
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| - if (parsed_command_line.HasSwitch(kOutputFilePathSwitch)) {
|
| - return parsed_command_line.GetSwitchValuePath(kOutputFilePathSwitch);
|
| - } else {
|
| - return base::FilePath(kDefaultOutputFilePath);
|
| - }
|
| -}
|
| -
|
| -base::FilePath GetTestLogFilePath() {
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| - if (parsed_command_line.HasSwitch(kTestLogFilePathSwitch)) {
|
| - return parsed_command_line.GetSwitchValuePath(kTestLogFilePathSwitch);
|
| - } else {
|
| - return base::FilePath(kDefaultTestLogFilePath);
|
| - }
|
| -}
|
| -
|
| -std::string GetChromeRevision() {
|
| - // Get Chrome version
|
| - std::string last_change;
|
| -#if defined(OS_WIN)
|
| - // Check file version info for chrome dll.
|
| - scoped_ptr<FileVersionInfo> file_info;
|
| - file_info.reset(
|
| - FileVersionInfo::CreateFileVersionInfo(base::FilePath(kChromeDll)));
|
| - last_change = WideToASCII(file_info->last_change());
|
| -#elif defined(OS_POSIX)
|
| - chrome::VersionInfo version_info;
|
| - last_change = version_info.LastChange();
|
| -#endif // !defined(OS_WIN)
|
| - return last_change;
|
| -}
|
| -
|
| -void InitTestLog(base::Time start_time) {
|
| - base::FilePath path = GetTestLogFilePath();
|
| - std::ofstream test_log_file;
|
| - if (!path.empty())
|
| - test_log_file.open(path.value().c_str(), std::ios::out);
|
| -
|
| - const std::string time =
|
| - UTF16ToASCII(base::TimeFormatFriendlyDateAndTime(start_time));
|
| -
|
| - test_log_file << "Last Change: " << GetChromeRevision() << std::endl;
|
| - test_log_file << "Test Start: " << time << std::endl;
|
| - test_log_file.close();
|
| -}
|
| -
|
| -void AppendToTestLog(const std::string& append_string) {
|
| - base::FilePath path = GetTestLogFilePath();
|
| - std::ofstream test_log_file;
|
| - if (!path.empty()) {
|
| - test_log_file.open(path.value().c_str(),
|
| - std::ios::out | std::ios_base::app);
|
| - }
|
| -
|
| - test_log_file << append_string << std::endl;
|
| - test_log_file.close();
|
| -}
|
| -
|
| -double CalculateTestDuration(base::Time start_time) {
|
| - base::Time time_now = base::Time::Now();
|
| - return time_now.ToDoubleT() - start_time.ToDoubleT();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// This subset of commands is used to test dialog boxes, which aren't likely
|
| -// to respond to most other commands.
|
| -const std::string kTestDialogPossibleActions[] = {
|
| - // See FuzzyTestDialog for details on why Enter and SpaceBar must appear first
|
| - // in this list.
|
| - "PressEnterKey",
|
| - "PressSpaceBar",
|
| - "PressTabKey",
|
| - "DownArrow"
|
| -};
|
| -
|
| -// The list of dialogs that can be shown.
|
| -const std::string kDialogs[] = {
|
| - "About",
|
| - "Options",
|
| - "TaskManager",
|
| - "JavaScriptConsole",
|
| - "ClearBrowsingData",
|
| - "ImportSettings",
|
| - "EditSearchEngines",
|
| - "ViewPasswords"
|
| -};
|
| -
|
| -AutomatedUITest::AutomatedUITest()
|
| - : test_start_time_(base::Time::NowFromSystemTime()),
|
| - total_crashes_(0),
|
| - debug_logging_enabled_(false),
|
| - post_action_delay_(0) {
|
| - show_window_ = true;
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| - if (parsed_command_line.HasSwitch(kDebugModeSwitch))
|
| - debug_logging_enabled_ = true;
|
| - if (parsed_command_line.HasSwitch(kWaitSwitch)) {
|
| - std::string str = parsed_command_line.GetSwitchValueASCII(kWaitSwitch);
|
| - if (str.empty()) {
|
| - post_action_delay_ = 1;
|
| - } else {
|
| - base::StringToInt(str, &post_action_delay_);
|
| - }
|
| - }
|
| - scoped_ptr<base::Environment> env(base::Environment::Create());
|
| - if (env->HasVar(env_vars::kHeadless))
|
| - logging::SetLogReportHandler(SilentRuntimeReportHandler);
|
| -}
|
| -
|
| -AutomatedUITest::~AutomatedUITest() {}
|
| -
|
| -void AutomatedUITest::RunReproduction() {
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| -
|
| - InitTestLog(test_start_time_);
|
| - xml_writer_.StartWriting();
|
| - xml_writer_.StartElement("Report");
|
| - std::string action_string =
|
| - parsed_command_line.GetSwitchValueASCII(kReproSwitch);
|
| -
|
| - int64 num_reproductions = 1;
|
| - if (parsed_command_line.HasSwitch(kReproRepeatSwitch)) {
|
| - base::StringToInt64(
|
| - parsed_command_line.GetSwitchValueASCII(kReproRepeatSwitch),
|
| - &num_reproductions);
|
| - }
|
| - std::vector<std::string> actions;
|
| - base::SplitString(action_string, ',', &actions);
|
| - bool did_crash = false;
|
| - bool command_complete = false;
|
| -
|
| - for (int64 i = 0; i < num_reproductions && !did_crash; ++i) {
|
| - bool did_teardown = false;
|
| - xml_writer_.StartElement("Executed");
|
| - for (size_t j = 0; j < actions.size(); ++j) {
|
| - DoAction(actions[j]);
|
| - if (DidCrash(true)) {
|
| - did_crash = true;
|
| - if (j >= (actions.size() - 1))
|
| - command_complete = true;
|
| - break;
|
| - }
|
| - if (LowerCaseEqualsASCII(actions[j], "teardown"))
|
| - did_teardown = true;
|
| - }
|
| -
|
| - // Force proper teardown after each run, if it didn't already happen. But
|
| - // don't teardown after crashes.
|
| - if (!did_teardown && !did_crash)
|
| - DoAction("TearDown");
|
| -
|
| - xml_writer_.EndElement(); // End "Executed" element.
|
| - }
|
| -
|
| - if (did_crash) {
|
| - base::FilePath crash_dump = GetMostRecentCrashDump();
|
| - base::FilePath::StringType result =
|
| - FILE_PATH_LITERAL("*** Crash dump produced. ")
|
| - FILE_PATH_LITERAL("See result file for more details. Dump = ");
|
| - result.append(crash_dump.value());
|
| - result.append(FILE_PATH_LITERAL(" ***\n"));
|
| - printf("%s", result.c_str());
|
| - LogCrashResult(crash_dump, command_complete);
|
| - EXPECT_TRUE(false) << "Crash detected.";
|
| - } else {
|
| - printf("*** No crashes. See result file for more details. ***\n");
|
| - LogSuccessResult();
|
| - }
|
| -
|
| - AppendToTestLog(base::StringPrintf("total_duration_seconds=%f",
|
| - CalculateTestDuration(test_start_time_)));
|
| - WriteReportToFile();
|
| -}
|
| -
|
| -
|
| -void AutomatedUITest::RunAutomatedUITest() {
|
| - InitTestLog(test_start_time_);
|
| -
|
| - ASSERT_TRUE(InitXMLReader()) << "Error initializing XMLReader";
|
| - xml_writer_.StartWriting();
|
| - xml_writer_.StartElement("Report");
|
| -
|
| - while (init_reader_.Read()) {
|
| - init_reader_.SkipToElement();
|
| - std::string node_name = init_reader_.NodeName();
|
| - if (LowerCaseEqualsASCII(node_name, "command")) {
|
| - bool no_errors = true;
|
| - xml_writer_.StartElement("Executed");
|
| - std::string command_number;
|
| - if (init_reader_.NodeAttribute("number", &command_number)) {
|
| - xml_writer_.AddAttribute("command_number", command_number);
|
| - }
|
| - xml_writer_.StopIndenting();
|
| -
|
| - // Starts the browser, logging it as an action.
|
| - DoAction("SetUp");
|
| -
|
| - // Record the depth of the root of the command subtree, then advance to
|
| - // the first element in preparation for parsing.
|
| - int start_depth = init_reader_.Depth();
|
| - ASSERT_TRUE(init_reader_.Read()) << "Malformed XML file.";
|
| - init_reader_.SkipToElement();
|
| -
|
| - // Check for a crash right after startup.
|
| - if (DidCrash(true)) {
|
| - LogCrashResult(GetMostRecentCrashDump(), false);
|
| - // Try and start up again.
|
| - CloseBrowserAndServer();
|
| - LaunchBrowserAndServer();
|
| - set_active_browser(automation()->GetBrowserWindow(0).get());
|
| - if (DidCrash(true)) {
|
| - no_errors = false;
|
| - // We crashed again, so skip to the end of the this command.
|
| - while (init_reader_.Depth() != start_depth) {
|
| - ASSERT_TRUE(init_reader_.Read()) << "Malformed XML file.";
|
| - }
|
| - } else {
|
| - // We didn't crash, so end the old element, logging a crash for that.
|
| - // Then start a new element to log this command.
|
| - xml_writer_.StartIndenting();
|
| - xml_writer_.EndElement();
|
| - xml_writer_.StartElement("Executed");
|
| - xml_writer_.AddAttribute("command_number", command_number);
|
| - xml_writer_.StopIndenting();
|
| - xml_writer_.StartElement("SetUp");
|
| - xml_writer_.EndElement();
|
| - }
|
| - }
|
| - // Parse the command, performing the specified actions and checking
|
| - // for a crash after each one.
|
| - while (init_reader_.Depth() != start_depth) {
|
| - node_name = init_reader_.NodeName();
|
| -
|
| - DoAction(node_name);
|
| -
|
| - // Advance to the next element
|
| - ASSERT_TRUE(init_reader_.Read()) << "Malformed XML file.";
|
| - init_reader_.SkipToElement();
|
| - if (DidCrash(true)) {
|
| - no_errors = false;
|
| - // This was the last action if we've returned to the initial depth
|
| - // of the command subtree.
|
| - bool wasLastAction = init_reader_.Depth() == start_depth;
|
| - LogCrashResult(GetMostRecentCrashDump(), wasLastAction);
|
| - // Skip to the beginning of the next command.
|
| - while (init_reader_.Depth() != start_depth) {
|
| - ASSERT_TRUE(init_reader_.Read()) << "Malformed XML file.";
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (no_errors) {
|
| - // If there were no previous crashes, log our tear down and check for
|
| - // a crash, log success for the entire command if this doesn't crash.
|
| - DoAction("TearDown");
|
| - if (DidCrash(true))
|
| - LogCrashResult(GetMostRecentCrashDump(), true);
|
| - else
|
| - LogSuccessResult();
|
| - } else {
|
| - // If there was a previous crash, just tear down without logging, so
|
| - // that we know what the last command was before we crashed.
|
| - CloseBrowserAndServer();
|
| - }
|
| -
|
| - xml_writer_.StartIndenting();
|
| - xml_writer_.EndElement(); // End "Executed" element.
|
| - }
|
| - }
|
| -
|
| - AppendToTestLog(base::StringPrintf("total_duration_seconds=%f",
|
| - CalculateTestDuration(test_start_time_)));
|
| -
|
| - // The test is finished so write our report.
|
| - WriteReportToFile();
|
| -}
|
| -
|
| -bool AutomatedUITest::DoAction(const std::string& action) {
|
| - bool did_complete_action = false;
|
| - xml_writer_.StartElement(action);
|
| - if (debug_logging_enabled_)
|
| - AppendToOutputFile(action);
|
| -
|
| - if (LowerCaseEqualsASCII(action, "about")) {
|
| - did_complete_action = OpenAboutDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "back")) {
|
| - did_complete_action = BackButton();
|
| - } else if (LowerCaseEqualsASCII(action, "changeencoding")) {
|
| - did_complete_action = ChangeEncoding();
|
| - } else if (LowerCaseEqualsASCII(action, "closetab")) {
|
| - did_complete_action = CloseActiveTab();
|
| - } else if (LowerCaseEqualsASCII(action, "clearbrowsingdata")) {
|
| - did_complete_action = OpenClearBrowsingDataDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "crash")) {
|
| - did_complete_action = ForceCrash();
|
| - } else if (LowerCaseEqualsASCII(action, "dialog")) {
|
| - did_complete_action = ExerciseDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "downloads")) {
|
| - did_complete_action = ShowDownloads();
|
| - } else if (LowerCaseEqualsASCII(action, "duplicatetab")) {
|
| - did_complete_action = DuplicateTab();
|
| - } else if (LowerCaseEqualsASCII(action, "editsearchengines")) {
|
| - did_complete_action = OpenEditSearchEnginesDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "findinpage")) {
|
| - did_complete_action = FindInPage();
|
| - } else if (LowerCaseEqualsASCII(action, "forward")) {
|
| - did_complete_action = ForwardButton();
|
| - } else if (LowerCaseEqualsASCII(action, "goofftherecord")) {
|
| - did_complete_action = GoOffTheRecord();
|
| - } else if (LowerCaseEqualsASCII(action, "history")) {
|
| - did_complete_action = ShowHistory();
|
| - } else if (LowerCaseEqualsASCII(action, "home")) {
|
| - did_complete_action = Home();
|
| - } else if (LowerCaseEqualsASCII(action, "importsettings")) {
|
| - did_complete_action = OpenImportSettingsDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "javascriptconsole")) {
|
| - did_complete_action = JavaScriptConsole();
|
| - } else if (LowerCaseEqualsASCII(action, "navigate")) {
|
| - std::string url = content::kAboutBlankURL;
|
| - if (init_reader_.NodeAttribute("url", &url)) {
|
| - xml_writer_.AddAttribute("url", url);
|
| - }
|
| - GURL test_url(url);
|
| - did_complete_action = Navigate(test_url);
|
| - } else if (LowerCaseEqualsASCII(action, "newtab")) {
|
| - did_complete_action = NewTab();
|
| - } else if (LowerCaseEqualsASCII(action, "openwindow")) {
|
| - did_complete_action = OpenAndActivateNewBrowserWindow(NULL);
|
| - } else if (LowerCaseEqualsASCII(action, "options")) {
|
| - did_complete_action = Options();
|
| - } else if (LowerCaseEqualsASCII(action, "reload")) {
|
| - did_complete_action = ReloadPage();
|
| - } else if (LowerCaseEqualsASCII(action, "restoretab")) {
|
| - did_complete_action = RestoreTab();
|
| - } else if (LowerCaseEqualsASCII(action, "selectnexttab")) {
|
| - did_complete_action = SelectNextTab();
|
| - } else if (LowerCaseEqualsASCII(action, "selectprevtab")) {
|
| - did_complete_action = SelectPreviousTab();
|
| - } else if (LowerCaseEqualsASCII(action, "setup")) {
|
| - AutomatedUITestBase::SetUp();
|
| - did_complete_action = true;
|
| - } else if (LowerCaseEqualsASCII(action, "sleep")) {
|
| - // This is for debugging, it probably shouldn't be used real tests.
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMilliseconds(kDebuggingTimeoutMsec));
|
| - did_complete_action = true;
|
| - } else if (LowerCaseEqualsASCII(action, "star")) {
|
| - did_complete_action = StarPage();
|
| - } else if (LowerCaseEqualsASCII(action, "taskmanager")) {
|
| - did_complete_action = OpenTaskManagerDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "teardown")) {
|
| - CloseBrowserAndServer();
|
| - did_complete_action = true;
|
| - } else if (LowerCaseEqualsASCII(action, "testaboutchrome")) {
|
| - did_complete_action = TestAboutChrome();
|
| - } else if (LowerCaseEqualsASCII(action, "testclearbrowsingdata")) {
|
| - did_complete_action = TestClearBrowsingData();
|
| - } else if (LowerCaseEqualsASCII(action, "testeditsearchengines")) {
|
| - did_complete_action = TestEditSearchEngines();
|
| - } else if (LowerCaseEqualsASCII(action, "testimportsettings")) {
|
| - did_complete_action = TestImportSettings();
|
| - } else if (LowerCaseEqualsASCII(action, "testoptions")) {
|
| - did_complete_action = TestOptions();
|
| - } else if (LowerCaseEqualsASCII(action, "testtaskmanager")) {
|
| - did_complete_action = TestTaskManager();
|
| - } else if (LowerCaseEqualsASCII(action, "testviewpasswords")) {
|
| - did_complete_action = TestViewPasswords();
|
| - } else if (LowerCaseEqualsASCII(action, "viewpasswords")) {
|
| - did_complete_action = OpenViewPasswordsDialog();
|
| - } else if (LowerCaseEqualsASCII(action, "viewsource")) {
|
| - did_complete_action = ViewSource();
|
| - } else if (LowerCaseEqualsASCII(action, "zoomplus")) {
|
| - did_complete_action = ZoomPlus();
|
| - } else if (LowerCaseEqualsASCII(action, "zoomminus")) {
|
| - did_complete_action = ZoomMinus();
|
| - } else {
|
| - NOTREACHED() << "Unknown command passed into DoAction: "
|
| - << action.c_str();
|
| - }
|
| -
|
| - EXPECT_TRUE(did_complete_action) << action;
|
| -
|
| - if (!did_complete_action)
|
| - xml_writer_.AddAttribute("failed_to_complete", "yes");
|
| - xml_writer_.EndElement();
|
| -
|
| - if (post_action_delay_) {
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromSeconds(post_action_delay_));
|
| - }
|
| -
|
| - return did_complete_action;
|
| -}
|
| -
|
| -bool AutomatedUITest::ChangeEncoding() {
|
| - // Get the encoding list that is used to populate the UI (encoding menu)
|
| - std::string cur_locale = g_browser_process->GetApplicationLocale();
|
| - const std::vector<CharacterEncoding::EncodingInfo>* encodings =
|
| - CharacterEncoding::GetCurrentDisplayEncodings(
|
| - cur_locale, "ISO-8859-1,windows-1252", std::string());
|
| - DCHECK(encodings);
|
| - DCHECK(!encodings->empty());
|
| - unsigned len = static_cast<unsigned>(encodings->size());
|
| -
|
| - // The vector will contain mostly IDC values for encoding commands plus a few
|
| - // menu separators (0 values). If we hit a separator we just retry.
|
| - int index = base::RandInt(0, len);
|
| - while ((*encodings)[index].encoding_id == 0) {
|
| - index = base::RandInt(0, len);
|
| - }
|
| -
|
| - return RunCommandAsync((*encodings)[index].encoding_id);
|
| -}
|
| -
|
| -bool AutomatedUITest::JavaScriptConsole() {
|
| - return RunCommandAsync(IDC_DEV_TOOLS);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenAboutDialog() {
|
| - return RunCommandAsync(IDC_ABOUT);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenClearBrowsingDataDialog() {
|
| - return RunCommandAsync(IDC_CLEAR_BROWSING_DATA);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenEditSearchEnginesDialog() {
|
| - return RunCommandAsync(IDC_EDIT_SEARCH_ENGINES);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenImportSettingsDialog() {
|
| - return RunCommandAsync(IDC_IMPORT_SETTINGS);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenTaskManagerDialog() {
|
| - return RunCommandAsync(IDC_TASK_MANAGER);
|
| -}
|
| -
|
| -bool AutomatedUITest::OpenViewPasswordsDialog() {
|
| - return RunCommandAsync(IDC_VIEW_PASSWORDS);
|
| -}
|
| -
|
| -bool AutomatedUITest::Options() {
|
| - return RunCommandAsync(IDC_OPTIONS);
|
| -}
|
| -
|
| -bool AutomatedUITest::StarPage() {
|
| - return RunCommandAsync(IDC_BOOKMARK_PAGE);
|
| -}
|
| -
|
| -bool AutomatedUITest::ViewSource() {
|
| - return RunCommandAsync(IDC_VIEW_SOURCE);
|
| -}
|
| -
|
| -bool AutomatedUITest::ZoomMinus() {
|
| - return RunCommandAsync(IDC_ZOOM_MINUS);
|
| -}
|
| -
|
| -bool AutomatedUITest::ZoomPlus() {
|
| - return RunCommandAsync(IDC_ZOOM_PLUS);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestAboutChrome() {
|
| - DoAction("About");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestClearBrowsingData() {
|
| - DoAction("ClearBrowsingData");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestEditSearchEngines() {
|
| - DoAction("EditSearchEngines");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestImportSettings() {
|
| - DoAction("ImportSettings");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestTaskManager() {
|
| - DoAction("TaskManager");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestOptions() {
|
| - DoAction("Options");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::TestViewPasswords() {
|
| - DoAction("ViewPasswords");
|
| - return FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::ExerciseDialog() {
|
| - int index = base::RandInt(0, arraysize(kDialogs) - 1);
|
| - return DoAction(kDialogs[index]) && FuzzyTestDialog(kTestDialogActionsToRun);
|
| -}
|
| -
|
| -bool AutomatedUITest::FuzzyTestDialog(int num_actions) {
|
| - bool return_value = true;
|
| -
|
| - for (int i = 0; i < num_actions; i++) {
|
| - // We want to make sure the first action performed on the dialog is not
|
| - // Space or Enter because focus is likely on the Close button. Both Space
|
| - // and Enter would close the dialog without performing more actions. We
|
| - // rely on the fact that those two actions are first in the array and set
|
| - // the lower bound to 2 if i == 0 to skip those two actions.
|
| - int action_index = base::RandInt(i == 0 ? 2 : 0,
|
| - arraysize(kTestDialogPossibleActions)
|
| - - 1);
|
| - return_value = return_value &&
|
| - DoAction(kTestDialogPossibleActions[action_index]);
|
| - if (DidCrash(false))
|
| - break;
|
| - }
|
| - return DoAction("PressEscapeKey") && return_value;
|
| -}
|
| -
|
| -bool AutomatedUITest::ForceCrash() {
|
| - scoped_refptr<TabProxy> tab(GetActiveTab());
|
| - GURL test_url(content::kChromeUICrashURL);
|
| - AutomationMsg_NavigationResponseValues result = tab->NavigateToURL(test_url);
|
| - if (result != AUTOMATION_MSG_NAVIGATION_SUCCESS) {
|
| - AddErrorAttribute("navigation_failed");
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool AutomatedUITest::InitXMLReader() {
|
| - base::FilePath input_path = GetInputFilePath();
|
| -
|
| - if (!base::ReadFileToString(input_path, &xml_init_file_))
|
| - return false;
|
| - return init_reader_.Load(xml_init_file_);
|
| -}
|
| -
|
| -bool AutomatedUITest::WriteReportToFile() {
|
| - base::FilePath path = GetOutputFilePath();
|
| - std::ofstream error_file;
|
| - if (!path.empty())
|
| - error_file.open(path.value().c_str(), std::ios::out);
|
| -
|
| - // Closes all open elements and free the writer. This is required
|
| - // in order to retrieve the contents of the buffer.
|
| - xml_writer_.StopWriting();
|
| - error_file << xml_writer_.GetWrittenString();
|
| - error_file.close();
|
| - return true;
|
| -}
|
| -
|
| -void AutomatedUITest::AppendToOutputFile(const std::string& append_string) {
|
| - base::FilePath path = GetOutputFilePath();
|
| - std::ofstream error_file;
|
| - if (!path.empty())
|
| - error_file.open(path.value().c_str(), std::ios::out | std::ios_base::app);
|
| -
|
| - error_file << append_string << " ";
|
| - error_file.close();
|
| -}
|
| -
|
| -void AutomatedUITest::LogCrashResult(const base::FilePath& crash_dump,
|
| - bool command_completed) {
|
| - xml_writer_.StartElement("result");
|
| - xml_writer_.AddAttribute("test_log_path",
|
| - GetTestLogFilePath().MaybeAsASCII());
|
| - xml_writer_.AddAttribute("revision", GetChromeRevision());
|
| - xml_writer_.StartElement("crash");
|
| -#if defined(OS_WIN)
|
| - xml_writer_.AddAttribute("crash_dump", WideToASCII(crash_dump.value()));
|
| -#else
|
| - xml_writer_.AddAttribute("crash_dump", crash_dump.value());
|
| -#endif
|
| - if (command_completed)
|
| - xml_writer_.AddAttribute("command_completed", "yes");
|
| - else
|
| - xml_writer_.AddAttribute("command_completed", "no");
|
| - xml_writer_.EndElement();
|
| - xml_writer_.EndElement();
|
| -}
|
| -
|
| -void AutomatedUITest::LogSuccessResult() {
|
| - xml_writer_.StartElement("result");
|
| - xml_writer_.AddAttribute("test_log_path",
|
| - GetTestLogFilePath().MaybeAsASCII());
|
| - xml_writer_.AddAttribute("revision", GetChromeRevision());
|
| - xml_writer_.StartElement("success");
|
| - xml_writer_.EndElement();
|
| - xml_writer_.EndElement();
|
| -}
|
| -
|
| -void AutomatedUITest::AddInfoAttribute(const std::string& info) {
|
| - xml_writer_.AddAttribute("info", info);
|
| -}
|
| -
|
| -void AutomatedUITest::AddWarningAttribute(const std::string& warning) {
|
| - xml_writer_.AddAttribute("warning", warning);
|
| -}
|
| -
|
| -void AutomatedUITest::AddErrorAttribute(const std::string& error) {
|
| - xml_writer_.AddAttribute("error", error);
|
| -}
|
| -
|
| -void AutomatedUITest::LogErrorMessage(const std::string& error) {
|
| - AddErrorAttribute(error);
|
| -}
|
| -
|
| -void AutomatedUITest::LogWarningMessage(const std::string& warning) {
|
| - AddWarningAttribute(warning);
|
| -}
|
| -
|
| -void AutomatedUITest::LogInfoMessage(const std::string& info) {
|
| - AddWarningAttribute(info);
|
| -}
|
| -
|
| -base::FilePath AutomatedUITest::GetMostRecentCrashDump() {
|
| - base::FilePath crash_dump_path;
|
| - base::FilePath most_recent_file_name;
|
| - PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path);
|
| - base::Time most_recent_file_time;
|
| -
|
| - bool first_file = true;
|
| -
|
| - base::FileEnumerator enumerator(crash_dump_path,
|
| - false, // not recursive
|
| - base::FileEnumerator::FILES);
|
| - for (base::FilePath path = enumerator.Next(); !path.value().empty();
|
| - path = enumerator.Next()) {
|
| - base::PlatformFileInfo file_info;
|
| - file_util::GetFileInfo(path, &file_info);
|
| - if (first_file) {
|
| - most_recent_file_time = file_info.last_modified;
|
| - most_recent_file_name = path.BaseName();
|
| - first_file = false;
|
| - } else if (file_info.last_modified >= most_recent_file_time) {
|
| - most_recent_file_time = file_info.last_modified;
|
| - most_recent_file_name = path.BaseName();
|
| - }
|
| - }
|
| - if (most_recent_file_name.empty()) {
|
| - return base::FilePath();
|
| - } else {
|
| - crash_dump_path = crash_dump_path.Append(most_recent_file_name);
|
| - return crash_dump_path;
|
| - }
|
| -}
|
| -
|
| -bool AutomatedUITest::DidCrash(bool update_total_crashes) {
|
| - int actual_crashes = GetCrashCount();
|
| -
|
| - // If there are more crash dumps than the total dumps which we have recorded
|
| - // then this is a new crash.
|
| - if (actual_crashes > total_crashes_) {
|
| - if (update_total_crashes)
|
| - total_crashes_ = actual_crashes;
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -TEST_F(AutomatedUITest, TheOneAndOnlyTest) {
|
| - const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| - if (parsed_command_line.HasSwitch(kReproSwitch))
|
| - RunReproduction();
|
| - else
|
| - RunAutomatedUITest();
|
| -}
|
|
|