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

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: TestNavigationController in ui_test_utils, renamed LoadStart->JsInjectionReady, reordered methods. 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/browser_navigator.h"
14 #include "chrome/browser/ui/webui/chrome_web_ui.h" 15 #include "chrome/browser/ui/webui/chrome_web_ui.h"
15 #include "chrome/browser/ui/webui/test_chrome_web_ui_factory.h" 16 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
16 #include "chrome/common/chrome_paths.h" 17 #include "chrome/common/chrome_paths.h"
17 #include "chrome/common/url_constants.h" 18 #include "chrome/common/url_constants.h"
19 #include "chrome/test/test_tab_strip_model_observer.h"
18 #include "chrome/test/ui_test_utils.h" 20 #include "chrome/test/ui_test_utils.h"
19 #include "content/browser/tab_contents/tab_contents.h" 21 #include "content/browser/tab_contents/tab_contents.h"
20 #include "testing/gtest/include/gtest/gtest-spi.h" 22 #include "testing/gtest/include/gtest/gtest-spi.h"
21 #include "ui/base/resource/resource_bundle.h" 23 #include "ui/base/resource/resource_bundle.h"
22 24
23 namespace { 25 namespace {
24 26
27 const FilePath::CharType kMockJS[] = FILE_PATH_LITERAL("mock4js.js");
25 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js"); 28 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js");
26 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui"); 29 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui");
27 base::LazyInstance<std::vector<std::string> > error_messages_( 30 base::LazyInstance<std::vector<std::string> > error_messages_(
28 base::LINKER_INITIALIZED); 31 base::LINKER_INITIALIZED);
29 32
30 // Intercepts all log messages. 33 // Intercepts all log messages.
31 bool LogHandler(int severity, 34 bool LogHandler(int severity,
32 const char* file, 35 const char* file,
33 int line, 36 int line,
34 size_t message_start, 37 size_t message_start,
35 const std::string& str) { 38 const std::string& str) {
36 if (severity == logging::LOG_ERROR) 39 if (severity == logging::LOG_ERROR)
37 error_messages_.Get().push_back(str); 40 error_messages_.Get().push_back(str);
38 41
39 return false; 42 return false;
40 } 43 }
41 44
42 } // namespace 45 } // namespace
43 46
44 WebUIBrowserTest::~WebUIBrowserTest() {} 47 WebUIBrowserTest::~WebUIBrowserTest() {}
45 48
49 void WebUIBrowserTest::AddLibrary(const FilePath& library_path) {
50 user_libraries_.push_back(library_path);
51 }
52
46 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name) { 53 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name) {
47 return RunJavascriptFunction(function_name, ConstValueVector()); 54 return RunJavascriptFunction(function_name, ConstValueVector());
48 } 55 }
49 56
50 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name, 57 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name,
51 const Value& arg) { 58 const Value& arg) {
52 ConstValueVector args; 59 ConstValueVector args;
53 args.push_back(&arg); 60 args.push_back(&arg);
54 return RunJavascriptFunction(function_name, args); 61 return RunJavascriptFunction(function_name, args);
55 } 62 }
56 63
57 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name, 64 bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name,
58 const Value& arg1, 65 const Value& arg1,
59 const Value& arg2) { 66 const Value& arg2) {
60 ConstValueVector args; 67 ConstValueVector args;
61 args.push_back(&arg1); 68 args.push_back(&arg1);
62 args.push_back(&arg2); 69 args.push_back(&arg2);
63 return RunJavascriptFunction(function_name, args); 70 return RunJavascriptFunction(function_name, args);
64 } 71 }
65 72
66 bool WebUIBrowserTest::RunJavascriptFunction( 73 bool WebUIBrowserTest::RunJavascriptFunction(
67 const std::string& function_name, 74 const std::string& function_name,
68 const ConstValueVector& function_arguments) { 75 const ConstValueVector& function_arguments) {
69 return RunJavascriptUsingHandler(function_name, function_arguments, false); 76 return RunJavascriptUsingHandler(function_name, function_arguments, false);
70 } 77 }
71 78
79 bool WebUIBrowserTest::RunJavascriptTestF(const std::string& test_fixture,
80 const std::string& test_name) {
81 ConstValueVector args;
82 args.push_back(Value::CreateStringValue(test_fixture));
83 args.push_back(Value::CreateStringValue(test_name));
84 return RunJavascriptTest("RUN_TEST_F", args);
85 }
86
72 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name) { 87 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name) {
73 return RunJavascriptTest(test_name, ConstValueVector()); 88 return RunJavascriptTest(test_name, ConstValueVector());
74 } 89 }
75 90
76 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 91 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name,
77 const Value& arg) { 92 const Value& arg) {
78 ConstValueVector args; 93 ConstValueVector args;
79 args.push_back(&arg); 94 args.push_back(&arg);
80 return RunJavascriptTest(test_name, args); 95 return RunJavascriptTest(test_name, args);
81 } 96 }
82 97
83 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 98 bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name,
84 const Value& arg1, 99 const Value& arg1,
85 const Value& arg2) { 100 const Value& arg2) {
86 ConstValueVector args; 101 ConstValueVector args;
87 args.push_back(&arg1); 102 args.push_back(&arg1);
88 args.push_back(&arg2); 103 args.push_back(&arg2);
89 return RunJavascriptTest(test_name, args); 104 return RunJavascriptTest(test_name, args);
90 } 105 }
91 106
92 bool WebUIBrowserTest::RunJavascriptTest( 107 bool WebUIBrowserTest::RunJavascriptTest(
93 const std::string& test_name, 108 const std::string& test_name,
94 const ConstValueVector& test_arguments) { 109 const ConstValueVector& test_arguments) {
95 return RunJavascriptUsingHandler(test_name, test_arguments, true); 110 return RunJavascriptUsingHandler(test_name, test_arguments, true);
96 } 111 }
97 112
98 void WebUIBrowserTest::PreLoadJavascriptLibraries(bool override_chrome_send) { 113 void WebUIBrowserTest::PreLoadJavascriptLibraries(
114 const std::string& preload_test_fixture,
115 const std::string& preload_test_name) {
99 ASSERT_FALSE(libraries_preloaded_); 116 ASSERT_FALSE(libraries_preloaded_);
100 scoped_ptr<Value> override_chrome_send_arg( 117 ConstValueVector args;
101 Value::CreateBooleanValue(override_chrome_send)); 118 args.push_back(Value::CreateStringValue(preload_test_fixture));
102 RunJavascriptFunction("preloadJavascriptLibraries", 119 args.push_back(Value::CreateStringValue(preload_test_name));
103 *override_chrome_send_arg); 120 RunJavascriptFunction("preloadJavascriptLibraries", args);
104 libraries_preloaded_ = true; 121 libraries_preloaded_ = true;
105 } 122 }
106 123
124 void WebUIBrowserTest::BrowsePreload(const GURL& browse_to,
125 const std::string& preload_test_fixture,
126 const std::string& preload_test_name) {
127 // Remember for callback OnJsInjectionReady().
128 preload_test_fixture_ = preload_test_fixture;
129 preload_test_name_ = preload_test_name;
130
131 TestNavigationObserver navigation_observer(
132 &browser()->GetSelectedTabContentsWrapper()->controller(), this, 1);
133 browser::NavigateParams params(
134 browser(), GURL(browse_to), PageTransition::TYPED);
135 params.disposition = CURRENT_TAB;
136 browser::Navigate(&params);
137 navigation_observer.WaitForObservation();
138 }
139
140 void WebUIBrowserTest::BrowsePrintPreload(
141 const GURL& browse_to,
142 const std::string& preload_test_fixture,
143 const std::string& preload_test_name) {
144 // Remember for callback OnJsInjectionReady().
145 preload_test_fixture_ = preload_test_fixture;
146 preload_test_name_ = preload_test_name;
147
148 ui_test_utils::NavigateToURL(browser(), browse_to);
149
150 TestTabStripModelObserver tabstrip_observer(
151 browser()->tabstrip_model(), this);
152 browser()->Print();
153 tabstrip_observer.WaitForObservation();
154 }
155
107 WebUIBrowserTest::WebUIBrowserTest() 156 WebUIBrowserTest::WebUIBrowserTest()
108 : test_handler_(new WebUITestHandler()), 157 : test_handler_(new WebUITestHandler()),
109 libraries_preloaded_(false), 158 libraries_preloaded_(false) {}
110 skip_test_(false) {}
111 159
112 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() { 160 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() {
113 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_)); 161 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_));
114 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder); 162 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder);
115 163
116 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test. 164 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test.
117 FilePath resources_pack_path; 165 FilePath resources_pack_path;
118 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 166 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
119 ResourceBundle::AddDataPackToSharedInstance(resources_pack_path); 167 ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
120 168
169 FilePath mockPath;
170 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &mockPath));
171 mockPath = mockPath.AppendASCII("chrome");
172 mockPath = mockPath.AppendASCII("third_party");
173 mockPath = mockPath.AppendASCII("mock4js");
174 mockPath = mockPath.Append(kMockJS);
175 AddLibrary(mockPath);
121 AddLibrary(FilePath(kWebUILibraryJS)); 176 AddLibrary(FilePath(kWebUILibraryJS));
122 } 177 }
123 178
124 WebUIMessageHandler* WebUIBrowserTest::GetMockMessageHandler() { 179 WebUIMessageHandler* WebUIBrowserTest::GetMockMessageHandler() {
125 return NULL; 180 return NULL;
126 } 181 }
127 182
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( 183 GURL WebUIBrowserTest::WebUITestDataPathToURL(
134 const FilePath::StringType& path) { 184 const FilePath::StringType& path) {
135 FilePath dir_test_data; 185 FilePath dir_test_data;
136 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data)); 186 EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data));
137 FilePath test_path(dir_test_data.AppendASCII("webui")); 187 FilePath test_path(dir_test_data.AppendASCII("webui"));
138 test_path = test_path.Append(path); 188 test_path = test_path.Append(path);
139 EXPECT_TRUE(file_util::PathExists(test_path)); 189 EXPECT_TRUE(file_util::PathExists(test_path));
140 return net::FilePathToFileURL(test_path); 190 return net::FilePathToFileURL(test_path);
141 } 191 }
142 192
193 void WebUIBrowserTest::OnJsInjectionReady() {
194 PreLoadJavascriptLibraries(preload_test_fixture_, preload_test_name_);
195 }
196
143 void WebUIBrowserTest::BuildJavascriptLibraries(std::string* content) { 197 void WebUIBrowserTest::BuildJavascriptLibraries(std::string* content) {
144 ASSERT_TRUE(content != NULL); 198 ASSERT_TRUE(content != NULL);
145 std::string library_content, src_content;
146
147 std::vector<FilePath>::iterator user_libraries_iterator; 199 std::vector<FilePath>::iterator user_libraries_iterator;
148 for (user_libraries_iterator = user_libraries_.begin(); 200 for (user_libraries_iterator = user_libraries_.begin();
149 user_libraries_iterator != user_libraries_.end(); 201 user_libraries_iterator != user_libraries_.end();
150 ++user_libraries_iterator) { 202 ++user_libraries_iterator) {
203 std::string library_content;
151 if (user_libraries_iterator->IsAbsolute()) { 204 if (user_libraries_iterator->IsAbsolute()) {
152 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator, 205 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator,
153 &library_content)); 206 &library_content));
154 } else { 207 } else {
155 ASSERT_TRUE(file_util::ReadFileToString( 208 ASSERT_TRUE(file_util::ReadFileToString(
156 test_data_directory_.Append(*user_libraries_iterator), 209 test_data_directory_.Append(*user_libraries_iterator),
157 &library_content)); 210 &library_content));
158 } 211 }
159 content->append(library_content); 212 content->append(library_content);
160 content->append(";\n"); 213 content->append(";\n");
(...skipping 14 matching lines...) Expand all
175 baked_argument_list.Append((Value *)*arguments_iterator); 228 baked_argument_list.Append((Value *)*arguments_iterator);
176 } 229 }
177 arguments.push_back(&baked_argument_list); 230 arguments.push_back(&baked_argument_list);
178 return WebUI::GetJavascriptCall(std::string("runTest"), arguments); 231 return WebUI::GetJavascriptCall(std::string("runTest"), arguments);
179 } 232 }
180 233
181 bool WebUIBrowserTest::RunJavascriptUsingHandler( 234 bool WebUIBrowserTest::RunJavascriptUsingHandler(
182 const std::string& function_name, 235 const std::string& function_name,
183 const ConstValueVector& function_arguments, 236 const ConstValueVector& function_arguments,
184 bool is_test) { 237 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; 238 std::string content;
193 if (!libraries_preloaded_) 239 if (!libraries_preloaded_)
194 BuildJavascriptLibraries(&content); 240 BuildJavascriptLibraries(&content);
195 241
196 if (!function_name.empty()) { 242 if (!function_name.empty()) {
197 string16 called_function; 243 string16 called_function;
198 if (is_test) { 244 if (is_test) {
199 called_function = BuildRunTestJSCall(function_name, function_arguments); 245 called_function = BuildRunTestJSCall(function_name, function_arguments);
200 } else { 246 } else {
201 called_function = WebUI::GetJavascriptCall(function_name, 247 called_function = WebUI::GetJavascriptCall(function_name,
(...skipping 18 matching lines...) Expand all
220 WebUI* web_ui_instance = 266 WebUI* web_ui_instance =
221 browser()->GetSelectedTabContents()->web_ui(); 267 browser()->GetSelectedTabContents()->web_ui();
222 ASSERT_TRUE(web_ui_instance != NULL); 268 ASSERT_TRUE(web_ui_instance != NULL);
223 web_ui_instance->register_callback_overwrites(true); 269 web_ui_instance->register_callback_overwrites(true);
224 test_handler_->Attach(web_ui_instance); 270 test_handler_->Attach(web_ui_instance);
225 271
226 if (GetMockMessageHandler()) 272 if (GetMockMessageHandler())
227 GetMockMessageHandler()->Attach(web_ui_instance); 273 GetMockMessageHandler()->Attach(web_ui_instance);
228 } 274 }
229 275
230 void WebUIBrowserTest::AddLibrary(const FilePath& library_path) {
231 user_libraries_.push_back(library_path);
232 }
233
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;
257 } 286 }
258 287
259 protected: 288 protected:
260 virtual ~WebUIBrowserExpectFailTest() { 289 virtual ~WebUIBrowserExpectFailTest() {
261 EXPECT_TRUE(s_test_); 290 EXPECT_TRUE(s_test_);
262 s_test_ = NULL; 291 s_test_ = NULL;
263 } 292 }
264 293
265 static void RunJavascriptTestNoReturn(const std::string& testname) { 294 static void RunJavascriptTestNoReturn(const std::string& testname) {
266 EXPECT_TRUE(s_test_); 295 EXPECT_TRUE(s_test_);
267 s_test_->RunJavascriptTest(testname); 296 s_test_->RunJavascriptTest(testname);
268 } 297 }
269 298
270 private: 299 private:
271 static WebUIBrowserTest* s_test_; 300 static WebUIBrowserTest* s_test_;
272 }; 301 };
302
273 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL; 303 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL;
274 304
275 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) { 305 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) {
276 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js"))); 306 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js")));
277 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); 307 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL));
278 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"), 308 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"),
279 "WebUITestHandler::Observe"); 309 "WebUITestHandler::Observe");
280 } 310 }
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