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

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

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

Powered by Google App Engine
This is Rietveld 408576698