summaryrefslogtreecommitdiffstats
path: root/chrome/test
diff options
context:
space:
mode:
authorjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-05 06:02:07 +0000
committerjorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-05 06:02:07 +0000
commit6d3744980e419303b01f12fe6c82ff81cfc2fd2f (patch)
tree3ad6ece5678bf4cf53fb04d232dfb779ccf4b89f /chrome/test
parentaded0071867946f9aab08ce88ebbfd83c77c83af (diff)
downloadchromium_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.html26
-rw-r--r--chrome/test/data/workers/layout_test_controller.html12
-rw-r--r--chrome/test/ui/ui_layout_test.cc234
-rw-r--r--chrome/test/ui/ui_layout_test.h41
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_