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

Side by Side Diff: content/browser/loader/intercepting_resource_handler_unittest.cc

Issue 2743723003: Add buffering to MimeSniffingResourceHandler.
Patch Set: Remove unused 'first_call' variable. Created 3 years, 9 months 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "content/browser/loader/intercepting_resource_handler.h" 5 #include "content/browser/loader/intercepting_resource_handler.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 // Tests that the handler behaves properly when it doesn't have to use an 81 // Tests that the handler behaves properly when it doesn't have to use an
82 // alternate next handler. 82 // alternate next handler.
83 TEST_F(InterceptingResourceHandlerTest, NoSwitching) { 83 TEST_F(InterceptingResourceHandlerTest, NoSwitching) {
84 const std::string kData = "The data"; 84 const std::string kData = "The data";
85 const std::string kData2 = "Data 2"; 85 const std::string kData2 = "Data 2";
86 86
87 // Simulate the MimeSniffingResourceHandler buffering the data. 87 // Simulate the MimeSniffingResourceHandler buffering the data.
88 ASSERT_EQ(MockResourceLoader::Status::IDLE, 88 ASSERT_EQ(MockResourceLoader::Status::IDLE,
89 mock_loader_->OnWillStart(request_->url())); 89 mock_loader_->OnWillStart(request_->url()));
90 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
91
92 ASSERT_NE(mock_loader_->io_buffer(), old_handler_->buffer());
93 90
94 // The response is received. The handler should not change. 91 // The response is received. The handler should not change.
95 ASSERT_EQ(MockResourceLoader::Status::IDLE, 92 ASSERT_EQ(MockResourceLoader::Status::IDLE,
96 mock_loader_->OnResponseStarted( 93 mock_loader_->OnResponseStarted(
97 make_scoped_refptr(new ResourceResponse()))); 94 make_scoped_refptr(new ResourceResponse())));
98 95
99 // The read is replayed by the MimeSniffingResourceHandler. The data should 96 // The OnWillRead and OnReadCompleted are replayed by the
100 // have been received by the old intercepting_handler. 97 // MimeSniffingResourceHandler. No buffering is done by the
98 // InterceptingResourceHandler, so the buffer used should be from
99 // the old handling.
100 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
101 ASSERT_EQ(mock_loader_->io_buffer(), old_handler_->buffer());
101 ASSERT_EQ(MockResourceLoader::Status::IDLE, 102 ASSERT_EQ(MockResourceLoader::Status::IDLE,
102 mock_loader_->OnReadCompleted(kData)); 103 mock_loader_->OnReadCompleted(kData));
104
105 // The data should be received by the original handler.
103 EXPECT_EQ(kData, old_handler_body_); 106 EXPECT_EQ(kData, old_handler_body_);
104 107
105 // Make sure another read behaves as expected. 108 // Make sure another read behaves as expected.
106 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); 109 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
107 ASSERT_EQ(mock_loader_->io_buffer(), old_handler_->buffer()); 110 ASSERT_EQ(mock_loader_->io_buffer(), old_handler_->buffer());
108 111
109 ASSERT_EQ(MockResourceLoader::Status::IDLE, 112 ASSERT_EQ(MockResourceLoader::Status::IDLE,
110 mock_loader_->OnReadCompleted(kData2)); 113 mock_loader_->OnReadCompleted(kData2));
111 EXPECT_EQ(kData + kData2, old_handler_body_); 114 EXPECT_EQ(kData + kData2, old_handler_body_);
112 } 115 }
113 116
114 // Tests that the data received is transmitted to the newly created 117 // Tests that the data received is transmitted to the newly created
115 // ResourceHandler. 118 // ResourceHandler.
116 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) { 119 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) {
117 const std::string kData = "The data"; 120 const std::string kData = "The data";
118 const std::string kData2 = "Data 2"; 121 const std::string kData2 = "Data 2";
119 122
120 // Simulate the MimeSniffingResourceHandler buffering the data. 123 // Simulate the MimeSniffingResourceHandler buffering the data.
121 ASSERT_EQ(MockResourceLoader::Status::IDLE, 124 ASSERT_EQ(MockResourceLoader::Status::IDLE,
122 mock_loader_->OnWillStart(request_->url())); 125 mock_loader_->OnWillStart(request_->url()));
123 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
124
125 ASSERT_NE(mock_loader_->io_buffer(), old_handler_->buffer());
126 126
127 // Simulate the MimeSniffingResourceHandler asking the 127 // Simulate the MimeSniffingResourceHandler asking the
128 // InterceptingResourceHandler to switch to a new handler. 128 // InterceptingResourceHandler to switch to a new handler.
129 net::URLRequestStatus new_handler_status; 129 net::URLRequestStatus new_handler_status;
130 std::string new_handler_body; 130 std::string new_handler_body;
131 std::unique_ptr<TestResourceHandler> new_handler_scoped( 131 std::unique_ptr<TestResourceHandler> new_handler_scoped(
132 new TestResourceHandler(&new_handler_status, &new_handler_body)); 132 new TestResourceHandler(&new_handler_status, &new_handler_body));
133 TestResourceHandler* new_test_handler = new_handler_scoped.get(); 133 TestResourceHandler* new_test_handler = new_handler_scoped.get();
134 intercepting_handler_->UseNewHandler(std::move(new_handler_scoped), 134 intercepting_handler_->UseNewHandler(std::move(new_handler_scoped),
135 std::string()); 135 std::string());
136 136
137 // The response is received. The new ResourceHandler should be used to handle 137 // The response is received. The new ResourceHandler should be used to handle
138 // the download. 138 // the download.
139 ASSERT_EQ(MockResourceLoader::Status::IDLE, 139 ASSERT_EQ(MockResourceLoader::Status::IDLE,
140 mock_loader_->OnResponseStarted( 140 mock_loader_->OnResponseStarted(
141 make_scoped_refptr(new ResourceResponse()))); 141 make_scoped_refptr(new ResourceResponse())));
142 142
143 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
144
145 // The old handler should have been destroyed at the beginning of the
146 // replace.
147 ASSERT_FALSE(old_handler_.get());
148 ASSERT_TRUE(mock_loader_->io_buffer());
149
143 EXPECT_FALSE(old_handler_status_.is_success()); 150 EXPECT_FALSE(old_handler_status_.is_success());
144 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error()); 151 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error());
145 EXPECT_EQ(std::string(), old_handler_body_); 152 EXPECT_EQ(std::string(), old_handler_body_);
146 153
147 // The read is replayed by the MimeSniffingResourceHandler. The data should 154 // The read is replayed by the MimeSniffingResourceHandler. The data should
148 // have been received by the new handler. 155 // have been received by the new handler.
149 ASSERT_EQ(MockResourceLoader::Status::IDLE, 156 ASSERT_EQ(MockResourceLoader::Status::IDLE,
150 mock_loader_->OnReadCompleted(kData)); 157 mock_loader_->OnReadCompleted(kData));
151 EXPECT_EQ(kData, new_handler_body); 158 EXPECT_EQ(kData, new_handler_body);
152 159
(...skipping 16 matching lines...) Expand all
169 // When sending a payload to the old ResourceHandler, the 176 // When sending a payload to the old ResourceHandler, the
170 // InterceptingResourceHandler doesn't send a final EOF read. 177 // InterceptingResourceHandler doesn't send a final EOF read.
171 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read 178 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read
172 // entirely? 179 // entirely?
173 old_handler_->set_expect_eof_read(false); 180 old_handler_->set_expect_eof_read(false);
174 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 181 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
175 182
176 // Simulate the MimeSniffingResourceHandler buffering the data. 183 // Simulate the MimeSniffingResourceHandler buffering the data.
177 ASSERT_EQ(MockResourceLoader::Status::IDLE, 184 ASSERT_EQ(MockResourceLoader::Status::IDLE,
178 mock_loader_->OnWillStart(request_->url())); 185 mock_loader_->OnWillStart(request_->url()));
179 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
180
181 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
182 186
183 // Simulate the MimeSniffingResourceHandler asking the 187 // Simulate the MimeSniffingResourceHandler asking the
184 // InterceptingResourceHandler to switch to a new handler. 188 // InterceptingResourceHandler to switch to a new handler.
185 net::URLRequestStatus new_handler_status; 189 net::URLRequestStatus new_handler_status;
186 std::string new_handler_body; 190 std::string new_handler_body;
187 std::unique_ptr<TestResourceHandler> new_handler_scoped( 191 std::unique_ptr<TestResourceHandler> new_handler_scoped(
188 new TestResourceHandler(&new_handler_status, &new_handler_body)); 192 new TestResourceHandler(&new_handler_status, &new_handler_body));
189 TestResourceHandler* new_test_handler = new_handler_scoped.get(); 193 TestResourceHandler* new_test_handler = new_handler_scoped.get();
190 intercepting_handler_->UseNewHandler(std::move(new_handler_scoped), kPayload); 194 intercepting_handler_->UseNewHandler(std::move(new_handler_scoped), kPayload);
191 195
192 // The old handler should not have received the payload yet. 196 // The old handler should not have received the payload yet.
193 ASSERT_EQ(std::string(), old_handler_body_); 197 ASSERT_EQ(std::string(), old_handler_body_);
194 198
195 // The response is received. The new ResourceHandler should be used to handle 199 // The response is received. The new ResourceHandler should be used to handle
196 // the download. 200 // the download.
197 ASSERT_EQ(MockResourceLoader::Status::IDLE, 201 ASSERT_EQ(MockResourceLoader::Status::IDLE,
198 mock_loader_->OnResponseStarted( 202 mock_loader_->OnResponseStarted(
199 make_scoped_refptr(new ResourceResponse()))); 203 make_scoped_refptr(new ResourceResponse())));
200 204
201 // The old handler should have received the payload. 205 // The old handler should have received the payload...
202 EXPECT_EQ(kPayload, old_handler_body_); 206 EXPECT_EQ(kPayload, old_handler_body_);
203 207
208 // ... and been destroyed.
209 ASSERT_FALSE(old_handler_.get());
210
204 EXPECT_TRUE(old_handler_status_.is_success()); 211 EXPECT_TRUE(old_handler_status_.is_success());
205 EXPECT_EQ(net::OK, old_handler_status_.error()); 212 EXPECT_EQ(net::OK, old_handler_status_.error());
206 213
207 // The read is replayed by the MimeSniffingResourceHandler. The data should 214 // The read is replayed by the MimeSniffingResourceHandler. The data should
208 // have been received by the new handler. 215 // have been received by the new handler.
216 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
217 ASSERT_TRUE(mock_loader_->io_buffer());
209 ASSERT_EQ(MockResourceLoader::Status::IDLE, 218 ASSERT_EQ(MockResourceLoader::Status::IDLE,
210 mock_loader_->OnReadCompleted(kData)); 219 mock_loader_->OnReadCompleted(kData));
211 EXPECT_EQ(kData, new_handler_body); 220 EXPECT_EQ(kData, new_handler_body);
212 221
213 // Make sure another read behaves as expected. 222 // Make sure another read behaves as expected.
214 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); 223 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
215 ASSERT_EQ(mock_loader_->io_buffer(), new_test_handler->buffer()); 224 ASSERT_EQ(mock_loader_->io_buffer(), new_test_handler->buffer());
216 225
217 ASSERT_EQ(MockResourceLoader::Status::IDLE, 226 ASSERT_EQ(MockResourceLoader::Status::IDLE,
218 mock_loader_->OnReadCompleted(kData2)); 227 mock_loader_->OnReadCompleted(kData2));
219 EXPECT_EQ(kData + kData2, new_handler_body); 228 EXPECT_EQ(kData + kData2, new_handler_body);
220 } 229 }
221 230
222 // Tests that the handler behaves properly if the old handler fails will read. 231 // Tests that the handler behaves properly if the old handler fails will read.
223 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) { 232 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
224 old_handler_->set_on_will_read_result(false); 233 old_handler_->set_on_will_read_result(false);
225 234
226 // Simulate the MimeSniffingResourceHandler buffering the data. The old 235 // Simulate the MimeSniffingResourceHandler buffering the data. The old
227 // handler should tell the caller to fail. 236 // handler should tell the caller to fail.
228 ASSERT_EQ(MockResourceLoader::Status::IDLE, 237 ASSERT_EQ(MockResourceLoader::Status::IDLE,
229 mock_loader_->OnWillStart(request_->url())); 238 mock_loader_->OnWillStart(request_->url()));
239 ASSERT_EQ(MockResourceLoader::Status::IDLE,
240 mock_loader_->OnResponseStarted(
241 make_scoped_refptr(new ResourceResponse())));
230 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead()); 242 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead());
231 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); 243 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
232 } 244 }
233 245
234 // Tests that the handler behaves properly if the new handler fails in 246 // Tests that the handler behaves properly if the new handler fails in
235 // OnWillStart. 247 // OnWillStart.
236 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsOnWillStart) { 248 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsOnWillStart) {
237 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 249 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
238 250
239 // Simulate the MimeSniffingResourceHandler buffering the data. 251 // Simulate the MimeSniffingResourceHandler buffering the data.
240 ASSERT_EQ(MockResourceLoader::Status::IDLE, 252 ASSERT_EQ(MockResourceLoader::Status::IDLE,
241 mock_loader_->OnWillStart(request_->url())); 253 mock_loader_->OnWillStart(request_->url()));
242 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
243
244 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
245
246 // Simulate the MimeSniffingResourceHandler asking the 254 // Simulate the MimeSniffingResourceHandler asking the
247 // InterceptingResourceHandler to switch to a new handler. 255 // InterceptingResourceHandler to switch to a new handler.
248 net::URLRequestStatus new_handler_status; 256 net::URLRequestStatus new_handler_status;
249 std::string new_handler_body; 257 std::string new_handler_body;
250 std::unique_ptr<TestResourceHandler> new_handler( 258 std::unique_ptr<TestResourceHandler> new_handler(
251 new TestResourceHandler(&new_handler_status, &new_handler_body)); 259 new TestResourceHandler(&new_handler_status, &new_handler_body));
252 new_handler->set_on_will_start_result(false); 260 new_handler->set_on_will_start_result(false);
253 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string()); 261 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string());
254 262
255 // The response is received. The new ResourceHandler should tell us to fail. 263 // The response is received. The new ResourceHandler should tell us to fail.
256 ASSERT_EQ(MockResourceLoader::Status::CANCELED, 264 ASSERT_EQ(MockResourceLoader::Status::CANCELED,
257 mock_loader_->OnResponseStarted( 265 mock_loader_->OnResponseStarted(
258 make_scoped_refptr(new ResourceResponse()))); 266 make_scoped_refptr(new ResourceResponse())));
267
259 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); 268 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
260 } 269 }
261 270
262 // Tests that the handler behaves properly if the new handler fails response 271 // Tests that the handler behaves properly if the new handler fails response
263 // started. 272 // started.
264 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) { 273 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
265 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 274 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
266 275
267 // Simulate the MimeSniffingResourceHandler buffering the data. 276 // Simulate the MimeSniffingResourceHandler buffering the data.
268 ASSERT_EQ(MockResourceLoader::Status::IDLE, 277 ASSERT_EQ(MockResourceLoader::Status::IDLE,
269 mock_loader_->OnWillStart(request_->url())); 278 mock_loader_->OnWillStart(request_->url()));
270 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
271
272 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
273
274 // Simulate the MimeSniffingResourceHandler asking the 279 // Simulate the MimeSniffingResourceHandler asking the
275 // InterceptingResourceHandler to switch to a new handler. 280 // InterceptingResourceHandler to switch to a new handler.
276 net::URLRequestStatus new_handler_status; 281 net::URLRequestStatus new_handler_status;
277 std::string new_handler_body; 282 std::string new_handler_body;
278 std::unique_ptr<TestResourceHandler> new_handler( 283 std::unique_ptr<TestResourceHandler> new_handler(
279 new TestResourceHandler(&new_handler_status, &new_handler_body)); 284 new TestResourceHandler(&new_handler_status, &new_handler_body));
280 new_handler->set_on_response_started_result(false); 285 new_handler->set_on_response_started_result(false);
281 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string()); 286 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string());
282 287
283 // The response is received. The new ResourceHandler should tell us to fail. 288 // The response is received. The new ResourceHandler should tell us to fail.
284 ASSERT_EQ(MockResourceLoader::Status::CANCELED, 289 ASSERT_EQ(MockResourceLoader::Status::CANCELED,
285 mock_loader_->OnResponseStarted( 290 mock_loader_->OnResponseStarted(
286 make_scoped_refptr(new ResourceResponse()))); 291 make_scoped_refptr(new ResourceResponse())));
287 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); 292 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
288 } 293 }
289 294
290 // Tests that the handler behaves properly if the new handler fails will read. 295 // Tests that the handler behaves properly if the new handler fails will read.
291 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { 296 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
292 const char kData[] = "The data";
293
294 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 297 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
295 298
296 // Simulate the MimeSniffingResourceHandler buffering the data. 299 // Simulate the MimeSniffingResourceHandler buffering the data.
297 ASSERT_EQ(MockResourceLoader::Status::IDLE, 300 ASSERT_EQ(MockResourceLoader::Status::IDLE,
298 mock_loader_->OnWillStart(request_->url())); 301 mock_loader_->OnWillStart(request_->url()));
299 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
300
301 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
302
303 // Simulate the MimeSniffingResourceHandler asking the 302 // Simulate the MimeSniffingResourceHandler asking the
304 // InterceptingResourceHandler to switch to a new handler. 303 // InterceptingResourceHandler to switch to a new handler.
305 net::URLRequestStatus new_handler_status; 304 net::URLRequestStatus new_handler_status;
306 std::string new_handler_body; 305 std::string new_handler_body;
307 std::unique_ptr<TestResourceHandler> new_handler( 306 std::unique_ptr<TestResourceHandler> new_handler(
308 new TestResourceHandler(&new_handler_status, &new_handler_body)); 307 new TestResourceHandler(&new_handler_status, &new_handler_body));
309 new_handler->set_on_will_read_result(false); 308 new_handler->set_on_will_read_result(false);
310 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string()); 309 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string());
311 310
312 // The response is received. The new handler should not have been asked to 311 // The response is received. The new handler should not have been asked to
313 // read yet. 312 // read yet.
314 ASSERT_EQ(MockResourceLoader::Status::IDLE, 313 ASSERT_EQ(MockResourceLoader::Status::IDLE,
315 mock_loader_->OnResponseStarted( 314 mock_loader_->OnResponseStarted(
316 make_scoped_refptr(new ResourceResponse()))); 315 make_scoped_refptr(new ResourceResponse())));
317 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status());
318 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error());
319 316
320 // The read is replayed by the MimeSniffingResourceHandler. The new 317 // The read is replayed by the MimeSniffingResourceHandler. The new
321 // handler should tell the caller to fail. 318 // handler should tell the caller to fail.
319 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead());
320 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
322 321
323 ASSERT_EQ(MockResourceLoader::Status::CANCELED, 322 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status());
324 mock_loader_->OnReadCompleted(kData)); 323 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error());
325 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
326 } 324 }
327 325
328 // Tests that the handler behaves properly if the new handler fails read 326 // Tests that the handler behaves properly if the new handler fails read
329 // completed. 327 // completed.
330 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) { 328 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) {
331 const char kData[] = "The data"; 329 const char kData[] = "The data";
332 330
333 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 331 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
334 332
335 // Simulate the MimeSniffingResourceHandler buffering the data.
336 ASSERT_EQ(MockResourceLoader::Status::IDLE, 333 ASSERT_EQ(MockResourceLoader::Status::IDLE,
337 mock_loader_->OnWillStart(request_->url())); 334 mock_loader_->OnWillStart(request_->url()));
338 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
339
340 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
341 335
342 // Simulate the MimeSniffingResourceHandler asking the 336 // Simulate the MimeSniffingResourceHandler asking the
343 // InterceptingResourceHandler to switch to a new handler. 337 // InterceptingResourceHandler to switch to a new handler.
344 net::URLRequestStatus new_handler_status; 338 net::URLRequestStatus new_handler_status;
345 std::string new_handler_body; 339 std::string new_handler_body;
346 std::unique_ptr<TestResourceHandler> new_handler( 340 std::unique_ptr<TestResourceHandler> new_handler(
347 new TestResourceHandler(&new_handler_status, &new_handler_body)); 341 new TestResourceHandler(&new_handler_status, &new_handler_body));
348 new_handler->set_on_read_completed_result(false); 342 new_handler->set_on_read_completed_result(false);
349 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string()); 343 intercepting_handler_->UseNewHandler(std::move(new_handler), std::string());
350 344
351 // The response is received. 345 // The response is received.
352 ASSERT_EQ(MockResourceLoader::Status::IDLE, 346 ASSERT_EQ(MockResourceLoader::Status::IDLE,
353 mock_loader_->OnResponseStarted( 347 mock_loader_->OnResponseStarted(
354 make_scoped_refptr(new ResourceResponse()))); 348 make_scoped_refptr(new ResourceResponse())));
355 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); 349 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status());
356 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error()); 350 EXPECT_EQ(net::ERR_ABORTED, old_handler_status_.error());
357 351
352 // Simulate the MimeSniffingResourceHandler buffering the data.
358 // The read is replayed by the MimeSniffingResourceHandler. The new handler 353 // The read is replayed by the MimeSniffingResourceHandler. The new handler
359 // should tell the caller to fail. 354 // should tell the caller to fail.
355 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
356 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
360 ASSERT_EQ(MockResourceLoader::Status::CANCELED, 357 ASSERT_EQ(MockResourceLoader::Status::CANCELED,
361 mock_loader_->OnReadCompleted(kData)); 358 mock_loader_->OnReadCompleted(kData));
362 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); 359 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code());
363 } 360 }
364 361
365 // The old handler sets |defer| to true in OnReadCompleted and 362 // The old handler sets |defer| to true in OnReadCompleted and
366 // OnResponseCompleted. The new handler sets |defer| to true in 363 // OnResponseCompleted. The new handler sets |defer| to true in
367 // OnResponseStarted and OnReadCompleted. 364 // OnResponseStarted and OnReadCompleted.
368 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { 365 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
369 const char kData[] = "The data"; 366 const char kData[] = "The data";
370 const char kPayload[] = "The long long long long long payload"; 367 const char kPayload[] = "The long long long long long payload";
371 // This should be less than half the size of the payload, so it needs at least 368 // This should be less than half the size of the payload, so it needs at least
372 // 3 reads to receive. 369 // 3 reads to receive.
373 const int kOldHandlerBufferSize = arraysize(kPayload) / 3; 370 const int kOldHandlerBufferSize = arraysize(kPayload) / 3;
374 371
375 // When sending a payload to the old ResourceHandler, the 372 // When sending a payload to the old ResourceHandler, the
376 // InterceptingResourceHandler doesn't send a final EOF read. 373 // InterceptingResourceHandler doesn't send a final EOF read.
377 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read 374 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read
378 // entirely? 375 // entirely?
379 old_handler_->set_expect_eof_read(false); 376 old_handler_->set_expect_eof_read(false);
380 old_handler_->SetBufferSize(kOldHandlerBufferSize); 377 old_handler_->SetBufferSize(kOldHandlerBufferSize);
381 old_handler_->set_defer_on_will_read(true); 378 old_handler_->set_defer_on_will_read(true);
382 old_handler_->set_defer_on_read_completed(true); 379 old_handler_->set_defer_on_read_completed(true);
383 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); 380 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer();
384 381
385 // Simulate the MimeSniffingResourceHandler buffering the data. 382 // Simulate the MimeSniffingResourceHandler buffering the data.
386 383
387 ASSERT_EQ(MockResourceLoader::Status::IDLE, 384 ASSERT_EQ(MockResourceLoader::Status::IDLE,
388 mock_loader_->OnWillStart(request_->url())); 385 mock_loader_->OnWillStart(request_->url()));
389 // The old handler defers the read.
390 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
391 mock_loader_->OnWillRead());
392 old_handler_->WaitUntilDeferred();
393
394 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status());
395 EXPECT_EQ(1, old_handler_->on_will_read_called());
396 EXPECT_EQ(0, old_handler_->on_read_completed_called());
397 EXPECT_EQ(0, old_handler_->on_response_completed_called());
398
399 // Defer the next OnWillRead, too. This is needed to test the case where
400 // OnWillRead completes asynchronously when passing the payload to the old
401 // handler.
402 old_handler_->set_defer_on_will_read(true);
403
404 // The old handle resumes the request.
405 old_handler_->Resume();
406
407 // Resume() call may do work asynchronously. Wait until that's done.
408 mock_loader_->WaitUntilIdleOrCanceled();
409 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
410 386
411 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get()); 387 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get());
412 388
413 // Simulate the MimeSniffingResourceHandler asking the 389 // Simulate the MimeSniffingResourceHandler asking the
414 // InterceptingResourceHandler to switch to a new handler. 390 // InterceptingResourceHandler to switch to a new handler.
415 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 391 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
416 0}; 392 0};
417 393
418 std::string new_handler_body; 394 std::string new_handler_body;
419 std::unique_ptr<TestResourceHandler> scoped_new_handler( 395 std::unique_ptr<TestResourceHandler> scoped_new_handler(
420 new TestResourceHandler(&new_handler_status, &new_handler_body)); 396 new TestResourceHandler(&new_handler_status, &new_handler_body));
421 base::WeakPtr<TestResourceHandler> new_handler = 397 base::WeakPtr<TestResourceHandler> new_handler =
422 scoped_new_handler->GetWeakPtr(); 398 scoped_new_handler->GetWeakPtr();
423 scoped_new_handler->SetBufferSize(1);
424 scoped_new_handler->set_defer_on_will_start(true); 399 scoped_new_handler->set_defer_on_will_start(true);
425 scoped_new_handler->set_defer_on_response_started(true); 400 scoped_new_handler->set_defer_on_response_started(true);
426 scoped_new_handler->set_defer_on_will_read(true); 401 scoped_new_handler->set_defer_on_will_read(true);
427 scoped_new_handler->set_defer_on_read_completed(true); 402 scoped_new_handler->set_defer_on_read_completed(true);
428 scoped_new_handler->set_defer_on_response_completed(true); 403 scoped_new_handler->set_defer_on_response_completed(true);
429 intercepting_handler_->UseNewHandler(std::move(scoped_new_handler), kPayload); 404 intercepting_handler_->UseNewHandler(std::move(scoped_new_handler), kPayload);
430 405
431 // The response is received, and then deferred by the old handler's 406 // The response is received, and then deferred by the old handler's
432 // OnReadCompleted method. 407 // OnReadCompleted method.
433 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 408 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
434 mock_loader_->OnResponseStarted( 409 mock_loader_->OnResponseStarted(
435 make_scoped_refptr(new ResourceResponse()))); 410 make_scoped_refptr(new ResourceResponse())));
436 old_handler_->WaitUntilDeferred(); 411 old_handler_->WaitUntilDeferred();
437 412
413 EXPECT_EQ(1, old_handler_->on_will_read_called());
414 EXPECT_EQ(0, old_handler_->on_read_completed_called());
415 EXPECT_EQ(0, old_handler_->on_response_completed_called());
416 EXPECT_EQ(0, new_handler->on_response_started_called());
417 old_handler_->Resume();
418 old_handler_->WaitUntilDeferred();
419
438 EXPECT_EQ(1, old_handler_->on_read_completed_called()); 420 EXPECT_EQ(1, old_handler_->on_read_completed_called());
439 EXPECT_EQ(0, old_handler_->on_response_completed_called()); 421 EXPECT_EQ(0, old_handler_->on_response_completed_called());
440 EXPECT_EQ(0, new_handler->on_response_started_called()); 422 EXPECT_EQ(0, new_handler->on_response_started_called());
441 423
442 // The old handler has received the first N bytes of the payload synchronously 424 // The old handler has received the first N bytes of the payload synchronously
443 // where N is the size of the buffer exposed via OnWillRead. 425 // where N is the size of the buffer exposed via OnWillRead.
444 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_); 426 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_);
445 EXPECT_EQ(std::string(), new_handler_body); 427 EXPECT_EQ(std::string(), new_handler_body);
446 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); 428 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status());
447 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
448
449 // Run until the old handler's OnWillRead method defers the request while
450 // replaying the payload.
451 old_handler_->Resume();
452 old_handler_->WaitUntilDeferred();
453 EXPECT_EQ(2, old_handler_->on_will_read_called());
454 EXPECT_EQ(1, old_handler_->on_read_completed_called());
455 EXPECT_EQ(0, old_handler_->on_response_completed_called());
456 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_);
457 EXPECT_EQ(std::string(), new_handler_body);
458 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status());
459 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 429 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
460 430
461 // Run until the new handler's OnWillStart method defers the request. 431 // Run until the new handler's OnWillStart method defers the request.
462 old_handler_->Resume(); 432 old_handler_->Resume();
463 new_handler->WaitUntilDeferred(); 433 new_handler->WaitUntilDeferred();
464 434
465 EXPECT_EQ(1, new_handler->on_will_start_called()); 435 EXPECT_EQ(1, new_handler->on_will_start_called());
466 EXPECT_EQ(0, new_handler->on_response_started_called()); 436 EXPECT_EQ(0, new_handler->on_response_started_called());
467 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 437 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
468 mock_loader_->status()); 438 mock_loader_->status());
469 EXPECT_EQ(kPayload, old_handler_body_); 439 EXPECT_EQ(kPayload, old_handler_body_);
470 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status_.status()); 440 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status_.status());
471 EXPECT_FALSE(old_handler_); 441 EXPECT_FALSE(old_handler_);
472 EXPECT_EQ(std::string(), new_handler_body); 442 EXPECT_EQ(std::string(), new_handler_body);
473 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 443 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
474 444
475 // Run until the new handler's OnResponseStarted method defers the request. 445 // Run until the new handler's OnResponseStarted method defers the request.
476 new_handler->Resume(); 446 new_handler->Resume();
477 // Resume() call may do work asynchronously. Wait until that's done. 447 // Resume() call may do work asynchronously. Wait until that's done.
478 new_handler->WaitUntilDeferred(); 448 new_handler->WaitUntilDeferred();
479 449
450 EXPECT_EQ(1, new_handler->on_will_start_called());
480 EXPECT_EQ(1, new_handler->on_response_started_called()); 451 EXPECT_EQ(1, new_handler->on_response_started_called());
481 EXPECT_EQ(0, new_handler->on_will_read_called()); 452 EXPECT_EQ(0, new_handler->on_will_read_called());
482 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 453 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
483 mock_loader_->status()); 454 mock_loader_->status());
484 EXPECT_EQ(std::string(), new_handler_body); 455 EXPECT_EQ(std::string(), new_handler_body);
485 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 456 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
486
487 // Resuming should finally call back into the ResourceController.
488 new_handler->Resume(); 457 new_handler->Resume();
489 mock_loader_->WaitUntilIdleOrCanceled();
490 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); 458 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
491 459
492 // Data is read, the new handler defers OnWillRead. 460 // Data is read, the new handler defers completion of the read buffer return.
461 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
462 mock_loader_->OnWillRead());
463 new_handler->WaitUntilDeferred();
464 EXPECT_EQ(1, new_handler->on_will_read_called());
465 EXPECT_EQ(0, new_handler->on_read_completed_called());
466 new_handler->Resume();
467 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
468
469 // As well as completion of the read itself.
493 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 470 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
494 mock_loader_->OnReadCompleted(kData)); 471 mock_loader_->OnReadCompleted(kData));
495 new_handler->WaitUntilDeferred(); 472 new_handler->WaitUntilDeferred();
496 EXPECT_EQ(1, new_handler->on_will_read_called());
497 EXPECT_EQ(0, new_handler->on_read_completed_called());
498
499 // The new ResourceHandler resumes, and then defers again in OnReadCompleted.
500 new_handler->Resume();
501 new_handler->WaitUntilDeferred();
502 EXPECT_EQ(1, new_handler->on_will_read_called());
503 EXPECT_EQ(1, new_handler->on_read_completed_called()); 473 EXPECT_EQ(1, new_handler->on_read_completed_called());
474 EXPECT_EQ(0, new_handler->on_read_eof_called());
504 EXPECT_EQ(0, new_handler->on_response_completed_called()); 475 EXPECT_EQ(0, new_handler->on_response_completed_called());
505 476
506 EXPECT_EQ("T", new_handler_body);
507
508 // New handler resumes again, everything continues synchronously until all 477 // New handler resumes again, everything continues synchronously until all
509 // written data is consumed. 478 // written data is consumed.
510 new_handler->Resume(); 479 new_handler->Resume();
511 mock_loader_->WaitUntilIdleOrCanceled(); 480 mock_loader_->WaitUntilIdleOrCanceled();
512 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); 481 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
513 EXPECT_EQ(kData, new_handler_body); 482 EXPECT_EQ(kData, new_handler_body);
514 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 483 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
515 EXPECT_EQ(0, new_handler->on_read_eof_called()); 484 EXPECT_EQ(0, new_handler->on_read_eof_called());
516 EXPECT_EQ(0, new_handler->on_response_completed_called()); 485 EXPECT_EQ(0, new_handler->on_response_completed_called());
517 486
(...skipping 28 matching lines...) Expand all
546 515
547 // When sending a payload to the old ResourceHandler, the 516 // When sending a payload to the old ResourceHandler, the
548 // InterceptingResourceHandler doesn't send a final EOF read. 517 // InterceptingResourceHandler doesn't send a final EOF read.
549 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read 518 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read
550 // entirely? 519 // entirely?
551 old_handler_->set_expect_eof_read(false); 520 old_handler_->set_expect_eof_read(false);
552 521
553 // Simulate the MimeSniffingResourceHandler buffering the data. 522 // Simulate the MimeSniffingResourceHandler buffering the data.
554 ASSERT_EQ(MockResourceLoader::Status::IDLE, 523 ASSERT_EQ(MockResourceLoader::Status::IDLE,
555 mock_loader_->OnWillStart(request_->url())); 524 mock_loader_->OnWillStart(request_->url()));
556 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
557 525
558 // Simulate the MimeSniffingResourceHandler asking the 526 // Simulate the MimeSniffingResourceHandler asking the
559 // InterceptingResourceHandler to switch to a new handler. 527 // InterceptingResourceHandler to switch to a new handler.
560 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 528 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
561 0}; 529 0};
562 530
563 std::string new_handler_body; 531 std::string new_handler_body;
564 std::unique_ptr<TestResourceHandler> new_handler( 532 std::unique_ptr<TestResourceHandler> new_handler(
565 new TestResourceHandler(&new_handler_status, &new_handler_body)); 533 new TestResourceHandler(&new_handler_status, &new_handler_body));
566 new_handler->SetBufferSize(1); 534 new_handler->SetBufferSize(1);
(...skipping 20 matching lines...) Expand all
587 // Test cancellation where there are both the old and the new handlers in an 555 // Test cancellation where there are both the old and the new handlers in an
588 // InterceptingResourceHandler. 556 // InterceptingResourceHandler.
589 TEST_F(InterceptingResourceHandlerTest, CancelBothHandlers) { 557 TEST_F(InterceptingResourceHandlerTest, CancelBothHandlers) {
590 const std::string kPayload = "The payload"; 558 const std::string kPayload = "The payload";
591 559
592 old_handler_->set_defer_on_read_completed(true); 560 old_handler_->set_defer_on_read_completed(true);
593 561
594 // Simulate the MimeSniffingResourceHandler buffering the data. 562 // Simulate the MimeSniffingResourceHandler buffering the data.
595 ASSERT_EQ(MockResourceLoader::Status::IDLE, 563 ASSERT_EQ(MockResourceLoader::Status::IDLE,
596 mock_loader_->OnWillStart(request_->url())); 564 mock_loader_->OnWillStart(request_->url()));
597 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
598 565
599 // Simulate the MimeSniffingResourceHandler asking the 566 // Simulate the MimeSniffingResourceHandler asking the
600 // InterceptingResourceHandler to switch to a new handler. 567 // InterceptingResourceHandler to switch to a new handler.
601 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 568 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
602 0}; 569 0};
603 570
604 std::string new_handler_body; 571 std::string new_handler_body;
605 std::unique_ptr<TestResourceHandler> new_handler( 572 std::unique_ptr<TestResourceHandler> new_handler(
606 new TestResourceHandler(&new_handler_status, &new_handler_body)); 573 new TestResourceHandler(&new_handler_status, &new_handler_body));
607 new_handler->SetBufferSize(1); 574 new_handler->SetBufferSize(1);
(...skipping 13 matching lines...) Expand all
621 {net::URLRequestStatus::CANCELED, net::ERR_FAILED})); 588 {net::URLRequestStatus::CANCELED, net::ERR_FAILED}));
622 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); 589 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status());
623 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error()); 590 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error());
624 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status()); 591 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status());
625 EXPECT_EQ(net::ERR_FAILED, new_handler_status.error()); 592 EXPECT_EQ(net::ERR_FAILED, new_handler_status.error());
626 } 593 }
627 594
628 } // namespace 595 } // namespace
629 596
630 } // namespace content 597 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/intercepting_resource_handler.cc ('k') | content/browser/loader/mime_sniffing_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698