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

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

Issue 7576024: Provide ability for WebUIBrowserTests to run asynchronous tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moved |errors| around and do errors.splice only when completing results. Created 9 years, 4 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/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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698