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/test_resource_handler.cc

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Response to comments Created 3 years, 10 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/test_resource_handler.h" 5 #include "content/browser/loader/test_resource_handler.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/ptr_util.h"
8 #include "content/browser/loader/resource_controller.h" 9 #include "content/browser/loader/resource_controller.h"
9 #include "content/public/common/resource_response.h" 10 #include "content/public/common/resource_response.h"
10 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
11 12
12 namespace content { 13 namespace content {
13 14
14 namespace { 15 namespace {
15 16
16 class ScopedCallDepthTracker { 17 class ScopedCallDepthTracker {
17 public: 18 public:
(...skipping 23 matching lines...) Expand all
41 deferred_run_loop_(new base::RunLoop()), 42 deferred_run_loop_(new base::RunLoop()),
42 weak_ptr_factory_(this) { 43 weak_ptr_factory_(this) {
43 SetBufferSize(2048); 44 SetBufferSize(2048);
44 } 45 }
45 46
46 TestResourceHandler::TestResourceHandler() 47 TestResourceHandler::TestResourceHandler()
47 : TestResourceHandler(nullptr, nullptr) {} 48 : TestResourceHandler(nullptr, nullptr) {}
48 49
49 TestResourceHandler::~TestResourceHandler() {} 50 TestResourceHandler::~TestResourceHandler() {}
50 51
51 void TestResourceHandler::SetController(ResourceController* controller) { 52 void TestResourceHandler::OnRequestRedirected(
52 controller_ = controller;
53 }
54
55 bool TestResourceHandler::OnRequestRedirected(
56 const net::RedirectInfo& redirect_info, 53 const net::RedirectInfo& redirect_info,
57 ResourceResponse* response, 54 ResourceResponse* response,
58 bool* defer) { 55 std::unique_ptr<ResourceController> controller) {
59 EXPECT_FALSE(canceled_); 56 EXPECT_FALSE(canceled_);
60 EXPECT_EQ(1, on_will_start_called_); 57 EXPECT_EQ(1, on_will_start_called_);
61 EXPECT_EQ(0, on_response_started_called_); 58 EXPECT_EQ(0, on_response_started_called_);
62 EXPECT_EQ(0, on_response_completed_called_); 59 EXPECT_EQ(0, on_response_completed_called_);
63 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 60 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
64 61
65 ++on_request_redirected_called_; 62 ++on_request_redirected_called_;
66 63
67 if (!on_request_redirected_result_) { 64 if (!on_request_redirected_result_) {
68 canceled_ = true; 65 canceled_ = true;
69 return false; 66 controller->Cancel();
67 return;
70 } 68 }
71 69
72 *defer = defer_on_request_redirected_; 70 if (defer_on_request_redirected_) {
73 defer_on_request_redirected_ = false; 71 defer_on_request_redirected_ = false;
74 if (*defer) 72 HoldController(std::move(controller));
75 deferred_run_loop_->Quit(); 73 deferred_run_loop_->Quit();
76 return true; 74 return;
75 }
76
77 controller->Resume();
77 } 78 }
78 79
79 bool TestResourceHandler::OnResponseStarted(ResourceResponse* response, 80 void TestResourceHandler::OnResponseStarted(
80 bool* defer) { 81 ResourceResponse* response,
82 std::unique_ptr<ResourceController> controller) {
81 EXPECT_FALSE(canceled_); 83 EXPECT_FALSE(canceled_);
82 EXPECT_EQ(1, on_will_start_called_); 84 EXPECT_EQ(1, on_will_start_called_);
83 EXPECT_EQ(0, on_response_started_called_); 85 EXPECT_EQ(0, on_response_started_called_);
84 EXPECT_EQ(0, on_response_completed_called_); 86 EXPECT_EQ(0, on_response_completed_called_);
85 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 87 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
86 88
87 ++on_response_started_called_; 89 ++on_response_started_called_;
88 90
89 EXPECT_FALSE(resource_response_); 91 EXPECT_FALSE(resource_response_);
90 resource_response_ = response; 92 resource_response_ = response;
91 93
92 if (!on_response_started_result_) { 94 if (!on_response_started_result_) {
93 canceled_ = true; 95 canceled_ = true;
94 return false; 96 controller->Cancel();
97 return;
95 } 98 }
96 99
97 *defer = defer_on_response_started_; 100 if (!on_request_redirected_result_) {
98 defer_on_response_started_ = false; 101 controller->Cancel();
99 if (*defer) 102 return;
103 }
104
105 if (defer_on_response_started_) {
106 defer_on_response_started_ = false;
107 HoldController(std::move(controller));
100 deferred_run_loop_->Quit(); 108 deferred_run_loop_->Quit();
101 return true; 109 return;
110 }
111
112 controller->Resume();
102 } 113 }
103 114
104 bool TestResourceHandler::OnWillStart(const GURL& url, bool* defer) { 115 void TestResourceHandler::OnWillStart(
116 const GURL& url,
117 std::unique_ptr<ResourceController> controller) {
105 EXPECT_FALSE(canceled_); 118 EXPECT_FALSE(canceled_);
106 EXPECT_EQ(0, on_response_started_called_); 119 EXPECT_EQ(0, on_response_started_called_);
107 EXPECT_EQ(0, on_will_start_called_); 120 EXPECT_EQ(0, on_will_start_called_);
108 EXPECT_EQ(0, on_response_completed_called_); 121 EXPECT_EQ(0, on_response_completed_called_);
109 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 122 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
110 123
111 ++on_will_start_called_; 124 ++on_will_start_called_;
112 125
113 start_url_ = url; 126 start_url_ = url;
114 127
115 if (!on_will_start_result_) { 128 if (!on_will_start_result_) {
116 canceled_ = true; 129 canceled_ = true;
117 return false; 130 controller->Cancel();
131 return;
118 } 132 }
119 133
120 *defer = defer_on_will_start_; 134 if (defer_on_will_start_) {
121 if (*defer) 135 defer_on_will_start_ = false;
136 HoldController(std::move(controller));
122 deferred_run_loop_->Quit(); 137 deferred_run_loop_->Quit();
123 return true; 138 return;
139 }
140
141 controller->Resume();
124 } 142 }
125 143
126 bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 144 bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
127 int* buf_size, 145 int* buf_size,
128 int min_size) { 146 int min_size) {
129 EXPECT_FALSE(canceled_); 147 EXPECT_FALSE(canceled_);
130 EXPECT_FALSE(expect_on_data_downloaded_); 148 EXPECT_FALSE(expect_on_data_downloaded_);
131 EXPECT_EQ(0, on_response_completed_called_); 149 EXPECT_EQ(0, on_response_completed_called_);
132 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 150 // Only create a ScopedCallDepthTracker if not called re-entrantly, as
151 // OnWillRead may be called synchronously in response to a Resume(), but
152 // nothing may be called synchronously in response to the OnWillRead call.
153 std::unique_ptr<ScopedCallDepthTracker> call_depth_tracker;
154 if (call_depth_ == 0)
155 call_depth_tracker = base::MakeUnique<ScopedCallDepthTracker>(&call_depth_);
133 156
134 ++on_will_read_called_; 157 ++on_will_read_called_;
135 158
136 if (!on_will_read_result_) { 159 if (!on_will_read_result_) {
137 canceled_ = true; 160 canceled_ = true;
138 } else { 161 } else {
139 *buf = buffer_; 162 *buf = buffer_;
140 *buf_size = buffer_size_; 163 *buf_size = buffer_size_;
141 memset(buffer_->data(), '\0', buffer_size_); 164 memset(buffer_->data(), '\0', buffer_size_);
142 } 165 }
143 166
144 return on_will_read_result_; 167 return on_will_read_result_;
145 } 168 }
146 169
147 bool TestResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { 170 void TestResourceHandler::OnReadCompleted(
171 int bytes_read,
172 std::unique_ptr<ResourceController> controller) {
148 EXPECT_FALSE(canceled_); 173 EXPECT_FALSE(canceled_);
149 EXPECT_FALSE(expect_on_data_downloaded_); 174 EXPECT_FALSE(expect_on_data_downloaded_);
150 EXPECT_EQ(1, on_will_start_called_); 175 EXPECT_EQ(1, on_will_start_called_);
151 EXPECT_EQ(1, on_response_started_called_); 176 EXPECT_EQ(1, on_response_started_called_);
152 EXPECT_EQ(0, on_response_completed_called_); 177 EXPECT_EQ(0, on_response_completed_called_);
153 EXPECT_EQ(0, on_read_eof_); 178 EXPECT_EQ(0, on_read_eof_);
154 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 179 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
155 180
156 ++on_read_completed_called_; 181 ++on_read_completed_called_;
157 if (bytes_read == 0) 182 if (bytes_read == 0)
158 ++on_read_eof_; 183 ++on_read_eof_;
159 184
160 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); 185 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_);
161 if (body_ptr_) 186 if (body_ptr_)
162 body_ptr_->append(buffer_->data(), bytes_read); 187 body_ptr_->append(buffer_->data(), bytes_read);
163 body_.append(buffer_->data(), bytes_read); 188 body_.append(buffer_->data(), bytes_read);
164 189
165 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) { 190 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) {
166 canceled_ = true; 191 canceled_ = true;
167 return false; 192 controller->Cancel();
193 return;
168 } 194 }
169 195
170 *defer = defer_on_read_completed_; 196 if (defer_on_read_completed_ || (bytes_read == 0 && defer_on_read_eof_)) {
171 defer_on_read_completed_ = false; 197 defer_on_read_completed_ = false;
172 if (bytes_read == 0 && defer_on_read_eof_) 198 HoldController(std::move(controller));
173 *defer = true; 199 deferred_run_loop_->Quit();
200 return;
201 }
174 202
175 if (*defer) 203 controller->Resume();
176 deferred_run_loop_->Quit();
177
178 return true;
179 } 204 }
180 205
181 void TestResourceHandler::OnResponseCompleted( 206 void TestResourceHandler::OnResponseCompleted(
182 const net::URLRequestStatus& status, 207 const net::URLRequestStatus& status,
183 bool* defer) { 208 std::unique_ptr<ResourceController> controller) {
184 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 209 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
185 210
186 EXPECT_EQ(0, on_response_completed_called_); 211 EXPECT_EQ(0, on_response_completed_called_);
187 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) 212 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_)
188 EXPECT_EQ(1, on_read_eof_); 213 EXPECT_EQ(1, on_read_eof_);
189 214
190 ++on_response_completed_called_; 215 ++on_response_completed_called_;
191 216
192 if (request_status_ptr_) 217 if (request_status_ptr_)
193 *request_status_ptr_ = status; 218 *request_status_ptr_ = status;
194 final_status_ = status; 219 final_status_ = status;
195 *defer = defer_on_response_completed_;
196 defer_on_response_completed_ = false;
197 220
198 if (*defer) 221 // Consider response completed. Even if deferring, the TestResourceHandler
222 // won't be called again.
223 response_complete_run_loop_.Quit();
224
225 if (defer_on_response_completed_) {
226 defer_on_response_completed_ = false;
227 HoldController(std::move(controller));
199 deferred_run_loop_->Quit(); 228 deferred_run_loop_->Quit();
200 response_complete_run_loop_.Quit(); 229 return;
230 }
231
232 controller->Resume();
201 } 233 }
202 234
203 void TestResourceHandler::OnDataDownloaded(int bytes_downloaded) { 235 void TestResourceHandler::OnDataDownloaded(int bytes_downloaded) {
204 EXPECT_TRUE(expect_on_data_downloaded_); 236 EXPECT_TRUE(expect_on_data_downloaded_);
205 EXPECT_EQ(1, on_will_start_called_); 237 EXPECT_EQ(1, on_will_start_called_);
206 EXPECT_EQ(1, on_response_started_called_); 238 EXPECT_EQ(1, on_response_started_called_);
207 EXPECT_EQ(0, on_response_completed_called_); 239 EXPECT_EQ(0, on_response_completed_called_);
208 240
209 total_bytes_downloaded_ += bytes_downloaded; 241 total_bytes_downloaded_ += bytes_downloaded;
210 } 242 }
211 243
212 void TestResourceHandler::Resume() { 244 void TestResourceHandler::Resume() {
213 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 245 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
214 controller_->Resume(); 246 ResourceHandler::Resume();
215 } 247 }
216 248
217 void TestResourceHandler::CancelWithError(net::Error net_error) { 249 void TestResourceHandler::CancelWithError(net::Error net_error) {
218 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 250 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
219 canceled_ = true; 251 canceled_ = true;
220 controller_->CancelWithError(net_error); 252 ResourceHandler::CancelWithError(net_error);
221 } 253 }
222 254
223 void TestResourceHandler::SetBufferSize(int buffer_size) { 255 void TestResourceHandler::SetBufferSize(int buffer_size) {
224 buffer_ = new net::IOBuffer(buffer_size); 256 buffer_ = new net::IOBuffer(buffer_size);
225 buffer_size_ = buffer_size; 257 buffer_size_ = buffer_size;
226 memset(buffer_->data(), '\0', buffer_size); 258 memset(buffer_->data(), '\0', buffer_size);
227 } 259 }
228 260
229 void TestResourceHandler::WaitUntilDeferred() { 261 void TestResourceHandler::WaitUntilDeferred() {
230 deferred_run_loop_->Run(); 262 deferred_run_loop_->Run();
231 deferred_run_loop_.reset(new base::RunLoop()); 263 deferred_run_loop_.reset(new base::RunLoop());
232 } 264 }
233 265
234 void TestResourceHandler::WaitUntilResponseComplete() { 266 void TestResourceHandler::WaitUntilResponseComplete() {
235 response_complete_run_loop_.Run(); 267 response_complete_run_loop_.Run();
236 } 268 }
237 269
238 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() { 270 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() {
239 return weak_ptr_factory_.GetWeakPtr(); 271 return weak_ptr_factory_.GetWeakPtr();
240 } 272 }
241 273
242 } // namespace content 274 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/test_resource_handler.h ('k') | content/browser/loader/throttling_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698