OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "chrome/browser/renderer_host/renderer_security_policy.h" | 8 #include "chrome/browser/renderer_host/renderer_security_policy.h" |
9 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" | 9 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
10 #include "chrome/common/chrome_plugin_lib.h" | 10 #include "chrome/common/chrome_plugin_lib.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 // testing::Test | 97 // testing::Test |
98 virtual void SetUp() { | 98 virtual void SetUp() { |
99 RendererSecurityPolicy::GetInstance()->Add(0); | 99 RendererSecurityPolicy::GetInstance()->Add(0); |
100 URLRequest::RegisterProtocolFactory("test", &URLRequestTestJob::Factory); | 100 URLRequest::RegisterProtocolFactory("test", &URLRequestTestJob::Factory); |
101 EnsureTestSchemeIsAllowed(); | 101 EnsureTestSchemeIsAllowed(); |
102 } | 102 } |
103 virtual void TearDown() { | 103 virtual void TearDown() { |
104 URLRequest::RegisterProtocolFactory("test", NULL); | 104 URLRequest::RegisterProtocolFactory("test", NULL); |
105 RendererSecurityPolicy::GetInstance()->Remove(0); | 105 RendererSecurityPolicy::GetInstance()->Remove(0); |
106 | 106 |
107 // The plugin lib is automatically loaded during these test | 107 // The plugin lib is automatically loaded during these test |
108 // and we want a clean environment for other tests. | 108 // and we want a clean environment for other tests. |
109 ChromePluginLib::UnloadAllPlugins(); | 109 ChromePluginLib::UnloadAllPlugins(); |
110 | 110 |
111 // Flush the message loop to make Purify happy. | 111 // Flush the message loop to make Purify happy. |
112 message_loop_.RunAllPending(); | 112 message_loop_.RunAllPending(); |
113 } | 113 } |
114 | 114 |
115 void MakeTestRequest(int render_process_id, | 115 void MakeTestRequest(int render_process_id, |
116 int render_view_id, | 116 int render_view_id, |
117 int request_id, | 117 int request_id, |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 | 187 |
188 // followed by a 0-byte read | 188 // followed by a 0-byte read |
189 //ASSERT_EQ(ViewMsg_Resource_DataReceived::ID, messages[2].type()); | 189 //ASSERT_EQ(ViewMsg_Resource_DataReceived::ID, messages[2].type()); |
190 | 190 |
191 // the last message should be all data received | 191 // the last message should be all data received |
192 ASSERT_EQ(ViewMsg_Resource_RequestComplete::ID, messages[2].type()); | 192 ASSERT_EQ(ViewMsg_Resource_RequestComplete::ID, messages[2].type()); |
193 } | 193 } |
194 | 194 |
195 // Tests whether many messages get dispatched properly. | 195 // Tests whether many messages get dispatched properly. |
196 TEST_F(ResourceDispatcherHostTest, TestMany) { | 196 TEST_F(ResourceDispatcherHostTest, TestMany) { |
| 197 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 198 |
197 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 199 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
198 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); | 200 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); |
199 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 201 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
200 | 202 |
201 // flush all the pending requests | 203 // flush all the pending requests |
202 while (URLRequestTestJob::ProcessOnePendingMessage()); | 204 while (URLRequestTestJob::ProcessOnePendingMessage()); |
203 | 205 |
| 206 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 207 |
204 // sorts out all the messages we saw by request | 208 // sorts out all the messages we saw by request |
205 ResourceIPCAccumulator::ClassifiedMessages msgs; | 209 ResourceIPCAccumulator::ClassifiedMessages msgs; |
206 accum_.GetClassifiedMessages(&msgs); | 210 accum_.GetClassifiedMessages(&msgs); |
207 | 211 |
208 // there are three requests, so we should have gotten them classified as such | 212 // there are three requests, so we should have gotten them classified as such |
209 ASSERT_EQ(3, msgs.size()); | 213 ASSERT_EQ(3, msgs.size()); |
210 | 214 |
211 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); | 215 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
212 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_2()); | 216 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_2()); |
213 CheckSuccessfulRequest(msgs[2], URLRequestTestJob::test_data_3()); | 217 CheckSuccessfulRequest(msgs[2], URLRequestTestJob::test_data_3()); |
214 } | 218 } |
215 | 219 |
216 // Tests whether messages get canceled properly. We issue three requests, | 220 // Tests whether messages get canceled properly. We issue three requests, |
217 // cancel one of them, and make sure that each sent the proper notifications. | 221 // cancel one of them, and make sure that each sent the proper notifications. |
218 TEST_F(ResourceDispatcherHostTest, Cancel) { | 222 TEST_F(ResourceDispatcherHostTest, Cancel) { |
219 ResourceDispatcherHost host(NULL); | 223 ResourceDispatcherHost host(NULL); |
220 | 224 |
| 225 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 226 |
221 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 227 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
222 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); | 228 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); |
223 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 229 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
224 MakeCancelRequest(2); | 230 MakeCancelRequest(2); |
225 | 231 |
226 // flush all the pending requests | 232 // flush all the pending requests |
227 while (URLRequestTestJob::ProcessOnePendingMessage()); | 233 while (URLRequestTestJob::ProcessOnePendingMessage()); |
| 234 MessageLoop::current()->RunAllPending(); |
| 235 |
| 236 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
228 | 237 |
229 ResourceIPCAccumulator::ClassifiedMessages msgs; | 238 ResourceIPCAccumulator::ClassifiedMessages msgs; |
230 accum_.GetClassifiedMessages(&msgs); | 239 accum_.GetClassifiedMessages(&msgs); |
231 | 240 |
232 // there are three requests, so we should have gotten them classified as such | 241 // there are three requests, so we should have gotten them classified as such |
233 ASSERT_EQ(3, msgs.size()); | 242 ASSERT_EQ(3, msgs.size()); |
234 | 243 |
235 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); | 244 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
236 CheckSuccessfulRequest(msgs[2], URLRequestTestJob::test_data_3()); | 245 CheckSuccessfulRequest(msgs[2], URLRequestTestJob::test_data_3()); |
237 | 246 |
238 // Check that request 2 got canceled before it finished reading, which gives | 247 // Check that request 2 got canceled. |
239 // us 1 ReceivedResponse message. | 248 ASSERT_EQ(2, msgs[1].size()); |
240 ASSERT_EQ(1, msgs[1].size()); | |
241 ASSERT_EQ(ViewMsg_Resource_ReceivedResponse::ID, msgs[1][0].type()); | 249 ASSERT_EQ(ViewMsg_Resource_ReceivedResponse::ID, msgs[1][0].type()); |
| 250 ASSERT_EQ(ViewMsg_Resource_RequestComplete::ID, msgs[1][1].type()); |
242 | 251 |
243 // TODO(mbelshe): | |
244 // Now that the async IO path is in place, the IO always completes on the | |
245 // initial call; so the cancel doesn't arrive until after we finished. | |
246 // This basically means the test doesn't work. | |
247 #if 0 | |
248 int request_id; | 252 int request_id; |
249 URLRequestStatus status; | 253 URLRequestStatus status; |
250 | 254 |
251 // The message should be all data received with an error. | |
252 ASSERT_EQ(ViewMsg_Resource_RequestComplete::ID, msgs[1][2].type()); | |
253 | |
254 void* iter = NULL; | 255 void* iter = NULL; |
255 ASSERT_TRUE(IPC::ReadParam(&msgs[1][2], &iter, &request_id)); | 256 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &request_id)); |
256 ASSERT_TRUE(IPC::ReadParam(&msgs[1][2], &iter, &status)); | 257 ASSERT_TRUE(IPC::ReadParam(&msgs[1][1], &iter, &status)); |
257 | 258 |
258 EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); | 259 EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); |
259 #endif | |
260 } | 260 } |
261 | 261 |
262 // Tests CancelRequestsForProcess | 262 // Tests CancelRequestsForProcess |
263 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { | 263 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { |
264 // the host delegate acts as a second one so we can have some requests | 264 // the host delegate acts as a second one so we can have some requests |
265 // pending and some canceled | 265 // pending and some canceled |
266 class TestReceiver : public ResourceDispatcherHost::Receiver { | 266 class TestReceiver : public ResourceDispatcherHost::Receiver { |
267 public: | 267 public: |
268 TestReceiver() : has_canceled_(false), received_after_canceled_(0) { | 268 TestReceiver() : has_canceled_(false), received_after_canceled_(0) { |
269 } | 269 } |
270 virtual bool Send(IPC::Message* msg) { | 270 virtual bool Send(IPC::Message* msg) { |
271 // no messages should be received when the process has been canceled | 271 // no messages should be received when the process has been canceled |
272 if (has_canceled_) | 272 if (has_canceled_) |
273 received_after_canceled_ ++; | 273 received_after_canceled_++; |
274 delete msg; | 274 delete msg; |
275 return true; | 275 return true; |
276 } | 276 } |
277 bool has_canceled_; | 277 bool has_canceled_; |
278 int received_after_canceled_; | 278 int received_after_canceled_; |
279 }; | 279 }; |
280 TestReceiver test_receiver; | 280 TestReceiver test_receiver; |
281 | 281 |
282 // request 1 goes to the test delegate | 282 // request 1 goes to the test delegate |
283 ViewHostMsg_Resource_Request request = | 283 ViewHostMsg_Resource_Request request = |
284 CreateResourceRequest("GET", URLRequestTestJob::test_url_1()); | 284 CreateResourceRequest("GET", URLRequestTestJob::test_url_1()); |
285 | 285 |
| 286 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 287 |
286 host_.BeginRequest(&test_receiver, GetCurrentProcess(), 0, MSG_ROUTING_NONE, | 288 host_.BeginRequest(&test_receiver, GetCurrentProcess(), 0, MSG_ROUTING_NONE, |
287 1, request, NULL, NULL); | 289 1, request, NULL, NULL); |
288 KickOffRequest(); | 290 KickOffRequest(); |
289 | 291 |
290 // request 2 goes to us | 292 // request 2 goes to us |
291 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); | 293 MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2()); |
292 | 294 |
293 // request 3 goes to the test delegate | 295 // request 3 goes to the test delegate |
294 request.url = URLRequestTestJob::test_url_3(); | 296 request.url = URLRequestTestJob::test_url_3(); |
295 host_.BeginRequest(&test_receiver, GetCurrentProcess(), 0, MSG_ROUTING_NONE, | 297 host_.BeginRequest(&test_receiver, GetCurrentProcess(), 0, MSG_ROUTING_NONE, |
296 3, request, NULL, NULL); | 298 3, request, NULL, NULL); |
297 KickOffRequest(); | 299 KickOffRequest(); |
298 | 300 |
299 // TODO: mbelshe | 301 // TODO(mbelshe): |
300 // Now that the async IO path is in place, the IO always completes on the | 302 // Now that the async IO path is in place, the IO always completes on the |
301 // initial call; so the requests have already completed. This basically | 303 // initial call; so the requests have already completed. This basically |
302 // breaks the whole test. | 304 // breaks the whole test. |
303 //EXPECT_EQ(3, host_.pending_requests()); | 305 //EXPECT_EQ(3, host_.pending_requests()); |
304 | 306 |
305 // process each request for one level so one callback is called | 307 // process each request for one level so one callback is called |
306 for (int i = 0; i < 3; i++) | 308 for (int i = 0; i < 3; i++) |
307 EXPECT_TRUE(URLRequestTestJob::ProcessOnePendingMessage()); | 309 EXPECT_TRUE(URLRequestTestJob::ProcessOnePendingMessage()); |
308 | 310 |
309 // cancel the requests to the test process | 311 // cancel the requests to the test process |
310 host_.CancelRequestsForProcess(0); | 312 host_.CancelRequestsForProcess(0); |
311 test_receiver.has_canceled_ = true; | 313 test_receiver.has_canceled_ = true; |
312 | 314 |
313 // flush all the pending requests | 315 // flush all the pending requests |
314 while (URLRequestTestJob::ProcessOnePendingMessage()); | 316 while (URLRequestTestJob::ProcessOnePendingMessage()); |
315 | 317 |
316 EXPECT_EQ(0, host_.pending_requests()); | 318 EXPECT_EQ(0, host_.pending_requests()); |
| 319 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
317 | 320 |
318 // the test delegate should not have gotten any messages after being canceled | 321 // the test delegate should not have gotten any messages after being canceled |
319 ASSERT_EQ(0, test_receiver.received_after_canceled_); | 322 ASSERT_EQ(0, test_receiver.received_after_canceled_); |
320 | 323 |
321 // we should have gotten exactly one result | 324 // we should have gotten exactly one result |
322 ResourceIPCAccumulator::ClassifiedMessages msgs; | 325 ResourceIPCAccumulator::ClassifiedMessages msgs; |
323 accum_.GetClassifiedMessages(&msgs); | 326 accum_.GetClassifiedMessages(&msgs); |
324 ASSERT_EQ(1, msgs.size()); | 327 ASSERT_EQ(1, msgs.size()); |
325 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); | 328 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); |
326 } | 329 } |
327 | 330 |
328 // Tests blocking and resuming requests. | 331 // Tests blocking and resuming requests. |
329 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { | 332 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { |
| 333 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 334 |
330 host_.BlockRequestsForRenderView(0, 1); | 335 host_.BlockRequestsForRenderView(0, 1); |
331 host_.BlockRequestsForRenderView(0, 2); | 336 host_.BlockRequestsForRenderView(0, 2); |
332 host_.BlockRequestsForRenderView(0, 3); | 337 host_.BlockRequestsForRenderView(0, 3); |
333 | 338 |
334 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 339 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
335 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); | 340 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); |
336 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 341 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
337 MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1()); | 342 MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1()); |
338 MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2()); | 343 MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2()); |
339 MakeTestRequest(0, 3, 6, URLRequestTestJob::test_url_3()); | 344 MakeTestRequest(0, 3, 6, URLRequestTestJob::test_url_3()); |
(...skipping 29 matching lines...) Expand all Loading... |
369 accum_.GetClassifiedMessages(&msgs); | 374 accum_.GetClassifiedMessages(&msgs); |
370 ASSERT_EQ(1, msgs.size()); | 375 ASSERT_EQ(1, msgs.size()); |
371 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); | 376 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
372 | 377 |
373 // Now resumes requests for all RVH (2 and 3). | 378 // Now resumes requests for all RVH (2 and 3). |
374 host_.ResumeBlockedRequestsForRenderView(0, 2); | 379 host_.ResumeBlockedRequestsForRenderView(0, 2); |
375 host_.ResumeBlockedRequestsForRenderView(0, 3); | 380 host_.ResumeBlockedRequestsForRenderView(0, 3); |
376 KickOffRequest(); | 381 KickOffRequest(); |
377 while (URLRequestTestJob::ProcessOnePendingMessage()); | 382 while (URLRequestTestJob::ProcessOnePendingMessage()); |
378 | 383 |
| 384 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 385 |
379 msgs.clear(); | 386 msgs.clear(); |
380 accum_.GetClassifiedMessages(&msgs); | 387 accum_.GetClassifiedMessages(&msgs); |
381 ASSERT_EQ(2, msgs.size()); | 388 ASSERT_EQ(2, msgs.size()); |
382 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); | 389 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2()); |
383 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); | 390 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); |
384 } | 391 } |
385 | 392 |
386 // Tests blocking and canceling requests. | 393 // Tests blocking and canceling requests. |
387 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { | 394 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { |
| 395 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 396 |
388 host_.BlockRequestsForRenderView(0, 1); | 397 host_.BlockRequestsForRenderView(0, 1); |
389 | 398 |
390 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 399 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
391 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); | 400 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); |
392 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 401 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
393 MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1()); | 402 MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1()); |
394 | 403 |
395 // Flush all the pending requests. | 404 // Flush all the pending requests. |
396 while (URLRequestTestJob::ProcessOnePendingMessage()); | 405 while (URLRequestTestJob::ProcessOnePendingMessage()); |
397 | 406 |
398 // Sort out all the messages we saw by request. | 407 // Sort out all the messages we saw by request. |
399 ResourceIPCAccumulator::ClassifiedMessages msgs; | 408 ResourceIPCAccumulator::ClassifiedMessages msgs; |
400 accum_.GetClassifiedMessages(&msgs); | 409 accum_.GetClassifiedMessages(&msgs); |
401 | 410 |
402 // The 2 requests for the RVH 0 should have been processed. | 411 // The 2 requests for the RVH 0 should have been processed. |
403 ASSERT_EQ(2, msgs.size()); | 412 ASSERT_EQ(2, msgs.size()); |
404 | 413 |
405 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); | 414 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
406 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); | 415 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); |
407 | 416 |
408 // Cancel requests for RVH 1. | 417 // Cancel requests for RVH 1. |
409 host_.CancelBlockedRequestsForRenderView(0, 1); | 418 host_.CancelBlockedRequestsForRenderView(0, 1); |
410 KickOffRequest(); | 419 KickOffRequest(); |
411 while (URLRequestTestJob::ProcessOnePendingMessage()); | 420 while (URLRequestTestJob::ProcessOnePendingMessage()); |
| 421 |
| 422 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 423 |
412 msgs.clear(); | 424 msgs.clear(); |
413 accum_.GetClassifiedMessages(&msgs); | 425 accum_.GetClassifiedMessages(&msgs); |
414 ASSERT_EQ(0, msgs.size()); | 426 ASSERT_EQ(0, msgs.size()); |
415 } | 427 } |
416 | 428 |
417 // Tests that blocked requests are canceled if their associated process dies. | 429 // Tests that blocked requests are canceled if their associated process dies. |
418 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { | 430 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { |
| 431 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 432 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(1)); |
| 433 |
419 host_.BlockRequestsForRenderView(1, 0); | 434 host_.BlockRequestsForRenderView(1, 0); |
420 | 435 |
421 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 436 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
422 MakeTestRequest(1, 0, 2, URLRequestTestJob::test_url_2()); | 437 MakeTestRequest(1, 0, 2, URLRequestTestJob::test_url_2()); |
423 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 438 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
424 MakeTestRequest(1, 0, 4, URLRequestTestJob::test_url_1()); | 439 MakeTestRequest(1, 0, 4, URLRequestTestJob::test_url_1()); |
425 | 440 |
426 // Simulate process death. | 441 // Simulate process death. |
427 host_.CancelRequestsForProcess(1); | 442 host_.CancelRequestsForProcess(1); |
428 | 443 |
429 // Flush all the pending requests. | 444 // Flush all the pending requests. |
430 while (URLRequestTestJob::ProcessOnePendingMessage()); | 445 while (URLRequestTestJob::ProcessOnePendingMessage()); |
431 | 446 |
| 447 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 448 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(1)); |
| 449 |
432 // Sort out all the messages we saw by request. | 450 // Sort out all the messages we saw by request. |
433 ResourceIPCAccumulator::ClassifiedMessages msgs; | 451 ResourceIPCAccumulator::ClassifiedMessages msgs; |
434 accum_.GetClassifiedMessages(&msgs); | 452 accum_.GetClassifiedMessages(&msgs); |
435 | 453 |
436 // The 2 requests for the RVH 0 should have been processed. | 454 // The 2 requests for the RVH 0 should have been processed. |
437 ASSERT_EQ(2, msgs.size()); | 455 ASSERT_EQ(2, msgs.size()); |
438 | 456 |
439 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); | 457 CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
440 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); | 458 CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); |
441 | 459 |
(...skipping 12 matching lines...) Expand all Loading... |
454 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); | 472 MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1()); |
455 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); | 473 MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2()); |
456 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); | 474 MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3()); |
457 MakeTestRequest(1, 1, 4, URLRequestTestJob::test_url_1()); | 475 MakeTestRequest(1, 1, 4, URLRequestTestJob::test_url_1()); |
458 MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2()); | 476 MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2()); |
459 MakeTestRequest(0, 2, 6, URLRequestTestJob::test_url_3()); | 477 MakeTestRequest(0, 2, 6, URLRequestTestJob::test_url_3()); |
460 | 478 |
461 // Flush all the pending requests. | 479 // Flush all the pending requests. |
462 while (URLRequestTestJob::ProcessOnePendingMessage()); | 480 while (URLRequestTestJob::ProcessOnePendingMessage()); |
463 } | 481 } |
| 482 |
| 483 // Test the private helper method "CalculateApproximateMemoryCost()". |
| 484 TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) { |
| 485 URLRequest req(GURL("http://www.google.com"), NULL); |
| 486 EXPECT_EQ(4425, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req)); |
| 487 |
| 488 // Add 9 bytes of referrer. |
| 489 req.set_referrer("123456789"); |
| 490 EXPECT_EQ(4434, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req)); |
| 491 |
| 492 // Add 33 bytes of upload content. |
| 493 std::string upload_content; |
| 494 upload_content.resize(33); |
| 495 std::fill(upload_content.begin(), upload_content.end(), 'x'); |
| 496 req.AppendBytesToUpload(upload_content.data(), upload_content.size()); |
| 497 |
| 498 // Since the upload throttling is disabled, this has no effect on the cost. |
| 499 EXPECT_EQ(4434, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req)); |
| 500 |
| 501 // Add a file upload -- should have no effect. |
| 502 req.AppendFileToUpload(L"does-not-exist.png"); |
| 503 EXPECT_EQ(4434, ResourceDispatcherHost::CalculateApproximateMemoryCost(&req)); |
| 504 } |
| 505 |
| 506 // Test the private helper method "IncrementOutstandingRequestsMemoryCost()". |
| 507 TEST_F(ResourceDispatcherHostTest, IncrementOutstandingRequestsMemoryCost) { |
| 508 ResourceDispatcherHost host(NULL); |
| 509 |
| 510 // Add some counts for render_process_host=7 |
| 511 EXPECT_EQ(0, host.GetOutstandingRequestsMemoryCost(7)); |
| 512 EXPECT_EQ(1, host.IncrementOutstandingRequestsMemoryCost(1, 7)); |
| 513 EXPECT_EQ(2, host.IncrementOutstandingRequestsMemoryCost(1, 7)); |
| 514 EXPECT_EQ(3, host.IncrementOutstandingRequestsMemoryCost(1, 7)); |
| 515 |
| 516 // Add some counts for render_process_host=3 |
| 517 EXPECT_EQ(0, host.GetOutstandingRequestsMemoryCost(3)); |
| 518 EXPECT_EQ(1, host.IncrementOutstandingRequestsMemoryCost(1, 3)); |
| 519 EXPECT_EQ(2, host.IncrementOutstandingRequestsMemoryCost(1, 3)); |
| 520 |
| 521 // Remove all the counts for render_process_host=7 |
| 522 EXPECT_EQ(3, host.GetOutstandingRequestsMemoryCost(7)); |
| 523 EXPECT_EQ(2, host.IncrementOutstandingRequestsMemoryCost(-1, 7)); |
| 524 EXPECT_EQ(1, host.IncrementOutstandingRequestsMemoryCost(-1, 7)); |
| 525 EXPECT_EQ(0, host.IncrementOutstandingRequestsMemoryCost(-1, 7)); |
| 526 EXPECT_EQ(0, host.GetOutstandingRequestsMemoryCost(7)); |
| 527 |
| 528 // Remove all the counts for render_process_host=3 |
| 529 EXPECT_EQ(2, host.GetOutstandingRequestsMemoryCost(3)); |
| 530 EXPECT_EQ(1, host.IncrementOutstandingRequestsMemoryCost(-1, 3)); |
| 531 EXPECT_EQ(0, host.IncrementOutstandingRequestsMemoryCost(-1, 3)); |
| 532 EXPECT_EQ(0, host.GetOutstandingRequestsMemoryCost(3)); |
| 533 |
| 534 // When an entry reaches 0, it should be deleted. |
| 535 EXPECT_TRUE(host.outstanding_requests_memory_cost_map_.end() == |
| 536 host.outstanding_requests_memory_cost_map_.find(7)); |
| 537 EXPECT_TRUE(host.outstanding_requests_memory_cost_map_.end() == |
| 538 host.outstanding_requests_memory_cost_map_.find(3)); |
| 539 } |
| 540 |
| 541 // Test that when too many requests are outstanding for a particular |
| 542 // render_process_host_id, any subsequent request from it fails. |
| 543 TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) { |
| 544 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 545 |
| 546 // Expected cost of each request as measured by |
| 547 // ResourceDispatcherHost::CalculateApproximateMemoryCost(). |
| 548 int kMemoryCostOfTest2Req = |
| 549 ResourceDispatcherHost::kAvgBytesPerOutstandingRequest + |
| 550 std::string("GET").size() + |
| 551 URLRequestTestJob::test_url_2().spec().size(); |
| 552 |
| 553 // Tighten the bound on the ResourceDispatcherHost, to speed things up. |
| 554 int kMaxCostPerProcess = 440000; |
| 555 host_.set_max_outstanding_requests_cost_per_process(kMaxCostPerProcess); |
| 556 |
| 557 // Determine how many instance of test_url_2() we can request before |
| 558 // throttling kicks in. |
| 559 int kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req; |
| 560 |
| 561 // Saturate the number of outstanding requests for process 0. |
| 562 for (int i = 0; i < kMaxRequests; ++i) |
| 563 MakeTestRequest(0, 0, i + 1, URLRequestTestJob::test_url_2()); |
| 564 |
| 565 // Issue two more requests for process 0 -- these should fail immediately. |
| 566 MakeTestRequest(0, 0, kMaxRequests + 1, URLRequestTestJob::test_url_2()); |
| 567 MakeTestRequest(0, 0, kMaxRequests + 2, URLRequestTestJob::test_url_2()); |
| 568 |
| 569 // Issue two requests for process 1 -- these should succeed since |
| 570 // it is just process 0 that is saturated. |
| 571 MakeTestRequest(1, 0, kMaxRequests + 3, URLRequestTestJob::test_url_2()); |
| 572 MakeTestRequest(1, 0, kMaxRequests + 4, URLRequestTestJob::test_url_2()); |
| 573 |
| 574 // Flush all the pending requests. |
| 575 while (URLRequestTestJob::ProcessOnePendingMessage()); |
| 576 MessageLoop::current()->RunAllPending(); |
| 577 |
| 578 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 579 |
| 580 // Sorts out all the messages we saw by request. |
| 581 ResourceIPCAccumulator::ClassifiedMessages msgs; |
| 582 accum_.GetClassifiedMessages(&msgs); |
| 583 |
| 584 // We issued (kMaxRequests + 4) total requests. |
| 585 ASSERT_EQ(kMaxRequests + 4, msgs.size()); |
| 586 |
| 587 // Check that the first kMaxRequests succeeded. |
| 588 for (int i = 0; i < kMaxRequests; ++i) |
| 589 CheckSuccessfulRequest(msgs[i], URLRequestTestJob::test_data_2()); |
| 590 |
| 591 // Check that the subsequent two requests (kMaxRequests + 1) and |
| 592 // (kMaxRequests + 2) were failed, since the per-process bound was reached. |
| 593 for (int i = 0; i < 2; ++i) { |
| 594 // Should have sent a single RequestComplete message. |
| 595 int index = kMaxRequests + i; |
| 596 EXPECT_EQ(1, msgs[index].size()); |
| 597 EXPECT_EQ(ViewMsg_Resource_RequestComplete::ID, msgs[index][0].type()); |
| 598 |
| 599 // The RequestComplete message should have had status |
| 600 // (CANCELLED, ERR_INSUFFICIENT_RESOURCES). |
| 601 int request_id; |
| 602 URLRequestStatus status; |
| 603 |
| 604 void* iter = NULL; |
| 605 EXPECT_TRUE(IPC::ReadParam(&msgs[index][0], &iter, &request_id)); |
| 606 EXPECT_TRUE(IPC::ReadParam(&msgs[index][0], &iter, &status)); |
| 607 |
| 608 EXPECT_EQ(index + 1, request_id); |
| 609 EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); |
| 610 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, status.os_error()); |
| 611 } |
| 612 |
| 613 // The final 2 requests should have succeeded. |
| 614 CheckSuccessfulRequest(msgs[kMaxRequests + 2], |
| 615 URLRequestTestJob::test_data_2()); |
| 616 CheckSuccessfulRequest(msgs[kMaxRequests + 3], |
| 617 URLRequestTestJob::test_data_2()); |
| 618 } |
| 619 |
OLD | NEW |