Index: chrome/browser/extensions/extension_apitest.cc |
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc |
index c14182b8a5697b715107a58d4cf0c52a24977fc2..0b126afae8abd0bb35c39c88d9ea8367c5400130 100644 |
--- a/chrome/browser/extensions/extension_apitest.cc |
+++ b/chrome/browser/extensions/extension_apitest.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/extensions/extension_apitest.h" |
+#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "chrome/browser/extensions/api/test/test_api.h" |
@@ -18,7 +19,11 @@ |
#include "chrome/test/base/ui_test_utils.h" |
#include "content/public/browser/notification_registrar.h" |
#include "content/public/browser/notification_service.h" |
+#include "net/base/escape.h" |
#include "net/base/net_util.h" |
+#include "net/test/embedded_test_server/embedded_test_server.h" |
+#include "net/test/embedded_test_server/http_response.h" |
+#include "net/test/embedded_test_server/http_request.h" |
#include "net/test/spawned_test_server/spawned_test_server.h" |
namespace { |
@@ -28,9 +33,108 @@ const char kTestServerPort[] = "testServer.port"; |
const char kTestDataDirectory[] = "testDataDirectory"; |
const char kTestWebSocketPort[] = "testWebSocketPort"; |
+scoped_ptr<net::test_server::HttpResponse> HandleServerRedirectRequest( |
+ const net::test_server::HttpRequest& request) { |
+ if (!StartsWithASCII(request.relative_url, "/server-redirect?", true)) |
+ return scoped_ptr<net::test_server::HttpResponse>(NULL); |
+ |
+ size_t query_string_pos = request.relative_url.find('?'); |
+ std::string redirect_target = |
+ request.relative_url.substr(query_string_pos + 1); |
+ |
+ scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
+ new net::test_server::BasicHttpResponse); |
+ http_response->set_code(net::HTTP_MOVED_PERMANENTLY); |
+ http_response->AddCustomHeader("Location", redirect_target); |
+ return http_response.PassAs<net::test_server::HttpResponse>(); |
+} |
+ |
+scoped_ptr<net::test_server::HttpResponse> HandleEchoHeaderRequest( |
+ const net::test_server::HttpRequest& request) { |
+ if (!StartsWithASCII(request.relative_url, "/echoheader?", true)) |
+ return scoped_ptr<net::test_server::HttpResponse>(NULL); |
+ |
+ size_t query_string_pos = request.relative_url.find('?'); |
+ std::string header_name = |
+ request.relative_url.substr(query_string_pos + 1); |
+ |
+ std::string header_value; |
+ std::map<std::string, std::string>::const_iterator it = request.headers.find( |
+ header_name); |
+ if (it != request.headers.end()) |
+ header_value = it->second; |
+ |
+ scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
+ new net::test_server::BasicHttpResponse); |
+ http_response->set_code(net::HTTP_OK); |
+ http_response->set_content(header_value); |
+ return http_response.PassAs<net::test_server::HttpResponse>(); |
+} |
+ |
+scoped_ptr<net::test_server::HttpResponse> HandleSetCookieRequest( |
+ const net::test_server::HttpRequest& request) { |
+ if (!StartsWithASCII(request.relative_url, "/set-cookie?", true)) |
+ return scoped_ptr<net::test_server::HttpResponse>(NULL); |
+ |
+ scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
+ new net::test_server::BasicHttpResponse); |
+ http_response->set_code(net::HTTP_OK); |
+ |
+ size_t query_string_pos = request.relative_url.find('?'); |
+ std::string cookie_value = |
+ request.relative_url.substr(query_string_pos + 1); |
+ |
+ std::vector<std::string> cookies; |
+ base::SplitString(cookie_value, '&', &cookies); |
+ |
+ for (size_t i = 0; i < cookies.size(); i++) |
+ http_response->AddCustomHeader("Set-Cookie", cookies[i]); |
+ |
+ return http_response.PassAs<net::test_server::HttpResponse>(); |
+} |
+ |
+scoped_ptr<net::test_server::HttpResponse> HandleSetHeaderRequest( |
+ const net::test_server::HttpRequest& request) { |
+ if (!StartsWithASCII(request.relative_url, "/set-header?", true)) |
+ return scoped_ptr<net::test_server::HttpResponse>(NULL); |
+ |
+ size_t query_string_pos = request.relative_url.find('?'); |
+ std::string escaped_header = |
+ request.relative_url.substr(query_string_pos + 1); |
+ |
+ std::string header = |
+ net::UnescapeURLComponent(escaped_header, |
+ net::UnescapeRule::NORMAL | |
+ net::UnescapeRule::SPACES | |
+ net::UnescapeRule::URL_SPECIAL_CHARS); |
+ |
+ size_t colon_pos = header.find(':'); |
+ if (colon_pos == std::string::npos) |
+ return scoped_ptr<net::test_server::HttpResponse>(NULL); |
+ |
+ std::string header_name = header.substr(0, colon_pos); |
+ // Skip space after colon. |
+ std::string header_value = header.substr(colon_pos + 2); |
+ |
+ scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
+ new net::test_server::BasicHttpResponse); |
+ http_response->set_code(net::HTTP_OK); |
+ http_response->AddCustomHeader(header_name, header_value); |
+ return http_response.PassAs<net::test_server::HttpResponse>(); |
+} |
+ |
}; // namespace |
-ExtensionApiTest::ExtensionApiTest() {} |
+ExtensionApiTest::ExtensionApiTest() { |
+ embedded_test_server()->RegisterRequestHandler( |
+ base::Bind(&HandleServerRedirectRequest)); |
+ embedded_test_server()->RegisterRequestHandler( |
+ base::Bind(&HandleEchoHeaderRequest)); |
+ embedded_test_server()->RegisterRequestHandler( |
+ base::Bind(&HandleSetCookieRequest)); |
+ embedded_test_server()->RegisterRequestHandler( |
+ base::Bind(&HandleSetHeaderRequest)); |
+} |
ExtensionApiTest::~ExtensionApiTest() {} |
@@ -305,15 +409,15 @@ const extensions::Extension* ExtensionApiTest::GetSingleLoadedExtension() { |
return extension; |
} |
-bool ExtensionApiTest::StartTestServer() { |
- if (!test_server()->Start()) |
+bool ExtensionApiTest::StartEmbeddedTestServer() { |
+ if (!embedded_test_server()->InitializeAndWaitUntilReady()) |
return false; |
// Build a dictionary of values that tests can use to build URLs that |
// access the test server and local file system. Tests can see these values |
// using the extension API function chrome.test.getConfig(). |
test_config_->SetInteger(kTestServerPort, |
- test_server()->host_port_pair().port()); |
+ embedded_test_server()->port()); |
return true; |
} |