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

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

Issue 2249213002: [OBSOLETE] Reporting: Initial implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Try fixing unittest compile error on Android? Created 3 years, 10 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
« no previous file with comments | « net/reporting/reporting_uploader.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 cases:
103 // don't send cookies
104 // don't save cookies
105 // don't cache response
106
107 TEST_F(ReportingUploaderTest, Upload) {
108 server_.RegisterRequestMonitor(base::Bind(&CheckUpload));
109 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
110 ASSERT_TRUE(server_.Start());
111
112 TestUploadCallback callback;
113 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
114 callback.callback());
115 callback.WaitForCall();
116 }
117
118 TEST_F(ReportingUploaderTest, Success) {
119 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
120 ASSERT_TRUE(server_.Start());
121
122 TestUploadCallback callback;
123 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
124 callback.callback());
125 callback.WaitForCall();
126
127 EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
128 }
129
130 TEST_F(ReportingUploaderTest, NetworkError1) {
131 ASSERT_TRUE(server_.Start());
132 GURL url = server_.GetURL("/");
133 ASSERT_TRUE(server_.ShutdownAndWaitUntilComplete());
134
135 TestUploadCallback callback;
136 uploader_->AttemptDelivery(url, kUploadBody, callback.callback());
137 callback.WaitForCall();
138
139 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
140 }
141
142 TEST_F(ReportingUploaderTest, NetworkError2) {
143 server_.RegisterRequestHandler(base::Bind(&ReturnInvalidResponse));
144 ASSERT_TRUE(server_.Start());
145
146 TestUploadCallback callback;
147 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
148 callback.callback());
149 callback.WaitForCall();
150
151 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
152 }
153
154 TEST_F(ReportingUploaderTest, ServerError) {
155 server_.RegisterRequestHandler(
156 base::Bind(&ReturnResponse, HTTP_INTERNAL_SERVER_ERROR));
157 ASSERT_TRUE(server_.Start());
158
159 TestUploadCallback callback;
160 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
161 callback.callback());
162 callback.WaitForCall();
163
164 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
165 }
166
167 TEST_F(ReportingUploaderTest, RemoveEndpoint) {
168 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_GONE));
169 ASSERT_TRUE(server_.Start());
170
171 TestUploadCallback callback;
172 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
173 callback.callback());
174 callback.WaitForCall();
175
176 EXPECT_EQ(ReportingUploader::REMOVE_ENDPOINT, callback.outcome());
177 }
178
179 const char kRedirectPath[] = "/redirect";
180
181 std::unique_ptr<test_server::HttpResponse> ReturnRedirect(
182 const std::string& location,
183 const test_server::HttpRequest& request) {
184 if (request.relative_url != "/")
185 return std::unique_ptr<test_server::HttpResponse>();
186
187 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
188 response->set_code(HTTP_FOUND);
189 response->AddCustomHeader("Location", location);
190 response->set_content(
191 "Thank you, Mario! But our Princess is in another castle.");
192 response->set_content_type("text/plain");
193 return std::move(response);
194 }
195
196 std::unique_ptr<test_server::HttpResponse> CheckRedirect(
197 bool* redirect_followed_out,
198 const test_server::HttpRequest& request) {
199 if (request.relative_url != kRedirectPath)
200 return std::unique_ptr<test_server::HttpResponse>();
201
202 *redirect_followed_out = true;
203 return ReturnResponse(HTTP_OK, request);
204 }
205
206 TEST_F(ReportingUploaderTest, FollowHttpsRedirect) {
207 bool followed = false;
208 server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, kRedirectPath));
209 server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
210 ASSERT_TRUE(server_.Start());
211
212 TestUploadCallback callback;
213 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
214 callback.callback());
215 callback.WaitForCall();
216
217 EXPECT_TRUE(followed);
218 EXPECT_EQ(ReportingUploader::SUCCESS, callback.outcome());
219 }
220
221 TEST_F(ReportingUploaderTest, DontFollowHttpRedirect) {
222 bool followed = false;
223
224 test_server::EmbeddedTestServer http_server_;
225 http_server_.RegisterRequestHandler(base::Bind(&CheckRedirect, &followed));
226 ASSERT_TRUE(http_server_.Start());
227
228 const GURL target = http_server_.GetURL(kRedirectPath);
229 server_.RegisterRequestHandler(base::Bind(&ReturnRedirect, target.spec()));
230 ASSERT_TRUE(server_.Start());
231
232 TestUploadCallback callback;
233 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
234 callback.callback());
235 callback.WaitForCall();
236
237 EXPECT_FALSE(followed);
238 EXPECT_EQ(ReportingUploader::FAILURE, callback.outcome());
239 }
240
241 void CheckNoCookie(const test_server::HttpRequest& request) {
242 auto it = request.headers.find("Cookie");
243 EXPECT_TRUE(it == request.headers.end());
244 }
245
246 TEST_F(ReportingUploaderTest, DontSendCookies) {
247 server_.RegisterRequestMonitor(base::Bind(&CheckNoCookie));
248 server_.RegisterRequestHandler(base::Bind(&ReturnResponse, HTTP_OK));
249 ASSERT_TRUE(server_.Start());
250
251 ResultSavingCookieCallback<bool> cookie_callback;
252 context_.cookie_store()->SetCookieWithOptionsAsync(
253 server_.GetURL("/"), "foo=bar", CookieOptions(),
254 base::Bind(&ResultSavingCookieCallback<bool>::Run,
255 base::Unretained(&cookie_callback)));
256 cookie_callback.WaitUntilDone();
257 ASSERT_TRUE(cookie_callback.result());
258
259 TestUploadCallback upload_callback;
260 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
261 upload_callback.callback());
262 upload_callback.WaitForCall();
263 }
264
265 std::unique_ptr<test_server::HttpResponse> SendCookie(
266 const test_server::HttpRequest& request) {
267 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
268 response->set_code(HTTP_OK);
269 response->AddCustomHeader("Set-Cookie", "foo=bar");
270 response->set_content("");
271 response->set_content_type("text/plain");
272 return std::move(response);
273 }
274
275 TEST_F(ReportingUploaderTest, DontSaveCookies) {
276 server_.RegisterRequestHandler(base::Bind(&SendCookie));
277 ASSERT_TRUE(server_.Start());
278
279 TestUploadCallback upload_callback;
280 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
281 upload_callback.callback());
282 upload_callback.WaitForCall();
283
284 GetCookieListCallback cookie_callback;
285 context_.cookie_store()->GetCookieListWithOptionsAsync(
286 server_.GetURL("/"), CookieOptions(),
287 base::Bind(&GetCookieListCallback::Run,
288 base::Unretained(&cookie_callback)));
289 cookie_callback.WaitUntilDone();
290
291 EXPECT_TRUE(cookie_callback.cookies().empty());
292 }
293
294 std::unique_ptr<test_server::HttpResponse> ReturnCacheableResponse(
295 int* request_count_out,
296 const test_server::HttpRequest& request) {
297 ++*request_count_out;
298 auto response = base::MakeUnique<test_server::BasicHttpResponse>();
299 response->set_code(HTTP_OK);
300 response->AddCustomHeader("Cache-Control", "max-age=86400");
301 response->set_content("");
302 response->set_content_type("text/plain");
303 return std::move(response);
304 }
305
306 // TODO(juliatuttle): This passes even if the uploader doesn't set
307 // LOAD_DISABLE_CACHE. Maybe that's okay -- Chromium might not cache POST
308 // responses ever -- but this test should either not exist or be sure that it is
309 // testing actual functionality, not a default.
310 TEST_F(ReportingUploaderTest, DontCacheResponse) {
311 int request_count = 0;
312 server_.RegisterRequestHandler(
313 base::Bind(&ReturnCacheableResponse, &request_count));
314 ASSERT_TRUE(server_.Start());
315
316 {
317 TestUploadCallback callback;
318 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
319 callback.callback());
320 callback.WaitForCall();
321 }
322 EXPECT_EQ(1, request_count);
323
324 {
325 TestUploadCallback callback;
326 uploader_->AttemptDelivery(server_.GetURL("/"), kUploadBody,
327 callback.callback());
328 callback.WaitForCall();
329 }
330 EXPECT_EQ(2, request_count);
331 }
332
333 } // namespace
334 } // namespace net
OLDNEW
« no previous file with comments | « net/reporting/reporting_uploader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698