Index: chrome_frame/test/test_with_web_server.h |
diff --git a/chrome_frame/test/test_with_web_server.h b/chrome_frame/test/test_with_web_server.h |
deleted file mode 100644 |
index e909683ebe55994cb72742165fedd24972ed6be8..0000000000000000000000000000000000000000 |
--- a/chrome_frame/test/test_with_web_server.h |
+++ /dev/null |
@@ -1,372 +0,0 @@ |
-// Copyright (c) 2012 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_FRAME_TEST_TEST_WITH_WEB_SERVER_H_ |
-#define CHROME_FRAME_TEST_TEST_WITH_WEB_SERVER_H_ |
- |
-#include <windows.h> |
-#include <string> |
- |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/win/scoped_handle.h" |
-#include "chrome_frame/chrome_tab.h" |
-#include "chrome_frame/test/chrome_frame_test_utils.h" |
-#include "chrome_frame/test/test_server.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-// Specifies the invocation method for CF. |
-class CFInvocation { |
- public: |
- enum Type { |
- NONE = 0, |
- META_TAG, |
- HTTP_HEADER |
- }; |
- |
- CFInvocation(): method_(NONE) {} |
- explicit CFInvocation(Type method): method_(method) {} |
- |
- // Convience methods for creating this class. |
- static CFInvocation None() { return CFInvocation(NONE); } |
- static CFInvocation MetaTag() { return CFInvocation(META_TAG); } |
- static CFInvocation HttpHeader() { return CFInvocation(HTTP_HEADER); } |
- |
- // Returns whether this page does invoke CF. |
- bool invokes_cf() const { |
- return method_ != NONE; |
- } |
- |
- Type type() const { return method_; } |
- |
- private: |
- Type method_; |
-}; |
- |
-// An interface for listeners of interesting events on a MockWebServer. |
-class WebServerListener { |
- public: |
- virtual ~WebServerListener() {} |
- |
- // Invoked when a MockWebServer receives an expected response; see |
- // MockWebServer::ExpectAndHandlePostedResult. |
- virtual void OnExpectedResponse() = 0; |
-}; |
- |
-// Simple Gmock friendly web server. Sample usage: |
-// MockWebServer mock(9999, "0.0.0.0"); |
-// EXPECT_CALL(mock, Get(_, StrEq("/favicon.ico"), _)).WillRepeatedly(SendFast( |
-// "HTTP/1.1 404 Not Found" |
-// "text/html; charset=UTF-8", std::string())); |
-// |
-// EXPECT_CALL(mock, Get(_, StrEq("/book"), _)).WillRepeatedly(Send( |
-// "HTTP/1.1 302 Found\r\n" |
-// "Connection: close\r\n" |
-// "Content-Type: text/html\r\n" |
-// "Location: library\r\n", |
-// "<html>Lalalala</html>", 3, 1000)); |
-// |
-// EXPECT_CALL(mock, Get(_, StrEq("/library"), _)).WillRepeatedly(Send( |
-// "HTTP/1.1 200 OK\r\n" |
-// "Connection: close\r\n" |
-// "Content-Type: text/html\r\n", |
-// "<html><meta http-equiv=\"X-UA-Compatible\" content=\"chrome=1\" />" |
-// "<body>Rendered in CF.</body></html>", 4, 1000)); |
-class MockWebServer : public test_server::HTTPTestServer { |
- public: |
- MockWebServer(int port, const std::wstring& address, base::FilePath root_dir) |
- : test_server::HTTPTestServer(port, address, root_dir), listener_(NULL) {} |
- |
- // Overriden from test_server::HTTPTestServer. |
- MOCK_METHOD3(Get, void(test_server::ConfigurableConnection* connection, |
- const std::wstring& path, |
- const test_server::Request& r)); |
- MOCK_METHOD3(Post, void(test_server::ConfigurableConnection* connection, |
- const std::wstring& path, |
- const test_server::Request& r)); |
- |
- // Expect a GET request for |url|. Respond with the file appropriate for |
- // the given |url|. Modify the file to follow the given CFInvocation method. |
- // The response includes a no-cache header. |allow_meta_tag_double_req| |
- // specifies whether to allow the request to happen twice if the invocation |
- // is using the CF meta tag. |
- void ExpectAndServeRequest(CFInvocation invocation, const std::wstring& url); |
- |
- // Expect a number of GET requests for |url|. Rest is similar to the function |
- // ExpectAndServeRequest. |
- void ExpectAndServeRequestWithCardinality(CFInvocation invocation, |
- const std::wstring& url, |
- testing::Cardinality cardinality); |
- |
- // Same as above except do not include the no-cache header. |
- void ExpectAndServeRequestAllowCache(CFInvocation invocation, |
- const std::wstring& url); |
- |
- // Expect any number of GETs for the given resource path (e.g, /favicon.ico) |
- // and respond with the file, if it exists, or a 404 if it does not. |
- void ExpectAndServeRequestAnyNumberTimes(CFInvocation invocation, |
- const std::wstring& path_prefix); |
- |
- void set_listener(WebServerListener* listener) { listener_ = listener; } |
- |
- // Expect a POST to an URL containing |post_suffix|, saving the response |
- // contents for retrieval by posted_result(). Invokes the listener's |
- // OnExpectedResponse method if the posted response matches the expected |
- // result. |
- void ExpectAndHandlePostedResult(CFInvocation invocation, |
- const std::wstring& post_suffix); |
- |
- // Expect and serve all incoming GET requests. |
- void ExpectAndServeAnyRequests(CFInvocation invocation) { |
- ExpectAndServeRequestAnyNumberTimes(invocation, L""); |
- } |
- |
- |
- // Send a response on the given connection appropriate for |resource_uri|. |
- // If the file referred to by |path| exists, send the file data, otherwise |
- // send 404. Modify the file data according to the given invocation method. |
- void SendResponseHelper(test_server::ConfigurableConnection* connection, |
- const std::wstring& resource_uri, |
- const test_server::Request& request, |
- CFInvocation invocation, |
- bool add_no_cache_header); |
- // Handles the posted /writefile response |
- void HandlePostedResponse(test_server::ConfigurableConnection* connection, |
- const test_server::Request& request); |
- |
- void ClearResults() { |
- posted_result_.clear(); |
- expected_result_.clear(); |
- } |
- |
- void set_expected_result(const std::string& expected_result) { |
- expected_result_ = expected_result; |
- } |
- |
- const std::string& posted_result() const { |
- return posted_result_; |
- } |
- |
- private: |
- WebServerListener* listener_; |
- // Holds the results of tests which post success/failure. |
- std::string posted_result_; |
- std::string expected_result_; |
-}; |
- |
-class MockWebServerListener : public WebServerListener { |
- public: |
- MOCK_METHOD0(OnExpectedResponse, void()); |
-}; |
- |
-// Class that: |
-// 1) Starts the local webserver, |
-// 2) Supports launching browsers - Internet Explorer with local url |
-// 3) Wait the webserver to finish. It is supposed the test webpage to shutdown |
-// the server by navigating to "kill" page |
-// 4) Supports read the posted results from the test webpage to the "dump" |
-// webserver directory |
-class ChromeFrameTestWithWebServer : public testing::Test { |
- public: |
- ChromeFrameTestWithWebServer(); |
- |
- protected: |
- enum BrowserKind { INVALID, IE, CHROME }; |
- |
- bool LaunchBrowser(BrowserKind browser, const wchar_t* url); |
- |
- // Returns true if the test completed in time, or false if it timed out. |
- bool WaitForTestToComplete(base::TimeDelta duration); |
- |
- // Waits for the page to notify us of the window.onload event firing. |
- // Note that the milliseconds value is only approximate. |
- bool WaitForOnLoad(int milliseconds); |
- |
- // Launches the specified browser and waits for the test to complete (see |
- // WaitForTestToComplete). Then checks that the outcome is equal to the |
- // expected result. The test is repeated once if it fails due to a timeout. |
- // This function uses EXPECT_TRUE and ASSERT_TRUE for all steps performed |
- // hence no return value. |
- void SimpleBrowserTestExpectedResult(BrowserKind browser, |
- const wchar_t* page, const char* result); |
- void SimpleBrowserTest(BrowserKind browser, const wchar_t* page); |
- |
- // Sets up expectations for a page to post back a result. |
- void ExpectAndHandlePostedResult(); |
- |
- // Test if chrome frame correctly reports its version. |
- void VersionTest(BrowserKind browser, const wchar_t* page); |
- |
- void CloseBrowser(); |
- |
- // Ensures (well, at least tries to ensure) that the browser window has focus. |
- bool BringBrowserToTop(); |
- |
- const base::FilePath& GetCFTestFilePath() { |
- return test_file_path_; |
- } |
- |
- static chrome_frame_test::TimedMsgLoop& loop() { |
- return *loop_; |
- } |
- |
- static testing::StrictMock<MockWebServerListener>& listener_mock() { |
- return *listener_mock_; |
- } |
- |
- static testing::StrictMock<MockWebServer>& server_mock() { |
- return *server_mock_; |
- } |
- |
- static void SetUpTestCase(); |
- static void TearDownTestCase(); |
- |
- static const base::FilePath& GetChromeUserDataDirectory(); |
- |
- virtual void SetUp() OVERRIDE; |
- virtual void TearDown() OVERRIDE; |
- |
- // The on-disk path to our html test files. |
- static base::FilePath test_file_path_; |
- static base::FilePath results_dir_; |
- static base::FilePath CFInstall_path_; |
- static base::FilePath CFInstance_path_; |
- static base::FilePath chrome_user_data_dir_; |
- |
- // The user data directory used for Chrome instances. |
- static base::ScopedTempDir temp_dir_; |
- |
- // The web server from which we serve the web! |
- static chrome_frame_test::TimedMsgLoop* loop_; |
- static std::string local_address_; |
- static testing::StrictMock<MockWebServerListener>* listener_mock_; |
- static testing::StrictMock<MockWebServer>* server_mock_; |
- |
- BrowserKind browser_; |
- base::win::ScopedHandle browser_handle_; |
-}; |
- |
-// A helper class for doing some bookkeeping when using the |
-// SimpleWebServer class. |
-class SimpleWebServerTest { |
- public: |
- SimpleWebServerTest(const std::string& address, int port) |
- : server_(address, port), port_(port) { |
- } |
- |
- ~SimpleWebServerTest() { |
- server_.DeleteAllResponses(); |
- } |
- |
- template <class ResponseClass> |
- void PopulateStaticFileListT(const wchar_t* pages[], int count, |
- const base::FilePath& directory) { |
- for (int i = 0; i < count; ++i) { |
- server_.AddResponse(new ResponseClass( |
- base::StringPrintf("/%ls", pages[i]).c_str(), |
- directory.Append(pages[i]))); |
- } |
- } |
- |
- std::wstring FormatHttpPath(const wchar_t* document_path) { |
- return base::StringPrintf(L"http://%ls:%i/%ls", |
- base::ASCIIToWide(server_.host()).c_str(), port_, |
- document_path); |
- } |
- |
- // Returns the last client request object. |
- // Under normal circumstances this will be the request for /quit. |
- const test_server::Request& last_request() const { |
- const test_server::ConnectionList& connections = server_.connections(); |
- DCHECK(connections.size()); |
- const test_server::Connection* c = connections.back(); |
- return c->request(); |
- } |
- |
- bool FindRequest(const std::string& path, |
- const test_server::Request** request) { |
- test_server::ConnectionList::const_iterator index; |
- for (index = server_.connections().begin(); |
- index != server_.connections().end(); index++) { |
- const test_server::Connection* connection = *index; |
- if (!lstrcmpiA(connection->request().path().c_str(), path.c_str())) { |
- if (request) |
- *request = &connection->request(); |
- return true; |
- } |
- } |
- return false; |
- } |
- |
- // Counts the number of times a page was requested. |
- // Optionally checks if the request method for each is equal to |
- // |expected_method|. If expected_method is NULL no such check is made. |
- int GetRequestCountForPage(const wchar_t* page, const char* expected_method) { |
- // Check how many requests we got for the cf page. |
- test_server::ConnectionList::const_iterator it; |
- int requests = 0; |
- const test_server::ConnectionList& connections = server_.connections(); |
- for (it = connections.begin(); it != connections.end(); ++it) { |
- const test_server::Connection* c = (*it); |
- const test_server::Request& r = c->request(); |
- if (!r.path().empty() && |
- base::ASCIIToWide(r.path().substr(1)).compare(page) == 0) { |
- if (expected_method) { |
- EXPECT_EQ(expected_method, r.method()); |
- } |
- requests++; |
- } |
- } |
- return requests; |
- } |
- |
- test_server::SimpleWebServer* web_server() { |
- return &server_; |
- } |
- |
- protected: |
- test_server::SimpleWebServer server_; |
- int port_; |
-}; |
- |
-ACTION_P2(SendFast, headers, content) { |
- arg0->Send(headers, content); |
-} |
- |
-ACTION_P4(Send, headers, content, chunk, timeout) { |
- test_server::ConfigurableConnection::SendOptions options( |
- test_server::ConfigurableConnection::SendOptions:: |
- IMMEDIATE_HEADERS_DELAYED_CONTENT, chunk, timeout); |
- arg0->SendWithOptions(std::string(headers), |
- std::string(content), |
- options); |
-} |
- |
-ACTION_P4(SendSlow, headers, content, chunk, timeout) { |
- test_server::ConfigurableConnection::SendOptions options( |
- test_server::ConfigurableConnection::SendOptions::DELAYED, chunk, timeout); |
- arg0->SendWithOptions(std::string(headers), |
- std::string(content), |
- options); |
-} |
- |
-// Sends a response with the file data for the given path, if the file exists, |
-// or a 404 if the file does not. This response includes a no-cache header. |
-ACTION_P2(SendResponse, server, invocation) { |
- server->SendResponseHelper(arg0, arg1, arg2, invocation, true); |
-} |
- |
-// Same as above except that the response does not include the no-cache header. |
-ACTION_P2(SendAllowCacheResponse, server, invocation) { |
- server->SendResponseHelper(arg0, arg1, invocation, false); |
-} |
- |
-ACTION_P2(HandlePostedResponseHelper, server, invocation) { |
- server->HandlePostedResponse(arg0, arg2); |
-} |
- |
-#endif // CHROME_FRAME_TEST_TEST_WITH_WEB_SERVER_H_ |