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

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

Issue 11270027: Add a ResourceScheduler to ResourceDispatcherHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove all linked_ptrs Created 8 years 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/loader/resource_scheduler.h"
6
7 #include "base/message_loop.h"
8 #include "content/browser/loader/resource_handler.h"
9 #include "content/browser/loader/resource_loader.h"
10 #include "content/browser/loader/resource_loader_delegate.h"
11 #include "content/browser/loader/resource_request_info_impl.h"
12 #include "content/public/browser/global_request_id.h"
13 #include "net/url_request/url_request.h"
14 #include "net/url_request/url_request_test_util.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace content {
18
19 namespace {
20
21 class TestRequestFactory;
22
23 const int kChildId = 30;
24 const int kRouteId = 75;
25
26 class TestRequest : public ResourceScheduler::Loadable {
27 public:
28 TestRequest(scoped_ptr<net::URLRequest> url_request)
29 : started_(false),
30 url_request_(url_request.Pass()) {}
31
32 bool started() const { return started_; }
33
34 private:
35 virtual void StartRequest() OVERRIDE { started_ = true; }
36 virtual net::URLRequest& url_request() OVERRIDE {
37 return *url_request_.get();
38 }
39
40 bool started_;
41 scoped_ptr<net::URLRequest> url_request_;
42 };
43
44 class ResourceSchedulerTest : public testing::Test {
45 protected:
46 ResourceSchedulerTest()
47 : message_loop_(MessageLoop::TYPE_IO) {
48 scheduler_.OnCreate(kChildId, kRouteId);
49 }
50
51 virtual ~ResourceSchedulerTest() {
52 scheduler_.OnDestroy(kChildId, kRouteId);
53 }
54
55 TestRequest* NewRequest(const char* url, net::RequestPriority priority) {
56 scoped_ptr<net::URLRequest> url_request(
57 context_.CreateRequest(GURL(url), NULL));
58 url_request->set_priority(priority);
59 return new TestRequest(url_request.Pass());
60 }
61
62 MessageLoop message_loop_;
63 ResourceScheduler scheduler_;
64 net::TestURLRequestContext context_;
65 };
66
67 TEST_F(ResourceSchedulerTest, OneIsolatedLowRequest) {
68 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOW));
69 scoped_ptr<ResourceScheduler::LoadHandle> handle(scheduler_.ScheduleLoad(
70 kChildId, kRouteId, request.get()));
71 EXPECT_TRUE(request->started());
72 }
73
74 TEST_F(ResourceSchedulerTest, LowBlocksUntilIdle) {
75 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
76 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
77 scoped_ptr<ResourceScheduler::LoadHandle> high_handle(scheduler_.ScheduleLoad(
78 kChildId, kRouteId, high.get()));
79 scoped_ptr<ResourceScheduler::LoadHandle> low_handle(scheduler_.ScheduleLoad(
80 kChildId, kRouteId, low.get()));
81 EXPECT_TRUE(high->started());
82 EXPECT_FALSE(low->started());
83 high_handle.reset();
84 EXPECT_TRUE(low->started());
85 }
86
87 TEST_F(ResourceSchedulerTest, LowBlocksUntilPaint) {
88 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
89 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
90 scoped_ptr<ResourceScheduler::LoadHandle> high_handle(scheduler_.ScheduleLoad(
91 kChildId, kRouteId, high.get()));
92 scoped_ptr<ResourceScheduler::LoadHandle> low_handle(scheduler_.ScheduleLoad(
93 kChildId, kRouteId, low.get()));
94 EXPECT_TRUE(high->started());
95 EXPECT_FALSE(low->started());
96 scheduler_.OnPaint(kChildId, kRouteId);
97 EXPECT_TRUE(low->started());
98 }
99
100 TEST_F(ResourceSchedulerTest, NavigationResetsPaintState) {
101 scoped_ptr<TestRequest> high(NewRequest("http://host/high", net::HIGHEST));
102 scoped_ptr<TestRequest> low(NewRequest("http://host/low", net::LOW));
103 scheduler_.OnPaint(kChildId, kRouteId);
104 scheduler_.OnNavigate(kChildId, kRouteId);
105 scoped_ptr<ResourceScheduler::LoadHandle> high_handle(scheduler_.ScheduleLoad(
106 kChildId, kRouteId, high.get()));
107 scoped_ptr<ResourceScheduler::LoadHandle> low_handle(scheduler_.ScheduleLoad(
108 kChildId, kRouteId, low.get()));
109 EXPECT_TRUE(high->started());
110 EXPECT_FALSE(low->started());
111 }
112
113 TEST_F(ResourceSchedulerTest, BackgroundRequestStartsImmediately) {
114 const int route_id = 0; // Indicates a background request.
115 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOW));
116 scoped_ptr<ResourceScheduler::LoadHandle> handle(scheduler_.ScheduleLoad(
117 kChildId, route_id, request.get()));
118 EXPECT_TRUE(request->started());
119 }
120
121 TEST_F(ResourceSchedulerTest, DestroyTabBeforeCancelingLoad) {
122 const int new_route_id = kRouteId +1;
123 scheduler_.OnCreate(kChildId, new_route_id);
124 scoped_ptr<TestRequest> request(NewRequest("http://host/1", net::LOW));
125 scoped_ptr<ResourceScheduler::LoadHandle> handle(scheduler_.ScheduleLoad(
126 kChildId, new_route_id, request.get()));
127 scheduler_.OnDestroy(kChildId, new_route_id);
128 // Note that new_route_id is destroyed before handle goes out of scope.
129 }
130
131 } // unnamed namespace
132
133 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698