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/browser_navigator.h" | 14 #include "chrome/browser/ui/browser_navigator.h" |
15 #include "chrome/browser/ui/webui/chrome_web_ui.h" | 15 #include "chrome/browser/ui/webui/chrome_web_ui.h" |
| 16 #include "chrome/browser/ui/webui/test_chrome_web_ui_factory.h" |
16 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 17 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
17 #include "chrome/common/chrome_paths.h" | 18 #include "chrome/common/chrome_paths.h" |
18 #include "chrome/common/url_constants.h" | 19 #include "chrome/common/url_constants.h" |
19 #include "chrome/test/base/test_tab_strip_model_observer.h" | 20 #include "chrome/test/base/test_tab_strip_model_observer.h" |
20 #include "chrome/test/base/ui_test_utils.h" | 21 #include "chrome/test/base/ui_test_utils.h" |
21 #include "content/browser/tab_contents/tab_contents.h" | 22 #include "content/browser/tab_contents/tab_contents.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" |
22 #include "testing/gtest/include/gtest/gtest-spi.h" | 24 #include "testing/gtest/include/gtest/gtest-spi.h" |
23 #include "ui/base/resource/resource_bundle.h" | 25 #include "ui/base/resource/resource_bundle.h" |
24 | 26 |
25 namespace { | 27 namespace { |
26 | 28 |
27 const FilePath::CharType kMockJS[] = FILE_PATH_LITERAL("mock4js.js"); | 29 const FilePath::CharType kMockJS[] = FILE_PATH_LITERAL("mock4js.js"); |
28 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js"); | 30 const FilePath::CharType kWebUILibraryJS[] = FILE_PATH_LITERAL("test_api.js"); |
29 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui"); | 31 const FilePath::CharType kWebUITestFolder[] = FILE_PATH_LITERAL("webui"); |
30 base::LazyInstance<std::vector<std::string> > error_messages_( | 32 base::LazyInstance<std::vector<std::string> > error_messages_( |
31 base::LINKER_INITIALIZED); | 33 base::LINKER_INITIALIZED); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 preload_test_name_ = preload_test_name; | 151 preload_test_name_ = preload_test_name; |
150 | 152 |
151 ui_test_utils::NavigateToURL(browser(), browse_to); | 153 ui_test_utils::NavigateToURL(browser(), browse_to); |
152 | 154 |
153 TestTabStripModelObserver tabstrip_observer( | 155 TestTabStripModelObserver tabstrip_observer( |
154 browser()->tabstrip_model(), this); | 156 browser()->tabstrip_model(), this); |
155 browser()->Print(); | 157 browser()->Print(); |
156 tabstrip_observer.WaitForObservation(); | 158 tabstrip_observer.WaitForObservation(); |
157 } | 159 } |
158 | 160 |
| 161 bool WebUIBrowserTest::WaitForAsyncResult() { |
| 162 return test_handler_->WaitForAsyncResult(); |
| 163 } |
| 164 |
159 WebUIBrowserTest::WebUIBrowserTest() | 165 WebUIBrowserTest::WebUIBrowserTest() |
160 : test_handler_(new WebUITestHandler()), | 166 : test_handler_(new WebUITestHandler()), |
161 libraries_preloaded_(false) {} | 167 libraries_preloaded_(false) {} |
162 | 168 |
163 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() { | 169 void WebUIBrowserTest::SetUpInProcessBrowserTestFixture() { |
164 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_)); | 170 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory_)); |
165 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder); | 171 test_data_directory_ = test_data_directory_.Append(kWebUITestFolder); |
166 | 172 |
167 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test. | 173 // TODO(dtseng): should this be part of every BrowserTest or just WebUI test. |
168 FilePath resources_pack_path; | 174 FilePath resources_pack_path; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 void WebUIBrowserTest::BuildJavascriptLibraries(string16* content) { | 207 void WebUIBrowserTest::BuildJavascriptLibraries(string16* content) { |
202 ASSERT_TRUE(content != NULL); | 208 ASSERT_TRUE(content != NULL); |
203 std::string utf8_content; | 209 std::string utf8_content; |
204 std::vector<FilePath>::iterator user_libraries_iterator; | 210 std::vector<FilePath>::iterator user_libraries_iterator; |
205 for (user_libraries_iterator = user_libraries_.begin(); | 211 for (user_libraries_iterator = user_libraries_.begin(); |
206 user_libraries_iterator != user_libraries_.end(); | 212 user_libraries_iterator != user_libraries_.end(); |
207 ++user_libraries_iterator) { | 213 ++user_libraries_iterator) { |
208 std::string library_content; | 214 std::string library_content; |
209 if (user_libraries_iterator->IsAbsolute()) { | 215 if (user_libraries_iterator->IsAbsolute()) { |
210 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator, | 216 ASSERT_TRUE(file_util::ReadFileToString(*user_libraries_iterator, |
211 &library_content)); | 217 &library_content)) |
| 218 << user_libraries_iterator->value(); |
212 } else { | 219 } else { |
213 ASSERT_TRUE(file_util::ReadFileToString( | 220 ASSERT_TRUE(file_util::ReadFileToString( |
214 test_data_directory_.Append(*user_libraries_iterator), | 221 test_data_directory_.Append(*user_libraries_iterator), |
215 &library_content)); | 222 &library_content)) << user_libraries_iterator->value(); |
216 } | 223 } |
217 utf8_content.append(library_content); | 224 utf8_content.append(library_content); |
218 utf8_content.append(";\n"); | 225 utf8_content.append(";\n"); |
219 } | 226 } |
220 content->append(UTF8ToUTF16(utf8_content)); | 227 content->append(UTF8ToUTF16(utf8_content)); |
221 } | 228 } |
222 | 229 |
223 string16 WebUIBrowserTest::BuildRunTestJSCall( | 230 string16 WebUIBrowserTest::BuildRunTestJSCall( |
224 const std::string& function_name, | 231 const std::string& function_name, |
225 const WebUIBrowserTest::ConstValueVector& test_func_args) { | 232 const WebUIBrowserTest::ConstValueVector& test_func_args) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 }; | 327 }; |
321 | 328 |
322 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL; | 329 WebUIBrowserTest* WebUIBrowserExpectFailTest::s_test_ = NULL; |
323 | 330 |
324 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) { | 331 IN_PROC_BROWSER_TEST_F(WebUIBrowserExpectFailTest, TestFailsFast) { |
325 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js"))); | 332 AddLibrary(FilePath(FILE_PATH_LITERAL("sample_downloads.js"))); |
326 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); | 333 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIDownloadsURL)); |
327 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"), | 334 EXPECT_FATAL_FAILURE(RunJavascriptTestNoReturn("FAILS_BogusFunctionName"), |
328 "WebUITestHandler::Observe"); | 335 "WebUITestHandler::Observe"); |
329 } | 336 } |
| 337 |
| 338 // Tests that the async framework works. |
| 339 class WebUIBrowserAsyncTest : public WebUIBrowserTest { |
| 340 public: |
| 341 // Calls the asyncTestDone() function from test_api.js |
| 342 void AsyncTestDone() { |
| 343 RunJavascriptFunction("asyncTestDone"); |
| 344 } |
| 345 |
| 346 // starts a failing test. |
| 347 void RunTestFailsAssert() { |
| 348 RunJavascriptFunction("runAsync", |
| 349 *Value::CreateStringValue("testFailsAssert")); |
| 350 } |
| 351 |
| 352 // starts a passing test. |
| 353 void RunTestPasses() { |
| 354 RunJavascriptFunction("runAsync", *Value::CreateStringValue("testPasses")); |
| 355 } |
| 356 |
| 357 protected: |
| 358 |
| 359 WebUIBrowserAsyncTest() {} |
| 360 |
| 361 static const char kDummyURL[]; |
| 362 |
| 363 // Class to synchronize asynchronous javascript activity with the tests. |
| 364 class AsyncWebUIMessageHandler : public WebUIMessageHandler { |
| 365 public: |
| 366 AsyncWebUIMessageHandler() {} |
| 367 |
| 368 MOCK_METHOD1(HandleTestContinues, void(const ListValue*)); |
| 369 MOCK_METHOD1(HandleTestPasses, void(const ListValue*)); |
| 370 |
| 371 private: |
| 372 virtual void RegisterMessages() OVERRIDE { |
| 373 web_ui_->RegisterMessageCallback("startAsyncTest", NewCallback( |
| 374 this, &AsyncWebUIMessageHandler::HandleStartAsyncTest)); |
| 375 web_ui_->RegisterMessageCallback("testPasses", NewCallback( |
| 376 this, &AsyncWebUIMessageHandler::HandleTestPasses)); |
| 377 web_ui_->RegisterMessageCallback("testContinues", NewCallback( |
| 378 this, &AsyncWebUIMessageHandler::HandleTestContinues)); |
| 379 } |
| 380 |
| 381 // Starts the test in |list_value|[0] with the runAsync wrapper. |
| 382 void HandleStartAsyncTest(const ListValue* list_value) { |
| 383 Value* test_name; |
| 384 ASSERT_TRUE(list_value->Get(0, &test_name)); |
| 385 web_ui_->CallJavascriptFunction("runAsync", *test_name); |
| 386 } |
| 387 |
| 388 DISALLOW_COPY_AND_ASSIGN(AsyncWebUIMessageHandler); |
| 389 }; |
| 390 |
| 391 // Handler for this object. |
| 392 ::testing::StrictMock<AsyncWebUIMessageHandler> message_handler_; |
| 393 |
| 394 private: |
| 395 // Class to provide a ChromeWebUI for |kDummyURL|. |
| 396 class MockWebUIProvider : public TestChromeWebUIFactory::WebUIProvider { |
| 397 public: |
| 398 MockWebUIProvider() {} |
| 399 |
| 400 // Returns a new ChromeWebUI |
| 401 WebUI* NewWebUI(TabContents* tab_contents, const GURL& url) OVERRIDE { |
| 402 return new ChromeWebUI(tab_contents); |
| 403 } |
| 404 }; |
| 405 |
| 406 // Provide this object's handler. |
| 407 virtual WebUIMessageHandler* GetMockMessageHandler() OVERRIDE { |
| 408 return &message_handler_; |
| 409 } |
| 410 |
| 411 // Set up the kDummyURL to be a WebUI page. |
| 412 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| 413 WebUIBrowserTest::SetUpInProcessBrowserTestFixture(); |
| 414 TestChromeWebUIFactory::AddFactoryOverride(GURL(kDummyURL).host(), |
| 415 &mock_provider_); |
| 416 } |
| 417 |
| 418 // Tear down the kDummyURL WebUI page. |
| 419 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { |
| 420 WebUIBrowserTest::TearDownInProcessBrowserTestFixture(); |
| 421 TestChromeWebUIFactory::RemoveFactoryOverride(GURL(kDummyURL).host()); |
| 422 } |
| 423 |
| 424 // Set up and browse to kDummyURL for all tests. |
| 425 virtual void SetUpOnMainThread() OVERRIDE { |
| 426 WebUIBrowserTest::SetUpOnMainThread(); |
| 427 AddLibrary(FilePath(FILE_PATH_LITERAL("async.js"))); |
| 428 ui_test_utils::NavigateToURL(browser(), GURL(kDummyURL)); |
| 429 } |
| 430 |
| 431 // Provider for this object. |
| 432 MockWebUIProvider mock_provider_; |
| 433 |
| 434 DISALLOW_COPY_AND_ASSIGN(WebUIBrowserAsyncTest); |
| 435 }; |
| 436 |
| 437 const char WebUIBrowserAsyncTest::kDummyURL[] = "chrome://Dummy"; |
| 438 |
| 439 // Test that assertions fail immediately without calling asyncTestDone(). |
| 440 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncFailsAssert) { |
| 441 ASSERT_TRUE(RunJavascriptTest("startAsyncTest", |
| 442 *Value::CreateStringValue("testFailsAssert"))); |
| 443 ASSERT_FALSE(WaitForAsyncResult()); |
| 444 } |
| 445 |
| 446 // Test that expectations continue the function, but fail the test without |
| 447 // calling asyncTestDone(). |
| 448 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncFailsExpect) { |
| 449 EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_)); |
| 450 ASSERT_TRUE(RunJavascriptTest("startAsyncTest", |
| 451 *Value::CreateStringValue("testFailsExpect"))); |
| 452 ASSERT_FALSE(WaitForAsyncResult()); |
| 453 } |
| 454 |
| 455 // Test that test passes when this object's handler calls asyncTestDone(). |
| 456 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncPasses) { |
| 457 ::testing::InSequence s; |
| 458 EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_)); |
| 459 EXPECT_CALL(message_handler_, HandleTestPasses(::testing::_)) |
| 460 .WillOnce(::testing::InvokeWithoutArgs( |
| 461 this, &WebUIBrowserAsyncTest::AsyncTestDone)); |
| 462 ASSERT_TRUE(RunJavascriptTest("startAsyncTest", |
| 463 *Value::CreateStringValue("testPasses"))); |
| 464 ASSERT_TRUE(WaitForAsyncResult()); |
| 465 } |
| 466 |
| 467 // Test that two tests pass |
| 468 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncPassPass) { |
| 469 ::testing::InSequence s; |
| 470 EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_)); |
| 471 EXPECT_CALL(message_handler_, HandleTestPasses(::testing::_)) |
| 472 .WillOnce(::testing::InvokeWithoutArgs( |
| 473 this, &WebUIBrowserAsyncTest::RunTestPasses)); |
| 474 EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_)); |
| 475 EXPECT_CALL(message_handler_, HandleTestPasses(::testing::_)) |
| 476 .WillOnce(::testing::InvokeWithoutArgs( |
| 477 this, &WebUIBrowserAsyncTest::AsyncTestDone)); |
| 478 ASSERT_TRUE(RunJavascriptTest("startAsyncTest", |
| 479 *Value::CreateStringValue("testPasses"))); |
| 480 ASSERT_TRUE(WaitForAsyncResult()); |
| 481 } |
| 482 |
| 483 // Test that first test passes; second fails. |
| 484 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncPassThenFail) { |
| 485 ::testing::InSequence s; |
| 486 EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_)); |
| 487 EXPECT_CALL(message_handler_, HandleTestPasses(::testing::_)) |
| 488 .WillOnce(::testing::InvokeWithoutArgs( |
| 489 this, &WebUIBrowserAsyncTest::RunTestFailsAssert)); |
| 490 ASSERT_TRUE(RunJavascriptTest("startAsyncTest", |
| 491 *Value::CreateStringValue("testPasses"))); |
| 492 ASSERT_FALSE(WaitForAsyncResult()); |
| 493 } |
OLD | NEW |