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

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

Powered by Google App Engine
This is Rietveld 408576698