| 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 |