OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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 <fstream> | 5 #include <fstream> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 const wchar_t* const kReproRepeatSwitch = L"num-reproductions"; | 34 const wchar_t* const kReproRepeatSwitch = L"num-reproductions"; |
35 | 35 |
36 const wchar_t* const kInputFilePathSwitch = L"input"; | 36 const wchar_t* const kInputFilePathSwitch = L"input"; |
37 | 37 |
38 const wchar_t* const kOutputFilePathSwitch = L"output"; | 38 const wchar_t* const kOutputFilePathSwitch = L"output"; |
39 | 39 |
40 const wchar_t* const kDebugModeSwitch = L"debug"; | 40 const wchar_t* const kDebugModeSwitch = L"debug"; |
41 | 41 |
42 const wchar_t* const kWaitSwitch = L"wait-after-action"; | 42 const wchar_t* const kWaitSwitch = L"wait-after-action"; |
43 | 43 |
44 const wchar_t* const kDefaultInputFilePath = L"C:\\automated_ui_tests.txt"; | 44 const FilePath::CharType* const kDefaultInputFilePath = |
| 45 #if defined(OS_WIN) |
| 46 L"C:\\automated_ui_tests.txt"; |
| 47 #else |
| 48 "/tmp/automated_ui_tests.txt"; |
| 49 #endif |
45 | 50 |
46 const wchar_t* const kDefaultOutputFilePath | 51 const FilePath::CharType* const kDefaultOutputFilePath = |
47 = L"C:\\automated_ui_tests_error_report.txt"; | 52 #if defined(OS_WIN) |
| 53 L"C:\\automated_ui_tests_error_report.txt"; |
| 54 #else |
| 55 "/tmp/automated_ui_tests_error_report.txt"; |
| 56 #endif |
48 | 57 |
49 const int kDebuggingTimeoutMsec = 5000; | 58 const int kDebuggingTimeoutMsec = 5000; |
50 | 59 |
51 // How many commands to run when testing a dialog box. | 60 // How many commands to run when testing a dialog box. |
52 const int kTestDialogActionsToRun = 7; | 61 const int kTestDialogActionsToRun = 7; |
53 | 62 |
54 void SilentRuntimeReportHandler(const std::string& str) { | 63 void SilentRuntimeReportHandler(const std::string& str) { |
55 } | 64 } |
56 | 65 |
| 66 FilePath GetInputFilePath() { |
| 67 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
| 68 if (parsed_command_line.HasSwitch(kInputFilePathSwitch)) { |
| 69 return FilePath::FromWStringHack( |
| 70 parsed_command_line.GetSwitchValue(kInputFilePathSwitch)); |
| 71 } else { |
| 72 return FilePath(kDefaultInputFilePath); |
| 73 } |
| 74 } |
| 75 |
| 76 FilePath GetOutputFilePath() { |
| 77 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
| 78 if (parsed_command_line.HasSwitch(kOutputFilePathSwitch)) { |
| 79 return FilePath::FromWStringHack( |
| 80 parsed_command_line.GetSwitchValue(kOutputFilePathSwitch)); |
| 81 } else { |
| 82 return FilePath(kDefaultOutputFilePath); |
| 83 } |
| 84 } |
| 85 |
57 } // namespace | 86 } // namespace |
58 | 87 |
59 // This subset of commands is used to test dialog boxes, which aren't likely | 88 // This subset of commands is used to test dialog boxes, which aren't likely |
60 // to respond to most other commands. | 89 // to respond to most other commands. |
61 const std::string kTestDialogPossibleActions[] = { | 90 const std::string kTestDialogPossibleActions[] = { |
62 // See FuzzyTestDialog for details on why Enter and SpaceBar must appear first | 91 // See FuzzyTestDialog for details on why Enter and SpaceBar must appear first |
63 // in this list. | 92 // in this list. |
64 "PressEnterKey", | 93 "PressEnterKey", |
65 "PressSpaceBar", | 94 "PressSpaceBar", |
66 "PressTabKey", | 95 "PressTabKey", |
(...skipping 19 matching lines...) Expand all Loading... |
86 post_action_delay_(0) { | 115 post_action_delay_(0) { |
87 show_window_ = true; | 116 show_window_ = true; |
88 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 117 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
89 if (parsed_command_line.HasSwitch(kDebugModeSwitch)) | 118 if (parsed_command_line.HasSwitch(kDebugModeSwitch)) |
90 debug_logging_enabled_ = true; | 119 debug_logging_enabled_ = true; |
91 if (parsed_command_line.HasSwitch(kWaitSwitch)) { | 120 if (parsed_command_line.HasSwitch(kWaitSwitch)) { |
92 std::wstring str = parsed_command_line.GetSwitchValue(kWaitSwitch); | 121 std::wstring str = parsed_command_line.GetSwitchValue(kWaitSwitch); |
93 if (str.empty()) { | 122 if (str.empty()) { |
94 post_action_delay_ = 1; | 123 post_action_delay_ = 1; |
95 } else { | 124 } else { |
96 post_action_delay_ = static_cast<int>(StringToInt64(str)); | 125 post_action_delay_ = static_cast<int>(StringToInt64(WideToUTF16(str))); |
97 } | 126 } |
98 } | 127 } |
99 if (base::SysInfo::HasEnvVar(env_vars::kHeadless)) | 128 if (base::SysInfo::HasEnvVar(env_vars::kHeadless)) |
100 logging::SetLogReportHandler(SilentRuntimeReportHandler); | 129 logging::SetLogReportHandler(SilentRuntimeReportHandler); |
101 } | 130 } |
102 | 131 |
103 AutomatedUITest::~AutomatedUITest() {} | 132 AutomatedUITest::~AutomatedUITest() {} |
104 | 133 |
105 void AutomatedUITest::RunReproduction() { | 134 void AutomatedUITest::RunReproduction() { |
106 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 135 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
107 xml_writer_.StartWriting(); | 136 xml_writer_.StartWriting(); |
108 xml_writer_.StartElement("Report"); | 137 xml_writer_.StartElement("Report"); |
109 std::string action_string = | 138 std::string action_string = |
110 WideToASCII(parsed_command_line.GetSwitchValue(kReproSwitch)); | 139 WideToASCII(parsed_command_line.GetSwitchValue(kReproSwitch)); |
111 | 140 |
112 int64 num_reproductions = 1; | 141 int64 num_reproductions = 1; |
113 if (parsed_command_line.HasSwitch(kReproRepeatSwitch)) { | 142 if (parsed_command_line.HasSwitch(kReproRepeatSwitch)) { |
114 std::wstring num_reproductions_string = | 143 std::wstring num_reproductions_string = |
115 parsed_command_line.GetSwitchValue(kReproRepeatSwitch); | 144 parsed_command_line.GetSwitchValue(kReproRepeatSwitch); |
116 std::string test = WideToASCII(num_reproductions_string); | 145 std::string test = WideToASCII(num_reproductions_string); |
117 num_reproductions = StringToInt64(num_reproductions_string); | 146 num_reproductions = StringToInt64(test); |
118 } | 147 } |
119 std::vector<std::string> actions; | 148 std::vector<std::string> actions; |
120 SplitString(action_string, L',', &actions); | 149 SplitString(action_string, L',', &actions); |
121 bool did_crash = false; | 150 bool did_crash = false; |
122 bool command_complete = false; | 151 bool command_complete = false; |
123 | 152 |
124 for (int64 i = 0; i < num_reproductions && !did_crash; ++i) { | 153 for (int64 i = 0; i < num_reproductions && !did_crash; ++i) { |
125 bool did_teardown = false; | 154 bool did_teardown = false; |
126 xml_writer_.StartElement("Executed"); | 155 xml_writer_.StartElement("Executed"); |
127 for (size_t j = 0; j < actions.size(); ++j) { | 156 for (size_t j = 0; j < actions.size(); ++j) { |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 } else if (LowerCaseEqualsASCII(action, "clearbrowsingdata")) { | 304 } else if (LowerCaseEqualsASCII(action, "clearbrowsingdata")) { |
276 did_complete_action = OpenClearBrowsingDataDialog(); | 305 did_complete_action = OpenClearBrowsingDataDialog(); |
277 } else if (LowerCaseEqualsASCII(action, "crash")) { | 306 } else if (LowerCaseEqualsASCII(action, "crash")) { |
278 did_complete_action = ForceCrash(); | 307 did_complete_action = ForceCrash(); |
279 } else if (LowerCaseEqualsASCII(action, "dialog")) { | 308 } else if (LowerCaseEqualsASCII(action, "dialog")) { |
280 did_complete_action = ExerciseDialog(); | 309 did_complete_action = ExerciseDialog(); |
281 } else if (LowerCaseEqualsASCII(action, "downarrow")) { | 310 } else if (LowerCaseEqualsASCII(action, "downarrow")) { |
282 did_complete_action = PressDownArrow(); | 311 did_complete_action = PressDownArrow(); |
283 } else if (LowerCaseEqualsASCII(action, "downloads")) { | 312 } else if (LowerCaseEqualsASCII(action, "downloads")) { |
284 did_complete_action = ShowDownloads(); | 313 did_complete_action = ShowDownloads(); |
| 314 // TODO(estade): port. |
| 315 #if defined(OS_WIN) |
285 } else if (LowerCaseEqualsASCII(action, "dragtableft")) { | 316 } else if (LowerCaseEqualsASCII(action, "dragtableft")) { |
286 did_complete_action = DragActiveTab(false); | 317 did_complete_action = DragActiveTab(false); |
287 } else if (LowerCaseEqualsASCII(action, "dragtabout")) { | 318 } else if (LowerCaseEqualsASCII(action, "dragtabout")) { |
288 did_complete_action = DragTabOut(); | 319 did_complete_action = DragTabOut(); |
289 } else if (LowerCaseEqualsASCII(action, "dragtabright")) { | 320 } else if (LowerCaseEqualsASCII(action, "dragtabright")) { |
290 did_complete_action = DragActiveTab(true); | 321 did_complete_action = DragActiveTab(true); |
| 322 #endif // defined(OS_WIN) |
291 } else if (LowerCaseEqualsASCII(action, "duplicatetab")) { | 323 } else if (LowerCaseEqualsASCII(action, "duplicatetab")) { |
292 did_complete_action = DuplicateTab(); | 324 did_complete_action = DuplicateTab(); |
293 } else if (LowerCaseEqualsASCII(action, "editsearchengines")) { | 325 } else if (LowerCaseEqualsASCII(action, "editsearchengines")) { |
294 did_complete_action = OpenEditSearchEnginesDialog(); | 326 did_complete_action = OpenEditSearchEnginesDialog(); |
295 } else if (LowerCaseEqualsASCII(action, "findinpage")) { | 327 } else if (LowerCaseEqualsASCII(action, "findinpage")) { |
296 did_complete_action = FindInPage(); | 328 did_complete_action = FindInPage(); |
297 } else if (LowerCaseEqualsASCII(action, "forward")) { | 329 } else if (LowerCaseEqualsASCII(action, "forward")) { |
298 did_complete_action = ForwardButton(); | 330 did_complete_action = ForwardButton(); |
299 } else if (LowerCaseEqualsASCII(action, "goofftherecord")) { | 331 } else if (LowerCaseEqualsASCII(action, "goofftherecord")) { |
300 did_complete_action = GoOffTheRecord(); | 332 did_complete_action = GoOffTheRecord(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 } else { | 415 } else { |
384 NOTREACHED() << "Unknown command passed into DoAction: " | 416 NOTREACHED() << "Unknown command passed into DoAction: " |
385 << action.c_str(); | 417 << action.c_str(); |
386 } | 418 } |
387 | 419 |
388 if (!did_complete_action) | 420 if (!did_complete_action) |
389 xml_writer_.AddAttribute("failed_to_complete", "yes"); | 421 xml_writer_.AddAttribute("failed_to_complete", "yes"); |
390 xml_writer_.EndElement(); | 422 xml_writer_.EndElement(); |
391 | 423 |
392 if (post_action_delay_) | 424 if (post_action_delay_) |
393 ::Sleep(1000 * post_action_delay_); | 425 PlatformThread::Sleep(1000 * post_action_delay_); |
394 | 426 |
395 return did_complete_action; | 427 return did_complete_action; |
396 } | 428 } |
397 | 429 |
398 bool AutomatedUITest::ChangeEncoding() { | 430 bool AutomatedUITest::ChangeEncoding() { |
399 // Get the encoding list that is used to populate the UI (encoding menu) | 431 // Get the encoding list that is used to populate the UI (encoding menu) |
400 std::string cur_locale = g_browser_process->GetApplicationLocale(); | 432 std::string cur_locale = g_browser_process->GetApplicationLocale(); |
401 const std::vector<CharacterEncoding::EncodingInfo>* encodings = | 433 const std::vector<CharacterEncoding::EncodingInfo>* encodings = |
402 CharacterEncoding::GetCurrentDisplayEncodings( | 434 CharacterEncoding::GetCurrentDisplayEncodings( |
403 cur_locale, L"ISO-8859-1,windows-1252", L""); | 435 cur_locale, L"ISO-8859-1,windows-1252", L""); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 return false; | 634 return false; |
603 } | 635 } |
604 if (!window->SimulateOSKeyPress(key, flags)) { | 636 if (!window->SimulateOSKeyPress(key, flags)) { |
605 AddWarningAttribute("failure_simulating_key_press"); | 637 AddWarningAttribute("failure_simulating_key_press"); |
606 return false; | 638 return false; |
607 } | 639 } |
608 return true; | 640 return true; |
609 } | 641 } |
610 | 642 |
611 bool AutomatedUITest::InitXMLReader() { | 643 bool AutomatedUITest::InitXMLReader() { |
612 std::wstring input_path; | 644 FilePath input_path = GetInputFilePath(); |
613 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | |
614 if (parsed_command_line.HasSwitch(kInputFilePathSwitch)) | |
615 input_path = parsed_command_line.GetSwitchValue(kInputFilePathSwitch); | |
616 else | |
617 input_path = kDefaultInputFilePath; | |
618 | 645 |
619 if (!file_util::ReadFileToString(input_path, &xml_init_file_)) | 646 if (!file_util::ReadFileToString(input_path, &xml_init_file_)) |
620 return false; | 647 return false; |
621 return init_reader_.Load(xml_init_file_); | 648 return init_reader_.Load(xml_init_file_); |
622 } | 649 } |
623 | 650 |
624 bool AutomatedUITest::WriteReportToFile() { | 651 bool AutomatedUITest::WriteReportToFile() { |
| 652 FilePath path = GetOutputFilePath(); |
625 std::ofstream error_file; | 653 std::ofstream error_file; |
626 std::wstring path; | |
627 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | |
628 if (parsed_command_line.HasSwitch(kOutputFilePathSwitch)) | |
629 path = parsed_command_line.GetSwitchValue(kOutputFilePathSwitch); | |
630 else | |
631 path = kDefaultOutputFilePath; | |
632 | |
633 if (!path.empty()) | 654 if (!path.empty()) |
634 error_file.open(path.c_str(), std::ios::out); | 655 error_file.open(path.value().c_str(), std::ios::out); |
635 | 656 |
636 // Closes all open elements and free the writer. This is required | 657 // Closes all open elements and free the writer. This is required |
637 // in order to retrieve the contents of the buffer. | 658 // in order to retrieve the contents of the buffer. |
638 xml_writer_.StopWriting(); | 659 xml_writer_.StopWriting(); |
639 error_file << xml_writer_.GetWrittenString(); | 660 error_file << xml_writer_.GetWrittenString(); |
640 error_file.close(); | 661 error_file.close(); |
641 return true; | 662 return true; |
642 } | 663 } |
643 | 664 |
644 void AutomatedUITest::AppendToOutputFile(const std::string &append_string) { | 665 void AutomatedUITest::AppendToOutputFile(const std::string &append_string) { |
| 666 FilePath path = GetOutputFilePath(); |
645 std::ofstream error_file; | 667 std::ofstream error_file; |
646 std::wstring path; | |
647 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | |
648 if (parsed_command_line.HasSwitch(kOutputFilePathSwitch)) | |
649 path = parsed_command_line.GetSwitchValue(kOutputFilePathSwitch); | |
650 else | |
651 path = kDefaultOutputFilePath; | |
652 | |
653 if (!path.empty()) | 668 if (!path.empty()) |
654 error_file.open(path.c_str(), std::ios::out | std::ios_base::app); | 669 error_file.open(path.value().c_str(), std::ios::out | std::ios_base::app); |
655 | 670 |
656 error_file << append_string << " "; | 671 error_file << append_string << " "; |
657 error_file.close(); | 672 error_file.close(); |
658 } | 673 } |
659 | 674 |
660 void AutomatedUITest::LogCrashResult(const std::string &crash_dump, | 675 void AutomatedUITest::LogCrashResult(const std::string &crash_dump, |
661 bool command_completed) { | 676 bool command_completed) { |
662 xml_writer_.StartElement("result"); | 677 xml_writer_.StartElement("result"); |
663 xml_writer_.StartElement("crash"); | 678 xml_writer_.StartElement("crash"); |
664 xml_writer_.AddAttribute("crash_dump", crash_dump); | 679 xml_writer_.AddAttribute("crash_dump", crash_dump); |
(...skipping 30 matching lines...) Expand all Loading... |
695 | 710 |
696 void AutomatedUITest::LogWarningMessage(const std::string &warning) { | 711 void AutomatedUITest::LogWarningMessage(const std::string &warning) { |
697 AddWarningAttribute(warning); | 712 AddWarningAttribute(warning); |
698 } | 713 } |
699 | 714 |
700 void AutomatedUITest::LogInfoMessage(const std::string &info) { | 715 void AutomatedUITest::LogInfoMessage(const std::string &info) { |
701 AddWarningAttribute(info); | 716 AddWarningAttribute(info); |
702 } | 717 } |
703 | 718 |
704 std::wstring AutomatedUITest::GetMostRecentCrashDump() { | 719 std::wstring AutomatedUITest::GetMostRecentCrashDump() { |
| 720 // TODO(estade): port. |
| 721 #if defined(OS_WIN) |
705 std::wstring crash_dump_path; | 722 std::wstring crash_dump_path; |
706 int file_count = 0; | 723 int file_count = 0; |
707 FILETIME most_recent_file_time; | 724 FILETIME most_recent_file_time; |
708 std::wstring most_recent_file_name; | 725 std::wstring most_recent_file_name; |
709 WIN32_FIND_DATA find_file_data; | 726 WIN32_FIND_DATA find_file_data; |
710 | 727 |
711 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); | 728 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); |
712 // All files in the given directory. | 729 // All files in the given directory. |
713 std::wstring filename_spec = crash_dump_path + L"\\*"; | 730 std::wstring filename_spec = crash_dump_path + L"\\*"; |
714 HANDLE find_handle = FindFirstFile(filename_spec.c_str(), &find_file_data); | 731 HANDLE find_handle = FindFirstFile(filename_spec.c_str(), &find_file_data); |
(...skipping 17 matching lines...) Expand all Loading... |
732 } while (FindNextFile(find_handle, &find_file_data)); | 749 } while (FindNextFile(find_handle, &find_file_data)); |
733 FindClose(find_handle); | 750 FindClose(find_handle); |
734 } | 751 } |
735 | 752 |
736 if (most_recent_file_name.empty()) { | 753 if (most_recent_file_name.empty()) { |
737 return L""; | 754 return L""; |
738 } else { | 755 } else { |
739 file_util::AppendToPath(&crash_dump_path, most_recent_file_name); | 756 file_util::AppendToPath(&crash_dump_path, most_recent_file_name); |
740 return crash_dump_path; | 757 return crash_dump_path; |
741 } | 758 } |
| 759 #else |
| 760 NOTIMPLEMENTED(); |
| 761 return std::wstring(); |
| 762 #endif |
742 } | 763 } |
743 | 764 |
744 bool AutomatedUITest::DidCrash(bool update_total_crashes) { | 765 bool AutomatedUITest::DidCrash(bool update_total_crashes) { |
745 FilePath crash_dump_path; | 766 FilePath crash_dump_path; |
746 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); | 767 PathService::Get(chrome::DIR_CRASH_DUMPS, &crash_dump_path); |
747 // Each crash creates two dump files, so we divide by two here. | 768 // Each crash creates two dump files, so we divide by two here. |
748 int actual_crashes = file_util::CountFilesCreatedAfter( | 769 int actual_crashes = file_util::CountFilesCreatedAfter( |
749 crash_dump_path, test_start_time_) / 2; | 770 crash_dump_path, test_start_time_) / 2; |
750 | 771 |
751 // If there are more crash dumps than the total dumps which we have recorded | 772 // If there are more crash dumps than the total dumps which we have recorded |
752 // then this is a new crash. | 773 // then this is a new crash. |
753 if (actual_crashes > total_crashes_) { | 774 if (actual_crashes > total_crashes_) { |
754 if (update_total_crashes) | 775 if (update_total_crashes) |
755 total_crashes_ = actual_crashes; | 776 total_crashes_ = actual_crashes; |
756 return true; | 777 return true; |
757 } else { | 778 } else { |
758 return false; | 779 return false; |
759 } | 780 } |
760 } | 781 } |
761 | 782 |
762 TEST_F(AutomatedUITest, TheOneAndOnlyTest) { | 783 TEST_F(AutomatedUITest, TheOneAndOnlyTest) { |
763 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 784 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
764 if (parsed_command_line.HasSwitch(kReproSwitch)) | 785 if (parsed_command_line.HasSwitch(kReproSwitch)) |
765 RunReproduction(); | 786 RunReproduction(); |
766 else | 787 else |
767 RunAutomatedUITest(); | 788 RunAutomatedUITest(); |
768 } | 789 } |
OLD | NEW |