diff options
author | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-05 06:02:07 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-05 06:02:07 +0000 |
commit | 6d3744980e419303b01f12fe6c82ff81cfc2fd2f (patch) | |
tree | 3ad6ece5678bf4cf53fb04d232dfb779ccf4b89f /chrome/test | |
parent | aded0071867946f9aab08ce88ebbfd83c77c83af (diff) | |
download | chromium_src-6d3744980e419303b01f12fe6c82ff81cfc2fd2f.zip chromium_src-6d3744980e419303b01f12fe6c82ff81cfc2fd2f.tar.gz chromium_src-6d3744980e419303b01f12fe6c82ff81cfc2fd2f.tar.bz2 |
Run the DOM Storage layout tests in the UI test framework since the test shell doesn't hit very much of the new code. I still plan to write unit tests and we're still goign to enable the layout tests in test shell, but this is still a good way for us to test the full stack ASAP.
Workers has used this technique for a while now. This CL factors out the layout test running code from the workers ui test and moves arounds directories a bit so not everything is in the "workers" directory.
Doing this via a v8 extension is the right way to go long term, but I ran into a couple snags, so I think this is a good first step.
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/159720
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22466 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test')
-rw-r--r-- | chrome/test/data/layout_tests/layout_test_controller.html | 26 | ||||
-rw-r--r-- | chrome/test/data/workers/layout_test_controller.html | 12 | ||||
-rw-r--r-- | chrome/test/ui/ui_layout_test.cc | 234 | ||||
-rw-r--r-- | chrome/test/ui/ui_layout_test.h | 41 |
4 files changed, 301 insertions, 12 deletions
diff --git a/chrome/test/data/layout_tests/layout_test_controller.html b/chrome/test/data/layout_tests/layout_test_controller.html new file mode 100644 index 0000000..5e14a39 --- /dev/null +++ b/chrome/test/data/layout_tests/layout_test_controller.html @@ -0,0 +1,26 @@ +<script> +function LayoutTestController() { + this.wait_until_done_ = false; + this.dumpAsText = function () { }; + this.waitUntilDone = function () { + this.wait_until_done_ = true; + }; + this.notifyDone = function () { + var cookie = "%COOKIE%=" + encodeURIComponent(document.firstChild.innerText); + document.cookie = cookie; + }; + this.OnTimerEvent = function () { + // Some layout tests do not call waitUntilDone. If this is true, we should + // assume the test is done when it's finished loading. + if (!this.wait_until_done_) + layoutTestController.notifyDone(); + }; + this.OnLoadEvent = function (event) { + // Do a timeout to ensure that we run after all other onload handlers have + // finished. + setTimeout(layoutTestController.OnTimerEvent, 0); + }; +} +window.layoutTestController = new LayoutTestController(); +window.addEventListener('load', layoutTestController.OnLoadEvent, false); +</script> diff --git a/chrome/test/data/workers/layout_test_controller.html b/chrome/test/data/workers/layout_test_controller.html deleted file mode 100644 index cb97db2..0000000 --- a/chrome/test/data/workers/layout_test_controller.html +++ /dev/null @@ -1,12 +0,0 @@ -<script> -function LayoutTestController() { - this.dumpAsText = function () { }; - this.waitUntilDone = function () { }; - this.notifyDone = function () { - var cookie = "%COOKIE%=" + encodeURIComponent(document.firstChild.innerText); - document.cookie = cookie; - }; -} -var layoutTestController = new LayoutTestController(); -window.layoutTestController = layoutTestController; -</script> diff --git a/chrome/test/ui/ui_layout_test.cc b/chrome/test/ui/ui_layout_test.cc new file mode 100644 index 0000000..dc0a4a2 --- /dev/null +++ b/chrome/test/ui/ui_layout_test.cc @@ -0,0 +1,234 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/test/ui/ui_layout_test.h" + +#include "base/file_util.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/automation/tab_proxy.h" +#include "net/base/escape.h" +#include "net/base/net_util.h" + +#if defined(OS_WIN) +static const char kPlatformName[] = "chromium-win"; +#elif defined(OS_MACOSX) +static const char kPlatformName[] = "chromium-mac"; +#elif defined(OS_LINUX) +static const char kPlatformName[] = "chromium-linux"; +#else +#error No known OS defined +#endif + +static const char kTestCompleteCookie[] = "status"; + +UILayoutTest::UILayoutTest() + : UITest(), initialized_for_layout_test_(false), test_count_(0) { +} + +UILayoutTest::~UILayoutTest() { + // The deletion might fail because HTTP server process might not been + // completely shut down yet and is still holding certain handle to it. + // To work around this problem, we try to repeat the deletion several + // times. + if (!temp_test_dir_.empty()) { + static const int kRetryNum = 10; + static const int kRetryDelayTimeMs = 500; + + int retry_time = 0; + for (int i = 0; i < kRetryNum; ++i) { + file_util::Delete(temp_test_dir_, true); + if (!file_util::DirectoryExists(temp_test_dir_)) + break; + + PlatformThread::Sleep(kRetryDelayTimeMs); + retry_time += kRetryDelayTimeMs; + } + + if (retry_time) { + printf("Retrying %d ms to delete temp layout test directory.\n", + retry_time); + } + } +} + +void UILayoutTest::InitializeForLayoutTest(const FilePath& test_parent_dir, + const FilePath& test_case_dir, + bool is_http_test) { + FilePath src_dir; + PathService::Get(base::DIR_SOURCE_ROOT, &src_dir); + + // Gets the file path to WebKit ui layout tests, that is, + // chrome/test/data/ui_tests/LayoutTests/... + // Note that we have to use our own copy of WebKit layout tests because our + // build machines do not have WebKit layout tests added. + layout_test_dir_ = src_dir.AppendASCII("chrome"); + layout_test_dir_ = layout_test_dir_.AppendASCII("test"); + layout_test_dir_ = layout_test_dir_.AppendASCII("data"); + layout_test_dir_ = layout_test_dir_.AppendASCII("layout_tests"); + layout_test_dir_ = layout_test_dir_.Append(test_parent_dir); + layout_test_dir_ = layout_test_dir_.Append(test_case_dir); + ASSERT_TRUE(file_util::DirectoryExists(layout_test_dir_)); + + // Gets the file path to rebased expected result directory for the current + // platform. + // webkit/data/layout_tests/platform/chromium_***/LayoutTests/... + rebase_result_dir_ = src_dir.AppendASCII("webkit"); + rebase_result_dir_ = rebase_result_dir_.AppendASCII("data"); + rebase_result_dir_ = rebase_result_dir_.AppendASCII("layout_tests"); + rebase_result_dir_ = rebase_result_dir_.AppendASCII("platform"); + rebase_result_dir_ = rebase_result_dir_.AppendASCII(kPlatformName); + rebase_result_dir_ = rebase_result_dir_.Append(test_parent_dir); + rebase_result_dir_ = rebase_result_dir_.Append(test_case_dir); + + // Gets the file path to rebased expected result directory under the + // win32 platform. This is used by other non-win32 platform to use the same + // rebased expected results. +#if !defined(OS_WIN) + rebase_result_win_dir_ = src_dir.AppendASCII("webkit"); + rebase_result_win_dir_ = rebase_result_win_dir_.AppendASCII("data"); + rebase_result_win_dir_ = rebase_result_win_dir_.AppendASCII("layout_tests"); + rebase_result_win_dir_ = rebase_result_win_dir_.AppendASCII("platform"); + rebase_result_win_dir_ = rebase_result_win_dir_.AppendASCII("chromium-win"); + rebase_result_win_dir_ = rebase_result_win_dir_.Append(test_parent_dir); + rebase_result_win_dir_ = rebase_result_win_dir_.Append(test_case_dir); +#endif + + // Creates the temporary directory. + ASSERT_TRUE(file_util::CreateNewTempDirectory( + FILE_PATH_LITERAL("chrome_ui_layout_tests_"), &temp_test_dir_)); + + // Creates the new layout test subdirectory under the temp directory. + // Note that we have to mimic the same layout test directory structure, + // like .../LayoutTests/fast/workers/.... Otherwise those layout tests + // dealing with location property, like worker-location.html, could fail. + new_layout_test_dir_ = temp_test_dir_; + new_layout_test_dir_ = new_layout_test_dir_.Append(test_parent_dir); + if (is_http_test) { + new_http_root_dir_ = new_layout_test_dir_; + test_case_dir_ = test_case_dir; + } + new_layout_test_dir_ = new_layout_test_dir_.Append(test_case_dir); + ASSERT_TRUE(file_util::CreateDirectory(new_layout_test_dir_)); + + // Copies the resource subdirectory. + FilePath layout_test_resource_path(layout_test_dir_); + layout_test_resource_path = + layout_test_resource_path.AppendASCII("resources"); + FilePath new_layout_test_resource_path(new_layout_test_dir_); + new_layout_test_resource_path = + new_layout_test_resource_path.AppendASCII("resources"); + ASSERT_TRUE(file_util::CopyDirectory( + layout_test_resource_path, new_layout_test_resource_path, true)); + + // Copies the parent resource subdirectory. This is needed in order to run + // http layout tests. + if (is_http_test) { + FilePath parent_resource_path(layout_test_dir_.DirName()); + parent_resource_path = parent_resource_path.AppendASCII("resources"); + FilePath new_parent_resource_path(new_layout_test_dir_.DirName()); + new_parent_resource_path = + new_parent_resource_path.AppendASCII("resources"); + ASSERT_TRUE(file_util::CopyDirectory( + parent_resource_path, new_parent_resource_path, true)); + } + + // Reads the layout test controller simulation script. + FilePath path; + PathService::Get(chrome::DIR_TEST_DATA, &path); + path = path.AppendASCII("layout_tests"); + path = path.AppendASCII("layout_test_controller.html"); + ASSERT_TRUE(file_util::ReadFileToString(path, &layout_test_controller_)); +} + +void UILayoutTest::RunLayoutTest(const std::string& test_case_file_name, + bool is_http_test) { + SCOPED_TRACE(test_case_file_name.c_str()); + + ASSERT_TRUE(!layout_test_controller_.empty()); + + // Creates a new cookie name. We will have to use a new cookie because + // this function could be called multiple times. + std::string status_cookie(kTestCompleteCookie); + status_cookie += IntToString(test_count_); + test_count_++; + + // Reads the layout test HTML file. + FilePath test_file_path(layout_test_dir_); + test_file_path = test_file_path.AppendASCII(test_case_file_name); + std::string test_html; + ASSERT_TRUE(file_util::ReadFileToString(test_file_path, &test_html)); + + // Injects the layout test controller into the test HTML. + test_html.insert(0, layout_test_controller_); + ReplaceSubstringsAfterOffset( + &test_html, 0, "%COOKIE%", status_cookie.c_str()); + + // Creates the new layout test HTML file. + FilePath new_test_file_path(new_layout_test_dir_); + new_test_file_path = new_test_file_path.AppendASCII(test_case_file_name); + ASSERT_TRUE(file_util::WriteFile(new_test_file_path, + &test_html.at(0), + static_cast<int>(test_html.size()))); + + scoped_ptr<GURL> new_test_url; + if (is_http_test) + new_test_url.reset(new GURL( + std::string("http://localhost:8080/") + + WideToUTF8(test_case_dir_.ToWStringHack()) + + "/" + + test_case_file_name)); + else + new_test_url.reset(new GURL(net::FilePathToFileURL(new_test_file_path))); + + // Runs the new layout test. + scoped_refptr<TabProxy> tab(GetActiveTab()); + ASSERT_TRUE(tab.get()); + ASSERT_TRUE(tab->NavigateToURL(*new_test_url.get())); + std::string escaped_value = + WaitUntilCookieNonEmpty(tab.get(), *new_test_url.get(), + status_cookie.c_str(), kTestIntervalMs, kTestWaitTimeoutMs); + + // Unescapes and normalizes the actual result. + std::string value = UnescapeURLComponent(escaped_value, + UnescapeRule::NORMAL | UnescapeRule::SPACES | + UnescapeRule::URL_SPECIAL_CHARS | UnescapeRule::CONTROL_CHARS); + value += "\n"; + ReplaceSubstringsAfterOffset(&value, 0, "\r", ""); + + // Reads the expected result. First try to read from rebase directory. + // If failed, read from original directory. + std::string expected_result_value; + if (!ReadExpectedResult(rebase_result_dir_, + test_case_file_name, + &expected_result_value)) { + if (rebase_result_win_dir_.empty() || + !ReadExpectedResult(rebase_result_win_dir_, + test_case_file_name, + &expected_result_value)) + ReadExpectedResult(layout_test_dir_, + test_case_file_name, + &expected_result_value); + } + ASSERT_TRUE(!expected_result_value.empty()); + + // Normalizes the expected result. + ReplaceSubstringsAfterOffset(&expected_result_value, 0, "\r", ""); + + // Compares the results. + EXPECT_STREQ(expected_result_value.c_str(), value.c_str()); +} + +bool UILayoutTest::ReadExpectedResult(const FilePath& result_dir_path, + const std::string test_case_file_name, + std::string* expected_result_value) { + FilePath expected_result_path(result_dir_path); + expected_result_path = expected_result_path.AppendASCII(test_case_file_name); + expected_result_path = expected_result_path.InsertBeforeExtension( + FILE_PATH_LITERAL("-expected")); + expected_result_path = + expected_result_path.ReplaceExtension(FILE_PATH_LITERAL("txt")); + return file_util::ReadFileToString(expected_result_path, + expected_result_value); +} diff --git a/chrome/test/ui/ui_layout_test.h b/chrome/test/ui/ui_layout_test.h new file mode 100644 index 0000000..49d6a63 --- /dev/null +++ b/chrome/test/ui/ui_layout_test.h @@ -0,0 +1,41 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_TEST_UI_UI_LAYOUT_TEST_H_ +#define CHROME_TEST_UI_UI_LAYOUT_TEST_H_ + +#include "base/file_path.h" +#include "chrome/test/ui/ui_test.h" + +class UILayoutTest : public UITest { + protected: + UILayoutTest(); + virtual ~UILayoutTest(); + + void InitializeForLayoutTest(const FilePath& test_parent_dir, + const FilePath& test_case_dir, + bool is_http_test); + void RunLayoutTest(const std::string& test_case_file_name, + bool is_http_test); + + bool ReadExpectedResult(const FilePath& result_dir_path, + const std::string test_case_file_name, + std::string* expected_result_value); + + bool initialized_for_layout_test_; + int test_count_; + FilePath temp_test_dir_; + FilePath layout_test_dir_; + FilePath test_case_dir_; + FilePath new_http_root_dir_; + FilePath new_layout_test_dir_; + FilePath rebase_result_dir_; + FilePath rebase_result_win_dir_; + std::string layout_test_controller_; + + static const int kTestIntervalMs = 250; + static const int kTestWaitTimeoutMs = 60 * 1000; +}; + +#endif // CHROME_TEST_UI_UI_LAYOUT_TEST_H_ |