Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: net/reporting/reporting_uploader_unittest.cc

Issue 2723563002: Reporting: Implement uploader. (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/reporting/reporting_uploader.h"
6
7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/run_loop.h"
10 #include "net/cookies/cookie_store.h"
11 #include "net/cookies/cookie_store_test_callbacks.h"
12 #include "net/http/http_status_code.h"
13 #include "net/test/embedded_test_server/embedded_test_server.h"
14 #include "net/test/embedded_test_server/http_request.h"
15 #include "net/test/embedded_test_server/http_response.h"
16 #include "net/url_request/url_request_test_util.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace net {
20 namespace {
21
22 class ReportingUploaderTest : public ::testing::Test {
23 protected:
24 ReportingUploaderTest()
25 : server_(test_server::EmbeddedTestServer::TYPE_HTTPS),
26 uploader_(ReportingUploader::Create(&context_)) {}
27
28 TestURLRequestContext context_;
29 test_server::EmbeddedTestServer server_;
30 std::unique_ptr<ReportingUploader> uploader_;
31 };
32
33 const char kUploadBody[] = "{}";
34
35 void CheckUpload(const test_server::HttpRequest& request) {
36 EXPECT_EQ("POST", request.method_string);
37 auto it = request.headers.find("Content-Type");
38 EXPECT_TRUE(it != request.headers.end());
39 EXPECT_EQ(ReportingUploader::kUploadContentType, it->second);
40 EXPECT_TRUE(request.has_content);
41 EXPECT_EQ(kUploadBody, request.content);
42 }
43
44 std::unique_ptr<test_server::HttpResponse> ReturnResponse(
45 HttpStatusCode code,
46 const test_server::HttpRequest& request) {
47 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
48 response->set_code(code);
49 response->set_content("");
50 response->set_content_type("text/plain");
51 return std::move(response);
52 }
53
54 std::unique_ptr<test_server::HttpResponse> ReturnInvalidResponse(
55 const test_server::HttpRequest& request) {
56 return base::MakeUnique<test_server::RawHttpResponse>(
57 "", "Not a valid HTTP response.");
58 }
59
60 class TestUploadCallback {
61 public:
62 TestUploadCallback() : called_(false), waiting_(false) {}
63
64 ReportingUploader::Callback callback() {
65 return base::Bind(&TestUploadCallback::OnUploadComplete,
66 base::Unretained(this));
67 }
68
69 void WaitForCall() {
70 if (called_)
71 return;
72
73 base::RunLoop run_loop;
74
75 waiting_ = true;
76 closure_ = run_loop.QuitClosure();
77 run_loop.Run();
78 }
79
80 ReportingUploader::Outcome outcome() const { return outcome_; }
81
82 private:
83 void OnUploadComplete(ReportingUploader::Outcome outcome) {
84 EXPECT_FALSE(called_);
85
86 called_ = true;
87 outcome_ = outcome;
88
89 if (waiting_) {
90 waiting_ = false;
91 closure_.Run();
92 }
93 }
94
95 bool called_;
96 ReportingUploader::Outcome outcome_;
97
98 bool waiting_;
99 base::Closure closure_;
100 };
101
102 TEST_F(ReportingUploaderTest, Upload) {
103 server_.RegisterRequestMonitor(base::Bind(&CheckUpload));
104 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
105 ASSERT_TRUE(server_.Start());
106
107 TestUploadCallback callback;
108 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
109 callback.WaitForCall();
110 }
111
112 TEST_F(ReportingUploaderTest, Success) {
113 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
114 ASSERT_TRUE(server_.Start());
115
116 TestUploadCallback callback;
117 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
118 callback.WaitForCall();
119
120 EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
121 }
122
123 TEST_F(ReportingUploaderTest, NetworkError1) {
124 ASSERT_TRUE(server_.Start());
125 GURL url = server_.GetURL("/");
126 ASSERT_TRUE(server_.ShutdownAndWaitUntilComplete());
127
128 TestUploadCallback callback;
129 uploader_->StartUpload(url, kUploadBody, callback.callback());
130 callback.WaitForCall();
131
132 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
133 }
134
135 TEST_F(ReportingUploaderTest, NetworkError2) {
136 server_.RegisterRequestHandler(base::Bind(&ReturnInvalidResponse));
137 ASSERT_TRUE(server_.Start());
138
139 TestUploadCallback callback;
140 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
141 callback.WaitForCall();
142
143 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
144 }
145
146 TEST_F(ReportingUploaderTest, ServerError) {
147 server_.RegisterRequestHandler(
148 base::Bind(&ReturnResponse, HTTP_INTERNAL_SERVER_ERROR));
149 ASSERT_TRUE(server_.Start());
150
151 TestUploadCallback callback;
152 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
153 callback.WaitForCall();
154
155 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
156 }
157
158 TEST_F(ReportingUploaderTest, RemoveEndpoint) {
159 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_GONE));
160 ASSERT_TRUE(server_.Start());
161
162 TestUploadCallback callback;
163 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
164 callback.WaitForCall();
165
166 EXPECT_EQ(ReportingUploader::REMOVE_ENDPOINT, callback.outcome());
167 }
168
169 const char kRedirectPath[] = "/redirect";
170
171 std::unique_ptr<test_server::HttpResponse> ReturnRedirect(
172 const std::string& location,
173 const test_server::HttpRequest& request) {
174 if (request.relative_url != "/")
175 return std::unique_ptr<test_server::HttpResponse>();
176
177 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
178 response->set_code(HTTP_FOUND);
179 response->AddCustomHeader("Location", location);
180 response->set_content(
181 "Thank you, Mario! But our Princess is in another castle.");
182 response->set_content_type("text/plain");
183 return std::move(response);
184 }
185
186 std::unique_ptr<test_server::HttpResponse> CheckRedirect(
187 bool* redirect_followed_out,
188 const test_server::HttpRequest& request) {
189 if (request.relative_url != kRedirectPath)
190 return std::unique_ptr<test_server::HttpResponse>();
191
192 *redirect_followed_out = true;
193 return ReturnResponse(HTTP_OK, request);
194 }
195
196 TEST_F(ReportingUploaderTest, FollowHttpsRedirect) {
197 bool followed = false;
198 server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, kRedirectPath));
199 server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
200 ASSERT_TRUE(server_.Start());
201
202 TestUploadCallback callback;
203 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
204 callback.WaitForCall();
205
206 EXPECT_TRUE(followed);
207 EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
208 }
209
210 TEST_F(ReportingUploaderTest, DontFollowHttpRedirect) {
211 bool followed = false;
212
213 test_server::EmbeddedTestServer http_server_;
214 http_server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
215 ASSERT_TRUE(http_server_.Start());
216
217 const GURL target = http_server_.GetURL(kRedirectPath);
218 server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, target.spec()));
219 ASSERT_TRUE(server_.Start());
220
221 TestUploadCallback callback;
222 uploader_->StartUpload(server_.GetURL("/"), kUploadBody, callback.callback());
223 callback.WaitForCall();
224
225 EXPECT_FALSE(followed);
226 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
227 }
228
229 void CheckNoCookie(const test_server::HttpRequest& request) {
230 auto it = request.headers.find("Cookie");
231 EXPECT_TRUE(it == request.headers.end());
232 }
233
234 TEST_F(ReportingUploaderTest, DontSendCookies) {
235 server_.RegisterRequestMonitor(base::Bind(&CheckNoCookie));
236 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
237 ASSERT_TRUE(server_.Start());
238
239 ResultSavingCookieCallback<bool> cookie_callback;
240 context_.cookie_store()->SetCookieWithOptionsAsync(
241 server_.GetURL("/"), "foo=bar", CookieOptions(),
242 base::Bind(&ResultSavingCookieCallback<bool>::Run,
243 base::Unretained(&cookie_callback)));
244 cookie_callback.WaitUntilDone();
245 ASSERT_TRUE(cookie_callback.result());
246
247 TestUploadCallback upload_callback;
248 uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
249 upload_callback.callback());
250 upload_callback.WaitForCall();
251 }
252
253 std::unique_ptr<test_server::HttpResponse> SendCookie(
254 const test_server::HttpRequest& request) {
255 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
256 response->set_code(HTTP_OK);
257 response->AddCustomHeader("Set-Cookie", "foo=bar");
258 response->set_content("");
259 response->set_content_type("text/plain");
260 return std::move(response);
261 }
262
263 TEST_F(ReportingUploaderTest, DontSaveCookies) {
264 server_.RegisterRequestHandler(base::Bind(&SendCookie));
265 ASSERT_TRUE(server_.Start());
266
267 TestUploadCallback upload_callback;
268 uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
269 upload_callback.callback());
270 upload_callback.WaitForCall();
271
272 GetCookieListCallback cookie_callback;
273 context_.cookie_store()->GetCookieListWithOptionsAsync(
274 server_.GetURL("/"), CookieOptions(),
275 base::Bind(&GetCookieListCallback::Run,
276 base::Unretained(&cookie_callback)));
277 cookie_callback.WaitUntilDone();
278
279 EXPECT_TRUE(cookie_callback.cookies().empty());
280 }
281
282 std::unique_ptr<test_server::HttpResponse> ReturnCacheableResponse(
283 int* request_count_out,
284 const test_server::HttpRequest& request) {
285 ++*request_count_out;
286 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
287 response->set_code(HTTP_OK);
288 response->AddCustomHeader("Cache-Control", "max-age=86400");
289 response->set_content("");
290 response->set_content_type("text/plain");
291 return std::move(response);
292 }
293
294 // TODO(juliatuttle): This passes even if the uploader doesn't set
295 // LOAD_DISABLE_CACHE. Maybe that's okay -- Chromium might not cache POST
296 // responses ever -- but this test should either not exist or be sure that it is
297 // testing actual functionality, not a default.
298 TEST_F(ReportingUploaderTest, DontCacheResponse) {
299 int request_count = 0;
300 server_.RegisterRequestHandler(
301 base::Bind(&ReturnCacheableResponse, &request_count));
302 ASSERT_TRUE(server_.Start());
303
304 {
305 TestUploadCallback callback;
306 uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
307 callback.callback());
308 callback.WaitForCall();
309 }
310 EXPECT_EQ(1, request_count);
311
312 {
313 TestUploadCallback callback;
314 uploader_->StartUpload(server_.GetURL("/"), kUploadBody,
315 callback.callback());
316 callback.WaitForCall();
317 }
318 EXPECT_EQ(2, request_count);
319 }
320
321 } // namespace
322 } // namespace net
OLDNEW
« net/reporting/reporting_uploader.cc ('K') | « net/reporting/reporting_uploader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698