| 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, |
| 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 |