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

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_; }
mmenke 2016/10/11 21:34:35 times_resume_called? num_times_resumed_called? r
yhirano 2016/10/12 10:36:21 Done.
42
43 private:
44 int num_resume_called_ = 0;
mmenke 2016/10/11 21:34:35 DISALLOW_COPY_AND_ASSIGN?
yhirano 2016/10/12 10:36:21 Done.
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;
mmenke 2016/10/11 21:34:35 include <string>
yhirano 2016/10/12 10:36:21 Done.
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;
171 bool defer = false; 219 bool defer = false;
172 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 220 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
173 EXPECT_FALSE(defer); 221 EXPECT_FALSE(defer);
174 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 222 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
175 223
176 const std::string kData = "The data"; 224 const std::string kData = "The data";
177 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data())); 225 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data()));
178 226
179 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer()); 227 ASSERT_NE(read_buffer.get(), old_test_handler->buffer());
180 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 228 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
181 memcpy(read_buffer->data(), kData.c_str(), kData.length()); 229 memcpy(read_buffer->data(), kData.c_str(), kData.length());
182 230
183 // The response is received. The handler should not change. 231 // The response is received. The handler should not change.
184 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 232 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
185 EXPECT_FALSE(defer); 233 EXPECT_FALSE(defer);
186 234
187 // The read is replayed by the MimeSniffingResourceHandler. The data should 235 // The read is replayed by the MimeSniffingResourceHandler. The data should
188 // have been received by the old intercepting_handler. 236 // have been received by the old intercepting_handler.
189 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer)); 237 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
190 EXPECT_FALSE(defer); 238 EXPECT_FALSE(defer);
191 EXPECT_EQ(kData, std::string(old_test_handler->buffer()->data())); 239 EXPECT_EQ(kData, std::string(old_test_handler->buffer()->data()));
192 240
193 // Make sure another read behave as expected. 241 // Make sure another read behave as expected.
194 buf_size = 0; 242 buf_size = 0;
195 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 243 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
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_NE(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()); 313 EXPECT_FALSE(old_handler_status.is_success());
267 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); 314 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
268 EXPECT_EQ(0ul, old_handler_final_bytes_read); 315 EXPECT_EQ(std::string(), old_handler_body);
269 316
270 // It should not have received the download data yet. 317 // It should not have received the download data yet.
271 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data())); 318 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
272 319
273 // The read is replayed by the MimeSniffingResourceHandler. The data should 320 // The read is replayed by the MimeSniffingResourceHandler. The data should
274 // have been received by the new handler. 321 // have been received by the new handler.
275 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer)); 322 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
276 EXPECT_FALSE(defer); 323 EXPECT_FALSE(defer);
277 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data())); 324 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
278 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(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_NE(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 should have received the payload.
360 ASSERT_TRUE(old_handler_final_bytes_read == kPayload.size()); 405 EXPECT_EQ(kPayload, old_handler_body);
361 EXPECT_EQ(kPayload, std::string(old_buffer->data())); 406 EXPECT_EQ(kPayload, std::string(old_buffer->data()));
362 407
363 EXPECT_TRUE(old_handler_status.is_success()); 408 EXPECT_TRUE(old_handler_status.is_success());
364 EXPECT_EQ(net::OK, old_handler_status.error()); 409 EXPECT_EQ(net::OK, old_handler_status.error());
365 410
366 // It should not have received the download data yet. 411 // It should not have received the download data yet.
367 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data())); 412 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
368 413
369 // The read is replayed by the MimeSniffingResourceHandler. The data should 414 // The read is replayed by the MimeSniffingResourceHandler. The data should
370 // have been received by the new handler. 415 // have been received by the new handler.
371 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer)); 416 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
372 EXPECT_FALSE(defer); 417 EXPECT_FALSE(defer);
373 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data())); 418 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
374 419
375 // Make sure another read behave as expected. 420 // Make sure another read behave as expected.
376 buf_size = 0; 421 buf_size = 0;
377 const std::string kData2 = "Data 2"; 422 const std::string kData2 = "Data 2";
378 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 423 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
379 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer()); 424 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer());
380 ASSERT_GT(static_cast<size_t>(buf_size), kData.length()); 425 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
381 426
382 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data())); 427 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data()));
383 memcpy(read_buffer->data(), kData2.c_str(), kData2.length()); 428 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
384 429
385 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer)); 430 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
386 EXPECT_FALSE(defer); 431 EXPECT_FALSE(defer);
387 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data())); 432 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data()));
388 EXPECT_EQ(kData.length() + kData2.length(), new_test_handler->bytes_read()); 433 EXPECT_EQ(kData + kData2, new_handler_body);
389 } 434 }
390 435
391 // Tests that the handler behaves properly if the old handler fails will read. 436 // Tests that the handler behaves properly if the old handler fails will read.
392 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) { 437 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
393 net::URLRequestContext context; 438 net::URLRequestContext context;
394 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 439 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
395 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 440 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
396 ResourceRequestInfo::AllocateForTesting(request.get(), 441 ResourceRequestInfo::AllocateForTesting(request.get(),
397 RESOURCE_TYPE_MAIN_FRAME, 442 RESOURCE_TYPE_MAIN_FRAME,
398 nullptr, // context 443 nullptr, // context
399 0, // render_process_id 444 0, // render_process_id
400 0, // render_view_id 445 0, // render_view_id
401 0, // render_frame_id 446 0, // render_frame_id
402 true, // is_main_frame 447 true, // is_main_frame
403 false, // parent_is_main_frame 448 false, // parent_is_main_frame
404 true, // allow_download 449 true, // allow_download
405 true, // is_async 450 true, // is_async
406 false); // is_using_lofi 451 false); // is_using_lofi
407 452
408 net::URLRequestStatus old_handler_status; 453 net::URLRequestStatus old_handler_status;
409 size_t old_handler_final_bytes_read = 0; 454 std::string old_handler_body;
410 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 455 std::unique_ptr<TestResourceHandler> old_handler(
411 &old_handler_status, &old_handler_final_bytes_read, 456 new TestResourceHandler(&old_handler_status, &old_handler_body,
412 true, // on_response_started 457 true, // on_response_started
413 false, // on_will_read 458 false, // on_will_read
414 true)); // on_read_completed 459 true)); // on_read_completed
415 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 460 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
416 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 461 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
417 new InterceptingResourceHandler(std::move(old_handler), request.get())); 462 new InterceptingResourceHandler(std::move(old_handler), request.get()));
418 463
419 scoped_refptr<ResourceResponse> response(new ResourceResponse); 464 scoped_refptr<ResourceResponse> response(new ResourceResponse);
420 465
421 // Simulate the MimeSniffingResourceHandler buffering the data. The old 466 // Simulate the MimeSniffingResourceHandler buffering the data. The old
422 // handler should tell the caller to fail. 467 // handler should tell the caller to fail.
423 scoped_refptr<net::IOBuffer> read_buffer; 468 scoped_refptr<net::IOBuffer> read_buffer;
424 int buf_size = 0; 469 int buf_size = 0;
(...skipping 15 matching lines...) Expand all
440 0, // render_process_id 485 0, // render_process_id
441 0, // render_view_id 486 0, // render_view_id
442 0, // render_frame_id 487 0, // render_frame_id
443 true, // is_main_frame 488 true, // is_main_frame
444 false, // parent_is_main_frame 489 false, // parent_is_main_frame
445 true, // allow_download 490 true, // allow_download
446 true, // is_async 491 true, // is_async
447 false); // is_using_lofi 492 false); // is_using_lofi
448 493
449 net::URLRequestStatus old_handler_status; 494 net::URLRequestStatus old_handler_status;
450 size_t old_handler_final_bytes_read = 0; 495 std::string old_handler_body;
451 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 496 std::unique_ptr<TestResourceHandler> old_handler(
452 &old_handler_status, &old_handler_final_bytes_read)); 497 new TestResourceHandler(&old_handler_status, &old_handler_body));
453 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 498 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
454 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 499 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
455 new InterceptingResourceHandler(std::move(old_handler), request.get())); 500 new InterceptingResourceHandler(std::move(old_handler), request.get()));
456 501
457 scoped_refptr<ResourceResponse> response(new ResourceResponse); 502 scoped_refptr<ResourceResponse> response(new ResourceResponse);
458 503
459 // Simulate the MimeSniffingResourceHandler buffering the data. 504 // Simulate the MimeSniffingResourceHandler buffering the data.
460 scoped_refptr<net::IOBuffer> read_buffer; 505 scoped_refptr<net::IOBuffer> read_buffer;
461 int buf_size = 0; 506 int buf_size = 0;
462 bool defer = false; 507 bool defer = false;
463 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 508 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
464 EXPECT_FALSE(defer); 509 EXPECT_FALSE(defer);
465 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 510 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
466 511
467 const char kData[] = "The data"; 512 const char kData[] = "The data";
468 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 513 ASSERT_NE(read_buffer.get(), old_buffer.get());
469 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 514 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
470 memcpy(read_buffer->data(), kData, sizeof(kData)); 515 memcpy(read_buffer->data(), kData, sizeof(kData));
471 516
472 // Simulate the MimeSniffingResourceHandler asking the 517 // Simulate the MimeSniffingResourceHandler asking the
473 // InterceptingResourceHandler to switch to a new handler. 518 // InterceptingResourceHandler to switch to a new handler.
474 net::URLRequestStatus new_handler_status; 519 net::URLRequestStatus new_handler_status;
475 size_t new_handler_final_bytes_read = 0; 520 std::string new_handler_body;
476 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 521 std::unique_ptr<TestResourceHandler> new_handler(
477 &new_handler_status, &new_handler_final_bytes_read, 522 new TestResourceHandler(&new_handler_status, &new_handler_body,
478 false, // on_response_started 523 false, // on_response_started
479 true, // on_will_read 524 true, // on_will_read
480 true)); // on_read_completed 525 true)); // on_read_completed
481 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 526 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
482 527
483 // The response is received. The new ResourceHandler should tell us to fail. 528 // The response is received. The new ResourceHandler should tell us to fail.
484 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 529 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
485 EXPECT_FALSE(defer); 530 EXPECT_FALSE(defer);
486 } 531 }
487 532
488 // Tests that the handler behaves properly if the new handler fails will read. 533 // Tests that the handler behaves properly if the new handler fails will read.
489 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { 534 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
490 net::URLRequestContext context; 535 net::URLRequestContext context;
491 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 536 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
492 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 537 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
493 ResourceRequestInfo::AllocateForTesting(request.get(), 538 ResourceRequestInfo::AllocateForTesting(request.get(),
494 RESOURCE_TYPE_MAIN_FRAME, 539 RESOURCE_TYPE_MAIN_FRAME,
495 nullptr, // context 540 nullptr, // context
496 0, // render_process_id 541 0, // render_process_id
497 0, // render_view_id 542 0, // render_view_id
498 0, // render_frame_id 543 0, // render_frame_id
499 true, // is_main_frame 544 true, // is_main_frame
500 false, // parent_is_main_frame 545 false, // parent_is_main_frame
501 true, // allow_download 546 true, // allow_download
502 true, // is_async 547 true, // is_async
503 false); // is_using_lofi 548 false); // is_using_lofi
504 549
505 net::URLRequestStatus old_handler_status; 550 net::URLRequestStatus old_handler_status;
506 size_t old_handler_final_bytes_read = 0; 551 std::string old_handler_body;
507 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 552 std::unique_ptr<TestResourceHandler> old_handler(
508 &old_handler_status, &old_handler_final_bytes_read)); 553 new TestResourceHandler(&old_handler_status, &old_handler_body));
509 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 554 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
510 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 555 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
511 new InterceptingResourceHandler(std::move(old_handler), request.get())); 556 new InterceptingResourceHandler(std::move(old_handler), request.get()));
512 557
513 scoped_refptr<ResourceResponse> response(new ResourceResponse); 558 scoped_refptr<ResourceResponse> response(new ResourceResponse);
514 559
515 // Simulate the MimeSniffingResourceHandler buffering the data. 560 // Simulate the MimeSniffingResourceHandler buffering the data.
516 scoped_refptr<net::IOBuffer> read_buffer; 561 scoped_refptr<net::IOBuffer> read_buffer;
517 int buf_size = 0; 562 int buf_size = 0;
518 bool defer = false; 563 bool defer = false;
519 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 564 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
520 EXPECT_FALSE(defer); 565 EXPECT_FALSE(defer);
521 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 566 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
522 567
523 const char kData[] = "The data"; 568 const char kData[] = "The data";
524 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 569 ASSERT_NE(read_buffer.get(), old_buffer.get());
525 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 570 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
526 memcpy(read_buffer->data(), kData, sizeof(kData)); 571 memcpy(read_buffer->data(), kData, sizeof(kData));
527 572
528 // Simulate the MimeSniffingResourceHandler asking the 573 // Simulate the MimeSniffingResourceHandler asking the
529 // InterceptingResourceHandler to switch to a new handler. 574 // InterceptingResourceHandler to switch to a new handler.
530 net::URLRequestStatus new_handler_status; 575 net::URLRequestStatus new_handler_status;
531 size_t new_handler_final_bytes_read = 0; 576 std::string new_handler_body;
532 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 577 std::unique_ptr<TestResourceHandler> new_handler(
533 &new_handler_status, &new_handler_final_bytes_read, 578 new TestResourceHandler(&new_handler_status, &new_handler_body,
534 true, // on_response_started 579 true, // on_response_started
535 false, // on_will_read 580 false, // on_will_read
536 true)); // on_read_completed 581 true)); // on_read_completed
537 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 582 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
538 583
539 // The response is received. The new handler should not have been asked to 584 // The response is received. The new handler should not have been asked to
540 // read yet. 585 // read yet.
541 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 586 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
542 EXPECT_FALSE(defer); 587 EXPECT_FALSE(defer);
543 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); 588 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
544 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); 589 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
545 590
546 // The read is replayed by the MimeSniffingResourceHandler. The new 591 // The read is replayed by the MimeSniffingResourceHandler. The new
(...skipping 14 matching lines...) Expand all
561 0, // render_process_id 606 0, // render_process_id
562 0, // render_view_id 607 0, // render_view_id
563 0, // render_frame_id 608 0, // render_frame_id
564 true, // is_main_frame 609 true, // is_main_frame
565 false, // parent_is_main_frame 610 false, // parent_is_main_frame
566 true, // allow_download 611 true, // allow_download
567 true, // is_async 612 true, // is_async
568 false); // is_using_lofi 613 false); // is_using_lofi
569 614
570 net::URLRequestStatus old_handler_status; 615 net::URLRequestStatus old_handler_status;
571 size_t old_handler_final_bytes_read = 0; 616 std::string old_handler_body;
572 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler( 617 std::unique_ptr<TestResourceHandler> old_handler(
573 &old_handler_status, &old_handler_final_bytes_read)); 618 new TestResourceHandler(&old_handler_status, &old_handler_body));
574 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 619 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
575 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 620 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
576 new InterceptingResourceHandler(std::move(old_handler), request.get())); 621 new InterceptingResourceHandler(std::move(old_handler), request.get()));
577 622
578 scoped_refptr<ResourceResponse> response(new ResourceResponse); 623 scoped_refptr<ResourceResponse> response(new ResourceResponse);
579 624
580 // Simulate the MimeSniffingResourceHandler buffering the data. 625 // Simulate the MimeSniffingResourceHandler buffering the data.
581 scoped_refptr<net::IOBuffer> read_buffer; 626 scoped_refptr<net::IOBuffer> read_buffer;
582 int buf_size = 0; 627 int buf_size = 0;
583 bool defer = false; 628 bool defer = false;
584 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 629 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
585 EXPECT_FALSE(defer); 630 EXPECT_FALSE(defer);
586 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 631 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
587 632
588 const char kData[] = "The data"; 633 const char kData[] = "The data";
589 ASSERT_EQ(read_buffer.get(), old_buffer.get()); 634 ASSERT_NE(read_buffer.get(), old_buffer.get());
590 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 635 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
591 memcpy(read_buffer->data(), kData, sizeof(kData)); 636 memcpy(read_buffer->data(), kData, sizeof(kData));
592 637
593 // Simulate the MimeSniffingResourceHandler asking the 638 // Simulate the MimeSniffingResourceHandler asking the
594 // InterceptingResourceHandler to switch to a new handler. 639 // InterceptingResourceHandler to switch to a new handler.
595 net::URLRequestStatus new_handler_status; 640 net::URLRequestStatus new_handler_status;
596 size_t new_handler_final_bytes_read = 0; 641 std::string new_handler_body;
597 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler( 642 std::unique_ptr<TestResourceHandler> new_handler(
598 &new_handler_status, &new_handler_final_bytes_read, 643 new TestResourceHandler(&new_handler_status, &new_handler_body,
599 true, // on_response_started 644 true, // on_response_started
600 true, // on_will_read 645 true, // on_will_read
601 false)); // on_read_completed 646 false)); // on_read_completed
602 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 647 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
603 648
604 // The response is received. 649 // The response is received.
605 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 650 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
606 EXPECT_FALSE(defer); 651 EXPECT_FALSE(defer);
607 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); 652 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
608 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); 653 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
609 654
610 // The read is replayed by the MimeSniffingResourceHandler. The new handler 655 // The read is replayed by the MimeSniffingResourceHandler. The new handler
611 // should tell the caller to fail. 656 // should tell the caller to fail.
612 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer)); 657 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
613 EXPECT_FALSE(defer); 658 EXPECT_FALSE(defer);
614 } 659 }
615 660
661 // The old handler and the new handler set |defer| to true.
662 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) {
663 net::URLRequestContext context;
664 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
665 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
666 ResourceRequestInfo::AllocateForTesting(request.get(),
667 RESOURCE_TYPE_MAIN_FRAME,
668 nullptr, // context
669 0, // render_process_id
670 0, // render_view_id
671 0, // render_frame_id
672 true, // is_main_frame
673 false, // parent_is_main_frame
674 true, // allow_download
675 true, // is_async
676 false); // is_using_lofi
677
678 std::unique_ptr<TestResourceController> resource_controller =
679 base::MakeUnique<TestResourceController>();
680 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
681 0};
682 std::string old_handler_body;
683 std::unique_ptr<TestResourceHandler> old_handler(
684 new TestResourceHandler(&old_handler_status, &old_handler_body,
685 10, // buffer_size
686 true, // on_response_started
687 true, // on_will_read
688 true, // on_read_completed
689 false, // defer_on_response_started
690 true, // defer_on_read_completed
691 false)); // defer_on_response_completed
692 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
693 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
694 new InterceptingResourceHandler(std::move(old_handler), request.get()));
695 intercepting_handler->SetController(resource_controller.get());
696
697 scoped_refptr<ResourceResponse> response(new ResourceResponse);
698
699 // Simulate the MimeSniffingResourceHandler buffering the data.
700 scoped_refptr<net::IOBuffer> read_buffer;
701 int buf_size = 0;
702 bool defer = false;
703 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
704 EXPECT_FALSE(defer);
705 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
706
707 const char kData[] = "The data";
708 ASSERT_NE(read_buffer.get(), old_buffer.get());
709 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData));
710 memcpy(read_buffer->data(), kData, strlen(kData));
711
712 // Simulate the MimeSniffingResourceHandler asking the
713 // InterceptingResourceHandler to switch to a new handler.
714 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
715 0};
716
717 std::string new_handler_body;
718 const std::string kPayload = "The long long long long long payload";
719 ASSERT_GT(kPayload.size(), static_cast<size_t>(buf_size));
720 std::unique_ptr<TestResourceHandler> new_handler(
721 new TestResourceHandler(&new_handler_status, &new_handler_body,
722 1, // buffer_size
723 true, // on_response_started
724 true, // on_will_read
725 true, // on_read_completed
726 true, // defer_on_response_started
727 true, // defer_on_read_completed
728 true)); // defer_on_response_completed
729 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
730
731 // The response is received.
732 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
733 ASSERT_TRUE(defer);
734
735 EXPECT_EQ("The long l", old_handler_body);
736 EXPECT_EQ(std::string(), new_handler_body);
737
738 intercepting_handler->Resume();
739 EXPECT_EQ(0, resource_controller->num_resume_called());
740 EXPECT_EQ(kPayload, old_handler_body);
741 EXPECT_EQ(std::string(), new_handler_body);
742
743 intercepting_handler->Resume();
744 EXPECT_EQ(1, resource_controller->num_resume_called());
745 EXPECT_EQ(kPayload, old_handler_body);
746 EXPECT_EQ(std::string(), new_handler_body);
747
748 defer = false;
749 ASSERT_TRUE(intercepting_handler->OnReadCompleted(strlen(kData), &defer));
750 ASSERT_TRUE(defer);
751
752 EXPECT_EQ(kPayload, old_handler_body);
753 EXPECT_EQ("T", new_handler_body);
754
755 intercepting_handler->Resume();
756 EXPECT_EQ(2, resource_controller->num_resume_called());
757 EXPECT_EQ(kPayload, old_handler_body);
758 EXPECT_EQ(kData, new_handler_body);
759
760 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
761 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
762
763 defer = false;
764 intercepting_handler->OnResponseCompleted({net::URLRequestStatus::SUCCESS, 0},
765 &defer);
766 ASSERT_TRUE(defer);
767 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
768 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::SUCCESS);
769 }
770
771 TEST_F(InterceptingResourceHandlerTest, DeferredCompletion) {
772 net::URLRequestContext context;
773 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
774 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
775 ResourceRequestInfo::AllocateForTesting(request.get(),
776 RESOURCE_TYPE_MAIN_FRAME,
777 nullptr, // context
778 0, // render_process_id
779 0, // render_view_id
780 0, // render_frame_id
781 true, // is_main_frame
782 false, // parent_is_main_frame
783 true, // allow_download
784 true, // is_async
785 false); // is_using_lofi
786
787 std::unique_ptr<TestResourceController> resource_controller =
788 base::MakeUnique<TestResourceController>();
789 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
790 0};
791 std::string old_handler_body;
792 std::unique_ptr<TestResourceHandler> old_handler(
793 new TestResourceHandler(&old_handler_status, &old_handler_body,
794 2048, // buffer_size
795 true, // on_response_started
796 true, // on_will_read
797 false, // on_read_completed
798 false, // defer_on_response_started
799 false, // defer_on_read_completed
800 false)); // defer_on_response_completed
801
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 true, // 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_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
840 ASSERT_FALSE(defer);
841
842 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status.status());
843 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
844
845 intercepting_handler->OnResponseCompleted(
846 {net::URLRequestStatus::CANCELED, net::ERR_FAILED}, &defer);
847 ASSERT_TRUE(defer);
848 EXPECT_EQ(0, resource_controller->num_resume_called());
849 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
850 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status());
851
852 intercepting_handler->Resume();
853 EXPECT_EQ(1, resource_controller->num_resume_called());
854 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
855 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status());
856 }
857
616 } // namespace 858 } // namespace
617 859
618 } // namespace content 860 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698