OLD | NEW |
---|---|
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 Loading... | |
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(¶ms); | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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) | |
OLD | NEW |