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

Side by Side Diff: components/domain_reliability/uploader_unittest.cc

Issue 2336043007: Domain Reliability: Don't crash on shutdown with uploads pending (Closed)
Patch Set: Remove outdated comment. Created 4 years 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 | « components/domain_reliability/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
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
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
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
OLDNEW
« no previous file with comments | « components/domain_reliability/uploader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698