Chromium Code Reviews| 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 | 211 |
| 208 private: | 212 private: |
| 209 base::MessageLoopForIO message_loop_; | 213 base::MessageLoopForIO message_loop_; |
| 210 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; | 214 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; |
| 211 UploadInterceptor* interceptor_; | 215 UploadInterceptor* interceptor_; |
| 212 MockTime time_; | 216 MockTime time_; |
| 213 std::unique_ptr<DomainReliabilityUploader> uploader_; | 217 std::unique_ptr<DomainReliabilityUploader> uploader_; |
| 214 }; | 218 }; |
| 215 | 219 |
| 216 TEST_F(DomainReliabilityUploaderTest, Null) { | 220 TEST_F(DomainReliabilityUploaderTest, Null) { |
| 221 uploader()->Shutdown(); | |
| 217 } | 222 } |
| 218 | 223 |
| 219 TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) { | 224 TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) { |
| 220 interceptor()->ExpectRequestAndReturnResponseCode(200); | 225 interceptor()->ExpectRequestAndReturnResponseCode(200); |
| 221 | 226 |
| 222 TestUploadCallback c; | 227 TestUploadCallback c; |
| 223 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 228 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
| 224 base::RunLoop().RunUntilIdle(); | 229 base::RunLoop().RunUntilIdle(); |
| 225 EXPECT_EQ(1u, c.called_count()); | 230 EXPECT_EQ(1u, c.called_count()); |
| 226 EXPECT_TRUE(c.last_result().is_success()); | 231 EXPECT_TRUE(c.last_result().is_success()); |
| 232 | |
| 233 uploader()->Shutdown(); | |
| 227 } | 234 } |
| 228 | 235 |
| 229 TEST_F(DomainReliabilityUploaderTest, NetworkErrorUpload) { | 236 TEST_F(DomainReliabilityUploaderTest, NetworkErrorUpload) { |
| 230 interceptor()->ExpectRequestAndReturnError(net::ERR_CONNECTION_REFUSED); | 237 interceptor()->ExpectRequestAndReturnError(net::ERR_CONNECTION_REFUSED); |
| 231 | 238 |
| 232 TestUploadCallback c; | 239 TestUploadCallback c; |
| 233 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 240 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
| 234 base::RunLoop().RunUntilIdle(); | 241 base::RunLoop().RunUntilIdle(); |
| 235 EXPECT_EQ(1u, c.called_count()); | 242 EXPECT_EQ(1u, c.called_count()); |
| 236 EXPECT_TRUE(c.last_result().is_failure()); | 243 EXPECT_TRUE(c.last_result().is_failure()); |
| 244 | |
| 245 uploader()->Shutdown(); | |
| 237 } | 246 } |
| 238 | 247 |
| 239 TEST_F(DomainReliabilityUploaderTest, ServerErrorUpload) { | 248 TEST_F(DomainReliabilityUploaderTest, ServerErrorUpload) { |
| 240 interceptor()->ExpectRequestAndReturnResponseCode(500); | 249 interceptor()->ExpectRequestAndReturnResponseCode(500); |
| 241 | 250 |
| 242 TestUploadCallback c; | 251 TestUploadCallback c; |
| 243 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 252 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
| 244 base::RunLoop().RunUntilIdle(); | 253 base::RunLoop().RunUntilIdle(); |
| 245 EXPECT_EQ(1u, c.called_count()); | 254 EXPECT_EQ(1u, c.called_count()); |
| 246 EXPECT_TRUE(c.last_result().is_failure()); | 255 EXPECT_TRUE(c.last_result().is_failure()); |
| 256 | |
| 257 uploader()->Shutdown(); | |
| 247 } | 258 } |
| 248 | 259 |
| 249 TEST_F(DomainReliabilityUploaderTest, RetryAfterUpload) { | 260 TEST_F(DomainReliabilityUploaderTest, RetryAfterUpload) { |
| 250 interceptor()->ExpectRequestAndReturnResponseCodeAndHeaders( | 261 interceptor()->ExpectRequestAndReturnResponseCodeAndHeaders( |
| 251 503, | 262 503, |
| 252 "HTTP/1.1 503 Ugh\nRetry-After: 3600\n\n"); | 263 "HTTP/1.1 503 Ugh\nRetry-After: 3600\n\n"); |
| 253 | 264 |
| 254 TestUploadCallback c; | 265 TestUploadCallback c; |
| 255 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 266 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
| 256 base::RunLoop().RunUntilIdle(); | 267 base::RunLoop().RunUntilIdle(); |
| 257 EXPECT_EQ(1u, c.called_count()); | 268 EXPECT_EQ(1u, c.called_count()); |
| 258 EXPECT_TRUE(c.last_result().is_retry_after()); | 269 EXPECT_TRUE(c.last_result().is_retry_after()); |
| 270 | |
| 271 uploader()->Shutdown(); | |
| 259 } | 272 } |
| 260 | 273 |
| 261 TEST_F(DomainReliabilityUploaderTest, UploadDepth1) { | 274 TEST_F(DomainReliabilityUploaderTest, UploadDepth1) { |
| 262 interceptor()->ExpectRequestAndReturnResponseCode(200); | 275 interceptor()->ExpectRequestAndReturnResponseCode(200); |
| 263 | 276 |
| 264 TestUploadCallback c; | 277 TestUploadCallback c; |
| 265 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); | 278 uploader()->UploadReport("{}", 0, GURL(kUploadURL), c.callback()); |
| 266 base::RunLoop().RunUntilIdle(); | 279 base::RunLoop().RunUntilIdle(); |
| 267 EXPECT_EQ(1u, c.called_count()); | 280 EXPECT_EQ(1u, c.called_count()); |
| 268 | 281 |
| 269 EXPECT_EQ(1, interceptor()->last_upload_depth()); | 282 EXPECT_EQ(1, interceptor()->last_upload_depth()); |
| 283 | |
| 284 uploader()->Shutdown(); | |
| 270 } | 285 } |
| 271 | 286 |
| 272 TEST_F(DomainReliabilityUploaderTest, UploadDepth2) { | 287 TEST_F(DomainReliabilityUploaderTest, UploadDepth2) { |
| 273 interceptor()->ExpectRequestAndReturnResponseCode(200); | 288 interceptor()->ExpectRequestAndReturnResponseCode(200); |
| 274 | 289 |
| 275 TestUploadCallback c; | 290 TestUploadCallback c; |
| 276 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); | 291 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); |
| 277 base::RunLoop().RunUntilIdle(); | 292 base::RunLoop().RunUntilIdle(); |
| 278 EXPECT_EQ(1u, c.called_count()); | 293 EXPECT_EQ(1u, c.called_count()); |
| 279 | 294 |
| 280 EXPECT_EQ(2, interceptor()->last_upload_depth()); | 295 EXPECT_EQ(2, interceptor()->last_upload_depth()); |
| 296 | |
| 297 uploader()->Shutdown(); | |
| 298 } | |
| 299 | |
| 300 TEST_F(DomainReliabilityUploaderTest, NoUploadAfterShutdown) { | |
|
mmenke
2016/12/14 19:12:17
Also have a test that checks that requests are can
Julia Tuttle
2016/12/15 21:53:00
Done.
| |
| 301 uploader()->Shutdown(); | |
| 302 | |
| 303 TestUploadCallback c; | |
| 304 uploader()->UploadReport("{}", 1, GURL(kUploadURL), c.callback()); | |
| 305 base::RunLoop().RunUntilIdle(); | |
| 306 EXPECT_EQ(1u, c.called_count()); | |
| 307 | |
| 308 EXPECT_EQ(0, interceptor()->request_count()); | |
| 281 } | 309 } |
| 282 | 310 |
| 283 } // namespace | 311 } // namespace |
| 284 } // namespace domain_reliability | 312 } // namespace domain_reliability |
| OLD | NEW |