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

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

Issue 2327463002: Relax ad-hoc assumptions on InterceptingResourceHandler (Closed)
Patch Set: fix Created 4 years, 2 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 10
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h"
15 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
16 #include "base/threading/thread_task_runner_handle.h" 17 #include "base/threading/thread_task_runner_handle.h"
17 #include "content/public/browser/resource_controller.h" 18 #include "content/public/browser/resource_controller.h"
18 #include "content/public/browser/resource_request_info.h" 19 #include "content/public/browser/resource_request_info.h"
19 #include "content/public/common/resource_response.h" 20 #include "content/public/common/resource_response.h"
20 #include "content/public/common/webplugininfo.h" 21 #include "content/public/common/webplugininfo.h"
21 #include "content/public/test/test_browser_thread_bundle.h" 22 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "content/public/test/test_utils.h" 23 #include "content/public/test/test_utils.h"
23 #include "net/base/net_errors.h" 24 #include "net/base/net_errors.h"
24 #include "net/url_request/url_request_context.h" 25 #include "net/url_request/url_request_context.h"
25 #include "net/url_request/url_request_status.h" 26 #include "net/url_request/url_request_status.h"
26 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
27 #include "url/gurl.h" 28 #include "url/gurl.h"
28 29
29 namespace content { 30 namespace content {
30 31
31 namespace { 32 namespace {
32 33
34 class TestResourceController : public ResourceController {
35 public:
36 void Cancel() override {}
37 void CancelAndIgnore() override {}
38 void CancelWithError(int error_code) override {}
39 void Resume() override { ++num_resume_called_; }
40
41 int num_resume_called() const { return num_resume_called_; }
42
43 private:
44 int num_resume_called_ = 0;
45 };
46
33 class TestResourceHandler : public ResourceHandler { 47 class TestResourceHandler : public ResourceHandler {
34 public: 48 public:
35 // A test version of a ResourceHandler. |request_status| and 49 // A test version of a ResourceHandler. |request_status| will be updated when
36 // |final_bytes_read| will be updated when the response is complete with the 50 // the response is complete with the final status of the request received by
37 // final status of the request received by the handler, and the total bytes 51 // the handler and |body| will be updated on each OnReadCompleted call.
38 // the handler saw.
39 explicit TestResourceHandler(net::URLRequestStatus* request_status, 52 explicit TestResourceHandler(net::URLRequestStatus* request_status,
40 size_t* final_bytes_read) 53 std::string* body)
41 : TestResourceHandler(request_status, 54 : TestResourceHandler(request_status,
42 final_bytes_read, 55 body,
56 2048 /* buffer_size */,
43 true /* on_response_started_result */, 57 true /* on_response_started_result */,
44 true /* on_will_read_result */, 58 true /* on_will_read_result */,
45 true /* on_read_completed_result */) {} 59 true /* on_read_completed_result */,
60 false /* defer_on_response_started */,
61 false /* defer_on_read_completed */,
62 false /* defer_on_response_completed */) {}
46 63
47 // This constructor allows to specify return values for OnResponseStarted, 64 // This constructor allows to specify return values for OnResponseStarted,
48 // OnWillRead and OnReadCompleted. 65 // OnWillRead and OnReadCompleted.
49 TestResourceHandler(net::URLRequestStatus* request_status, 66 TestResourceHandler(net::URLRequestStatus* request_status,
50 size_t* final_bytes_read, 67 std::string* body,
51 bool on_response_started_result, 68 bool on_response_started_result,
52 bool on_will_read_result, 69 bool on_will_read_result,
53 bool on_read_completed_result) 70 bool on_read_completed_result)
71 : TestResourceHandler(request_status,
72 body,
73 2048 /* buffer_size */,
74 on_response_started_result,
75 on_will_read_result,
76 on_read_completed_result,
77 false /* defer_on_response_started */,
78 false /* defer_on_response_completed */,
79 false /* defer_on_read_completed */) {}
80
81 TestResourceHandler(net::URLRequestStatus* request_status,
82 std::string* body,
83 size_t buffer_size,
84 bool on_response_started_result,
85 bool on_will_read_result,
86 bool on_read_completed_result,
87 bool defer_on_response_started,
88 bool defer_on_read_completed,
89 bool defer_on_response_completed)
54 : ResourceHandler(nullptr), 90 : ResourceHandler(nullptr),
55 buffer_(new net::IOBuffer(2048)),
56 request_status_(request_status), 91 request_status_(request_status),
57 final_bytes_read_(final_bytes_read), 92 body_(body),
93 buffer_(new net::IOBuffer(buffer_size)),
94 buffer_size_(buffer_size),
58 on_response_started_result_(on_response_started_result), 95 on_response_started_result_(on_response_started_result),
59 on_will_read_result_(on_will_read_result), 96 on_will_read_result_(on_will_read_result),
60 on_read_completed_result_(on_read_completed_result), 97 on_read_completed_result_(on_read_completed_result),
61 bytes_read_(0), 98 defer_on_response_started_(defer_on_response_started),
62 is_completed_(false) { 99 defer_on_read_completed_(defer_on_read_completed),
63 memset(buffer_->data(), '\0', 2048); 100 defer_on_response_completed_(defer_on_response_completed) {
101 memset(buffer_->data(), '\0', buffer_size_);
64 } 102 }
65 103
66 ~TestResourceHandler() override {} 104 ~TestResourceHandler() override {}
67 105
68 void SetController(ResourceController* controller) override {} 106 void SetController(ResourceController* controller) override {}
69 107
70 bool OnRequestRedirected(const net::RedirectInfo& redirect_info, 108 bool OnRequestRedirected(const net::RedirectInfo& redirect_info,
71 ResourceResponse* response, 109 ResourceResponse* response,
72 bool* defer) override { 110 bool* defer) override {
73 NOTREACHED(); 111 NOTREACHED();
74 return false; 112 return false;
75 } 113 }
76 114
77 bool OnResponseStarted(ResourceResponse* response, bool* defer) override { 115 bool OnResponseStarted(ResourceResponse* response, bool* defer) override {
78 EXPECT_FALSE(is_completed_); 116 EXPECT_FALSE(is_completed_);
79 return on_response_started_result_; 117 if (!on_response_started_result_)
118 return false;
119 *defer = defer_on_response_started_;
120 defer_on_response_started_ = false;
121 return true;
80 } 122 }
81 123
82 bool OnWillStart(const GURL& url, bool* defer) override { 124 bool OnWillStart(const GURL& url, bool* defer) override {
83 EXPECT_FALSE(is_completed_); 125 EXPECT_FALSE(is_completed_);
84 return true; 126 return true;
85 } 127 }
86 128
87 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, 129 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
88 int* buf_size, 130 int* buf_size,
89 int min_size) override { 131 int min_size) override {
90 EXPECT_FALSE(is_completed_); 132 EXPECT_FALSE(is_completed_);
91 *buf = buffer_; 133 *buf = buffer_;
92 *buf_size = 2048; 134 *buf_size = buffer_size_;
93 memset(buffer_->data(), '\0', 2048); 135 memset(buffer_->data(), '\0', buffer_size_);
94 return on_will_read_result_; 136 return on_will_read_result_;
95 } 137 }
96 138
97 bool OnReadCompleted(int bytes_read, bool* defer) override { 139 bool OnReadCompleted(int bytes_read, bool* defer) override {
98 EXPECT_FALSE(is_completed_); 140 EXPECT_FALSE(is_completed_);
99 EXPECT_LT(bytes_read, 2048); 141 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_);
100 bytes_read_ += bytes_read; 142 body_->append(buffer_->data(), bytes_read);
101 return on_read_completed_result_; 143 if (!on_read_completed_result_)
144 return false;
145 *defer = defer_on_read_completed_;
146 defer_on_read_completed_ = false;
147 return true;
102 } 148 }
103 149
104 void OnResponseCompleted(const net::URLRequestStatus& status, 150 void OnResponseCompleted(const net::URLRequestStatus& status,
105 bool* defer) override { 151 bool* defer) override {
106 EXPECT_FALSE(is_completed_); 152 EXPECT_FALSE(is_completed_);
107 is_completed_ = true; 153 is_completed_ = true;
108 *request_status_ = status; 154 *request_status_ = status;
109 *final_bytes_read_ = bytes_read_; 155 *defer = defer_on_response_completed_;
156 defer_on_response_completed_ = false;
110 } 157 }
111 158
112 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); } 159 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); }
113 160
114 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; } 161 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; }
115 162
116 size_t bytes_read() const { return bytes_read_; }
117
118 private: 163 private:
164 net::URLRequestStatus* request_status_;
165 std::string* body_;
119 scoped_refptr<net::IOBuffer> buffer_; 166 scoped_refptr<net::IOBuffer> buffer_;
120 net::URLRequestStatus* request_status_; 167 const size_t buffer_size_;
121 size_t* final_bytes_read_; 168 const bool on_response_started_result_;
122 bool on_response_started_result_; 169 const bool on_will_read_result_;
123 bool on_will_read_result_; 170 const bool on_read_completed_result_;
124 bool on_read_completed_result_; 171 bool defer_on_response_started_;
125 size_t bytes_read_; 172 bool defer_on_read_completed_;
126 bool is_completed_; 173 bool defer_on_response_completed_;
174 bool is_completed_ = false;
127 175
128 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler); 176 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler);
129 }; 177 };
130 178
131 class InterceptingResourceHandlerTest : public testing::Test { 179 class InterceptingResourceHandlerTest : public testing::Test {
132 public: 180 public:
133 InterceptingResourceHandlerTest() {} 181 InterceptingResourceHandlerTest() {}
134 182
135 private: 183 private:
136 TestBrowserThreadBundle thread_bundle_; 184 TestBrowserThreadBundle thread_bundle_;
(...skipping 11 matching lines...) Expand all
148 0, // render_process_id 196 0, // render_process_id
149 0, // render_view_id 197 0, // render_view_id
150 0, // render_frame_id 198 0, // render_frame_id
151 true, // is_main_frame 199 true, // is_main_frame
152 false, // parent_is_main_frame 200 false, // parent_is_main_frame
153 true, // allow_download 201 true, // allow_download
154 true, // is_async 202 true, // is_async
155 false); // is_using_lofi 203 false); // is_using_lofi
156 204
157 net::URLRequestStatus old_handler_status; 205 net::URLRequestStatus old_handler_status;
158 size_t old_handler_final_bytes_read = 0; 206 std::string old_handler_body;
159 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 207 std::unique_ptr<TestResourceHandler> old_handler(
160 &old_handler_status, &old_handler_final_bytes_read)); 208 new TestResourceHandler(&old_handler_status, &old_handler_body));
161 TestResourceHandler* old_test_handler = old_handler.get(); 209 TestResourceHandler* old_test_handler = old_handler.get();
162 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 210 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
163 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 211 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
164 new InterceptingResourceHandler(std::move(old_handler), request.get())); 212 new InterceptingResourceHandler(std::move(old_handler), request.get()));
165 213
166 scoped_refptr<ResourceResponse> response(new ResourceResponse); 214 scoped_refptr<ResourceResponse> response(new ResourceResponse);
167 215
168 // Simulate the MimeSniffingResourceHandler buffering the data. 216 // Simulate the MimeSniffingResourceHandler buffering the data.
169 scoped_refptr<net::IOBuffer> read_buffer; 217 scoped_refptr<net::IOBuffer> read_buffer;
170 int buf_size = 0; 218 int buf_size = 0;
(...skipping 25 matching lines...) Expand all
196 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer()); 244 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer());
197 245
198 const std::string kData2 = "Data 2"; 246 const std::string kData2 = "Data 2";
199 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data())); 247 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data()));
200 ASSERT_GT(static_cast<size_t>(buf_size), kData2.length()); 248 ASSERT_GT(static_cast<size_t>(buf_size), kData2.length());
201 memcpy(read_buffer->data(), kData2.c_str(), kData2.length()); 249 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
202 250
203 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer)); 251 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
204 EXPECT_FALSE(defer); 252 EXPECT_FALSE(defer);
205 EXPECT_EQ(kData2, std::string(old_test_handler->buffer()->data())); 253 EXPECT_EQ(kData2, std::string(old_test_handler->buffer()->data()));
206 EXPECT_EQ(kData.length() + kData2.length(), old_test_handler->bytes_read()); 254 EXPECT_EQ(std::string(kData) + kData2, old_handler_body);
207 } 255 }
208 256
209 // Tests that the data received is transmitted to the newly created 257 // Tests that the data received is transmitted to the newly created
210 // ResourceHandler. 258 // ResourceHandler.
211 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) { 259 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) {
212 net::URLRequestContext context; 260 net::URLRequestContext context;
213 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 261 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
214 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 262 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
215 ResourceRequestInfo::AllocateForTesting(request.get(), 263 ResourceRequestInfo::AllocateForTesting(request.get(),
216 RESOURCE_TYPE_MAIN_FRAME, 264 RESOURCE_TYPE_MAIN_FRAME,
217 nullptr, // context 265 nullptr, // context
218 0, // render_process_id 266 0, // render_process_id
219 0, // render_view_id 267 0, // render_view_id
220 0, // render_frame_id 268 0, // render_frame_id
221 true, // is_main_frame 269 true, // is_main_frame
222 false, // parent_is_main_frame 270 false, // parent_is_main_frame
223 true, // allow_download 271 true, // allow_download
224 true, // is_async 272 true, // is_async
225 false); // is_using_lofi 273 false); // is_using_lofi
226 274
227 net::URLRequestStatus old_handler_status; 275 net::URLRequestStatus old_handler_status;
228 size_t old_handler_final_bytes_read = 0; 276 std::string old_handler_body;
229 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 277 std::unique_ptr<TestResourceHandler> old_handler(
230 &old_handler_status, &old_handler_final_bytes_read)); 278 new TestResourceHandler(&old_handler_status, &old_handler_body));
231 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 279 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
232 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 280 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
233 new InterceptingResourceHandler(std::move(old_handler), request.get())); 281 new InterceptingResourceHandler(std::move(old_handler), request.get()));
234 282
235 scoped_refptr<ResourceResponse> response(new ResourceResponse); 283 scoped_refptr<ResourceResponse> response(new ResourceResponse);
236 284
237 // Simulate the MimeSniffingResourceHandler buffering the data. 285 // Simulate the MimeSniffingResourceHandler buffering the data.
238 scoped_refptr<net::IOBuffer> read_buffer; 286 scoped_refptr<net::IOBuffer> read_buffer;
239 int buf_size = 0; 287 int buf_size = 0;
240 bool defer = false; 288 bool defer = false;
241 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 289 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
242 EXPECT_FALSE(defer); 290 EXPECT_FALSE(defer);
243 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 291 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
244 292
245 const std::string kData = "The data"; 293 const std::string kData = "The data";
246 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 294 ASSERT_EQ(read_buffer.get(), old_buffer.get());
247 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 295 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
248 memcpy(read_buffer->data(), kData.c_str(), kData.length()); 296 memcpy(read_buffer->data(), kData.c_str(), kData.length());
249 297
250 // Simulate the MimeSniffingResourceHandler asking the 298 // Simulate the MimeSniffingResourceHandler asking the
251 // InterceptingResourceHandler to switch to a new handler. 299 // InterceptingResourceHandler to switch to a new handler.
252 net::URLRequestStatus new_handler_status; 300 net::URLRequestStatus new_handler_status;
253 size_t new_handler_final_bytes_read = 0; 301 std::string new_handler_body;
254 std::unique_ptr<TestResourceHandler> new_handler_scoped( 302 std::unique_ptr<TestResourceHandler> new_handler_scoped(
255 new TestResourceHandler(&new_handler_status, 303 new TestResourceHandler(&new_handler_status, &new_handler_body));
256 &new_handler_final_bytes_read));
257 TestResourceHandler* new_test_handler = new_handler_scoped.get(); 304 TestResourceHandler* new_test_handler = new_handler_scoped.get();
258 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), 305 intercepting_handler->UseNewHandler(std::move(new_handler_scoped),
259 std::string()); 306 std::string());
260 307
261 // The response is received. The new ResourceHandler should be used handle 308 // The response is received. The new ResourceHandler should be used handle
262 // the download. 309 // the download.
263 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 310 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
264 EXPECT_FALSE(defer); 311 EXPECT_FALSE(defer);
265 312
266 EXPECT_FALSE(old_handler_status.is_success());
267 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
268 EXPECT_EQ(0ul, old_handler_final_bytes_read);
269
270 // It should not have received the download data yet. 313 // It should not have received the download data yet.
271 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data())); 314 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
272 315
273 // The read is replayed by the MimeSniffingResourceHandler. The data should 316 // The read is replayed by the MimeSniffingResourceHandler. The data should
274 // have been received by the new handler. 317 // have been received by the new handler.
275 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer)); 318 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
276 EXPECT_FALSE(defer); 319 EXPECT_FALSE(defer);
277 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data())); 320 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
278 321
322 EXPECT_FALSE(old_handler_status.is_success());
323 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
324 EXPECT_EQ(std::string(), old_handler_body);
325
279 // Make sure another read behaves as expected. 326 // Make sure another read behaves as expected.
280 buf_size = 0; 327 buf_size = 0;
281 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 328 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
282 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer()); 329 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer());
283 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 330 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
284 331
285 const std::string kData2 = "Data 2"; 332 const std::string kData2 = "Data 2";
286 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data())); 333 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data()));
287 memcpy(read_buffer->data(), kData2.c_str(), kData2.length()); 334 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
288 335
289 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer)); 336 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
290 EXPECT_FALSE(defer); 337 EXPECT_FALSE(defer);
291 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data())); 338 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data()));
292 EXPECT_EQ(kData.length() + kData2.length(), new_test_handler->bytes_read()); 339 EXPECT_EQ(std::string(kData) + kData2, new_handler_body);
293 } 340 }
294 341
295 // Tests that the data received is transmitted to the newly created 342 // Tests that the data received is transmitted to the newly created
296 // ResourceHandler and the specified payload to the old ResourceHandler. 343 // ResourceHandler and the specified payload to the old ResourceHandler.
297 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) { 344 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) {
298 net::URLRequestContext context; 345 net::URLRequestContext context;
299 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 346 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
300 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 347 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
301 ResourceRequestInfo::AllocateForTesting(request.get(), 348 ResourceRequestInfo::AllocateForTesting(request.get(),
302 RESOURCE_TYPE_MAIN_FRAME, 349 RESOURCE_TYPE_MAIN_FRAME,
303 nullptr, // context 350 nullptr, // context
304 0, // render_process_id 351 0, // render_process_id
305 0, // render_view_id 352 0, // render_view_id
306 0, // render_frame_id 353 0, // render_frame_id
307 true, // is_main_frame 354 true, // is_main_frame
308 false, // parent_is_main_frame 355 false, // parent_is_main_frame
309 true, // allow_download 356 true, // allow_download
310 true, // is_async 357 true, // is_async
311 false); // is_using_lofi 358 false); // is_using_lofi
312 359
313 net::URLRequestStatus old_handler_status; 360 net::URLRequestStatus old_handler_status;
314 size_t old_handler_final_bytes_read = 0; 361 std::string old_handler_body;
315 std::unique_ptr<TestResourceHandler> old_handler_scoped( 362 std::unique_ptr<TestResourceHandler> old_handler_scoped(
316 new TestResourceHandler(&old_handler_status, 363 new TestResourceHandler(&old_handler_status, &old_handler_body));
317 &old_handler_final_bytes_read));
318 TestResourceHandler* old_handler = old_handler_scoped.get(); 364 TestResourceHandler* old_handler = old_handler_scoped.get();
319 scoped_refptr<net::IOBuffer> old_buffer = old_handler->buffer(); 365 scoped_refptr<net::IOBuffer> old_buffer = old_handler->buffer();
320 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 366 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
321 new InterceptingResourceHandler(std::move(old_handler_scoped), 367 new InterceptingResourceHandler(std::move(old_handler_scoped),
322 request.get())); 368 request.get()));
323 369
324 scoped_refptr<ResourceResponse> response(new ResourceResponse); 370 scoped_refptr<ResourceResponse> response(new ResourceResponse);
325 371
326 // Simulate the MimeSniffingResourceHandler buffering the data. 372 // Simulate the MimeSniffingResourceHandler buffering the data.
327 scoped_refptr<net::IOBuffer> read_buffer; 373 scoped_refptr<net::IOBuffer> read_buffer;
328 int buf_size = 0; 374 int buf_size = 0;
329 bool defer = false; 375 bool defer = false;
330 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 376 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
331 EXPECT_FALSE(defer); 377 EXPECT_FALSE(defer);
332 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 378 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
333 379
334 const std::string kData = "The data"; 380 const std::string kData = "The data";
335 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 381 ASSERT_EQ(read_buffer.get(), old_buffer.get());
336 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 382 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
337 memcpy(read_buffer->data(), kData.c_str(), kData.length()); 383 memcpy(read_buffer->data(), kData.c_str(), kData.length());
338 384
339 // Simulate the MimeSniffingResourceHandler asking the 385 // Simulate the MimeSniffingResourceHandler asking the
340 // InterceptingResourceHandler to switch to a new handler. 386 // InterceptingResourceHandler to switch to a new handler.
341 const std::string kPayload = "The payload"; 387 const std::string kPayload = "The payload";
342 net::URLRequestStatus new_handler_status; 388 net::URLRequestStatus new_handler_status;
343 size_t new_handler_final_bytes_read = 0; 389 std::string new_handler_body;
344 std::unique_ptr<TestResourceHandler> new_handler_scoped( 390 std::unique_ptr<TestResourceHandler> new_handler_scoped(
345 new TestResourceHandler(&new_handler_status, 391 new TestResourceHandler(&new_handler_status, &new_handler_body));
346 &new_handler_final_bytes_read));
347 TestResourceHandler* new_test_handler = new_handler_scoped.get(); 392 TestResourceHandler* new_test_handler = new_handler_scoped.get();
348 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), kPayload); 393 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), kPayload);
349 394
350 // The old handler should not have received the payload yet. 395 // The old handler should not have received the payload yet.
351 ASSERT_FALSE(old_handler->bytes_read()); 396 ASSERT_EQ("", old_handler_body);
352 EXPECT_NE(kPayload, std::string(old_buffer->data())); 397 EXPECT_NE(kPayload, std::string(old_buffer->data()));
353 398
354 // The response is received. The new ResourceHandler should be used to handle 399 // The response is received. The new ResourceHandler should be used to handle
355 // the download. 400 // the download.
356 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 401 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
357 EXPECT_FALSE(defer); 402 EXPECT_FALSE(defer);
358 403
359 // The old handler should have received the payload. 404 // The old handler has not received the payload yet.
360 ASSERT_TRUE(old_handler_final_bytes_read == kPayload.size()); 405 EXPECT_EQ("", old_handler_body);
361 EXPECT_EQ(kPayload, std::string(old_buffer->data()));
362
363 EXPECT_TRUE(old_handler_status.is_success());
364 EXPECT_EQ(net::OK, old_handler_status.error());
365 406
366 // It should not have received the download data yet. 407 // It should not have received the download data yet.
367 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data())); 408 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
368 409
369 // The read is replayed by the MimeSniffingResourceHandler. The data should 410 // The read is replayed by the MimeSniffingResourceHandler. The data should
370 // have been received by the new handler. 411 // have been received by the new handler.
371 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer)); 412 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
372 EXPECT_FALSE(defer); 413 EXPECT_FALSE(defer);
373 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data())); 414 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
374 415
416 // The old handler should have received the payload.
417 ASSERT_EQ(kPayload, old_handler_body);
418 EXPECT_EQ(kPayload, std::string(old_buffer->data()));
419
420 EXPECT_TRUE(old_handler_status.is_success());
421 EXPECT_EQ(net::OK, old_handler_status.error());
422
375 // Make sure another read behave as expected. 423 // Make sure another read behave as expected.
376 buf_size = 0; 424 buf_size = 0;
377 const std::string kData2 = "Data 2"; 425 const std::string kData2 = "Data 2";
378 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 426 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
379 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer()); 427 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer());
380 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 428 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
381 429
382 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data())); 430 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data()));
383 memcpy(read_buffer->data(), kData2.c_str(), kData2.length()); 431 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
384 432
385 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer)); 433 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
386 EXPECT_FALSE(defer); 434 EXPECT_FALSE(defer);
387 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data())); 435 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data()));
388 EXPECT_EQ(kData.length() + kData2.length(), new_test_handler->bytes_read()); 436 EXPECT_EQ(std::string(kData) + kData2, new_handler_body);
389 } 437 }
390 438
391 // Tests that the handler behaves properly if the old handler fails will read. 439 // Tests that the handler behaves properly if the old handler fails will read.
392 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) { 440 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
393 net::URLRequestContext context; 441 net::URLRequestContext context;
394 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 442 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
395 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 443 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
396 ResourceRequestInfo::AllocateForTesting(request.get(), 444 ResourceRequestInfo::AllocateForTesting(request.get(),
397 RESOURCE_TYPE_MAIN_FRAME, 445 RESOURCE_TYPE_MAIN_FRAME,
398 nullptr, // context 446 nullptr, // context
399 0, // render_process_id 447 0, // render_process_id
400 0, // render_view_id 448 0, // render_view_id
401 0, // render_frame_id 449 0, // render_frame_id
402 true, // is_main_frame 450 true, // is_main_frame
403 false, // parent_is_main_frame 451 false, // parent_is_main_frame
404 true, // allow_download 452 true, // allow_download
405 true, // is_async 453 true, // is_async
406 false); // is_using_lofi 454 false); // is_using_lofi
407 455
408 net::URLRequestStatus old_handler_status; 456 net::URLRequestStatus old_handler_status;
409 size_t old_handler_final_bytes_read = 0; 457 std::string old_handler_body;
410 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 458 std::unique_ptr<TestResourceHandler> old_handler(
411 &old_handler_status, &old_handler_final_bytes_read, 459 new TestResourceHandler(&old_handler_status, &old_handler_body,
412 true, // on_response_started 460 true, // on_response_started
413 false, // on_will_read 461 false, // on_will_read
414 true)); // on_read_completed 462 true)); // on_read_completed
415 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 463 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
416 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 464 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
417 new InterceptingResourceHandler(std::move(old_handler), request.get())); 465 new InterceptingResourceHandler(std::move(old_handler), request.get()));
418 466
419 scoped_refptr<ResourceResponse> response(new ResourceResponse); 467 scoped_refptr<ResourceResponse> response(new ResourceResponse);
420 468
421 // Simulate the MimeSniffingResourceHandler buffering the data. The old 469 // Simulate the MimeSniffingResourceHandler buffering the data. The old
422 // handler should tell the caller to fail. 470 // handler should tell the caller to fail.
423 scoped_refptr<net::IOBuffer> read_buffer; 471 scoped_refptr<net::IOBuffer> read_buffer;
424 int buf_size = 0; 472 int buf_size = 0;
(...skipping 15 matching lines...) Expand all
440 0, // render_process_id 488 0, // render_process_id
441 0, // render_view_id 489 0, // render_view_id
442 0, // render_frame_id 490 0, // render_frame_id
443 true, // is_main_frame 491 true, // is_main_frame
444 false, // parent_is_main_frame 492 false, // parent_is_main_frame
445 true, // allow_download 493 true, // allow_download
446 true, // is_async 494 true, // is_async
447 false); // is_using_lofi 495 false); // is_using_lofi
448 496
449 net::URLRequestStatus old_handler_status; 497 net::URLRequestStatus old_handler_status;
450 size_t old_handler_final_bytes_read = 0; 498 std::string old_handler_body;
451 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 499 std::unique_ptr<TestResourceHandler> old_handler(
452 &old_handler_status, &old_handler_final_bytes_read)); 500 new TestResourceHandler(&old_handler_status, &old_handler_body));
453 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 501 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
454 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 502 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
455 new InterceptingResourceHandler(std::move(old_handler), request.get())); 503 new InterceptingResourceHandler(std::move(old_handler), request.get()));
456 504
457 scoped_refptr<ResourceResponse> response(new ResourceResponse); 505 scoped_refptr<ResourceResponse> response(new ResourceResponse);
458 506
459 // Simulate the MimeSniffingResourceHandler buffering the data. 507 // Simulate the MimeSniffingResourceHandler buffering the data.
460 scoped_refptr<net::IOBuffer> read_buffer; 508 scoped_refptr<net::IOBuffer> read_buffer;
461 int buf_size = 0; 509 int buf_size = 0;
462 bool defer = false; 510 bool defer = false;
463 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 511 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
464 EXPECT_FALSE(defer); 512 EXPECT_FALSE(defer);
465 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 513 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
466 514
467 const char kData[] = "The data"; 515 const char kData[] = "The data";
468 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 516 ASSERT_EQ(read_buffer.get(), old_buffer.get());
469 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 517 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
470 memcpy(read_buffer->data(), kData, sizeof(kData)); 518 memcpy(read_buffer->data(), kData, sizeof(kData));
471 519
472 // Simulate the MimeSniffingResourceHandler asking the 520 // Simulate the MimeSniffingResourceHandler asking the
473 // InterceptingResourceHandler to switch to a new handler. 521 // InterceptingResourceHandler to switch to a new handler.
474 net::URLRequestStatus new_handler_status; 522 net::URLRequestStatus new_handler_status;
475 size_t new_handler_final_bytes_read = 0; 523 std::string new_handler_body;
476 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 524 std::unique_ptr<TestResourceHandler> new_handler(
477 &new_handler_status, &new_handler_final_bytes_read, 525 new TestResourceHandler(&new_handler_status, &new_handler_body,
478 false, // on_response_started 526 false, // on_response_started
479 true, // on_will_read 527 true, // on_will_read
480 true)); // on_read_completed 528 true)); // on_read_completed
481 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 529 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
482 530
483 // The response is received. The new ResourceHandler should tell us to fail. 531 // The response is received. The new ResourceHandler should tell us to fail.
484 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 532 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
485 EXPECT_FALSE(defer); 533 EXPECT_FALSE(defer);
486 } 534 }
487 535
488 // Tests that the handler behaves properly if the new handler fails will read. 536 // Tests that the handler behaves properly if the new handler fails will read.
489 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { 537 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
490 net::URLRequestContext context; 538 net::URLRequestContext context;
491 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 539 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
492 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 540 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
493 ResourceRequestInfo::AllocateForTesting(request.get(), 541 ResourceRequestInfo::AllocateForTesting(request.get(),
494 RESOURCE_TYPE_MAIN_FRAME, 542 RESOURCE_TYPE_MAIN_FRAME,
495 nullptr, // context 543 nullptr, // context
496 0, // render_process_id 544 0, // render_process_id
497 0, // render_view_id 545 0, // render_view_id
498 0, // render_frame_id 546 0, // render_frame_id
499 true, // is_main_frame 547 true, // is_main_frame
500 false, // parent_is_main_frame 548 false, // parent_is_main_frame
501 true, // allow_download 549 true, // allow_download
502 true, // is_async 550 true, // is_async
503 false); // is_using_lofi 551 false); // is_using_lofi
504 552
505 net::URLRequestStatus old_handler_status; 553 net::URLRequestStatus old_handler_status;
506 size_t old_handler_final_bytes_read = 0; 554 std::string old_handler_body;
507 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 555 std::unique_ptr<TestResourceHandler> old_handler(
508 &old_handler_status, &old_handler_final_bytes_read)); 556 new TestResourceHandler(&old_handler_status, &old_handler_body));
509 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 557 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
510 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 558 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
511 new InterceptingResourceHandler(std::move(old_handler), request.get())); 559 new InterceptingResourceHandler(std::move(old_handler), request.get()));
512 560
513 scoped_refptr<ResourceResponse> response(new ResourceResponse); 561 scoped_refptr<ResourceResponse> response(new ResourceResponse);
514 562
515 // Simulate the MimeSniffingResourceHandler buffering the data. 563 // Simulate the MimeSniffingResourceHandler buffering the data.
516 scoped_refptr<net::IOBuffer> read_buffer; 564 scoped_refptr<net::IOBuffer> read_buffer;
517 int buf_size = 0; 565 int buf_size = 0;
518 bool defer = false; 566 bool defer = false;
519 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 567 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
520 EXPECT_FALSE(defer); 568 EXPECT_FALSE(defer);
521 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 569 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
522 570
523 const char kData[] = "The data"; 571 const char kData[] = "The data";
524 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 572 ASSERT_EQ(read_buffer.get(), old_buffer.get());
525 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 573 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
526 memcpy(read_buffer->data(), kData, sizeof(kData)); 574 memcpy(read_buffer->data(), kData, sizeof(kData));
527 575
528 // Simulate the MimeSniffingResourceHandler asking the 576 // Simulate the MimeSniffingResourceHandler asking the
529 // InterceptingResourceHandler to switch to a new handler. 577 // InterceptingResourceHandler to switch to a new handler.
530 net::URLRequestStatus new_handler_status; 578 net::URLRequestStatus new_handler_status;
531 size_t new_handler_final_bytes_read = 0; 579 std::string new_handler_body;
532 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 580 std::unique_ptr<TestResourceHandler> new_handler(
533 &new_handler_status, &new_handler_final_bytes_read, 581 new TestResourceHandler(&new_handler_status, &new_handler_body,
534 true, // on_response_started 582 true, // on_response_started
535 false, // on_will_read 583 false, // on_will_read
536 true)); // on_read_completed 584 true)); // on_read_completed
537 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 585 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
538 586
539 // The response is received. The new handler should not have been asked to 587 // The response is received. The new handler should not have been asked to
540 // read yet. 588 // read yet.
541 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 589 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
542 EXPECT_FALSE(defer); 590 EXPECT_FALSE(defer);
543 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
544 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
545 591
546 // The read is replayed by the MimeSniffingResourceHandler. The new 592 // The read is replayed by the MimeSniffingResourceHandler. The new
547 // handler should tell the caller to fail. 593 // handler should tell the caller to fail.
548 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); 594 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
549 EXPECT_FALSE(defer); 595 EXPECT_FALSE(defer);
550 } 596 }
551 597
552 // Tests that the handler behaves properly if the new handler fails read 598 // Tests that the handler behaves properly if the new handler fails read
553 // completed. 599 // completed.
554 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) { 600 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) {
555 net::URLRequestContext context; 601 net::URLRequestContext context;
556 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 602 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
557 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 603 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
558 ResourceRequestInfo::AllocateForTesting(request.get(), 604 ResourceRequestInfo::AllocateForTesting(request.get(),
559 RESOURCE_TYPE_MAIN_FRAME, 605 RESOURCE_TYPE_MAIN_FRAME,
560 nullptr, // context 606 nullptr, // context
561 0, // render_process_id 607 0, // render_process_id
562 0, // render_view_id 608 0, // render_view_id
563 0, // render_frame_id 609 0, // render_frame_id
564 true, // is_main_frame 610 true, // is_main_frame
565 false, // parent_is_main_frame 611 false, // parent_is_main_frame
566 true, // allow_download 612 true, // allow_download
567 true, // is_async 613 true, // is_async
568 false); // is_using_lofi 614 false); // is_using_lofi
569 615
570 net::URLRequestStatus old_handler_status; 616 net::URLRequestStatus old_handler_status;
571 size_t old_handler_final_bytes_read = 0; 617 std::string old_handler_body;
572 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 618 std::unique_ptr<TestResourceHandler> old_handler(
573 &old_handler_status, &old_handler_final_bytes_read)); 619 new TestResourceHandler(&old_handler_status, &old_handler_body));
574 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 620 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
575 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 621 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
576 new InterceptingResourceHandler(std::move(old_handler), request.get())); 622 new InterceptingResourceHandler(std::move(old_handler), request.get()));
577 623
578 scoped_refptr<ResourceResponse> response(new ResourceResponse); 624 scoped_refptr<ResourceResponse> response(new ResourceResponse);
579 625
580 // Simulate the MimeSniffingResourceHandler buffering the data. 626 // Simulate the MimeSniffingResourceHandler buffering the data.
581 scoped_refptr<net::IOBuffer> read_buffer; 627 scoped_refptr<net::IOBuffer> read_buffer;
582 int buf_size = 0; 628 int buf_size = 0;
583 bool defer = false; 629 bool defer = false;
584 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 630 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
585 EXPECT_FALSE(defer); 631 EXPECT_FALSE(defer);
586 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 632 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
587 633
588 const char kData[] = "The data"; 634 const char kData[] = "The data";
589 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 635 ASSERT_EQ(read_buffer.get(), old_buffer.get());
590 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 636 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
591 memcpy(read_buffer->data(), kData, sizeof(kData)); 637 memcpy(read_buffer->data(), kData, sizeof(kData));
592 638
593 // Simulate the MimeSniffingResourceHandler asking the 639 // Simulate the MimeSniffingResourceHandler asking the
594 // InterceptingResourceHandler to switch to a new handler. 640 // InterceptingResourceHandler to switch to a new handler.
595 net::URLRequestStatus new_handler_status; 641 net::URLRequestStatus new_handler_status;
596 size_t new_handler_final_bytes_read = 0; 642 std::string new_handler_body;
597 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 643 std::unique_ptr<TestResourceHandler> new_handler(
598 &new_handler_status, &new_handler_final_bytes_read, 644 new TestResourceHandler(&new_handler_status, &new_handler_body,
599 true, // on_response_started 645 true, // on_response_started
600 true, // on_will_read 646 true, // on_will_read
601 false)); // on_read_completed 647 false)); // on_read_completed
602 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 648 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
603 649
604 // The response is received. 650 // The response is received.
605 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 651 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
606 EXPECT_FALSE(defer); 652 EXPECT_FALSE(defer);
607 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
608 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
609 653
610 // The read is replayed by the MimeSniffingResourceHandler. The new handler 654 // The read is replayed by the MimeSniffingResourceHandler. The new handler
611 // should tell the caller to fail. 655 // should tell the caller to fail.
612 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); 656 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
613 EXPECT_FALSE(defer); 657 EXPECT_FALSE(defer);
614 } 658 }
615 659
660 // The old handler and the new handler set |defer| to true.
661 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
662 net::URLRequestContext context;
663 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
664 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
665 ResourceRequestInfo::AllocateForTesting(request.get(),
666 RESOURCE_TYPE_MAIN_FRAME,
667 nullptr, // context
668 0, // render_process_id
669 0, // render_view_id
670 0, // render_frame_id
671 true, // is_main_frame
672 false, // parent_is_main_frame
673 true, // allow_download
674 true, // is_async
675 false); // is_using_lofi
676
677 std::unique_ptr<TestResourceController> resource_controller =
678 base::MakeUnique<TestResourceController>();
679 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
680 0};
681 std::string old_handler_body;
682 std::unique_ptr<TestResourceHandler> old_handler(
683 new TestResourceHandler(&old_handler_status, &old_handler_body,
684 10, // buffer_size
685 true, // on_response_started
686 true, // on_will_read
687 true, // on_read_completed
688 false, // defer_on_response_started
689 true, // defer_on_read_completed
690 false)); // defer_on_response_completed
691 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
692 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
693 new InterceptingResourceHandler(std::move(old_handler), request.get()));
694 intercepting_handler->SetController(resource_controller.get());
695
696 scoped_refptr<ResourceResponse> response(new ResourceResponse);
697
698 // Simulate the MimeSniffingResourceHandler buffering the data.
699 scoped_refptr<net::IOBuffer> read_buffer;
700 int buf_size = 0;
701 bool defer = false;
702 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
703 EXPECT_FALSE(defer);
704 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
705
706 const char kData[] = "The data";
707 ASSERT_EQ(read_buffer.get(), old_buffer.get());
708 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData));
709 memcpy(read_buffer->data(), kData, strlen(kData));
710
711 // Simulate the MimeSniffingResourceHandler asking the
712 // InterceptingResourceHandler to switch to a new handler.
713 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
714 0};
715
716 std::string new_handler_body;
717 const std::string kPayload = "The long long long long long payload";
718 ASSERT_GT(kPayload.size(), static_cast<size_t>(buf_size));
719 std::unique_ptr<TestResourceHandler> new_handler(
720 new TestResourceHandler(&new_handler_status, &new_handler_body,
721 1, // buffer_size
722 true, // on_response_started
723 true, // on_will_read
724 true, // on_read_completed
725 true, // defer_on_response_started
726 true, // defer_on_read_completed
727 true)); // defer_on_response_completed
728 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
729
730 // The response is received.
731 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
732 ASSERT_TRUE(defer);
733
734 intercepting_handler->Resume();
735 EXPECT_EQ(1, resource_controller->num_resume_called());
736 EXPECT_EQ(std::string(), old_handler_body);
737 EXPECT_EQ(std::string(), new_handler_body);
738
739 defer = false;
740 ASSERT_TRUE(intercepting_handler->OnReadCompleted(strlen(kData), &defer));
741 ASSERT_TRUE(defer);
742
743 EXPECT_EQ(std::string(), old_handler_body);
744 EXPECT_EQ("T", new_handler_body);
745
746 intercepting_handler->Resume();
747 EXPECT_EQ(1, resource_controller->num_resume_called());
748 EXPECT_EQ("The long l", old_handler_body);
749 EXPECT_EQ(kData, new_handler_body);
750
751 intercepting_handler->Resume();
752 EXPECT_EQ(2, resource_controller->num_resume_called());
753 EXPECT_EQ(kPayload, old_handler_body);
754 EXPECT_EQ(kData, new_handler_body);
755
756 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
757 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
758
759 defer = false;
760 intercepting_handler->OnResponseCompleted({net::URLRequestStatus::SUCCESS, 0},
761 &defer);
762 ASSERT_TRUE(defer);
763 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
764 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::SUCCESS);
765 }
766
767 TEST_F(InterceptingResourceHandlerTest, DeferredCompletion) {
768 net::URLRequestContext context;
769 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
770 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
771 ResourceRequestInfo::AllocateForTesting(request.get(),
772 RESOURCE_TYPE_MAIN_FRAME,
773 nullptr, // context
774 0, // render_process_id
775 0, // render_view_id
776 0, // render_frame_id
777 true, // is_main_frame
778 false, // parent_is_main_frame
779 true, // allow_download
780 true, // is_async
781 false); // is_using_lofi
782
783 std::unique_ptr<TestResourceController> resource_controller =
784 base::MakeUnique<TestResourceController>();
785 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
786 0};
787 std::string old_handler_body;
788 std::unique_ptr<TestResourceHandler> old_handler(
789 new TestResourceHandler(&old_handler_status, &old_handler_body));
790 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
791 new InterceptingResourceHandler(std::move(old_handler), request.get()));
792 intercepting_handler->SetController(resource_controller.get());
793
794 scoped_refptr<ResourceResponse> response(new ResourceResponse);
795
796 // Simulate the MimeSniffingResourceHandler buffering the data.
797 scoped_refptr<net::IOBuffer> read_buffer;
798 int buf_size = 0;
799 bool defer = false;
800 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
801 EXPECT_FALSE(defer);
802 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
803
804 const char kData[] = "The data";
805 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData));
806 memcpy(read_buffer->data(), kData, strlen(kData));
807
808 // Simulate the MimeSniffingResourceHandler asking the
809 // InterceptingResourceHandler to switch to a new handler.
810 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
811 0};
812
813 std::string new_handler_body;
814 const std::string kPayload = "The payload";
815 std::unique_ptr<TestResourceHandler> new_handler(
816 new TestResourceHandler(&new_handler_status, &new_handler_body,
817 1, // buffer_size
818 true, // on_response_started
819 true, // on_will_read
820 false, // on_read_completed
821 false, // defer_on_response_started
822 false, // defer_on_read_completed
823 true)); // defer_on_response_completed
824 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
825
826 // The response is received.
827 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
828 ASSERT_FALSE(defer);
829
830 ASSERT_FALSE(intercepting_handler->OnReadCompleted(strlen(kData), &defer));
831 ASSERT_FALSE(defer);
832
833 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::IO_PENDING);
834 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
835
836 defer = false;
837 intercepting_handler->OnResponseCompleted(
838 {net::URLRequestStatus::CANCELED, net::ERR_FAILED}, &defer);
839 ASSERT_TRUE(defer);
840 EXPECT_EQ(0, resource_controller->num_resume_called());
841 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::CANCELED);
842 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::CANCELED);
843
844 intercepting_handler->Resume();
845 EXPECT_EQ(1, resource_controller->num_resume_called());
846 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::CANCELED);
847 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::CANCELED);
848 }
849
616 } // namespace 850 } // namespace
617 851
618 } // namespace content 852 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698