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

Side by Side Diff: chrome/browser/prerender/prerender_tracker_unittest.cc

Issue 11348357: Add observer interface to PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: _really_ fix windows build. 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 <set> 5 #include <set>
6 #include <utility>
6 7
7 #include "base/logging.h" 8 #include "base/logging.h"
8 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "chrome/browser/prerender/prerender_contents.h"
9 #include "chrome/browser/prerender/prerender_manager.h" 11 #include "chrome/browser/prerender/prerender_manager.h"
10 #include "chrome/browser/prerender/prerender_tracker.h" 12 #include "chrome/browser/prerender/prerender_tracker.h"
11 #include "chrome/test/base/testing_browser_process.h" 13 #include "chrome/test/base/testing_browser_process.h"
12 #include "content/public/test/test_browser_thread.h" 14 #include "content/public/test/test_browser_thread.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
15 using content::BrowserThread; 17 using content::BrowserThread;
16 18
17 namespace prerender { 19 namespace prerender {
18 20
19 namespace { 21 namespace {
20 22
23 class TestPrerenderContents : public PrerenderContents {
24 public:
25 TestPrerenderContents(PrerenderManager* prerender_manager,
26 int child_id, int route_id)
27 : PrerenderContents(prerender_manager, static_cast<Profile*>(NULL),
28 GURL(), content::Referrer(), ORIGIN_NONE,
29 PrerenderManager::kNoExperiment),
30 child_id_(child_id),
31 route_id_(route_id) {
32 }
33
34 ~TestPrerenderContents() {
mmenke 2012/12/06 19:54:22 nit: virtual
gavinp 2012/12/07 17:37:04 Done.
35 if (final_status() == FINAL_STATUS_MAX)
36 SetFinalStatus(FINAL_STATUS_USED);
37 }
38
39 virtual bool GetChildId(int* child_id) const OVERRIDE {
40 *child_id = child_id_;
41 return true;
42 }
43
44 virtual bool GetRouteId(int* route_id) const OVERRIDE {
45 *route_id = route_id_;
46 return true;
47 }
48
49 void Start() {
50 AddObserver(prerender_manager()->prerender_tracker());
51 prerendering_has_started_ = true;
52 NotifyPrerenderStart();
53 }
54
55 void Cancel() {
56 Destroy(FINAL_STATUS_CANCELLED);
57 }
58
59 void Use() {
60 SetFinalStatus(FINAL_STATUS_USED);
61 }
62
63 private:
64 int child_id_;
65 int route_id_;
66 };
67
21 class TestPrerenderManager : public PrerenderManager { 68 class TestPrerenderManager : public PrerenderManager {
22 public: 69 public:
23 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) : 70 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) :
24 PrerenderManager(NULL, prerender_tracker) { 71 PrerenderManager(NULL, prerender_tracker) {
25 mutable_config().rate_limit_enabled = false; 72 mutable_config().rate_limit_enabled = false;
26 } 73 }
27 74
28 virtual void DestroyPrerenderForRenderView( 75 virtual void DestroyPrerenderForRenderView(
29 int process_id, int view_id, FinalStatus final_status) OVERRIDE { 76 int process_id, int view_id, FinalStatus final_status) OVERRIDE {
30 cancelled_id_pairs_.insert(std::make_pair(process_id, view_id)); 77 cancelled_id_pairs_.insert(std::make_pair(process_id, view_id));
31 } 78 }
32 79
80 // We never allocate our PrerenderContents in PrerenderManager, so we don't
81 // ever want the default pending delete behaviour.
82 virtual void MoveEntryToPendingDelete(PrerenderContents* entry,
83 FinalStatus final_status) OVERRIDE {
84 }
85
33 bool WasPrerenderCancelled(int child_id, int route_id) { 86 bool WasPrerenderCancelled(int child_id, int route_id) {
34 std::pair<int, int> child_route_id_pair(child_id, route_id); 87 std::pair<int, int> child_route_id_pair(child_id, route_id);
35 return cancelled_id_pairs_.count(child_route_id_pair) != 0; 88 return cancelled_id_pairs_.count(child_route_id_pair) != 0;
36 } 89 }
37 90
91
mmenke 2012/12/06 19:54:22 nit: Remove blank line.
gavinp 2012/12/07 17:37:04 Done.
38 // Set of all the RenderViews that have been cancelled. 92 // Set of all the RenderViews that have been cancelled.
39 std::set<std::pair<int, int> > cancelled_id_pairs_; 93 std::set<std::pair<int, int> > cancelled_id_pairs_;
40 }; 94 };
41 95
42 } // namespace 96 } // namespace
43 97
44 class PrerenderTrackerTest : public testing::Test { 98 class PrerenderTrackerTest : public testing::Test {
45 public: 99 public:
100 static const int kDefaultChildId = 0;
101 static const int kDefaultRouteId = 100;
102
46 PrerenderTrackerTest() : 103 PrerenderTrackerTest() :
47 ui_thread_(BrowserThread::UI, &message_loop_), 104 ui_thread_(BrowserThread::UI, &message_loop_),
48 io_thread_(BrowserThread::IO, &message_loop_), 105 io_thread_(BrowserThread::IO, &message_loop_),
49 prerender_manager_(new TestPrerenderManager(prerender_tracker())) { 106 prerender_manager_(prerender_tracker()),
50 } 107 test_contents_(&prerender_manager_, kDefaultChildId, kDefaultRouteId) {
51
52 TestPrerenderManager* prerender_manager() {
53 return prerender_manager_.get();
54 } 108 }
55 109
56 PrerenderTracker* prerender_tracker() { 110 PrerenderTracker* prerender_tracker() {
57 return g_browser_process->prerender_tracker(); 111 return g_browser_process->prerender_tracker();
58 } 112 }
59 113
114 TestPrerenderManager* prerender_manager() {
115 return &prerender_manager_;
116 }
117
118 TestPrerenderContents* test_contents() {
119 return &test_contents_;
120 }
121
60 int GetCurrentStatus(int child_id, int route_id) { 122 int GetCurrentStatus(int child_id, int route_id) {
61 FinalStatus final_status; 123 FinalStatus final_status;
62 if (!prerender_tracker()->GetFinalStatus(child_id, route_id, 124 if (!prerender_tracker()->GetFinalStatus(child_id, route_id,
63 &final_status)) { 125 &final_status)) {
64 return -1; 126 return -1;
65 } 127 }
66 return final_status; 128 return final_status;
67 } 129 }
68 130
69 // Runs any tasks queued on either thread. 131 // Runs any tasks queued on either thread.
70 void RunEvents() { 132 void RunEvents() {
71 message_loop_.RunUntilIdle(); 133 message_loop_.RunUntilIdle();
72 } 134 }
73 135
74 private: 136 private:
75 MessageLoop message_loop_; 137 MessageLoop message_loop_;
76 content::TestBrowserThread ui_thread_; 138 content::TestBrowserThread ui_thread_;
77 content::TestBrowserThread io_thread_; 139 content::TestBrowserThread io_thread_;
78 140
79 scoped_ptr<TestPrerenderManager> prerender_manager_; 141 TestPrerenderManager prerender_manager_;
142 TestPrerenderContents test_contents_;
80 }; 143 };
81 144
82 // Check that a non-existant RenderView is handled correctly. 145 // Check that a non-existant RenderView is handled correctly.
83 TEST_F(PrerenderTrackerTest, PrerenderTrackerNull) { 146 TEST_F(PrerenderTrackerTest, PrerenderTrackerNull) {
84 FinalStatus final_status; 147 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
85 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); 148 EXPECT_FALSE(prerender_tracker()->TryCancel(
86 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 149 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
87 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( 150 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread(
88 0, 0, FINAL_STATUS_HTTPS)); 151 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
89 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 152 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
90 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 153 kDefaultChildId, kDefaultRouteId));
91 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); 154 FinalStatus final_status;
155 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
156 kDefaultChildId, kDefaultRouteId, &final_status));
157 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(
158 kDefaultChildId, kDefaultRouteId));
92 } 159 }
93 160
94 // Check that a page that is used is handled correctly. 161 // Check that a page that is used is handled correctly.
95 TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) { 162 TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) {
96 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); 163 test_contents()->Start();
97 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); 164
98 165 EXPECT_EQ(FINAL_STATUS_MAX,
99 // This calls AddPrerenderOnIOThreadTask(). 166 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
100 RunEvents(); 167
101 168 // This calls AddPrerenderOnIOThreadTask().
102 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 169 RunEvents();
103 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); 170
171 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(
172 kDefaultChildId, kDefaultRouteId));
173 EXPECT_EQ(FINAL_STATUS_MAX,
174 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
104 175
105 // Display the prerendered RenderView. 176 // Display the prerendered RenderView.
106 EXPECT_TRUE(prerender_tracker()->TryUse(0, 0)); 177 EXPECT_TRUE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
107 178
108 // Make sure the page can't be destroyed or claim it was destroyed after 179 // Make sure the page can't be destroyed or claim it was destroyed after
109 // it's been used. 180 // it's been used.
110 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 181 EXPECT_FALSE(prerender_tracker()->TryCancel(
182 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
111 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( 183 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread(
112 0, 0, FINAL_STATUS_TIMED_OUT)); 184 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
113 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); 185 EXPECT_EQ(FINAL_STATUS_USED,
186 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
114 187
115 // This would call DestroyPrerenderForChildRouteIdPair(), if the prerender 188 // This would call DestroyPrerenderForChildRouteIdPair(), if the prerender
116 // were cancelled. 189 // were cancelled.
117 RunEvents(); 190 RunEvents();
118 191
119 // These functions should all behave as before. 192 // These functions should all behave as before.
120 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 193 EXPECT_FALSE(prerender_tracker()->TryCancel(
194 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
121 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( 195 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread(
122 0, 0, FINAL_STATUS_TIMED_OUT)); 196 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
123 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); 197 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(
124 198 kDefaultChildId, kDefaultRouteId));
125 // This calls DestroyPrerenderForChildRouteIdPair(). 199
126 prerender_tracker()->OnPrerenderingFinished(0, 0); 200 // This calls DestroyPrerenderForChildRouteIdPair().
127 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 201 test_contents()->Use();
128 202 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(
129 // This calls RemovePrerenderOnIOThreadTask(). 203 kDefaultChildId, kDefaultRouteId));
130 RunEvents(); 204
131 205 // This calls RemovePrerenderOnIOThreadTask().
132 FinalStatus final_status; 206 RunEvents();
133 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 207
134 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 208 FinalStatus final_status;
135 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 209 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
136 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); 210 kDefaultChildId, kDefaultRouteId, &final_status));
211 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
212 kDefaultChildId, kDefaultRouteId));
213 EXPECT_FALSE(prerender_tracker()->TryCancel(
214 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
215 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(
216 kDefaultChildId, kDefaultRouteId));
137 } 217 }
138 218
139 // Check that a prerendered page cancelled by TryCancel() is handled correctly. 219 // Check that a prerendered page cancelled by TryCancel() is handled correctly.
140 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelled) { 220 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelled) {
141 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); 221 test_contents()->Start();
142 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); 222 EXPECT_EQ(FINAL_STATUS_MAX,
223 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
143 224
144 // This calls AddPrerenderOnIOThreadTask(). 225 // This calls AddPrerenderOnIOThreadTask().
145 RunEvents(); 226 RunEvents();
146 227
147 // Cancel the prerender. 228 // Cancel the prerender.
148 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 229 EXPECT_TRUE(prerender_tracker()->TryCancel(
149 230 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
150 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); 231
151 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); 232 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
152 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 233 EXPECT_TRUE(prerender_tracker()->TryCancel(
153 0, 0, FINAL_STATUS_TIMED_OUT)); 234 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
154 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); 235 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
155 236 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
156 // This calls DestroyPrerenderForChildRouteIdPair(). 237 EXPECT_EQ(FINAL_STATUS_CANCELLED,
157 RunEvents(); 238 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
158 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); 239
240 // This calls DestroyPrerenderForChildRouteIdPair().
241 RunEvents();
242 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(
243 kDefaultChildId, kDefaultRouteId));
159 244
160 // These should all work until the prerendering RenderViewHost is destroyed. 245 // These should all work until the prerendering RenderViewHost is destroyed.
161 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); 246 EXPECT_TRUE(prerender_tracker()->TryCancel(
162 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 247 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
163 0, 0, FINAL_STATUS_TIMED_OUT)); 248 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
164 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); 249 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
165 250 EXPECT_EQ(FINAL_STATUS_CANCELLED,
166 prerender_tracker()->OnPrerenderingFinished(0, 0); 251 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
167 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 252
168 253 test_contents()->Cancel();
169 // This calls RemovePrerenderOnIOThreadTask(). 254 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(
170 RunEvents(); 255 kDefaultChildId, kDefaultRouteId));
171 256
172 FinalStatus final_status; 257 // This calls RemovePrerenderOnIOThreadTask().
173 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 258 RunEvents();
174 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 259
260 FinalStatus final_status;
261 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
262 kDefaultChildId, kDefaultRouteId, &final_status));
263 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
264 kDefaultChildId, kDefaultRouteId));
175 } 265 }
176 266
177 // Check that a prerendered page cancelled on the IO thread by 267 // Check that a prerendered page cancelled on the IO thread by
178 // TryCancelOnIOThread() is handled correctly. 268 // TryCancelOnIOThread() is handled correctly.
179 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledOnIO) { 269 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledOnIO) {
180 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); 270 test_contents()->Start();
181 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); 271 EXPECT_EQ(FINAL_STATUS_MAX,
272 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
182 273
183 // This calls AddPrerenderOnIOThreadTask(). 274 // This calls AddPrerenderOnIOThreadTask().
184 RunEvents(); 275 RunEvents();
185 276
186 // Cancel the prerender. 277 // Cancel the prerender.
187 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 278 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
188 0, 0, FINAL_STATUS_TIMED_OUT)); 279 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
189 280
190 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); 281 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
191 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 282 EXPECT_TRUE(prerender_tracker()->TryCancel(kDefaultChildId, kDefaultRouteId,
192 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 283 FINAL_STATUS_CANCELLED));
193 0, 0, FINAL_STATUS_HTTPS)); 284 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
194 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, GetCurrentStatus(0, 0)); 285 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
195 286 EXPECT_EQ(FINAL_STATUS_TIMED_OUT,
196 // This calls DestroyPrerenderForChildRouteIdPair(). 287 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
197 RunEvents(); 288
198 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); 289 // This calls DestroyPrerenderForChildRouteIdPair().
290 RunEvents();
291 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(
292 kDefaultChildId, kDefaultRouteId));
199 293
200 // These should all work until the prerendering RenderViewHost is destroyed. 294 // These should all work until the prerendering RenderViewHost is destroyed.
201 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 295 EXPECT_TRUE(prerender_tracker()->TryCancel(
202 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 296 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
203 0, 0, FINAL_STATUS_HTTPS)); 297 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
204 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, GetCurrentStatus(0, 0)); 298 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
205 299 EXPECT_EQ(FINAL_STATUS_TIMED_OUT,
206 prerender_tracker()->OnPrerenderingFinished(0, 0); 300 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
207 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 301
208 302 test_contents()->Cancel();
209 // This calls RemovePrerenderOnIOThreadTask(). 303 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(
210 RunEvents(); 304 kDefaultChildId, kDefaultRouteId));
211 305
212 FinalStatus final_status; 306 // This calls RemovePrerenderOnIOThreadTask().
213 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 307 RunEvents();
214 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 308
309 FinalStatus final_status;
310 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
311 kDefaultChildId, kDefaultRouteId, &final_status));
312 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
313 kDefaultChildId, kDefaultRouteId));
215 } 314 }
216 315
217 // Check that a prerendered page cancelled before it reaches the IO thread is 316 // Check that a prerendered page cancelled before it reaches the IO thread is
218 // handled correctly. 317 // handled correctly.
219 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledFast) { 318 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledFast) {
220 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); 319 test_contents()->Start();
320
221 // Cancel the prerender. 321 // Cancel the prerender.
222 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 322 EXPECT_TRUE(prerender_tracker()->TryCancel(
223 323 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
224 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); 324
225 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); 325 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
326 EXPECT_TRUE(prerender_tracker()->TryCancel(
327 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
226 328
227 // This calls AddPrerenderOnIOThreadTask() and 329 // This calls AddPrerenderOnIOThreadTask() and
228 // DestroyPrerenderForChildRouteIdPair(). 330 // DestroyPrerenderForChildRouteIdPair().
229 RunEvents(); 331 RunEvents();
230 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); 332 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(
231 333 kDefaultChildId, kDefaultRouteId));
232 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 334
233 0, 0, FINAL_STATUS_TIMED_OUT)); 335 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
234 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); 336 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
235 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); 337 EXPECT_TRUE(prerender_tracker()->TryCancel(
236 338 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT));
237 prerender_tracker()->OnPrerenderingFinished(0, 0); 339 EXPECT_EQ(FINAL_STATUS_CANCELLED, GetCurrentStatus(
238 340 kDefaultChildId, kDefaultRouteId));
239 // This calls RemovePrerenderOnIOThreadTask(). 341
240 RunEvents(); 342 test_contents()->Cancel();
241 343
242 FinalStatus final_status; 344 // This calls RemovePrerenderOnIOThreadTask().
243 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 345 RunEvents();
244 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 346
347 FinalStatus final_status;
348 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
349 kDefaultChildId, kDefaultRouteId, &final_status));
350 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
351 kDefaultChildId, kDefaultRouteId));
245 } 352 }
246 353
247 // Check that handling two pages at once works. 354 // Check that handling two pages at once works.
248 TEST_F(PrerenderTrackerTest, PrerenderTrackerMultiple) { 355 TEST_F(PrerenderTrackerTest, PrerenderTrackerMultiple) {
249 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); 356 test_contents()->Start();
250 357
251 // This calls AddPrerenderOnIOThreadTask(). 358 // This calls AddPrerenderOnIOThreadTask().
252 RunEvents(); 359 RunEvents();
253 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 360 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(
254 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(1, 2)); 361 kDefaultChildId, kDefaultRouteId));
255 EXPECT_FALSE(prerender_tracker()->TryUse(1, 2)); 362 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
256 EXPECT_FALSE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_HTTPS)); 363 kDefaultChildId + 1, kDefaultRouteId + 1));
364 EXPECT_FALSE(prerender_tracker()->TryUse(
365 kDefaultChildId + 1, kDefaultRouteId + 1));
366 EXPECT_FALSE(prerender_tracker()->TryCancel(
367 kDefaultChildId + 1, kDefaultRouteId + 1, FINAL_STATUS_CANCELLED));
257 368
258 // Start second prerender. 369 // Start second prerender.
259 prerender_tracker()->OnPrerenderingStarted(1, 2, prerender_manager()); 370 TestPrerenderContents second_test_contents(prerender_manager(),
260 // This calls AddPrerenderOnIOThreadTask(). 371 kDefaultChildId + 1,
261 RunEvents(); 372 kDefaultRouteId + 1);
262 373
263 // Use (0, 0). 374 second_test_contents.Start();
264 EXPECT_TRUE(prerender_tracker()->TryUse(0, 0)); 375 // This calls AddPrerenderOnIOThreadTask().
265 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); 376 RunEvents();
266 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(1, 2)); 377
267 378 // Use (kDefaultChildId, kDefaultRouteId).
268 // Cancel (1, 2). 379 EXPECT_TRUE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId));
269 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( 380 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(
270 1, 2, FINAL_STATUS_HTTPS)); 381 kDefaultChildId, kDefaultRouteId));
271 382 EXPECT_EQ(FINAL_STATUS_MAX,
272 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); 383 GetCurrentStatus(kDefaultChildId + 1, kDefaultRouteId + 1));
273 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); 384
274 385 // Cancel (kDefaultChildId + 1, kDefaultRouteId + 1).
275 EXPECT_FALSE(prerender_tracker()->TryUse(1, 2)); 386 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread(
276 EXPECT_TRUE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_HTTPS)); 387 kDefaultChildId + 1, kDefaultRouteId + 1, FINAL_STATUS_CANCELLED));
277 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(1, 2)); 388
278 389 EXPECT_FALSE(prerender_tracker()->TryCancel(
279 // This calls DestroyPrerenderForChildRouteIdPair(). 390 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED));
280 RunEvents(); 391 EXPECT_EQ(FINAL_STATUS_USED,
281 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); 392 GetCurrentStatus(kDefaultChildId, kDefaultRouteId));
282 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(1, 2)); 393
283 394 EXPECT_FALSE(prerender_tracker()->TryUse(
284 prerender_tracker()->OnPrerenderingFinished(0, 0); 395 kDefaultChildId + 1, kDefaultRouteId + 1));
285 prerender_tracker()->OnPrerenderingFinished(1, 2); 396 EXPECT_TRUE(prerender_tracker()->TryCancel(
286 397 kDefaultChildId + 1, kDefaultRouteId + 1, FINAL_STATUS_CANCELLED));
287 // This calls RemovePrerenderOnIOThreadTask(). 398 EXPECT_EQ(FINAL_STATUS_CANCELLED,
288 RunEvents(); 399 GetCurrentStatus(kDefaultChildId + 1, kDefaultRouteId + 1));
289 400
290 FinalStatus final_status; 401 // This calls DestroyPrerenderForChildRouteIdPair().
291 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); 402 RunEvents();
292 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); 403 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(kDefaultChildId,
293 404 kDefaultRouteId));
294 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(1, 2, &final_status)); 405 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(kDefaultChildId + 1,
295 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(1, 2)); 406 kDefaultRouteId + 1));
407
408 test_contents()->Cancel();
409 second_test_contents.Cancel();
410
411 // This calls RemovePrerenderOnIOThreadTask().
412 RunEvents();
413
414 FinalStatus final_status;
415 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
416 kDefaultChildId, kDefaultRouteId, &final_status));
417 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
418 kDefaultChildId, kDefaultRouteId));
419
420 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(
421 kDefaultChildId + 1, kDefaultRouteId + 1, &final_status));
422 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(
423 kDefaultChildId + 1, kDefaultRouteId + 1));
296 } 424 }
297 425
298 } // namespace prerender 426 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698