OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/url_request/report_sender.h" | 5 #include "net/url_request/report_sender.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 | 60 |
61 // A network delegate that lets tests check that a report | 61 // A network delegate that lets tests check that a report |
62 // was sent. It counts the number of requests and lets tests register a | 62 // was sent. It counts the number of requests and lets tests register a |
63 // callback to run when the request is destroyed. It also checks that | 63 // callback to run when the request is destroyed. It also checks that |
64 // the uploaded data is as expected. | 64 // the uploaded data is as expected. |
65 class TestReportSenderNetworkDelegate : public NetworkDelegateImpl { | 65 class TestReportSenderNetworkDelegate : public NetworkDelegateImpl { |
66 public: | 66 public: |
67 TestReportSenderNetworkDelegate() | 67 TestReportSenderNetworkDelegate() |
68 : url_request_destroyed_callback_(base::Bind(&base::DoNothing)), | 68 : url_request_destroyed_callback_(base::Bind(&base::DoNothing)), |
69 all_url_requests_destroyed_callback_(base::Bind(&base::DoNothing)), | 69 all_url_requests_destroyed_callback_(base::Bind(&base::DoNothing)), |
70 num_requests_(0), | 70 num_requests_(0) {} |
71 expect_cookies_(false) {} | |
72 | 71 |
73 void ExpectReport(const std::string& report) { | 72 void ExpectReport(const std::string& report) { |
74 expect_reports_.insert(report); | 73 expect_reports_.insert(report); |
75 } | 74 } |
76 | 75 |
77 void set_all_url_requests_destroyed_callback(const base::Closure& callback) { | 76 void set_all_url_requests_destroyed_callback(const base::Closure& callback) { |
78 all_url_requests_destroyed_callback_ = callback; | 77 all_url_requests_destroyed_callback_ = callback; |
79 } | 78 } |
80 | 79 |
81 void set_url_request_destroyed_callback(const base::Closure& callback) { | 80 void set_url_request_destroyed_callback(const base::Closure& callback) { |
82 url_request_destroyed_callback_ = callback; | 81 url_request_destroyed_callback_ = callback; |
83 } | 82 } |
84 | 83 |
85 void set_expect_url(const GURL& expect_url) { expect_url_ = expect_url; } | 84 void set_expect_url(const GURL& expect_url) { expect_url_ = expect_url; } |
86 | 85 |
87 size_t num_requests() const { return num_requests_; } | 86 size_t num_requests() const { return num_requests_; } |
88 | 87 |
89 // Sets whether cookies are expected to be sent on requests. | |
90 void set_expect_cookies(bool expect_cookies) { | |
91 expect_cookies_ = expect_cookies; | |
92 } | |
93 | |
94 void set_expected_content_type(const std::string& content_type) { | 88 void set_expected_content_type(const std::string& content_type) { |
95 expected_content_type_ = content_type; | 89 expected_content_type_ = content_type; |
96 } | 90 } |
97 | 91 |
98 // NetworkDelegateImpl implementation. | 92 // NetworkDelegateImpl implementation. |
99 int OnBeforeURLRequest(URLRequest* request, | 93 int OnBeforeURLRequest(URLRequest* request, |
100 const CompletionCallback& callback, | 94 const CompletionCallback& callback, |
101 GURL* new_url) override { | 95 GURL* new_url) override { |
102 num_requests_++; | 96 num_requests_++; |
103 EXPECT_EQ(expect_url_, request->url()); | 97 EXPECT_EQ(expect_url_, request->url()); |
104 EXPECT_STRCASEEQ("POST", request->method().data()); | 98 EXPECT_STRCASEEQ("POST", request->method().data()); |
105 | 99 EXPECT_TRUE(request->load_flags() & LOAD_DO_NOT_SEND_COOKIES); |
106 if (expect_cookies_) { | 100 EXPECT_TRUE(request->load_flags() & LOAD_DO_NOT_SAVE_COOKIES); |
107 EXPECT_FALSE(request->load_flags() & LOAD_DO_NOT_SEND_COOKIES); | |
108 EXPECT_FALSE(request->load_flags() & LOAD_DO_NOT_SAVE_COOKIES); | |
109 } else { | |
110 EXPECT_TRUE(request->load_flags() & LOAD_DO_NOT_SEND_COOKIES); | |
111 EXPECT_TRUE(request->load_flags() & LOAD_DO_NOT_SAVE_COOKIES); | |
112 } | |
113 | 101 |
114 const HttpRequestHeaders& extra_headers = request->extra_request_headers(); | 102 const HttpRequestHeaders& extra_headers = request->extra_request_headers(); |
115 std::string content_type; | 103 std::string content_type; |
116 EXPECT_TRUE(extra_headers.GetHeader(HttpRequestHeaders::kContentType, | 104 EXPECT_TRUE(extra_headers.GetHeader(HttpRequestHeaders::kContentType, |
117 &content_type)); | 105 &content_type)); |
118 EXPECT_EQ(expected_content_type_, content_type); | 106 EXPECT_EQ(expected_content_type_, content_type); |
119 | 107 |
120 CheckUploadData(*request, &expect_reports_); | 108 CheckUploadData(*request, &expect_reports_); |
121 | 109 |
122 // Unconditionally return OK, since the sender ignores the results | 110 // Unconditionally return OK, since the sender ignores the results |
123 // anyway. | 111 // anyway. |
124 return OK; | 112 return OK; |
125 } | 113 } |
126 | 114 |
127 void OnURLRequestDestroyed(URLRequest* request) override { | 115 void OnURLRequestDestroyed(URLRequest* request) override { |
128 url_request_destroyed_callback_.Run(); | 116 url_request_destroyed_callback_.Run(); |
129 if (expect_reports_.empty()) | 117 if (expect_reports_.empty()) |
130 all_url_requests_destroyed_callback_.Run(); | 118 all_url_requests_destroyed_callback_.Run(); |
131 } | 119 } |
132 | 120 |
133 private: | 121 private: |
134 base::Closure url_request_destroyed_callback_; | 122 base::Closure url_request_destroyed_callback_; |
135 base::Closure all_url_requests_destroyed_callback_; | 123 base::Closure all_url_requests_destroyed_callback_; |
136 size_t num_requests_; | 124 size_t num_requests_; |
137 GURL expect_url_; | 125 GURL expect_url_; |
138 std::set<std::string> expect_reports_; | 126 std::set<std::string> expect_reports_; |
139 bool expect_cookies_; | |
140 std::string expected_content_type_; | 127 std::string expected_content_type_; |
141 | 128 |
142 DISALLOW_COPY_AND_ASSIGN(TestReportSenderNetworkDelegate); | 129 DISALLOW_COPY_AND_ASSIGN(TestReportSenderNetworkDelegate); |
143 }; | 130 }; |
144 | 131 |
145 class ReportSenderTest : public ::testing::Test { | 132 class ReportSenderTest : public ::testing::Test { |
146 public: | 133 public: |
147 ReportSenderTest() : context_(true) { | 134 ReportSenderTest() : context_(true) { |
148 context_.set_network_delegate(&network_delegate_); | 135 context_.set_network_delegate(&network_delegate_); |
149 context_.Init(); | 136 context_.Init(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 TestReportSenderNetworkDelegate network_delegate_; | 185 TestReportSenderNetworkDelegate network_delegate_; |
199 | 186 |
200 private: | 187 private: |
201 TestURLRequestContext context_; | 188 TestURLRequestContext context_; |
202 }; | 189 }; |
203 | 190 |
204 // Test that ReportSender::Send creates a URLRequest for the | 191 // Test that ReportSender::Send creates a URLRequest for the |
205 // endpoint and sends the expected data. | 192 // endpoint and sends the expected data. |
206 TEST_F(ReportSenderTest, SendsRequest) { | 193 TEST_F(ReportSenderTest, SendsRequest) { |
207 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | 194 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); |
208 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 195 ReportSender reporter(context()); |
209 SendReport(&reporter, kDummyReport, url, 0); | 196 SendReport(&reporter, kDummyReport, url, 0); |
210 } | 197 } |
211 | 198 |
212 TEST_F(ReportSenderTest, SendMultipleReportsSequentially) { | 199 TEST_F(ReportSenderTest, SendMultipleReportsSequentially) { |
213 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | 200 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); |
214 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 201 ReportSender reporter(context()); |
215 SendReport(&reporter, kDummyReport, url, 0); | 202 SendReport(&reporter, kDummyReport, url, 0); |
216 SendReport(&reporter, kDummyReport, url, 1); | 203 SendReport(&reporter, kDummyReport, url, 1); |
217 } | 204 } |
218 | 205 |
219 TEST_F(ReportSenderTest, SendMultipleReportsSimultaneously) { | 206 TEST_F(ReportSenderTest, SendMultipleReportsSimultaneously) { |
220 base::RunLoop run_loop; | 207 base::RunLoop run_loop; |
221 network_delegate_.set_all_url_requests_destroyed_callback( | 208 network_delegate_.set_all_url_requests_destroyed_callback( |
222 run_loop.QuitClosure()); | 209 run_loop.QuitClosure()); |
223 | 210 |
224 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | 211 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); |
225 network_delegate_.set_expect_url(url); | 212 network_delegate_.set_expect_url(url); |
226 network_delegate_.ExpectReport(kDummyReport); | 213 network_delegate_.ExpectReport(kDummyReport); |
227 network_delegate_.ExpectReport(kSecondDummyReport); | 214 network_delegate_.ExpectReport(kSecondDummyReport); |
228 network_delegate_.set_expected_content_type("application/foobar"); | 215 network_delegate_.set_expected_content_type("application/foobar"); |
229 | 216 |
230 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 217 ReportSender reporter(context()); |
231 | 218 |
232 EXPECT_EQ(0u, network_delegate_.num_requests()); | 219 EXPECT_EQ(0u, network_delegate_.num_requests()); |
233 | 220 |
234 reporter.Send(url, "application/foobar", kDummyReport, base::Closure(), | 221 reporter.Send(url, "application/foobar", kDummyReport, base::Closure(), |
235 base::Callback<void(const GURL&, int)>()); | 222 base::Callback<void(const GURL&, int)>()); |
236 reporter.Send(url, "application/foobar", kSecondDummyReport, base::Closure(), | 223 reporter.Send(url, "application/foobar", kSecondDummyReport, base::Closure(), |
237 base::Callback<void(const GURL&, int)>()); | 224 base::Callback<void(const GURL&, int)>()); |
238 | 225 |
239 run_loop.Run(); | 226 run_loop.Run(); |
240 | 227 |
241 EXPECT_EQ(2u, network_delegate_.num_requests()); | 228 EXPECT_EQ(2u, network_delegate_.num_requests()); |
242 } | 229 } |
243 | 230 |
244 // Test that pending URLRequests get cleaned up when the report sender | 231 // Test that pending URLRequests get cleaned up when the report sender |
245 // is deleted. | 232 // is deleted. |
246 TEST_F(ReportSenderTest, PendingRequestGetsDeleted) { | 233 TEST_F(ReportSenderTest, PendingRequestGetsDeleted) { |
247 bool url_request_destroyed = false; | 234 bool url_request_destroyed = false; |
248 network_delegate_.set_url_request_destroyed_callback(base::Bind( | 235 network_delegate_.set_url_request_destroyed_callback(base::Bind( |
249 &MarkURLRequestDestroyed, base::Unretained(&url_request_destroyed))); | 236 &MarkURLRequestDestroyed, base::Unretained(&url_request_destroyed))); |
250 | 237 |
251 GURL url = URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( | 238 GURL url = URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( |
252 URLRequestFailedJob::START, ERR_IO_PENDING); | 239 URLRequestFailedJob::START, ERR_IO_PENDING); |
253 network_delegate_.set_expect_url(url); | 240 network_delegate_.set_expect_url(url); |
254 network_delegate_.ExpectReport(kDummyReport); | 241 network_delegate_.ExpectReport(kDummyReport); |
255 network_delegate_.set_expected_content_type("application/foobar"); | 242 network_delegate_.set_expected_content_type("application/foobar"); |
256 | 243 |
257 EXPECT_EQ(0u, network_delegate_.num_requests()); | 244 EXPECT_EQ(0u, network_delegate_.num_requests()); |
258 | 245 |
259 std::unique_ptr<ReportSender> reporter( | 246 std::unique_ptr<ReportSender> reporter(new ReportSender(context())); |
260 new ReportSender(context(), ReportSender::DO_NOT_SEND_COOKIES)); | |
261 reporter->Send(url, "application/foobar", kDummyReport, base::Closure(), | 247 reporter->Send(url, "application/foobar", kDummyReport, base::Closure(), |
262 base::Callback<void(const GURL&, int)>()); | 248 base::Callback<void(const GURL&, int)>()); |
263 reporter.reset(); | 249 reporter.reset(); |
264 | 250 |
265 EXPECT_EQ(1u, network_delegate_.num_requests()); | 251 EXPECT_EQ(1u, network_delegate_.num_requests()); |
266 EXPECT_TRUE(url_request_destroyed); | 252 EXPECT_TRUE(url_request_destroyed); |
267 } | 253 } |
268 | 254 |
269 // Test that a request that returns an error gets cleaned up. | 255 // Test that a request that returns an error gets cleaned up. |
270 TEST_F(ReportSenderTest, ErroredRequestGetsDeleted) { | 256 TEST_F(ReportSenderTest, ErroredRequestGetsDeleted) { |
271 GURL url = URLRequestFailedJob::GetMockHttpsUrl(ERR_FAILED); | 257 GURL url = URLRequestFailedJob::GetMockHttpsUrl(ERR_FAILED); |
272 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 258 ReportSender reporter(context()); |
273 // SendReport will block until the URLRequest is destroyed. | 259 // SendReport will block until the URLRequest is destroyed. |
274 SendReport(&reporter, kDummyReport, url, 0); | 260 SendReport(&reporter, kDummyReport, url, 0); |
275 } | 261 } |
276 | 262 |
277 // Test that the error callback, if provided, gets called when a request | 263 // Test that the error callback, if provided, gets called when a request |
278 // returns an error and the success callback doesn't get called. | 264 // returns an error and the success callback doesn't get called. |
279 TEST_F(ReportSenderTest, ErroredRequestCallsErrorCallback) { | 265 TEST_F(ReportSenderTest, ErroredRequestCallsErrorCallback) { |
280 bool error_callback_called = false; | 266 bool error_callback_called = false; |
281 bool success_callback_called = false; | 267 bool success_callback_called = false; |
282 GURL url = URLRequestFailedJob::GetMockHttpsUrl(ERR_FAILED); | 268 GURL url = URLRequestFailedJob::GetMockHttpsUrl(ERR_FAILED); |
283 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 269 ReportSender reporter(context()); |
284 // SendReport will block until the URLRequest is destroyed. | 270 // SendReport will block until the URLRequest is destroyed. |
285 SendReport(&reporter, kDummyReport, url, 0, | 271 SendReport(&reporter, kDummyReport, url, 0, |
286 base::Bind(SuccessCallback, &success_callback_called), | 272 base::Bind(SuccessCallback, &success_callback_called), |
287 base::Bind(ErrorCallback, &error_callback_called)); | 273 base::Bind(ErrorCallback, &error_callback_called)); |
288 EXPECT_TRUE(error_callback_called); | 274 EXPECT_TRUE(error_callback_called); |
289 EXPECT_FALSE(success_callback_called); | 275 EXPECT_FALSE(success_callback_called); |
290 } | 276 } |
291 | 277 |
292 // Test that the error callback does not get called and the success callback | 278 // Test that the error callback does not get called and the success callback |
293 /// gets called when a request does not return an error. | 279 /// gets called when a request does not return an error. |
294 TEST_F(ReportSenderTest, SuccessfulRequestCallsSuccessCallback) { | 280 TEST_F(ReportSenderTest, SuccessfulRequestCallsSuccessCallback) { |
295 bool error_callback_called = false; | 281 bool error_callback_called = false; |
296 bool success_callback_called = false; | 282 bool success_callback_called = false; |
297 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | 283 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); |
298 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | 284 ReportSender reporter(context()); |
299 SendReport(&reporter, kDummyReport, url, 0, | 285 SendReport(&reporter, kDummyReport, url, 0, |
300 base::Bind(SuccessCallback, &success_callback_called), | 286 base::Bind(SuccessCallback, &success_callback_called), |
301 base::Bind(ErrorCallback, &error_callback_called)); | 287 base::Bind(ErrorCallback, &error_callback_called)); |
302 EXPECT_FALSE(error_callback_called); | 288 EXPECT_FALSE(error_callback_called); |
303 EXPECT_TRUE(success_callback_called); | 289 EXPECT_TRUE(success_callback_called); |
304 } | 290 } |
305 | 291 |
306 // Test that cookies are sent or not sent according to the error | |
307 // reporter's cookies preference. | |
308 | |
309 TEST_F(ReportSenderTest, SendCookiesPreference) { | |
310 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | |
311 ReportSender reporter(context(), ReportSender::SEND_COOKIES); | |
312 | |
313 network_delegate_.set_expect_cookies(true); | |
314 SendReport(&reporter, kDummyReport, url, 0); | |
315 } | |
316 | |
317 TEST_F(ReportSenderTest, DoNotSendCookiesPreference) { | |
318 GURL url = URLRequestMockDataJob::GetMockHttpsUrl("dummy data", 1); | |
319 ReportSender reporter(context(), ReportSender::DO_NOT_SEND_COOKIES); | |
320 | |
321 network_delegate_.set_expect_cookies(false); | |
322 SendReport(&reporter, kDummyReport, url, 0); | |
323 } | |
324 | |
325 } // namespace | 292 } // namespace |
326 } // namespace net | 293 } // namespace net |
OLD | NEW |