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

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

Powered by Google App Engine
This is Rietveld 408576698