| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/google_apis/test_server/http_server.h" | 5 #include "chrome/browser/google_apis/test_server/http_server.h" |
| 6 | 6 |
| 7 #include "base/stringprintf.h" | 7 #include "base/stringprintf.h" |
| 8 #include "base/threading/thread.h" | 8 #include "base/threading/thread.h" |
| 9 #include "chrome/browser/google_apis/test_util.h" | 9 #include "chrome/browser/google_apis/test_util.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 message_loop_.Quit(); | 72 message_loop_.Quit(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 // Waits until the specified number of responses are received. | 75 // Waits until the specified number of responses are received. |
| 76 void WaitForResponses(int num_responses) { | 76 void WaitForResponses(int num_responses) { |
| 77 num_responses_received_ = 0; | 77 num_responses_received_ = 0; |
| 78 num_responses_expected_ = num_responses; | 78 num_responses_expected_ = num_responses; |
| 79 message_loop_.Run(); // Will be terminated in OnURLFetchComplete(). | 79 message_loop_.Run(); // Will be terminated in OnURLFetchComplete(). |
| 80 } | 80 } |
| 81 | 81 |
| 82 // Handles the request and returns a simple text content. Saves the | 82 // Handles |request| sent to |path| and returns the response per |content|, |
| 83 // request URL for verification. | 83 // |content type|, and |code|. Saves the request URL for verification. |
| 84 scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request) { | 84 scoped_ptr<HttpResponse> HandleRequest(const std::string& path, |
| 85 const std::string& content, |
| 86 const std::string& content_type, |
| 87 ResponseCode code, |
| 88 const HttpRequest& request) { |
| 85 request_relative_url_ = request.relative_url; | 89 request_relative_url_ = request.relative_url; |
| 86 | 90 |
| 87 scoped_ptr<HttpResponse> http_response(new HttpResponse); | 91 GURL absolute_url = server_.GetURL(request.relative_url); |
| 88 http_response->set_code(SUCCESS); | 92 if (absolute_url.path() == path) { |
| 89 http_response->set_content("<b>Worked!</b>"); | 93 scoped_ptr<HttpResponse> http_response(new HttpResponse); |
| 90 http_response->set_content_type("text/html"); | 94 http_response->set_code(code); |
| 91 return http_response.Pass(); | 95 http_response->set_content(content); |
| 96 http_response->set_content_type(content_type); |
| 97 return http_response.Pass(); |
| 98 } |
| 99 |
| 100 return scoped_ptr<HttpResponse>(); |
| 92 } | 101 } |
| 93 | 102 |
| 94 protected: | 103 protected: |
| 95 int num_responses_received_; | 104 int num_responses_received_; |
| 96 int num_responses_expected_; | 105 int num_responses_expected_; |
| 97 std::string request_relative_url_; | 106 std::string request_relative_url_; |
| 98 MessageLoopForUI message_loop_; | 107 MessageLoopForUI message_loop_; |
| 99 content::TestBrowserThread ui_thread_; | 108 content::TestBrowserThread ui_thread_; |
| 100 content::TestBrowserThread io_thread_; | 109 content::TestBrowserThread io_thread_; |
| 101 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; | 110 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; |
| 102 HttpServer server_; | 111 HttpServer server_; |
| 103 }; | 112 }; |
| 104 | 113 |
| 105 TEST_F(HttpServerTest, GetBaseURL) { | 114 TEST_F(HttpServerTest, GetBaseURL) { |
| 106 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/", server_.port()), | 115 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/", server_.port()), |
| 107 server_.GetBaseURL().spec()); | 116 server_.GetBaseURL().spec()); |
| 108 } | 117 } |
| 109 | 118 |
| 110 TEST_F(HttpServerTest, GetURL) { | 119 TEST_F(HttpServerTest, GetURL) { |
| 111 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/path?query=foo", | 120 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%d/path?query=foo", |
| 112 server_.port()), | 121 server_.port()), |
| 113 server_.GetURL("/path?query=foo").spec()); | 122 server_.GetURL("/path?query=foo").spec()); |
| 114 } | 123 } |
| 115 | 124 |
| 116 TEST_F(HttpServerTest, RegisterRequestHandler) { | 125 TEST_F(HttpServerTest, RegisterRequestHandler) { |
| 117 server_.RegisterRequestHandler(base::Bind(&HttpServerTest::HandleRequest, | 126 server_.RegisterRequestHandler(base::Bind(&HttpServerTest::HandleRequest, |
| 118 base::Unretained(this))); | 127 base::Unretained(this), |
| 128 "/test", |
| 129 "<b>Worked!</b>", |
| 130 "text/html", |
| 131 SUCCESS)); |
| 119 | 132 |
| 120 scoped_ptr<net::URLFetcher> fetcher( | 133 scoped_ptr<net::URLFetcher> fetcher( |
| 121 net::URLFetcher::Create(server_.GetURL("/test?q=foo"), | 134 net::URLFetcher::Create(server_.GetURL("/test?q=foo"), |
| 122 net::URLFetcher::GET, | 135 net::URLFetcher::GET, |
| 123 this)); | 136 this)); |
| 124 fetcher->SetRequestContext(request_context_getter_.get()); | 137 fetcher->SetRequestContext(request_context_getter_.get()); |
| 125 fetcher->Start(); | 138 fetcher->Start(); |
| 126 WaitForResponses(1); | 139 WaitForResponses(1); |
| 127 | 140 |
| 128 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 141 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
| 129 EXPECT_EQ(SUCCESS, fetcher->GetResponseCode()); | 142 EXPECT_EQ(SUCCESS, fetcher->GetResponseCode()); |
| 130 EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); | 143 EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); |
| 131 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | 144 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); |
| 132 | 145 |
| 133 EXPECT_EQ("/test?q=foo", request_relative_url_); | 146 EXPECT_EQ("/test?q=foo", request_relative_url_); |
| 134 } | 147 } |
| 135 | 148 |
| 136 TEST_F(HttpServerTest, RegisterDefaultResponse) { | |
| 137 HttpResponse http_response; | |
| 138 // MOVED is chosen here, as it's rather an unusual code. | |
| 139 http_response.set_code(MOVED); | |
| 140 http_response.set_content("<b>Moved!</b>"); | |
| 141 http_response.set_content_type("text/html"); | |
| 142 http_response.AddCustomHeader("Server", "test server"); | |
| 143 server_.RegisterDefaultResponse("/test", http_response); | |
| 144 | |
| 145 scoped_ptr<net::URLFetcher> fetcher( | |
| 146 net::URLFetcher::Create(server_.GetURL("/test"), | |
| 147 net::URLFetcher::GET, | |
| 148 this)); | |
| 149 fetcher->SetRequestContext(request_context_getter_.get()); | |
| 150 fetcher->Start(); | |
| 151 WaitForResponses(1); | |
| 152 | |
| 153 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | |
| 154 EXPECT_EQ(MOVED, fetcher->GetResponseCode()); | |
| 155 EXPECT_EQ("<b>Moved!</b>", GetContentFromFetcher(*fetcher)); | |
| 156 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); | |
| 157 const net::HttpResponseHeaders* headers = fetcher->GetResponseHeaders(); | |
| 158 ASSERT_TRUE(headers); | |
| 159 ASSERT_TRUE(headers->HasHeaderValue("Server", "test server")); | |
| 160 } | |
| 161 | |
| 162 TEST_F(HttpServerTest, RegisterTextResponse) { | |
| 163 server_.RegisterTextResponse("/test", | |
| 164 "Raspberry chocolate", | |
| 165 "text/plain", | |
| 166 SUCCESS); | |
| 167 | |
| 168 scoped_ptr<net::URLFetcher> fetcher( | |
| 169 net::URLFetcher::Create(server_.GetURL("/test"), | |
| 170 net::URLFetcher::GET, | |
| 171 this)); | |
| 172 fetcher->SetRequestContext(request_context_getter_.get()); | |
| 173 fetcher->Start(); | |
| 174 WaitForResponses(1); | |
| 175 | |
| 176 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | |
| 177 EXPECT_EQ(SUCCESS, fetcher->GetResponseCode()); | |
| 178 EXPECT_EQ("Raspberry chocolate", GetContentFromFetcher(*fetcher)); | |
| 179 EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher)); | |
| 180 } | |
| 181 | |
| 182 // Test files cannot be opened on Android. | |
| 183 #if !defined(OS_ANDROID) | |
| 184 | |
| 185 TEST_F(HttpServerTest, RegisterFileResponse) { | |
| 186 server_.RegisterFileResponse( | |
| 187 "/test", | |
| 188 test_util::GetTestFilePath("gdata/testfile.txt"), | |
| 189 "text/plain", | |
| 190 SUCCESS); | |
| 191 | |
| 192 scoped_ptr<net::URLFetcher> fetcher( | |
| 193 net::URLFetcher::Create(server_.GetURL("/test"), | |
| 194 net::URLFetcher::GET, | |
| 195 this)); | |
| 196 fetcher->SetRequestContext(request_context_getter_.get()); | |
| 197 fetcher->Start(); | |
| 198 WaitForResponses(1); | |
| 199 | |
| 200 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | |
| 201 EXPECT_EQ(SUCCESS, fetcher->GetResponseCode()); | |
| 202 // Trim the trailing whitespace as it can be CRLF on Windows... | |
| 203 const std::string content = GetContentFromFetcher(*fetcher); | |
| 204 std::string trimmed; | |
| 205 TrimWhitespaceASCII(content, TRIM_TRAILING, &trimmed); | |
| 206 EXPECT_EQ("test file", trimmed); | |
| 207 EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher)); | |
| 208 } | |
| 209 | |
| 210 #endif // !defined(OS_ANDROID) | |
| 211 | |
| 212 TEST_F(HttpServerTest, DefaultNotFoundResponse) { | 149 TEST_F(HttpServerTest, DefaultNotFoundResponse) { |
| 213 scoped_ptr<net::URLFetcher> fetcher( | 150 scoped_ptr<net::URLFetcher> fetcher( |
| 214 net::URLFetcher::Create(server_.GetURL("/non-existent"), | 151 net::URLFetcher::Create(server_.GetURL("/non-existent"), |
| 215 net::URLFetcher::GET, | 152 net::URLFetcher::GET, |
| 216 this)); | 153 this)); |
| 217 fetcher->SetRequestContext(request_context_getter_.get()); | 154 fetcher->SetRequestContext(request_context_getter_.get()); |
| 218 | 155 |
| 219 fetcher->Start(); | 156 fetcher->Start(); |
| 220 WaitForResponses(1); | 157 WaitForResponses(1); |
| 221 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); | 158 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); |
| 222 EXPECT_EQ(NOT_FOUND, fetcher->GetResponseCode()); | 159 EXPECT_EQ(NOT_FOUND, fetcher->GetResponseCode()); |
| 223 } | 160 } |
| 224 | 161 |
| 225 TEST_F(HttpServerTest, ConcurrentFetches) { | 162 TEST_F(HttpServerTest, ConcurrentFetches) { |
| 226 server_.RegisterTextResponse("/test1", | 163 server_.RegisterRequestHandler( |
| 227 "Raspberry chocolate", | 164 base::Bind(&HttpServerTest::HandleRequest, |
| 228 "text/html", | 165 base::Unretained(this), |
| 229 SUCCESS); | 166 "/test1", |
| 230 server_.RegisterTextResponse("/test2", | 167 "Raspberry chocolate", |
| 231 "Vanilla chocolate", | 168 "text/html", |
| 232 "text/html", | 169 SUCCESS)); |
| 233 SUCCESS); | 170 server_.RegisterRequestHandler( |
| 234 server_.RegisterTextResponse("/test3", | 171 base::Bind(&HttpServerTest::HandleRequest, |
| 235 "No chocolates", | 172 base::Unretained(this), |
| 236 "text/plain", | 173 "/test2", |
| 237 NOT_FOUND); | 174 "Vanilla chocolate", |
| 175 "text/html", |
| 176 SUCCESS)); |
| 177 server_.RegisterRequestHandler( |
| 178 base::Bind(&HttpServerTest::HandleRequest, |
| 179 base::Unretained(this), |
| 180 "/test3", |
| 181 "No chocolates", |
| 182 "text/plain", |
| 183 NOT_FOUND)); |
| 238 | 184 |
| 239 scoped_ptr<net::URLFetcher> fetcher1 = scoped_ptr<net::URLFetcher>( | 185 scoped_ptr<net::URLFetcher> fetcher1 = scoped_ptr<net::URLFetcher>( |
| 240 net::URLFetcher::Create(server_.GetURL("/test1"), | 186 net::URLFetcher::Create(server_.GetURL("/test1"), |
| 241 net::URLFetcher::GET, | 187 net::URLFetcher::GET, |
| 242 this)); | 188 this)); |
| 243 fetcher1->SetRequestContext(request_context_getter_.get()); | 189 fetcher1->SetRequestContext(request_context_getter_.get()); |
| 244 scoped_ptr<net::URLFetcher> fetcher2 = scoped_ptr<net::URLFetcher>( | 190 scoped_ptr<net::URLFetcher> fetcher2 = scoped_ptr<net::URLFetcher>( |
| 245 net::URLFetcher::Create(server_.GetURL("/test2"), | 191 net::URLFetcher::Create(server_.GetURL("/test2"), |
| 246 net::URLFetcher::GET, | 192 net::URLFetcher::GET, |
| 247 this)); | 193 this)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 269 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); | 215 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher2)); |
| 270 | 216 |
| 271 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); | 217 EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher3->GetStatus().status()); |
| 272 EXPECT_EQ(NOT_FOUND,fetcher3->GetResponseCode()); | 218 EXPECT_EQ(NOT_FOUND,fetcher3->GetResponseCode()); |
| 273 EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); | 219 EXPECT_EQ("No chocolates", GetContentFromFetcher(*fetcher3)); |
| 274 EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); | 220 EXPECT_EQ("text/plain", GetContentTypeFromFetcher(*fetcher3)); |
| 275 } | 221 } |
| 276 | 222 |
| 277 } // namespace test_server | 223 } // namespace test_server |
| 278 } // namespace google_apis | 224 } // namespace google_apis |
| OLD | NEW |