| Index: chrome/test/ui/ui_layout_test.h
|
| ===================================================================
|
| --- chrome/test/ui/ui_layout_test.h (revision 22032)
|
| +++ chrome/test/ui/ui_layout_test.h (working copy)
|
| @@ -2,47 +2,23 @@
|
| // 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 "base/file_util.h"
|
| -#include "base/path_service.h"
|
| -#include "base/platform_thread.h"
|
| -#include "base/string_util.h"
|
| -#include "chrome/browser/worker_host/worker_service.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/test/automation/browser_proxy.h"
|
| -#include "chrome/test/automation/tab_proxy.h"
|
| #include "chrome/test/ui/ui_test.h"
|
| -#include "net/base/escape.h"
|
| -#include "net/base/net_util.h"
|
|
|
| -#if defined(OS_WIN)
|
| -const char kPlatformName[] = "chromium-win";
|
| -#elif defined(OS_MACOSX)
|
| -const char kPlatformName[] = "chromium-mac";
|
| -#elif defined(OS_LINUX)
|
| -const char kPlatformName[] = "chromium-linux";
|
| -#else
|
| -#error No known OS defined
|
| -#endif
|
| -
|
| -const char kTestCompleteCookie[] = "status";
|
| -const char kTestCompleteSuccess[] = "OK";
|
| -const int kTestIntervalMs = 250;
|
| -const int kTestWaitTimeoutMs = 60 * 1000;
|
| -
|
| -class WorkerTest : public UITest {
|
| +class UILayoutTest : public UITest {
|
| protected:
|
| - WorkerTest();
|
| - virtual ~WorkerTest();
|
| + UILayoutTest();
|
| + virtual ~UILayoutTest();
|
|
|
| - void RunTest(const std::wstring& test_case);
|
| -
|
| 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);
|
| + void RunLayoutTest(const std::string& test_case_file_name,
|
| + bool is_http_test);
|
|
|
| - protected:
|
| bool ReadExpectedResult(const FilePath& result_dir_path,
|
| const std::string test_case_file_name,
|
| std::string* expected_result_value);
|
| @@ -57,358 +33,9 @@
|
| 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;
|
| };
|
|
|
| -WorkerTest::WorkerTest()
|
| - : UITest(), initialized_for_layout_test_(false), test_count_(0) {
|
| -}
|
| -
|
| -WorkerTest::~WorkerTest() {
|
| - // 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 worker directory.\n", retry_time);
|
| - }
|
| -}
|
| -
|
| -void WorkerTest::RunTest(const std::wstring& test_case) {
|
| - scoped_refptr<TabProxy> tab(GetActiveTab());
|
| - ASSERT_TRUE(tab.get());
|
| -
|
| - GURL url = GetTestUrl(L"workers", test_case);
|
| - ASSERT_TRUE(tab->NavigateToURL(url));
|
| -
|
| - std::string value = WaitUntilCookieNonEmpty(tab.get(), url,
|
| - kTestCompleteCookie, kTestIntervalMs, kTestWaitTimeoutMs);
|
| - ASSERT_STREQ(kTestCompleteSuccess, value.c_str());
|
| -}
|
| -
|
| -void WorkerTest::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 layout tests for workers, that is,
|
| - // chrome/test/data/workers/LayoutTests/.../workers
|
| - // Note that we have to use our copy of WebKit layout tests for workers.
|
| - // This is 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("workers");
|
| - layout_test_dir_ = layout_test_dir_.Append(test_parent_dir);
|
| - layout_test_dir_ = layout_test_dir_.Append(test_case_dir);
|
| -
|
| - // If not found, try to use the original copy of WebKit layout tests for
|
| - // workers. For testing only in local machine only.
|
| - // third_party/LayoutTests/.../workers
|
| - if (!file_util::DirectoryExists(layout_test_dir_)) {
|
| - layout_test_dir_ = src_dir.AppendASCII("third_party");
|
| - 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 workers for
|
| - // current platform.
|
| - // webkit/data/layout_tests/platform/chromium_***/LayoutTests/.../workers
|
| - 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 for workers under
|
| - // 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_worker_test_"), &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("workers");
|
| - path = path.AppendASCII("layout_test_controller.html");
|
| - ASSERT_TRUE(file_util::ReadFileToString(path, &layout_test_controller_));
|
| -}
|
| -
|
| -void WorkerTest::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 WorkerTest::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);
|
| -}
|
| -
|
| -TEST_F(WorkerTest, SingleWorker) {
|
| - RunTest(L"single_worker.html");
|
| -}
|
| -
|
| -TEST_F(WorkerTest, MultipleWorkers) {
|
| - RunTest(L"multi_worker.html");
|
| -}
|
| -
|
| -TEST_F(WorkerTest, WorkerFastLayoutTests) {
|
| - static const char* kLayoutTestFiles[] = {
|
| - "stress-js-execution.html",
|
| - "use-machine-stack.html",
|
| - "worker-close.html",
|
| - //"worker-constructor.html",
|
| - "worker-context-gc.html",
|
| - "worker-event-listener.html",
|
| - "worker-gc.html",
|
| - "worker-location.html",
|
| - "worker-navigator.html",
|
| - "worker-replace-global-constructor.html",
|
| - "worker-replace-self.html",
|
| - "worker-script-error.html",
|
| - "worker-terminate.html",
|
| - "worker-timeout.html"
|
| - };
|
| -
|
| - FilePath fast_test_dir;
|
| - fast_test_dir = fast_test_dir.AppendASCII("LayoutTests");
|
| - fast_test_dir = fast_test_dir.AppendASCII("fast");
|
| -
|
| - FilePath worker_test_dir;
|
| - worker_test_dir = worker_test_dir.AppendASCII("workers");
|
| - InitializeForLayoutTest(fast_test_dir, worker_test_dir, false);
|
| -
|
| - for (size_t i = 0; i < arraysize(kLayoutTestFiles); ++i)
|
| - RunLayoutTest(kLayoutTestFiles[i], false);
|
| -}
|
| -
|
| -TEST_F(WorkerTest, WorkerHttpLayoutTests) {
|
| - static const char* kLayoutTestFiles[] = {
|
| - // flakey? BUG 16934 "text-encoding.html",
|
| - "worker-importScripts.html",
|
| - //"worker-redirect.html",
|
| - };
|
| -
|
| - FilePath http_test_dir;
|
| - http_test_dir = http_test_dir.AppendASCII("LayoutTests");
|
| - http_test_dir = http_test_dir.AppendASCII("http");
|
| - http_test_dir = http_test_dir.AppendASCII("tests");
|
| -
|
| - FilePath worker_test_dir;
|
| - worker_test_dir = worker_test_dir.AppendASCII("workers");
|
| - InitializeForLayoutTest(http_test_dir, worker_test_dir, true);
|
| -
|
| - StartHttpServer(new_http_root_dir_);
|
| - for (size_t i = 0; i < arraysize(kLayoutTestFiles); ++i)
|
| - RunLayoutTest(kLayoutTestFiles[i], true);
|
| - StopHttpServer();
|
| -}
|
| -
|
| -TEST_F(WorkerTest, WorkerXhrHttpLayoutTests) {
|
| - static const char* kLayoutTestFiles[] = {
|
| - "abort-exception-assert.html",
|
| - "close.html",
|
| - //"methods-async.html",
|
| - //"methods.html",
|
| - "xmlhttprequest-file-not-found.html"
|
| - };
|
| -
|
| - FilePath http_test_dir;
|
| - http_test_dir = http_test_dir.AppendASCII("LayoutTests");
|
| - http_test_dir = http_test_dir.AppendASCII("http");
|
| - http_test_dir = http_test_dir.AppendASCII("tests");
|
| -
|
| - FilePath worker_test_dir;
|
| - worker_test_dir = worker_test_dir.AppendASCII("xmlhttprequest");
|
| - worker_test_dir = worker_test_dir.AppendASCII("workers");
|
| - InitializeForLayoutTest(http_test_dir, worker_test_dir, true);
|
| -
|
| - StartHttpServer(new_http_root_dir_);
|
| - for (size_t i = 0; i < arraysize(kLayoutTestFiles); ++i)
|
| - RunLayoutTest(kLayoutTestFiles[i], true);
|
| - StopHttpServer();
|
| -}
|
| -
|
| -TEST_F(WorkerTest, LimitPerPage) {
|
| - int max_workers_per_tab = WorkerService::kMaxWorkersPerTabWhenSeparate;
|
| - GURL url = GetTestUrl(L"workers", L"many_workers.html");
|
| - url = GURL(url.spec() + StringPrintf("?count=%d", max_workers_per_tab + 1));
|
| -
|
| - scoped_refptr<TabProxy> tab(GetActiveTab());
|
| - ASSERT_TRUE(tab.get());
|
| - ASSERT_TRUE(tab->NavigateToURL(url));
|
| -
|
| - EXPECT_EQ(max_workers_per_tab + 1 + (UITest::in_process_renderer() ? 0 : 1),
|
| - UITest::GetBrowserProcessCount());
|
| -}
|
| -
|
| -TEST_F(WorkerTest, LimitTotal) {
|
| - int max_workers_per_tab = WorkerService::kMaxWorkersPerTabWhenSeparate;
|
| - int total_workers = WorkerService::kMaxWorkersWhenSeparate;
|
| -
|
| - int tab_count = (total_workers / max_workers_per_tab) + 1;
|
| - GURL url = GetTestUrl(L"workers", L"many_workers.html");
|
| - url = GURL(url.spec() + StringPrintf("?count=%d", max_workers_per_tab));
|
| -
|
| - scoped_refptr<TabProxy> tab(GetActiveTab());
|
| - ASSERT_TRUE(tab.get());
|
| - ASSERT_TRUE(tab->NavigateToURL(url));
|
| - scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
|
| - for (int i = 1; i < tab_count; ++i)
|
| - window->AppendTab(url);
|
| -
|
| - // Check that we didn't create more than the max number of workers.
|
| - EXPECT_EQ(total_workers + 1 + (UITest::in_process_renderer() ? 0 : tab_count),
|
| - UITest::GetBrowserProcessCount());
|
| -
|
| - // Now close the first tab and check that the queued workers were started.
|
| - tab->Close(true);
|
| - tab->NavigateToURL(GetTestUrl(L"google", L"google.html"));
|
| -
|
| - EXPECT_EQ(total_workers + 1 + (UITest::in_process_renderer() ? 0 : tab_count),
|
| - UITest::GetBrowserProcessCount());
|
| -}
|
| +#endif // CHROME_TEST_UI_UI_LAYOUT_TEST_H_
|
|
|