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

Side by Side Diff: chrome/browser/ui/webui/web_ui_browsertest.cc

Issue 7237030: Added options browser_tests using the generator and js handler framework. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix indent & commenting capitalization. Created 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/browser/ui/webui/web_ui_browsertest.h" 4 #include "chrome/browser/ui/webui/web_ui_browsertest.h"
5 5
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
11 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/webui/chrome_web_ui.h" 14 #include "chrome/browser/ui/webui/chrome_web_ui.h"
15 #include "chrome/browser/ui/webui/test_chrome_web_ui_factory.h" 15 #include "chrome/browser/ui/browser_navigator.h"
16 #include "chrome/common/chrome_paths.h" 16 #include "chrome/common/chrome_paths.h"
17 #include "chrome/common/url_constants.h" 17 #include "chrome/common/url_constants.h"
18 #include "chrome/test/test_tab_strip_model_observer.h"
18 #include "chrome/test/ui_test_utils.h" 19 #include "chrome/test/ui_test_utils.h"
19 #include "content/browser/tab_contents/tab_contents.h" 20 #include "content/browser/tab_contents/tab_contents.h"
20 #include "testing/gtest/include/gtest/gtest-spi.h" 21 #include "testing/gtest/include/gtest/gtest-spi.h"
21 #include "ui/base/resource/resource_bundle.h" 22 #include "ui/base/resource/resource_bundle.h"
22 23
23 namespace { 24 namespace {
24 25
26 const FilePath::CharType kMockJS[] = FILE_PATH_LITERAL("mock4js.js");
25 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js"); 27 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js");
26 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui"); 28 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui");
27 base::LazyInstance<std::vector<std::string> > error_messages_( 29 base::LazyInstance<std::vector<std::string> > error_messages_(
28 base::LINKER_INITIALIZED); 30 base::LINKER_INITIALIZED);
29 31
30 // Intercepts all log messages. 32 // Intercepts all log messages.
31 bool LogHandler(int severity, 33 bool LogHandler(int severity,
32 const char* file, 34 const char* file,
33 int line, 35 int line,
34 size_t message_start, 36 size_t message_start,
(...skipping 27 matching lines...) Expand all
62 args.push_back(&arg2); 64 args.push_back(&arg2);
63 return RunJavascriptFunction(function_name, args); 65 return RunJavascriptFunction(function_name, args);
64 } 66 }
65 67
66 bool WebUIBrowserTest::RunJavascriptFunction( 68 bool WebUIBrowserTest::RunJavascriptFunction(
67 const std::string& function_name, 69 const std::string& function_name,
68 const ConstValueVector& function_arguments) { 70 const ConstValueVector& function_arguments) {
69 return RunJavascriptUsingHandler(function_name, function_arguments, false); 71 return RunJavascriptUsingHandler(function_name, function_arguments, false);
70 } 72 }
71 73
74 bool WebUIBrowserTest::RunJavascriptTestF(const std::string& test_fixture,
75 const std::string& test_name) {
76 ConstValueVector args;
77 args.push_back(Value::CreateStringValue(test_fixture));
78 args.push_back(Value::CreateStringValue(test_name));
79 return RunJavascriptTest("RUN_TEST_F", args);
80 }
81
72 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name) { 82 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name) {
73 return RunJavascriptTest(test_name, ConstValueVector()); 83 return RunJavascriptTest(test_name, ConstValueVector());
74 } 84 }
75 85
76 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 86 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name,
77 const Value& arg) { 87 const Value& arg) {
78 ConstValueVector args; 88 ConstValueVector args;
79 args.push_back(&arg); 89 args.push_back(&arg);
80 return RunJavascriptTest(test_name, args); 90 return RunJavascriptTest(test_name, args);
81 } 91 }
82 92
83 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 93 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name,
84 const Value& arg1, 94 const Value& arg1,
85 const Value& arg2) { 95 const Value& arg2) {
86 ConstValueVector args; 96 ConstValueVector args;
87 args.push_back(&arg1); 97 args.push_back(&arg1);
88 args.push_back(&arg2); 98 args.push_back(&arg2);
89 return RunJavascriptTest(test_name, args); 99 return RunJavascriptTest(test_name, args);
90 } 100 }
91 101
92 bool WebUIBrowserTest::RunJavascriptTest( 102 bool WebUIBrowserTest::RunJavascriptTest(
93 const std::string& test_name, 103 const std::string& test_name,
94 const ConstValueVector& test_arguments) { 104 const ConstValueVector& test_arguments) {
95 return RunJavascriptUsingHandler(test_name, test_arguments, true); 105 return RunJavascriptUsingHandler(test_name, test_arguments, true);
96 } 106 }
97 107
98 void WebUIBrowserTest::PreLoadJavascriptLibraries(bool override_chrome_send) { 108 void WebUIBrowserTest::PreLoadJavascriptLibraries(
109 const std::string& preload_test_fixture,
110 const std::string& preload_test_name) {
99 ASSERT_FALSE(libraries_preloaded_); 111 ASSERT_FALSE(libraries_preloaded_);
100 scoped_ptr<Value> override_chrome_send_arg( 112 ConstValueVector args;
101 Value::CreateBooleanValue(override_chrome_send)); 113 args.push_back(Value::CreateStringValue(preload_test_fixture));
102 RunJavascriptFunction("preloadJavascriptLibraries", 114 args.push_back(Value::CreateStringValue(preload_test_name));
103 *override_chrome_send_arg); 115 RunJavascriptFunction("preloadJavascriptLibraries", args);
104 libraries_preloaded_ = true; 116 libraries_preloaded_ = true;
105 } 117 }
106 118
107 WebUIBrowserTest::WebUIBrowserTest() 119 WebUIBrowserTest::WebUIBrowserTest()
108 : test_handler_(new WebUITestHandler()), 120 : test_handler_(new WebUITestHandler()),
109 libraries_preloaded_(false), 121 libraries_preloaded_(false) {}
110 skip_test_(false) {} 122
123 void WebUIBrowserTest::BrowsePreload(const GURL& browse_to,
sky 2011/07/11 20:50:22 position of methods should match header.
Sheridan Rawlins 2011/07/11 22:22:41 Done.
124 const std::string& preload_test_fixture,
125 const std::string& preload_test_name) {
126 // Remember for callback OnLoadStart().
127 preload_test_fixture_ = preload_test_fixture;
128 preload_test_name_ = preload_test_name;
129
130 TestNavigationObserver navigation_observer(
131 browser()->GetSelectedTabContentsWrapper(), this);
132 browser::NavigateParams params(
133 browser(), GURL(browse_to), PageTransition::TYPED);
134 params.disposition = CURRENT_TAB;
135 browser::Navigate(&params);
136 navigation_observer.WaitForObservation();
137 }
138
139 void WebUIBrowserTest::BrowsePrintPreload(
140 const GURL& browse_to,
141 const std::string& preload_test_fixture,
142 const std::string& preload_test_name) {
143 // Remember for callback OnLoadStart().
144 preload_test_fixture_ = preload_test_fixture;
145 preload_test_name_ = preload_test_name;
146
147 ui_test_utils::NavigateToURL(browser(), browse_to);
148
149 TestTabStripModelObserver tabstrip_observer(
150 browser()->tabstrip_model(), this);
151 browser()->Print();
152 tabstrip_observer.WaitForObservation();
153 }
111 154
112 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() { 155 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() {
113 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_)); 156 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_));
114 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder); 157 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder);
115 158
116 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test. 159 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test.
117 FilePath resources_pack_path; 160 FilePath resources_pack_path;
118 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 161 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
119 ResourceBundle::AddDataPackToSharedInstance(resources_pack_path); 162 ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
120 163
164 FilePath mockPath;
165 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &mockPath));
166 mockPath = mockPath.AppendASCII("chrome");
167 mockPath = mockPath.AppendASCII("third_party");
168 mockPath = mockPath.AppendASCII("mock4js");
169 mockPath = mockPath.Append(kMockJS);
170 AddLibrary(mockPath);
121 AddLibrary(FilePath(kWebUILibraryJS)); 171 AddLibrary(FilePath(kWebUILibraryJS));
122 } 172 }
123 173
124 WebUIMessageHandler* WebUIBrowserTest::GetMockMessageHandler() { 174 WebUIMessageHandler* WebUIBrowserTest::GetMockMessageHandler() {
125 return NULL; 175 return NULL;
126 } 176 }
127 177
128 void WebUIBrowserTest::skipTest(const std::string& skip_test_message) {
129 skip_test_ = true;
130 skip_test_message_.assign(skip_test_message);
131 }
132
133 GURL WebUIBrowserTest::WebUITestDataPathToURL( 178 GURL WebUIBrowserTest::WebUITestDataPathToURL(
134 const FilePath::StringType& path) { 179 const FilePath::StringType& path) {
135 FilePath dir_test_data; 180 FilePath dir_test_data;
136 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data)); 181 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data));
137 FilePath test_path(dir_test_data.AppendASCII("webui")); 182 FilePath test_path(dir_test_data.AppendASCII("webui"));
138 test_path = test_path.Append(path); 183 test_path = test_path.Append(path);
139 EXPECT_TRUE(file_util::PathExists(test_path)); 184 EXPECT_TRUE(file_util::PathExists(test_path));
140 return net::FilePathToFileURL(test_path); 185 return net::FilePathToFileURL(test_path);
141 } 186 }
142 187
188 // TestTabStripModelObserver::LoadStartObserver:
189 void WebUIBrowserTest::OnLoadStart() {
190 PreLoadJavascriptLibraries(preload_test_fixture_, preload_test_name_);
191 }
192
143 void WebUIBrowserTest::BuildJavascriptLibraries(std::string* content) { 193 void WebUIBrowserTest::BuildJavascriptLibraries(std::string* content) {
144 ASSERT_TRUE(content != NULL); 194 ASSERT_TRUE(content != NULL);
145 std::string library_content, src_content;
146
147 std::vector<FilePath>::iterator user_libraries_iterator; 195 std::vector<FilePath>::iterator user_libraries_iterator;
148 for (user_libraries_iterator = user_libraries_.begin(); 196 for (user_libraries_iterator = user_libraries_.begin();
149 user_libraries_iterator != user_libraries_.end(); 197 user_libraries_iterator != user_libraries_.end();
150 ++user_libraries_iterator) { 198 ++user_libraries_iterator) {
199 std::string library_content;
151 if (user_libraries_iterator->IsAbsolute()) { 200 if (user_libraries_iterator->IsAbsolute()) {
152 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator, 201 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator,
153 &library_content)); 202 &library_content));
154 } else { 203 } else {
155 ASSERT_TRUE(file_util::ReadFileToString( 204 ASSERT_TRUE(file_util::ReadFileToString(
156 test_data_directory_.Append(*user_libraries_iterator), 205 test_data_directory_.Append(*user_libraries_iterator),
157 &library_content)); 206 &library_content));
158 } 207 }
159 content->append(library_content); 208 content->append(library_content);
160 content->append(";\n"); 209 content->append(";\n");
(...skipping 14 matching lines...) Expand all
175 baked_argument_list.Append((Value *)*arguments_iterator); 224 baked_argument_list.Append((Value *)*arguments_iterator);
176 } 225 }
177 arguments.push_back(&baked_argument_list); 226 arguments.push_back(&baked_argument_list);
178 return WebUI::GetJavascriptCall(std::string("runTest"), arguments); 227 return WebUI::GetJavascriptCall(std::string("runTest"), arguments);
179 } 228 }
180 229
181 bool WebUIBrowserTest::RunJavascriptUsingHandler( 230 bool WebUIBrowserTest::RunJavascriptUsingHandler(
182 const std::string& function_name, 231 const std::string& function_name,
183 const ConstValueVector& function_arguments, 232 const ConstValueVector& function_arguments,
184 bool is_test) { 233 bool is_test) {
185 if (skip_test_) {
186 SUCCEED();
187 LOG(WARNING)
188 << "Skipping test " << function_name << ": " << skip_test_message_;
189 return true;
190 }
191
192 std::string content; 234 std::string content;
193 if (!libraries_preloaded_) 235 if (!libraries_preloaded_)
194 BuildJavascriptLibraries(&content); 236 BuildJavascriptLibraries(&content);
195 237
196 if (!function_name.empty()) { 238 if (!function_name.empty()) {
197 string16 called_function; 239 string16 called_function;
198 if (is_test) { 240 if (is_test) {
199 called_function = BuildRunTestJSCall(function_name, function_arguments); 241 called_function = BuildRunTestJSCall(function_name, function_arguments);
200 } else { 242 } else {
201 called_function = WebUI::GetJavascriptCall(function_name, 243 called_function = WebUI::GetJavascriptCall(function_name,
(...skipping 22 matching lines...) Expand all
224 test_handler_->Attach(web_ui_instance); 266 test_handler_->Attach(web_ui_instance);
225 267
226 if (GetMockMessageHandler()) 268 if (GetMockMessageHandler())
227 GetMockMessageHandler()->Attach(web_ui_instance); 269 GetMockMessageHandler()->Attach(web_ui_instance);
228 } 270 }
229 271
230 void WebUIBrowserTest::AddLibrary(const FilePath& library_path) { 272 void WebUIBrowserTest::AddLibrary(const FilePath& library_path) {
231 user_libraries_.push_back(library_path); 273 user_libraries_.push_back(library_path);
232 } 274 }
233 275
234 IN_PROC_BROWSER_TEST_F(WebUIBrowserTest, TestSamplePass) {
235 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js")));
236
237 // Navigate to UI.
238 // TODO(dtseng): make accessor for subclasses to return?
239 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL));
240
241 ASSERT_TRUE(RunJavascriptTest("testAssertFalse"));
242 ASSERT_FALSE(RunJavascriptTest("FAILS_testAssertFalse"));
243 ASSERT_TRUE(RunJavascriptTest("testInitialFocus"));
244 ASSERT_FALSE(RunJavascriptTest("testConsoleError"));
245 }
246
247 // According to the interface for EXPECT_FATAL_FAILURE 276 // According to the interface for EXPECT_FATAL_FAILURE
248 // (http://code.google.com/p/googletest/wiki/AdvancedGuide#Catching_Failures) 277 // (http://code.google.com/p/googletest/wiki/AdvancedGuide#Catching_Failures)
249 // the statement must be statically available. Therefore, we make a static 278 // the statement must be statically available. Therefore, we make a static
250 // global s_test_ which should point to |this| for the duration of the test run 279 // global s_test_ which should point to |this| for the duration of the test run
251 // and be cleared afterward. 280 // and be cleared afterward.
252 class WebUIBrowserExpectFailTest : public WebUIBrowserTest { 281 class WebUIBrowserExpectFailTest : public WebUIBrowserTest {
253 public: 282 public:
254 WebUIBrowserExpectFailTest() { 283 WebUIBrowserExpectFailTest() {
255 EXPECT_FALSE(s_test_); 284 EXPECT_FALSE(s_test_);
256 s_test_ = this; 285 s_test_ = this;
(...skipping 14 matching lines...) Expand all
271 static WebUIBrowserTest* s_test_; 300 static WebUIBrowserTest* s_test_;
272 }; 301 };
273 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL; 302 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL;
274 303
275 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) { 304 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) {
276 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js"))); 305 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js")));
277 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); 306 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL));
278 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"), 307 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"),
279 "WebUITestHandler::Observe"); 308 "WebUITestHandler::Observe");
280 } 309 }
281
282 // crbug.com/88104 - v8_shell#host doesn't build when host=="arm".
283 #if !defined(ARCH_CPU_ARM_FAMILY)
284 // This test framework is used in the generated tests, which are included
285 // below. WebUIBrowserTest requires being on a page which is a WebUI page. Using
286 // the TestChromeWebUIFactory, we use a dummy URL |kChromeTestBrowserTestPass|,
287 // which we force to be a WebUI page.
288 class WebUIBrowserTestPass
289 : public WebUIBrowserTest,
290 public TestChromeWebUIFactory::WebUIProvider {
291 private:
292 // TestChromeWebUIFactory::WebUIProvider:
293 virtual WebUI* NewWebUI(TabContents* tab_contents,
294 const GURL& url) OVERRIDE {
295 return new ChromeWebUI(tab_contents);
296 }
297
298 // InProcessBrowserTest:
299 virtual void SetUpOnMainThread() OVERRIDE {
300 WebUIBrowserTest::SetUpOnMainThread();
301 ui_test_utils::NavigateToURL(browser(),
302 GURL(kChromeTestBrowserTestPass));
303 }
304
305 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
306 WebUIBrowserTest::SetUpInProcessBrowserTestFixture();
307 TestChromeWebUIFactory::AddFactoryOverride(
308 GURL(kChromeTestBrowserTestPass).host(), this);
309 }
310
311 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
312 WebUIBrowserTest::TearDownInProcessBrowserTestFixture();
313 TestChromeWebUIFactory::RemoveFactoryOverride(
314 GURL(kChromeTestBrowserTestPass).host());
315 }
316
317 static const char kChromeTestBrowserTestPass[];
318 };
319
320 const char WebUIBrowserTestPass::kChromeTestBrowserTestPass[] =
321 "chrome://WebUIBrowserTestPass";
322
323 #include "js2webui/chrome/test/data/webui/sample_pass-inl.h"
324
325 #endif // !defined(ARCH_CPU_ARM_FAMILY)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698