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 "components/domain_reliability/uploader.h" | 5 #include "components/domain_reliability/uploader.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <string> | 10 #include <string> |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 } | 84 } |
85 | 85 |
86 void OnStreamRead(int rv) { | 86 void OnStreamRead(int rv) { |
87 EXPECT_EQ(upload_buffer_->size(), rv); | 87 EXPECT_EQ(upload_buffer_->size(), rv); |
88 | 88 |
89 upload_data_ = std::string(upload_buffer_->data(), upload_buffer_->size()); | 89 upload_data_ = std::string(upload_buffer_->data(), upload_buffer_->size()); |
90 upload_buffer_ = nullptr; | 90 upload_buffer_ = nullptr; |
91 | 91 |
92 if (result_.net_error == net::OK) | 92 if (result_.net_error == net::OK) |
93 NotifyHeadersComplete(); | 93 NotifyHeadersComplete(); |
94 else | 94 else if (result_.net_error != net::ERR_IO_PENDING) |
95 NotifyStartError(net::URLRequestStatus::FromError(result_.net_error)); | 95 NotifyStartError(net::URLRequestStatus::FromError(result_.net_error)); |
96 } | 96 } |
97 | 97 |
98 int GetResponseCode() const override { | 98 int GetResponseCode() const override { |
99 return result_.response_code; | 99 return result_.response_code; |
100 } | 100 } |
101 | 101 |
102 void GetResponseInfo(net::HttpResponseInfo* info) override { | 102 void GetResponseInfo(net::HttpResponseInfo* info) override { |
103 info->headers = result_.response_headers; | 103 info->headers = result_.response_headers; |
104 } | 104 } |
105 | 105 |
106 net::UploadDataStream* upload_stream_; | 106 net::UploadDataStream* upload_stream_; |
107 scoped_refptr<net::IOBufferWithSize> upload_buffer_; | 107 scoped_refptr<net::IOBufferWithSize> upload_buffer_; |
108 std::string upload_data_; | 108 std::string upload_data_; |
109 MockUploadResult result_; | 109 MockUploadResult result_; |
110 }; | 110 }; |
111 | 111 |
112 class UploadInterceptor : public net::URLRequestInterceptor { | 112 class UploadInterceptor : public net::URLRequestInterceptor { |
113 public: | 113 public: |
114 UploadInterceptor() : last_upload_depth_(-1) {} | 114 UploadInterceptor() : request_count_(0), last_upload_depth_(-1) {} |
115 | 115 |
116 ~UploadInterceptor() override { | 116 ~UploadInterceptor() override { |
117 EXPECT_TRUE(results_.empty()); | 117 EXPECT_TRUE(results_.empty()); |
118 } | 118 } |
119 | 119 |
120 net::URLRequestJob* MaybeInterceptRequest( | 120 net::URLRequestJob* MaybeInterceptRequest( |
121 net::URLRequest* request, | 121 net::URLRequest* request, |
122 net::NetworkDelegate* delegate) const override { | 122 net::NetworkDelegate* delegate) const override { |
123 EXPECT_FALSE(results_.empty()); | 123 EXPECT_FALSE(results_.empty()); |
124 MockUploadResult result = results_.front(); | 124 MockUploadResult result = results_.front(); |
125 results_.pop_front(); | 125 results_.pop_front(); |
126 | 126 |
127 last_upload_depth_ = | 127 last_upload_depth_ = |
128 DomainReliabilityUploader::GetURLRequestUploadDepth(*request); | 128 DomainReliabilityUploader::GetURLRequestUploadDepth(*request); |
129 | 129 |
| 130 ++request_count_; |
| 131 |
130 return new UploadMockURLRequestJob(request, delegate, result); | 132 return new UploadMockURLRequestJob(request, delegate, result); |
131 } | 133 } |
132 | 134 |
133 void ExpectRequestAndReturnError(int net_error) { | 135 void ExpectRequestAndReturnError(int net_error) { |
134 MockUploadResult result; | 136 MockUploadResult result; |
135 result.net_error = net_error; | 137 result.net_error = net_error; |
136 result.response_code = -1; | 138 result.response_code = -1; |
137 results_.push_back(result); | 139 results_.push_back(result); |
138 } | 140 } |
139 | 141 |
140 void ExpectRequestAndReturnResponseCode(int response_code) { | 142 void ExpectRequestAndReturnResponseCode(int response_code) { |
141 MockUploadResult result; | 143 MockUploadResult result; |
142 result.net_error = net::OK; | 144 result.net_error = net::OK; |
143 result.response_code = response_code; | 145 result.response_code = response_code; |
144 results_.push_back(result); | 146 results_.push_back(result); |
145 } | 147 } |
146 | 148 |
147 void ExpectRequestAndReturnResponseCodeAndHeaders( | 149 void ExpectRequestAndReturnResponseCodeAndHeaders( |
148 int response_code, | 150 int response_code, |
149 const char* headers) { | 151 const char* headers) { |
150 MockUploadResult result; | 152 MockUploadResult result; |
151 result.net_error = net::OK; | 153 result.net_error = net::OK; |
152 result.response_code = response_code; | 154 result.response_code = response_code; |
153 result.response_headers = new net::HttpResponseHeaders( | 155 result.response_headers = new net::HttpResponseHeaders( |
154 net::HttpUtil::AssembleRawHeaders(headers, strlen(headers))); | 156 net::HttpUtil::AssembleRawHeaders(headers, strlen(headers))); |
155 results_.push_back(result); | 157 results_.push_back(result); |
156 } | 158 } |
157 | 159 |
| 160 int request_count() const { return request_count_; } |
158 int last_upload_depth() const { return last_upload_depth_; } | 161 int last_upload_depth() const { return last_upload_depth_; } |
159 | 162 |
160 private: | 163 private: |
161 mutable std::list<MockUploadResult> results_; | 164 mutable std::list<MockUploadResult> results_; |
| 165 mutable int request_count_; |
162 mutable int last_upload_depth_; | 166 mutable int last_upload_depth_; |
163 }; | 167 }; |
164 | 168 |
165 class TestUploadCallback { | 169 class TestUploadCallback { |
166 public: | 170 public: |
167 TestUploadCallback() : called_count_(0u) {} | 171 TestUploadCallback() : called_count_(0u) {} |
168 | 172 |
169 DomainReliabilityUploader::UploadCallback callback() { | 173 DomainReliabilityUploader::UploadCallback callback() { |
170 return base::Bind(&TestUploadCallback::OnCalled, base::Unretained(this)); | 174 return base::Bind(&TestUploadCallback::OnCalled, base::Unretained(this)); |
171 } | 175 } |
(...skipping 25 matching lines...) Expand all Loading... |
197 GURL(kUploadURL), base::WrapUnique(interceptor_)); | 201 GURL(kUploadURL), base::WrapUnique(interceptor_)); |
198 uploader_->set_discard_uploads(false); | 202 uploader_->set_discard_uploads(false); |
199 } | 203 } |
200 | 204 |
201 ~DomainReliabilityUploaderTest() override { | 205 ~DomainReliabilityUploaderTest() override { |
202 net::URLRequestFilter::GetInstance()->ClearHandlers(); | 206 net::URLRequestFilter::GetInstance()->ClearHandlers(); |
203 } | 207 } |
204 | 208 |
205 DomainReliabilityUploader* uploader() const { return uploader_.get(); } | 209 DomainReliabilityUploader* uploader() const { return uploader_.get(); } |
206 UploadInterceptor* interceptor() const { return interceptor_; } | 210 UploadInterceptor* interceptor() const { return interceptor_; } |
| 211 scoped_refptr<net::TestURLRequestContextGetter> |
| 212 url_request_context_getter() { |
| 213 return url_request_context_getter_; |
| 214 } |
207 | 215 |
208 private: | 216 private: |
209 base::MessageLoopForIO message_loop_; | 217 base::MessageLoopForIO message_loop_; |
210 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; | 218 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; |
211 UploadInterceptor* interceptor_; | 219 UploadInterceptor* interceptor_; |
212 MockTime time_; | 220 MockTime time_; |
213 std::unique_ptr<DomainReliabilityUploader> uploader_; | 221 std::unique_ptr<DomainReliabilityUploader> uploader_; |
214 }; | 222 }; |
215 | 223 |
216 TEST_F(DomainReliabilityUploaderTest, Null) { | 224 TEST_F(DomainReliabilityUploaderTest, Null) { |
| 225 uploader()->Shutdown(); |
217 } | 226 } |
218 | 227 |
219 TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) { | 228 TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) { |
220 interceptor()->ExpectRequestAndReturnResponseCode(200); | 229 interceptor()->ExpectRequestAndReturnResponseCode(200); |
221 | 230 |
222 TestUploadCallback c; | 231 TestUploadCallback c; |
223 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 232 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
224 base::RunLoop().RunUntilIdle(); | 233 base::RunLoop().RunUntilIdle(); |
225 EXPECT_EQ(1u, c.called_count()); | 234 EXPECT_EQ(1u, c.called_count()); |
226 EXPECT_TRUE(c.last_result().is_success()); | 235 EXPECT_TRUE(c.last_result().is_success()); |
| 236 |
| 237 uploader()->Shutdown(); |
227 } | 238 } |
228 | 239 |
229 TEST_F(DomainReliabilityUploaderTest, NetworkErrorUpload) { | 240 TEST_F(DomainReliabilityUploaderTest, NetworkErrorUpload) { |
230 interceptor()->ExpectRequestAndReturnError(net::ERR_CONNECTION_REFUSED); | 241 interceptor()->ExpectRequestAndReturnError(net::ERR_CONNECTION_REFUSED); |
231 | 242 |
232 TestUploadCallback c; | 243 TestUploadCallback c; |
233 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 244 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
234 base::RunLoop().RunUntilIdle(); | 245 base::RunLoop().RunUntilIdle(); |
235 EXPECT_EQ(1u, c.called_count()); | 246 EXPECT_EQ(1u, c.called_count()); |
236 EXPECT_TRUE(c.last_result().is_failure()); | 247 EXPECT_TRUE(c.last_result().is_failure()); |
| 248 |
| 249 uploader()->Shutdown(); |
237 } | 250 } |
238 | 251 |
239 TEST_F(DomainReliabilityUploaderTest, ServerErrorUpload) { | 252 TEST_F(DomainReliabilityUploaderTest, ServerErrorUpload) { |
240 interceptor()->ExpectRequestAndReturnResponseCode(500); | 253 interceptor()->ExpectRequestAndReturnResponseCode(500); |
241 | 254 |
242 TestUploadCallback c; | 255 TestUploadCallback c; |
243 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 256 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
244 base::RunLoop().RunUntilIdle(); | 257 base::RunLoop().RunUntilIdle(); |
245 EXPECT_EQ(1u, c.called_count()); | 258 EXPECT_EQ(1u, c.called_count()); |
246 EXPECT_TRUE(c.last_result().is_failure()); | 259 EXPECT_TRUE(c.last_result().is_failure()); |
| 260 |
| 261 uploader()->Shutdown(); |
247 } | 262 } |
248 | 263 |
249 TEST_F(DomainReliabilityUploaderTest, RetryAfterUpload) { | 264 TEST_F(DomainReliabilityUploaderTest, RetryAfterUpload) { |
250 interceptor()->ExpectRequestAndReturnResponseCodeAndHeaders( | 265 interceptor()->ExpectRequestAndReturnResponseCodeAndHeaders( |
251 503, | 266 503, |
252 "HTTP/1.1 503 Ugh\nRetry-After: 3600\n\n"); | 267 "HTTP/1.1 503 Ugh\nRetry-After: 3600\n\n"); |
253 | 268 |
254 TestUploadCallback c; | 269 TestUploadCallback c; |
255 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 270 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
256 base::RunLoop().RunUntilIdle(); | 271 base::RunLoop().RunUntilIdle(); |
257 EXPECT_EQ(1u, c.called_count()); | 272 EXPECT_EQ(1u, c.called_count()); |
258 EXPECT_TRUE(c.last_result().is_retry_after()); | 273 EXPECT_TRUE(c.last_result().is_retry_after()); |
| 274 |
| 275 uploader()->Shutdown(); |
259 } | 276 } |
260 | 277 |
261 TEST_F(DomainReliabilityUploaderTest, UploadDepth1) { | 278 TEST_F(DomainReliabilityUploaderTest, UploadDepth1) { |
262 interceptor()->ExpectRequestAndReturnResponseCode(200); | 279 interceptor()->ExpectRequestAndReturnResponseCode(200); |
263 | 280 |
264 TestUploadCallback c; | 281 TestUploadCallback c; |
265 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 282 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
266 base::RunLoop().RunUntilIdle(); | 283 base::RunLoop().RunUntilIdle(); |
267 EXPECT_EQ(1u, c.called_count()); | 284 EXPECT_EQ(1u, c.called_count()); |
268 | 285 |
269 EXPECT_EQ(1, interceptor()->last_upload_depth()); | 286 EXPECT_EQ(1, interceptor()->last_upload_depth()); |
| 287 |
| 288 uploader()->Shutdown(); |
270 } | 289 } |
271 | 290 |
272 TEST_F(DomainReliabilityUploaderTest, UploadDepth2) { | 291 TEST_F(DomainReliabilityUploaderTest, UploadDepth2) { |
273 interceptor()->ExpectRequestAndReturnResponseCode(200); | 292 interceptor()->ExpectRequestAndReturnResponseCode(200); |
274 | 293 |
275 TestUploadCallback c; | 294 TestUploadCallback c; |
276 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); | 295 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); |
277 base::RunLoop().RunUntilIdle(); | 296 base::RunLoop().RunUntilIdle(); |
278 EXPECT_EQ(1u, c.called_count()); | 297 EXPECT_EQ(1u, c.called_count()); |
279 | 298 |
280 EXPECT_EQ(2, interceptor()->last_upload_depth()); | 299 EXPECT_EQ(2, interceptor()->last_upload_depth()); |
| 300 |
| 301 uploader()->Shutdown(); |
| 302 } |
| 303 |
| 304 TEST_F(DomainReliabilityUploaderTest, UploadCanceledAtShutdown) { |
| 305 interceptor()->ExpectRequestAndReturnError(net::ERR_IO_PENDING); |
| 306 |
| 307 TestUploadCallback c; |
| 308 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); |
| 309 base::RunLoop().RunUntilIdle(); |
| 310 EXPECT_EQ(1, interceptor()->request_count()); |
| 311 EXPECT_EQ(0u, c.called_count()); |
| 312 |
| 313 uploader()->Shutdown(); |
| 314 |
| 315 EXPECT_EQ(0u, c.called_count()); |
| 316 |
| 317 url_request_context_getter()->GetURLRequestContext()->AssertNoURLRequests(); |
| 318 } |
| 319 |
| 320 TEST_F(DomainReliabilityUploaderTest, NoUploadAfterShutdown) { |
| 321 uploader()->Shutdown(); |
| 322 |
| 323 TestUploadCallback c; |
| 324 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); |
| 325 base::RunLoop().RunUntilIdle(); |
| 326 EXPECT_EQ(1u, c.called_count()); |
| 327 EXPECT_EQ(0, interceptor()->request_count()); |
281 } | 328 } |
282 | 329 |
283 } // namespace | 330 } // namespace |
284 } // namespace domain_reliability | 331 } // namespace domain_reliability |
OLD | NEW |