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

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

Powered by Google App Engine
This is Rietveld 408576698