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 |