OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <limits> | 5 #include <limits> |
6 | 6 |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "content/public/test/test_browser_thread_bundle.h" | 8 #include "content/public/test/test_browser_thread_bundle.h" |
9 #include "extensions/browser/deferred_start_render_host.h" | 9 #include "extensions/browser/deferred_start_render_host.h" |
10 #include "extensions/browser/extensions_test.h" | 10 #include "extensions/browser/extensions_test.h" |
11 #include "extensions/browser/load_monitoring_extension_host_queue.h" | 11 #include "extensions/browser/load_monitoring_extension_host_queue.h" |
12 #include "extensions/browser/serial_extension_host_queue.h" | 12 #include "extensions/browser/serial_extension_host_queue.h" |
13 | 13 |
14 namespace extensions { | 14 namespace extensions { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 class StubDeferredStartRenderHost : public DeferredStartRenderHost { | 18 class StubDeferredStartRenderHost : public DeferredStartRenderHost { |
19 public: | |
20 // Returns true if this host is being observed by |observer|. | |
21 bool IsObservedBy(DeferredStartRenderHostObserver* observer) { | |
22 return observers_.count(observer) > 0; | |
23 } | |
24 | |
25 private: | 19 private: |
26 // DeferredStartRenderHost: | |
27 void AddDeferredStartRenderHostObserver( | 20 void AddDeferredStartRenderHostObserver( |
28 DeferredStartRenderHostObserver* observer) override { | 21 DeferredStartRenderHostObserver* observer) override {} |
29 observers_.insert(observer); | |
30 } | |
31 void RemoveDeferredStartRenderHostObserver( | 22 void RemoveDeferredStartRenderHostObserver( |
32 DeferredStartRenderHostObserver* observer) override { | 23 DeferredStartRenderHostObserver* observer) override {} |
33 observers_.erase(observer); | |
34 } | |
35 void CreateRenderViewNow() override {} | 24 void CreateRenderViewNow() override {} |
36 | |
37 std::set<DeferredStartRenderHostObserver*> observers_; | |
38 }; | 25 }; |
39 | 26 |
40 const size_t g_invalid_size_t = std::numeric_limits<size_t>::max(); | 27 const size_t g_invalid_size_t = std::numeric_limits<size_t>::max(); |
41 | 28 |
42 } // namespace | 29 } // namespace |
43 | 30 |
44 class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { | 31 class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
45 public: | 32 public: |
46 LoadMonitoringExtensionHostQueueTest() | 33 LoadMonitoringExtensionHostQueueTest() |
47 : finished_(false), | 34 : finished_(false), |
48 // Arbitrary choice of an invalid size_t. | 35 // Arbitrary choice of an invalid size_t. |
49 num_queued_(g_invalid_size_t), | 36 num_queued_(g_invalid_size_t), |
50 num_loaded_(g_invalid_size_t), | 37 num_loaded_(g_invalid_size_t), |
51 max_awaiting_loading_(g_invalid_size_t), | 38 max_in_queue_(g_invalid_size_t), |
52 max_active_loading_(g_invalid_size_t) {} | 39 max_active_loading_(g_invalid_size_t) {} |
53 | 40 |
54 void SetUp() override { | 41 void SetUp() override { |
55 queue_.reset(new LoadMonitoringExtensionHostQueue( | 42 queue_.reset(new LoadMonitoringExtensionHostQueue( |
56 // Use a SerialExtensionHostQueue because it's simple. | 43 // Use a SerialExtensionHostQueue because it's simple. |
57 scoped_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue()), | 44 scoped_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue()), |
58 base::TimeDelta(), // no delay, easier to test | 45 base::TimeDelta(), // no delay, easier to test |
59 base::Bind(&LoadMonitoringExtensionHostQueueTest::Finished, | 46 base::Bind(&LoadMonitoringExtensionHostQueueTest::Finished, |
60 base::Unretained(this)))); | 47 base::Unretained(this)))); |
61 } | 48 } |
62 | 49 |
63 protected: | 50 protected: |
64 // Creates a new DeferredStartRenderHost. Ownership is held by this class, | 51 // Creates a new DeferredStartRenderHost. Ownership is held by this class, |
65 // not passed to caller. | 52 // not passed to caller. |
66 StubDeferredStartRenderHost* CreateHost() { | 53 DeferredStartRenderHost* CreateHost() { |
67 StubDeferredStartRenderHost* stub = new StubDeferredStartRenderHost(); | 54 StubDeferredStartRenderHost* stub = new StubDeferredStartRenderHost(); |
68 stubs_.push_back(stub); | 55 stubs_.push_back(stub); |
69 return stub; | 56 return stub; |
70 } | 57 } |
71 | 58 |
72 // Our single LoadMonitoringExtensionHostQueue instance. | 59 // Our single LoadMonitoringExtensionHostQueue instance. |
73 LoadMonitoringExtensionHostQueue* queue() { return queue_.get(); } | 60 LoadMonitoringExtensionHostQueue* queue() { return queue_.get(); } |
74 | 61 |
75 // Returns true if the queue has finished monitoring. | 62 // Returns true if the queue has finished monitoring. |
76 bool finished() const { return finished_; } | 63 bool finished() { return finished_; } |
77 | 64 |
78 // These are available after the queue has finished (in which case finished() | 65 // These are available after the queue has finished (in which case finished() |
79 // will return true). | 66 // will return true). |
80 size_t num_queued() { return num_queued_; } | 67 size_t num_queued() { return num_queued_; } |
81 size_t num_loaded() { return num_loaded_; } | 68 size_t num_loaded() { return num_loaded_; } |
82 size_t max_awaiting_loading() { return max_awaiting_loading_; } | 69 size_t max_in_queue() { return max_in_queue_; } |
83 size_t max_active_loading() { return max_active_loading_; } | 70 size_t max_active_loading() { return max_active_loading_; } |
84 | 71 |
85 private: | 72 private: |
86 // Callback when queue has finished monitoring. | 73 // Callback when queue has finished monitoring. |
87 void Finished(size_t num_queued, | 74 void Finished(size_t num_queued, |
88 size_t num_loaded, | 75 size_t num_loaded, |
89 size_t max_awaiting_loading, | 76 size_t max_in_queue, |
90 size_t max_active_loading) { | 77 size_t max_active_loading) { |
91 CHECK(!finished_); | |
92 finished_ = true; | 78 finished_ = true; |
93 num_queued_ = num_queued; | 79 num_queued_ = num_queued; |
94 num_loaded_ = num_loaded; | 80 num_loaded_ = num_loaded; |
95 max_awaiting_loading_ = max_awaiting_loading; | 81 max_in_queue_ = max_in_queue; |
96 max_active_loading_ = max_active_loading; | 82 max_active_loading_ = max_active_loading; |
97 } | 83 } |
98 | 84 |
99 content::TestBrowserThreadBundle thread_bundle_; | 85 content::TestBrowserThreadBundle thread_bundle_; |
100 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; | 86 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; |
101 ScopedVector<StubDeferredStartRenderHost> stubs_; | 87 ScopedVector<StubDeferredStartRenderHost> stubs_; |
102 | 88 |
103 // Set after the queue has finished monitoring. | 89 // Set after the queue has finished monitoring. |
104 bool finished_; | 90 bool finished_; |
105 size_t num_queued_; | 91 size_t num_queued_; |
106 size_t num_loaded_; | 92 size_t num_loaded_; |
107 size_t max_awaiting_loading_; | 93 size_t max_in_queue_; |
108 size_t max_active_loading_; | 94 size_t max_active_loading_; |
109 }; | 95 }; |
110 | 96 |
111 // Tests that if monitoring is never started, nor any hosts added, nothing is | 97 // Tests that if monitoring is never started, nor any hosts added, nothing is |
112 // recorded. | 98 // recorded. |
113 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { | 99 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { |
114 base::RunLoop().RunUntilIdle(); | 100 base::RunLoop().RunUntilIdle(); |
115 ASSERT_FALSE(finished()); | 101 ASSERT_FALSE(finished()); |
116 } | 102 } |
117 | 103 |
118 // Tests that if monitoring has started but no hosts added, it's recorded as 0. | 104 // Tests that if monitoring has started but no hosts added, it's recorded as 0. |
119 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { | 105 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { |
120 queue()->StartMonitoring(); | 106 queue()->StartMonitoring(); |
121 | 107 |
122 base::RunLoop().RunUntilIdle(); | 108 base::RunLoop().RunUntilIdle(); |
123 ASSERT_TRUE(finished()); | 109 ASSERT_TRUE(finished()); |
124 EXPECT_EQ(0u, num_queued()); | 110 EXPECT_EQ(0u, num_queued()); |
125 EXPECT_EQ(0u, num_loaded()); | 111 EXPECT_EQ(0u, num_loaded()); |
126 EXPECT_EQ(0u, max_awaiting_loading()); | 112 EXPECT_EQ(0u, max_in_queue()); |
127 EXPECT_EQ(0u, max_active_loading()); | 113 EXPECT_EQ(0u, max_active_loading()); |
128 } | 114 } |
129 | 115 |
130 // Tests that adding a host starts monitoring. | 116 // Tests that adding a host starts monitoring. |
131 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { | 117 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { |
132 queue()->Add(CreateHost()); | 118 queue()->Add(CreateHost()); |
133 | 119 |
134 base::RunLoop().RunUntilIdle(); | 120 base::RunLoop().RunUntilIdle(); |
135 ASSERT_TRUE(finished()); | 121 ASSERT_TRUE(finished()); |
136 EXPECT_EQ(1u, num_queued()); | 122 EXPECT_EQ(1u, num_queued()); |
137 EXPECT_EQ(0u, num_loaded()); | 123 EXPECT_EQ(0u, num_loaded()); |
138 EXPECT_EQ(1u, max_awaiting_loading()); | 124 EXPECT_EQ(1u, max_in_queue()); |
139 EXPECT_EQ(0u, max_active_loading()); | 125 EXPECT_EQ(0u, max_active_loading()); |
140 } | 126 } |
141 | 127 |
142 // Tests that a host added and removed is still recorded, but not as a load | 128 // Tests that a host added and removed is still recorded, but not as a load |
143 // finished. | 129 // finished. |
144 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { | 130 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { |
145 DeferredStartRenderHost* host = CreateHost(); | 131 DeferredStartRenderHost* host = CreateHost(); |
146 queue()->Add(host); | 132 queue()->Add(host); |
147 queue()->Remove(host); | 133 queue()->Remove(host); |
148 | 134 |
149 base::RunLoop().RunUntilIdle(); | 135 base::RunLoop().RunUntilIdle(); |
150 ASSERT_TRUE(finished()); | 136 ASSERT_TRUE(finished()); |
151 EXPECT_EQ(1u, num_queued()); | 137 EXPECT_EQ(1u, num_queued()); |
152 EXPECT_EQ(0u, num_loaded()); | 138 EXPECT_EQ(0u, num_loaded()); |
153 EXPECT_EQ(1u, max_awaiting_loading()); | 139 EXPECT_EQ(1u, max_in_queue()); |
154 EXPECT_EQ(0u, max_active_loading()); | 140 EXPECT_EQ(0u, max_active_loading()); |
155 } | 141 } |
156 | 142 |
157 // Tests adding and starting a single host. | 143 // Tests adding and starting a single host. |
158 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { | 144 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { |
159 DeferredStartRenderHost* host = CreateHost(); | 145 DeferredStartRenderHost* host = CreateHost(); |
160 queue()->Add(host); | 146 queue()->Add(host); |
161 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 147 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
162 | 148 |
163 base::RunLoop().RunUntilIdle(); | 149 base::RunLoop().RunUntilIdle(); |
164 ASSERT_TRUE(finished()); | 150 ASSERT_TRUE(finished()); |
165 EXPECT_EQ(1u, num_queued()); | 151 EXPECT_EQ(1u, num_queued()); |
166 EXPECT_EQ(0u, num_loaded()); | 152 EXPECT_EQ(0u, num_loaded()); |
167 EXPECT_EQ(1u, max_awaiting_loading()); | 153 EXPECT_EQ(1u, max_in_queue()); |
168 EXPECT_EQ(1u, max_active_loading()); | 154 EXPECT_EQ(1u, max_active_loading()); |
| 155 |
| 156 // Sanity check: stopping/destroying at this point doesn't crash. |
| 157 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 158 queue()->OnDeferredStartRenderHostDestroyed(host); |
169 } | 159 } |
170 | 160 |
171 // Tests adding and destroying a single host without starting it. | 161 // Tests adding and destroying a single host without starting it. |
172 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { | 162 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { |
173 DeferredStartRenderHost* host = CreateHost(); | 163 DeferredStartRenderHost* host = CreateHost(); |
174 queue()->Add(host); | 164 queue()->Add(host); |
175 queue()->OnDeferredStartRenderHostDestroyed(host); | 165 queue()->OnDeferredStartRenderHostDestroyed(host); |
176 | 166 |
177 base::RunLoop().RunUntilIdle(); | 167 base::RunLoop().RunUntilIdle(); |
178 ASSERT_TRUE(finished()); | 168 ASSERT_TRUE(finished()); |
179 EXPECT_EQ(1u, num_queued()); | 169 EXPECT_EQ(1u, num_queued()); |
180 EXPECT_EQ(0u, num_loaded()); | 170 EXPECT_EQ(0u, num_loaded()); |
181 EXPECT_EQ(1u, max_awaiting_loading()); | 171 EXPECT_EQ(1u, max_in_queue()); |
182 EXPECT_EQ(0u, max_active_loading()); | 172 EXPECT_EQ(0u, max_active_loading()); |
| 173 |
| 174 // Sanity check: stopping/destroying at this point doesn't crash. |
| 175 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 176 queue()->OnDeferredStartRenderHostDestroyed(host); |
183 } | 177 } |
184 | 178 |
185 // Tests adding, starting, and stopping a single host. | 179 // Tests adding, starting, and stopping a single host. |
186 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { | 180 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { |
187 DeferredStartRenderHost* host = CreateHost(); | 181 DeferredStartRenderHost* host = CreateHost(); |
188 queue()->Add(host); | 182 queue()->Add(host); |
189 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 183 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
190 queue()->OnDeferredStartRenderHostDidStopLoading(host); | 184 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
191 | 185 |
192 base::RunLoop().RunUntilIdle(); | 186 base::RunLoop().RunUntilIdle(); |
193 ASSERT_TRUE(finished()); | 187 ASSERT_TRUE(finished()); |
194 EXPECT_EQ(1u, num_queued()); | 188 EXPECT_EQ(1u, num_queued()); |
195 EXPECT_EQ(1u, num_loaded()); | 189 EXPECT_EQ(1u, num_loaded()); |
196 EXPECT_EQ(1u, max_awaiting_loading()); | 190 EXPECT_EQ(1u, max_in_queue()); |
197 EXPECT_EQ(1u, max_active_loading()); | 191 EXPECT_EQ(1u, max_active_loading()); |
198 } | |
199 | 192 |
200 // Tests adding, starting, and stopping a single host - twice. | 193 // Sanity check: destroying at this point doesn't crash. |
201 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHostTwice) { | 194 queue()->OnDeferredStartRenderHostDestroyed(host); |
202 DeferredStartRenderHost* host = CreateHost(); | |
203 queue()->Add(host); | |
204 queue()->OnDeferredStartRenderHostDidStartLoading(host); | |
205 queue()->OnDeferredStartRenderHostDidStopLoading(host); | |
206 | |
207 // Re-starting loading should also be recorded fine (e.g. navigations could | |
208 // trigger this). | |
209 queue()->OnDeferredStartRenderHostDidStartLoading(host); | |
210 queue()->OnDeferredStartRenderHostDidStopLoading(host); | |
211 | |
212 base::RunLoop().RunUntilIdle(); | |
213 ASSERT_TRUE(finished()); | |
214 EXPECT_EQ(1u, num_queued()); | |
215 EXPECT_EQ(2u, num_loaded()); // 2 loaded this time, because we ran twice | |
216 EXPECT_EQ(1u, max_awaiting_loading()); | |
217 EXPECT_EQ(1u, max_active_loading()); | |
218 } | 195 } |
219 | 196 |
220 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. | 197 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. |
221 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { | 198 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { |
222 DeferredStartRenderHost* host = CreateHost(); | 199 DeferredStartRenderHost* host = CreateHost(); |
223 queue()->Add(host); | 200 queue()->Add(host); |
224 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 201 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
225 queue()->OnDeferredStartRenderHostDestroyed(host); | 202 queue()->OnDeferredStartRenderHostDestroyed(host); |
226 | 203 |
227 base::RunLoop().RunUntilIdle(); | 204 base::RunLoop().RunUntilIdle(); |
228 ASSERT_TRUE(finished()); | 205 ASSERT_TRUE(finished()); |
229 EXPECT_EQ(1u, num_queued()); | 206 EXPECT_EQ(1u, num_queued()); |
230 EXPECT_EQ(1u, num_loaded()); | 207 EXPECT_EQ(1u, num_loaded()); |
231 EXPECT_EQ(1u, max_awaiting_loading()); | 208 EXPECT_EQ(1u, max_in_queue()); |
232 EXPECT_EQ(1u, max_active_loading()); | 209 EXPECT_EQ(1u, max_active_loading()); |
233 } | 210 } |
234 | 211 |
235 // Tests adding, starting, and removing a single host. | 212 // Tests adding, starting, and removing a single host. |
236 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { | 213 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { |
237 DeferredStartRenderHost* host = CreateHost(); | 214 DeferredStartRenderHost* host = CreateHost(); |
238 queue()->Add(host); | 215 queue()->Add(host); |
239 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 216 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
240 queue()->Remove(host); | 217 queue()->Remove(host); |
241 | 218 |
242 base::RunLoop().RunUntilIdle(); | 219 base::RunLoop().RunUntilIdle(); |
243 ASSERT_TRUE(finished()); | 220 ASSERT_TRUE(finished()); |
244 EXPECT_EQ(1u, num_queued()); | 221 EXPECT_EQ(1u, num_queued()); |
245 EXPECT_EQ(0u, num_loaded()); | 222 EXPECT_EQ(0u, num_loaded()); |
246 EXPECT_EQ(1u, max_awaiting_loading()); | 223 EXPECT_EQ(1u, max_in_queue()); |
247 EXPECT_EQ(1u, max_active_loading()); | 224 EXPECT_EQ(1u, max_active_loading()); |
248 } | 225 } |
249 | 226 |
250 // Tests monitoring a sequence of hosts. | 227 // Tests monitoring a sequence of hosts. |
251 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { | 228 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { |
252 // Scenario: | 229 // Scenario: |
253 // | 230 // |
254 // 6 hosts will be added, only 5 will start loading, with a maximum of 4 in | 231 // 6 hosts will be added, only 5 will start loading, with a maximum of 4 in |
255 // the queue and 3 loading at any time. Only 2 will finish. | 232 // the queue and 3 loading at any time. Only 2 will finish. |
256 DeferredStartRenderHost* host1 = CreateHost(); | 233 DeferredStartRenderHost* host1 = CreateHost(); |
(...skipping 17 matching lines...) Expand all Loading... |
274 | 251 |
275 queue()->OnDeferredStartRenderHostDidStartLoading(host3); | 252 queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
276 queue()->OnDeferredStartRenderHostDidStartLoading(host4); | 253 queue()->OnDeferredStartRenderHostDidStartLoading(host4); |
277 queue()->OnDeferredStartRenderHostDidStopLoading(host4); | 254 queue()->OnDeferredStartRenderHostDidStopLoading(host4); |
278 queue()->OnDeferredStartRenderHostDidStartLoading(host5); | 255 queue()->OnDeferredStartRenderHostDidStartLoading(host5); |
279 | 256 |
280 base::RunLoop().RunUntilIdle(); | 257 base::RunLoop().RunUntilIdle(); |
281 ASSERT_TRUE(finished()); | 258 ASSERT_TRUE(finished()); |
282 EXPECT_EQ(6u, num_queued()); | 259 EXPECT_EQ(6u, num_queued()); |
283 EXPECT_EQ(2u, num_loaded()); | 260 EXPECT_EQ(2u, num_loaded()); |
284 EXPECT_EQ(4u, max_awaiting_loading()); | 261 EXPECT_EQ(4u, max_in_queue()); |
285 EXPECT_EQ(3u, max_active_loading()); | 262 EXPECT_EQ(3u, max_active_loading()); |
286 | 263 |
287 // Complete a realistic sequence by stopping and/or destroying all hosts. | 264 // Sanity check: complete a realistic sequence by stopping and/or destroying |
| 265 // all of the hosts. It shouldn't crash. |
288 queue()->OnDeferredStartRenderHostDestroyed(host1); | 266 queue()->OnDeferredStartRenderHostDestroyed(host1); |
289 queue()->OnDeferredStartRenderHostDidStopLoading(host2); | 267 queue()->OnDeferredStartRenderHostDidStopLoading(host2); |
290 queue()->OnDeferredStartRenderHostDestroyed(host2); | 268 queue()->OnDeferredStartRenderHostDestroyed(host2); |
291 queue()->OnDeferredStartRenderHostDidStopLoading(host3); | 269 queue()->OnDeferredStartRenderHostDidStopLoading(host3); |
292 queue()->OnDeferredStartRenderHostDestroyed(host3); | 270 queue()->OnDeferredStartRenderHostDestroyed(host3); |
293 queue()->OnDeferredStartRenderHostDestroyed(host4); | 271 queue()->OnDeferredStartRenderHostDestroyed(host4); |
294 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped | 272 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped |
295 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped | 273 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped |
296 } | 274 } |
297 | 275 |
298 // Tests that the queue is observing Hosts from adding them through to being | |
299 // removed - that the load sequence itself is irrelevant. | |
300 // | |
301 // This is an unfortunate implementation-style test, but it used to be a bug | |
302 // and difficult to catch outside of a proper test framework - one in which we | |
303 // don't have to trigger events by hand. | |
304 TEST_F(LoadMonitoringExtensionHostQueueTest, ObserverLifetime) { | |
305 StubDeferredStartRenderHost* host1 = CreateHost(); | |
306 StubDeferredStartRenderHost* host2 = CreateHost(); | |
307 StubDeferredStartRenderHost* host3 = CreateHost(); | |
308 StubDeferredStartRenderHost* host4 = CreateHost(); | |
309 | |
310 EXPECT_FALSE(host1->IsObservedBy(queue())); | |
311 EXPECT_FALSE(host2->IsObservedBy(queue())); | |
312 EXPECT_FALSE(host3->IsObservedBy(queue())); | |
313 EXPECT_FALSE(host4->IsObservedBy(queue())); | |
314 | |
315 queue()->Add(host1); | |
316 queue()->Add(host2); | |
317 queue()->Add(host3); | |
318 queue()->Add(host4); | |
319 | |
320 EXPECT_TRUE(host1->IsObservedBy(queue())); | |
321 EXPECT_TRUE(host2->IsObservedBy(queue())); | |
322 EXPECT_TRUE(host3->IsObservedBy(queue())); | |
323 EXPECT_TRUE(host4->IsObservedBy(queue())); | |
324 | |
325 queue()->OnDeferredStartRenderHostDidStartLoading(host1); | |
326 queue()->OnDeferredStartRenderHostDidStartLoading(host2); | |
327 queue()->OnDeferredStartRenderHostDidStartLoading(host3); | |
328 // host4 will test that we Remove before Starting - so don't start. | |
329 | |
330 EXPECT_TRUE(host1->IsObservedBy(queue())); | |
331 EXPECT_TRUE(host2->IsObservedBy(queue())); | |
332 EXPECT_TRUE(host3->IsObservedBy(queue())); | |
333 EXPECT_TRUE(host4->IsObservedBy(queue())); | |
334 | |
335 queue()->OnDeferredStartRenderHostDidStopLoading(host1); | |
336 queue()->OnDeferredStartRenderHostDestroyed(host2); | |
337 | |
338 EXPECT_TRUE(host1->IsObservedBy(queue())); | |
339 EXPECT_TRUE(host2->IsObservedBy(queue())); | |
340 | |
341 queue()->Remove(host1); | |
342 queue()->Remove(host2); | |
343 queue()->Remove(host3); | |
344 queue()->Remove(host4); | |
345 | |
346 EXPECT_FALSE(host1->IsObservedBy(queue())); | |
347 EXPECT_FALSE(host2->IsObservedBy(queue())); | |
348 EXPECT_FALSE(host3->IsObservedBy(queue())); | |
349 EXPECT_FALSE(host4->IsObservedBy(queue())); | |
350 } | |
351 | |
352 } // namespace extensions | 276 } // namespace extensions |
OLD | NEW |