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

Side by Side Diff: cc/scheduler/begin_frame_source_unittest.cc

Issue 2779633002: [cc] Remove remaining_frames from BeginFrameAck. (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/scheduler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/scheduler/begin_frame_source.h" 5 #include "cc/scheduler/begin_frame_source.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 source_->AddObserver(obs_.get()); 67 source_->AddObserver(obs_.get());
68 EXPECT_TRUE(task_runner_->HasPendingTasks()); 68 EXPECT_TRUE(task_runner_->HasPendingTasks());
69 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 69 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
70 1000 + kDeadline, kInterval); 70 1000 + kDeadline, kInterval);
71 task_runner_->RunPendingTasks(); 71 task_runner_->RunPendingTasks();
72 72
73 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, 73 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100,
74 1100 + kDeadline, kInterval); 74 1100 + kDeadline, kInterval);
75 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 75 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
76 source_->DidFinishFrame(obs_.get(), 76 source_->DidFinishFrame(obs_.get(),
77 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 77 BeginFrameAck(source_->source_id(), 1, 1, true));
78 task_runner_->RunPendingTasks(); 78 task_runner_->RunPendingTasks();
79 } 79 }
80 80
81 TEST_F(BackToBackBeginFrameSourceTest, 81 TEST_F(BackToBackBeginFrameSourceTest,
82 RemoveObserverThenDidFinishFrameProducesNoFrame) { 82 RemoveObserverThenDidFinishFrameProducesNoFrame) {
83 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 83 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
84 source_->AddObserver(obs_.get()); 84 source_->AddObserver(obs_.get());
85 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 85 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
86 1000 + kDeadline, kInterval); 86 1000 + kDeadline, kInterval);
87 task_runner_->RunPendingTasks(); 87 task_runner_->RunPendingTasks();
88 88
89 source_->RemoveObserver(obs_.get()); 89 source_->RemoveObserver(obs_.get());
90 source_->DidFinishFrame(obs_.get(), 90 source_->DidFinishFrame(obs_.get(),
91 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 91 BeginFrameAck(source_->source_id(), 1, 1, true));
92 92
93 // Verify no BeginFrame is sent to |obs_|. There is a pending task in the 93 // Verify no BeginFrame is sent to |obs_|. There is a pending task in the
94 // task_runner_ as a BeginFrame was posted, but it gets aborted since |obs_| 94 // task_runner_ as a BeginFrame was posted, but it gets aborted since |obs_|
95 // is removed. 95 // is removed.
96 task_runner_->RunPendingTasks(); 96 task_runner_->RunPendingTasks();
97 EXPECT_FALSE(task_runner_->HasPendingTasks()); 97 EXPECT_FALSE(task_runner_->HasPendingTasks());
98 } 98 }
99 99
100 TEST_F(BackToBackBeginFrameSourceTest, 100 TEST_F(BackToBackBeginFrameSourceTest,
101 DidFinishFrameThenRemoveObserverProducesNoFrame) { 101 DidFinishFrameThenRemoveObserverProducesNoFrame) {
102 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 102 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
103 source_->AddObserver(obs_.get()); 103 source_->AddObserver(obs_.get());
104 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 104 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
105 1000 + kDeadline, kInterval); 105 1000 + kDeadline, kInterval);
106 task_runner_->RunPendingTasks(); 106 task_runner_->RunPendingTasks();
107 107
108 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 108 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
109 source_->DidFinishFrame(obs_.get(), 109 source_->DidFinishFrame(obs_.get(),
110 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 110 BeginFrameAck(source_->source_id(), 1, 1, true));
111 source_->RemoveObserver(obs_.get()); 111 source_->RemoveObserver(obs_.get());
112 112
113 EXPECT_TRUE(task_runner_->HasPendingTasks()); 113 EXPECT_TRUE(task_runner_->HasPendingTasks());
114 task_runner_->RunPendingTasks(); 114 task_runner_->RunPendingTasks();
115 } 115 }
116 116
117 TEST_F(BackToBackBeginFrameSourceTest, 117 TEST_F(BackToBackBeginFrameSourceTest,
118 TogglingObserverThenDidFinishFrameProducesCorrectFrame) { 118 TogglingObserverThenDidFinishFrameProducesCorrectFrame) {
119 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 119 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
120 source_->AddObserver(obs_.get()); 120 source_->AddObserver(obs_.get());
121 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 121 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
122 1000 + kDeadline, kInterval); 122 1000 + kDeadline, kInterval);
123 task_runner_->RunPendingTasks(); 123 task_runner_->RunPendingTasks();
124 124
125 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 125 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
126 source_->RemoveObserver(obs_.get()); 126 source_->RemoveObserver(obs_.get());
127 127
128 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 128 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
129 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 129 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
130 source_->AddObserver(obs_.get()); 130 source_->AddObserver(obs_.get());
131 131
132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
133 source_->DidFinishFrame(obs_.get(), 133 source_->DidFinishFrame(obs_.get(),
134 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 134 BeginFrameAck(source_->source_id(), 1, 1, true));
135 135
136 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 136 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
137 // The begin frame is posted at the time when the observer was added, 137 // The begin frame is posted at the time when the observer was added,
138 // so it ignores changes to "now" afterward. 138 // so it ignores changes to "now" afterward.
139 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1110, 139 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1110,
140 1110 + kDeadline, kInterval); 140 1110 + kDeadline, kInterval);
141 EXPECT_TRUE(task_runner_->HasPendingTasks()); 141 EXPECT_TRUE(task_runner_->HasPendingTasks());
142 task_runner_->RunPendingTasks(); 142 task_runner_->RunPendingTasks();
143 } 143 }
144 144
145 TEST_F(BackToBackBeginFrameSourceTest, 145 TEST_F(BackToBackBeginFrameSourceTest,
146 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { 146 DidFinishFrameThenTogglingObserverProducesCorrectFrame) {
147 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 147 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
148 source_->AddObserver(obs_.get()); 148 source_->AddObserver(obs_.get());
149 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 149 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
150 1000 + kDeadline, kInterval); 150 1000 + kDeadline, kInterval);
151 task_runner_->RunPendingTasks(); 151 task_runner_->RunPendingTasks();
152 152
153 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 153 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
154 source_->DidFinishFrame(obs_.get(), 154 source_->DidFinishFrame(obs_.get(),
155 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 155 BeginFrameAck(source_->source_id(), 1, 1, true));
156 156
157 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 157 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
158 source_->RemoveObserver(obs_.get()); 158 source_->RemoveObserver(obs_.get());
159 159
160 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 160 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
161 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 161 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
162 source_->AddObserver(obs_.get()); 162 source_->AddObserver(obs_.get());
163 163
164 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 164 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
165 // Ticks at the time at which the observer was added, ignoring the 165 // Ticks at the time at which the observer was added, ignoring the
166 // last change to "now". 166 // last change to "now".
167 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1120, 167 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1120,
168 1120 + kDeadline, kInterval); 168 1120 + kDeadline, kInterval);
169 EXPECT_TRUE(task_runner_->HasPendingTasks()); 169 EXPECT_TRUE(task_runner_->HasPendingTasks());
170 task_runner_->RunPendingTasks(); 170 task_runner_->RunPendingTasks();
171 } 171 }
172 172
173 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { 173 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) {
174 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 174 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
175 source_->AddObserver(obs_.get()); 175 source_->AddObserver(obs_.get());
176 source_->RemoveObserver(obs_.get()); 176 source_->RemoveObserver(obs_.get());
177 source_->DidFinishFrame(obs_.get(), 177 source_->DidFinishFrame(obs_.get(),
178 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 178 BeginFrameAck(source_->source_id(), 1, 1, true));
179 EXPECT_FALSE(task_runner_->RunPendingTasks()); 179 EXPECT_FALSE(task_runner_->RunPendingTasks());
180 } 180 }
181 181
182 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
183 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
184 source_->AddObserver(obs_.get());
185 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
186 1000 + kDeadline, kInterval);
187 // Runs the pending begin frame.
188 task_runner_->RunPendingTasks();
189 // While running the begin frame, the next frame was cancelled, this
190 // runs the next frame, sees it was cancelled, and goes to sleep.
191 task_runner_->RunPendingTasks();
192 EXPECT_FALSE(task_runner_->HasPendingTasks());
193
194 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
195
196 source_->DidFinishFrame(obs_.get(),
197 BeginFrameAck(source_->source_id(), 1, 1, 3, true));
198 EXPECT_FALSE(task_runner_->HasPendingTasks());
199 source_->DidFinishFrame(obs_.get(),
200 BeginFrameAck(source_->source_id(), 1, 1, 2, true));
201 EXPECT_FALSE(task_runner_->HasPendingTasks());
202 source_->DidFinishFrame(obs_.get(),
203 BeginFrameAck(source_->source_id(), 1, 1, 1, true));
204 EXPECT_FALSE(task_runner_->HasPendingTasks());
205
206 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100,
207 1100 + kDeadline, kInterval);
208 source_->DidFinishFrame(obs_.get(),
209 BeginFrameAck(source_->source_id(), 1, 1, 0, true));
210 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
211 task_runner_->RunPendingTasks();
212 }
213
214 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) { 182 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) {
215 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 183 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
216 source_->AddObserver(obs_.get()); 184 source_->AddObserver(obs_.get());
217 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 185 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
218 1000 + kDeadline, kInterval); 186 1000 + kDeadline, kInterval);
219 task_runner_->RunPendingTasks(); 187 task_runner_->RunPendingTasks();
220 188
221 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 189 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
222 source_->DidFinishFrame(obs_.get(), 190 source_->DidFinishFrame(obs_.get(),
223 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 191 BeginFrameAck(source_->source_id(), 1, 1, true));
224 source_->DidFinishFrame(obs_.get(), 192 source_->DidFinishFrame(obs_.get(),
225 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 193 BeginFrameAck(source_->source_id(), 1, 1, true));
226 source_->DidFinishFrame(obs_.get(), 194 source_->DidFinishFrame(obs_.get(),
227 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 195 BeginFrameAck(source_->source_id(), 1, 1, true));
228 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, 196 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100,
229 1100 + kDeadline, kInterval); 197 1100 + kDeadline, kInterval);
230 task_runner_->RunPendingTasks(); 198 task_runner_->RunPendingTasks();
231 199
232 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 200 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
233 source_->DidFinishFrame(obs_.get(), 201 source_->DidFinishFrame(obs_.get(),
234 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 202 BeginFrameAck(source_->source_id(), 2, 2, true));
235 source_->DidFinishFrame(obs_.get(), 203 source_->DidFinishFrame(obs_.get(),
236 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 204 BeginFrameAck(source_->source_id(), 2, 2, true));
237 source_->DidFinishFrame(obs_.get(), 205 source_->DidFinishFrame(obs_.get(),
238 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 206 BeginFrameAck(source_->source_id(), 2, 2, true));
239 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 1200, 207 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 1200,
240 1200 + kDeadline, kInterval); 208 1200 + kDeadline, kInterval);
241 task_runner_->RunPendingTasks(); 209 task_runner_->RunPendingTasks();
242 } 210 }
243 211
244 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { 212 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
245 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 213 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
246 source_->AddObserver(obs_.get()); 214 source_->AddObserver(obs_.get());
247 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, 215 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000,
248 1000 + kDeadline, kInterval); 216 1000 + kDeadline, kInterval);
249 task_runner_->RunPendingTasks(); 217 task_runner_->RunPendingTasks();
250 218
251 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 219 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
252 source_->DidFinishFrame(obs_.get(), 220 source_->DidFinishFrame(obs_.get(),
253 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 221 BeginFrameAck(source_->source_id(), 1, 1, true));
254 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); 222 now_src_->Advance(base::TimeDelta::FromMicroseconds(50));
255 // Ticks at the time the last frame finished, so ignores the last change to 223 // Ticks at the time the last frame finished, so ignores the last change to
256 // "now". 224 // "now".
257 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, 225 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100,
258 1100 + kDeadline, kInterval); 226 1100 + kDeadline, kInterval);
259 227
260 EXPECT_TRUE(task_runner_->HasPendingTasks()); 228 EXPECT_TRUE(task_runner_->HasPendingTasks());
261 task_runner_->RunPendingTasks(); 229 task_runner_->RunPendingTasks();
262 } 230 }
263 231
264 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { 232 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) {
265 StrictMock<MockBeginFrameObserver> obs1, obs2; 233 StrictMock<MockBeginFrameObserver> obs1, obs2;
266 234
267 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); 235 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
268 source_->AddObserver(&obs1); 236 source_->AddObserver(&obs1);
269 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); 237 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
270 source_->AddObserver(&obs2); 238 source_->AddObserver(&obs2);
271 239
272 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, 240 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline,
273 kInterval); 241 kInterval);
274 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, 242 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline,
275 kInterval); 243 kInterval);
276 task_runner_->RunPendingTasks(); 244 task_runner_->RunPendingTasks();
277 245
278 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 246 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
279 source_->DidFinishFrame(&obs1, 247 source_->DidFinishFrame(&obs1,
280 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 248 BeginFrameAck(source_->source_id(), 1, 1, true));
281 source_->DidFinishFrame(&obs2, 249 source_->DidFinishFrame(&obs2,
282 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 250 BeginFrameAck(source_->source_id(), 1, 1, true));
283 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, 251 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline,
284 kInterval); 252 kInterval);
285 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, 253 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline,
286 kInterval); 254 kInterval);
287 task_runner_->RunPendingTasks(); 255 task_runner_->RunPendingTasks();
288 256
289 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 257 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
290 source_->DidFinishFrame(&obs1, 258 source_->DidFinishFrame(&obs1,
291 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 259 BeginFrameAck(source_->source_id(), 2, 2, true));
292 source_->DidFinishFrame(&obs2, 260 source_->DidFinishFrame(&obs2,
293 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 261 BeginFrameAck(source_->source_id(), 2, 2, true));
294 EXPECT_TRUE(task_runner_->HasPendingTasks()); 262 EXPECT_TRUE(task_runner_->HasPendingTasks());
295 source_->RemoveObserver(&obs1); 263 source_->RemoveObserver(&obs1);
296 source_->RemoveObserver(&obs2); 264 source_->RemoveObserver(&obs2);
297 task_runner_->RunPendingTasks(); 265 task_runner_->RunPendingTasks();
298 } 266 }
299 267
300 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { 268 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) {
301 StrictMock<MockBeginFrameObserver> obs1, obs2; 269 StrictMock<MockBeginFrameObserver> obs1, obs2;
302 270
303 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); 271 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
304 source_->AddObserver(&obs1); 272 source_->AddObserver(&obs1);
305 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, 273 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline,
306 kInterval); 274 kInterval);
307 task_runner_->RunPendingTasks(); 275 task_runner_->RunPendingTasks();
308 276
309 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 277 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
310 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); 278 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
311 source_->AddObserver(&obs2); 279 source_->AddObserver(&obs2);
312 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, 280 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline,
313 kInterval); 281 kInterval);
314 task_runner_->RunPendingTasks(); 282 task_runner_->RunPendingTasks();
315 283
316 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 284 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
317 source_->DidFinishFrame(&obs1, 285 source_->DidFinishFrame(&obs1,
318 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 286 BeginFrameAck(source_->source_id(), 1, 1, true));
319 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 1200, 1200 + kDeadline, 287 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 1200, 1200 + kDeadline,
320 kInterval); 288 kInterval);
321 task_runner_->RunPendingTasks(); 289 task_runner_->RunPendingTasks();
322 290
323 source_->DidFinishFrame(&obs1, 291 source_->DidFinishFrame(&obs1,
324 BeginFrameAck(source_->source_id(), 3, 3, 0, true)); 292 BeginFrameAck(source_->source_id(), 3, 3, true));
325 source_->RemoveObserver(&obs1); 293 source_->RemoveObserver(&obs1);
326 // Removing all finished observers should disable the time source. 294 // Removing all finished observers should disable the time source.
327 EXPECT_FALSE(delay_based_time_source_->Active()); 295 EXPECT_FALSE(delay_based_time_source_->Active());
328 // Finishing the frame for |obs1| posts a begin frame task, which will be 296 // Finishing the frame for |obs1| posts a begin frame task, which will be
329 // aborted since |obs1| is removed. Clear that from the task runner. 297 // aborted since |obs1| is removed. Clear that from the task runner.
330 task_runner_->RunPendingTasks(); 298 task_runner_->RunPendingTasks();
331 299
332 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 300 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
333 source_->DidFinishFrame(&obs2, 301 source_->DidFinishFrame(&obs2,
334 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 302 BeginFrameAck(source_->source_id(), 2, 2, true));
335 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline, 303 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline,
336 kInterval); 304 kInterval);
337 task_runner_->RunPendingTasks(); 305 task_runner_->RunPendingTasks();
338 306
339 source_->DidFinishFrame(&obs2, 307 source_->DidFinishFrame(&obs2,
340 BeginFrameAck(source_->source_id(), 4, 4, 0, true)); 308 BeginFrameAck(source_->source_id(), 4, 4, true));
341 source_->RemoveObserver(&obs2); 309 source_->RemoveObserver(&obs2);
342 } 310 }
343 311
344 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { 312 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) {
345 StrictMock<MockBeginFrameObserver> obs1, obs2; 313 StrictMock<MockBeginFrameObserver> obs1, obs2;
346 314
347 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); 315 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
348 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); 316 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
349 source_->AddObserver(&obs1); 317 source_->AddObserver(&obs1);
350 source_->AddObserver(&obs2); 318 source_->AddObserver(&obs2);
351 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, 319 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline,
352 kInterval); 320 kInterval);
353 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, 321 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline,
354 kInterval); 322 kInterval);
355 task_runner_->RunPendingTasks(); 323 task_runner_->RunPendingTasks();
356 324
357 // |obs1| finishes first. 325 // |obs1| finishes first.
358 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 326 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
359 source_->DidFinishFrame(&obs1, 327 source_->DidFinishFrame(&obs1,
360 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 328 BeginFrameAck(source_->source_id(), 1, 1, true));
361 329
362 // |obs2| finishes also, before getting to the newly posted begin frame. 330 // |obs2| finishes also, before getting to the newly posted begin frame.
363 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 331 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
364 source_->DidFinishFrame(&obs2, 332 source_->DidFinishFrame(&obs2,
365 BeginFrameAck(source_->source_id(), 1, 1, 0, true)); 333 BeginFrameAck(source_->source_id(), 1, 1, true));
366 334
367 // Because the begin frame source already ticked when |obs1| finished, 335 // Because the begin frame source already ticked when |obs1| finished,
368 // we see it as the frame time for both observers. 336 // we see it as the frame time for both observers.
369 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, 337 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline,
370 kInterval); 338 kInterval);
371 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, 339 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline,
372 kInterval); 340 kInterval);
373 task_runner_->RunPendingTasks(); 341 task_runner_->RunPendingTasks();
374 342
375 source_->DidFinishFrame(&obs1, 343 source_->DidFinishFrame(&obs1,
376 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 344 BeginFrameAck(source_->source_id(), 2, 2, true));
377 source_->RemoveObserver(&obs1); 345 source_->RemoveObserver(&obs1);
378 source_->DidFinishFrame(&obs2, 346 source_->DidFinishFrame(&obs2,
379 BeginFrameAck(source_->source_id(), 2, 2, 0, true)); 347 BeginFrameAck(source_->source_id(), 2, 2, true));
380 source_->RemoveObserver(&obs2); 348 source_->RemoveObserver(&obs2);
381 } 349 }
382 350
383 // DelayBasedBeginFrameSource testing ------------------------------------------ 351 // DelayBasedBeginFrameSource testing ------------------------------------------
384 class DelayBasedBeginFrameSourceTest : public ::testing::Test { 352 class DelayBasedBeginFrameSourceTest : public ::testing::Test {
385 public: 353 public:
386 std::unique_ptr<base::SimpleTestTickClock> now_src_; 354 std::unique_ptr<base::SimpleTestTickClock> now_src_;
387 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 355 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
388 std::unique_ptr<DelayBasedBeginFrameSource> source_; 356 std::unique_ptr<DelayBasedBeginFrameSource> source_;
389 std::unique_ptr<MockBeginFrameObserver> obs_; 357 std::unique_ptr<MockBeginFrameObserver> obs_;
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 tracker_->OnObserverRemoved(&obs1_); 608 tracker_->OnObserverRemoved(&obs1_);
641 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 609 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
642 610
643 // After adding it back, the BeginFrame is again not finished or confirmed. 611 // After adding it back, the BeginFrame is again not finished or confirmed.
644 tracker_->OnObserverAdded(&obs1_); 612 tracker_->OnObserverAdded(&obs1_);
645 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. 613 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
646 614
647 // When the observer finishes and confirms, the BeginFrame is finished 615 // When the observer finishes and confirms, the BeginFrame is finished
648 // and confirmed. 616 // and confirmed.
649 obs1_.OnBeginFrame(current_args_); 617 obs1_.OnBeginFrame(current_args_);
650 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, 0, false)); 618 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
651 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 619 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
652 620
653 // A new BeginFrame is initially not finished or confirmed. 621 // A new BeginFrame is initially not finished or confirmed.
654 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2); 622 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
655 tracker_->OnBeginFrame(current_args_); 623 tracker_->OnBeginFrame(current_args_);
656 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 624 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
657 625
658 // Stray ACK for an old BeginFrame is ignored. 626 // Stray ACK for an old BeginFrame is ignored.
659 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, 0, false)); 627 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
660 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 628 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
661 629
662 // When the observer finishes but doesn't confirm, the BeginFrame is finished 630 // When the observer finishes but doesn't confirm, the BeginFrame is finished
663 // but not confirmed. 631 // but not confirmed.
664 obs1_.OnBeginFrame(current_args_); 632 obs1_.OnBeginFrame(current_args_);
665 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 1, 0, false)); 633 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 1, false));
666 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 634 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
667 635
668 // Damage from ACK propagates. 636 // Damage from ACK propagates.
669 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3); 637 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3);
670 tracker_->OnBeginFrame(current_args_); 638 tracker_->OnBeginFrame(current_args_);
671 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 639 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
672 obs1_.OnBeginFrame(current_args_); 640 obs1_.OnBeginFrame(current_args_);
673 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 3, 0, true)); 641 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 3, true));
674 EXPECT_ACK_TRACKER_STATE(true, true, 3u); 642 EXPECT_ACK_TRACKER_STATE(true, true, 3u);
675 643
676 // Removing an out-of-date observer confirms the latest BeginFrame. 644 // Removing an out-of-date observer confirms the latest BeginFrame.
677 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4); 645 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4);
678 tracker_->OnBeginFrame(current_args_); 646 tracker_->OnBeginFrame(current_args_);
679 EXPECT_ACK_TRACKER_STATE(false, false, 3u); 647 EXPECT_ACK_TRACKER_STATE(false, false, 3u);
680 obs1_.OnBeginFrame(current_args_); 648 obs1_.OnBeginFrame(current_args_);
681 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 3, 0, false)); 649 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 3, false));
682 EXPECT_ACK_TRACKER_STATE(true, false, 3u); 650 EXPECT_ACK_TRACKER_STATE(true, false, 3u);
683 tracker_->OnObserverRemoved(&obs1_); 651 tracker_->OnObserverRemoved(&obs1_);
684 EXPECT_ACK_TRACKER_STATE(true, false, 4u); 652 EXPECT_ACK_TRACKER_STATE(true, false, 4u);
685 } 653 }
686 654
687 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith2Observers) { 655 TEST_F(BeginFrameObserverAckTrackerTest, CorrectnessWith2Observers) {
688 // Check initial state. 656 // Check initial state.
689 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 657 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
690 658
691 // After adding observers, the BeginFrame is not finished or confirmed. 659 // After adding observers, the BeginFrame is not finished or confirmed.
692 tracker_->OnObserverAdded(&obs1_); 660 tracker_->OnObserverAdded(&obs1_);
693 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. 661 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
694 tracker_->OnObserverAdded(&obs2_); 662 tracker_->OnObserverAdded(&obs2_);
695 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame. 663 EXPECT_ACK_TRACKER_STATE(false, false, 0u); // up to date to previous frame.
696 664
697 // Removing one of them changes nothing. Same for adding back. 665 // Removing one of them changes nothing. Same for adding back.
698 tracker_->OnObserverRemoved(&obs1_); 666 tracker_->OnObserverRemoved(&obs1_);
699 EXPECT_ACK_TRACKER_STATE(false, false, 0u); 667 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
700 tracker_->OnObserverAdded(&obs1_); 668 tracker_->OnObserverAdded(&obs1_);
701 EXPECT_ACK_TRACKER_STATE(false, false, 0u); 669 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
702 670
703 // When one observer finishes and confirms, nothing changes. 671 // When one observer finishes and confirms, nothing changes.
704 obs1_.OnBeginFrame(current_args_); 672 obs1_.OnBeginFrame(current_args_);
705 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, 0, false)); 673 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 1, 1, false));
706 EXPECT_ACK_TRACKER_STATE(false, false, 0u); 674 EXPECT_ACK_TRACKER_STATE(false, false, 0u);
707 // When both finish and confirm, the BeginFrame is finished and confirmed. 675 // When both finish and confirm, the BeginFrame is finished and confirmed.
708 obs2_.OnBeginFrame(current_args_); 676 obs2_.OnBeginFrame(current_args_);
709 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 1, 1, 0, false)); 677 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 1, 1, false));
710 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 678 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
711 679
712 // A new BeginFrame is not finished or confirmed. 680 // A new BeginFrame is not finished or confirmed.
713 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2); 681 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2);
714 tracker_->OnBeginFrame(current_args_); 682 tracker_->OnBeginFrame(current_args_);
715 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 683 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
716 684
717 // When both observers finish but only one confirms, the BeginFrame is 685 // When both observers finish but only one confirms, the BeginFrame is
718 // finished but not confirmed. 686 // finished but not confirmed.
719 obs1_.OnBeginFrame(current_args_); 687 obs1_.OnBeginFrame(current_args_);
720 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 2, 0, false)); 688 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 2, 2, false));
721 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 689 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
722 obs2_.OnBeginFrame(current_args_); 690 obs2_.OnBeginFrame(current_args_);
723 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 2, 1, 0, false)); 691 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 2, 1, false));
724 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 692 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
725 693
726 // With reversed confirmations in the next ACKs, the latest confirmed frame 694 // With reversed confirmations in the next ACKs, the latest confirmed frame
727 // increases but the latest BeginFrame remains unconfirmed. 695 // increases but the latest BeginFrame remains unconfirmed.
728 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3); 696 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 3);
729 tracker_->OnBeginFrame(current_args_); 697 tracker_->OnBeginFrame(current_args_);
730 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 698 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
731 obs1_.OnBeginFrame(current_args_); 699 obs1_.OnBeginFrame(current_args_);
732 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 2, 0, false)); 700 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 3, 2, false));
733 EXPECT_ACK_TRACKER_STATE(false, false, 1u); 701 EXPECT_ACK_TRACKER_STATE(false, false, 1u);
734 obs2_.OnBeginFrame(current_args_); 702 obs2_.OnBeginFrame(current_args_);
735 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 3, 3, 0, false)); 703 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 3, 3, false));
736 EXPECT_ACK_TRACKER_STATE(true, false, 2u); 704 EXPECT_ACK_TRACKER_STATE(true, false, 2u);
737 705
738 // Only a single ACK with damage suffices. 706 // Only a single ACK with damage suffices.
739 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4); 707 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 4);
740 tracker_->OnBeginFrame(current_args_); 708 tracker_->OnBeginFrame(current_args_);
741 EXPECT_ACK_TRACKER_STATE(false, false, 2u); 709 EXPECT_ACK_TRACKER_STATE(false, false, 2u);
742 obs1_.OnBeginFrame(current_args_); 710 obs1_.OnBeginFrame(current_args_);
743 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 4, 0, true)); 711 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 4, 4, true));
744 EXPECT_ACK_TRACKER_STATE(false, true, 3u); 712 EXPECT_ACK_TRACKER_STATE(false, true, 3u);
745 obs2_.OnBeginFrame(current_args_); 713 obs2_.OnBeginFrame(current_args_);
746 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 4, 4, 0, false)); 714 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 4, 4, false));
747 EXPECT_ACK_TRACKER_STATE(true, true, 4u); 715 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
748 716
749 // Removing the damaging observer makes no difference in this case. 717 // Removing the damaging observer makes no difference in this case.
750 tracker_->OnObserverRemoved(&obs1_); 718 tracker_->OnObserverRemoved(&obs1_);
751 EXPECT_ACK_TRACKER_STATE(true, true, 4u); 719 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
752 720
753 // Adding the observer back considers it up to date up to the current 721 // Adding the observer back considers it up to date up to the current
754 // BeginFrame, because it is the last used one. Thus, the current BeginFrame 722 // BeginFrame, because it is the last used one. Thus, the current BeginFrame
755 // is still finished, too. 723 // is still finished, too.
756 tracker_->OnObserverAdded(&obs1_); 724 tracker_->OnObserverAdded(&obs1_);
757 EXPECT_ACK_TRACKER_STATE(true, true, 4u); 725 EXPECT_ACK_TRACKER_STATE(true, true, 4u);
758 726
759 // Adding the observer back after the next BeginFrame considers it up to date 727 // Adding the observer back after the next BeginFrame considers it up to date
760 // up to last BeginFrame only. 728 // up to last BeginFrame only.
761 tracker_->OnObserverRemoved(&obs1_); 729 tracker_->OnObserverRemoved(&obs1_);
762 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 5); 730 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 5);
763 tracker_->OnBeginFrame(current_args_); 731 tracker_->OnBeginFrame(current_args_);
764 tracker_->OnObserverAdded(&obs1_); 732 tracker_->OnObserverAdded(&obs1_);
765 EXPECT_ACK_TRACKER_STATE(false, false, 4u); 733 EXPECT_ACK_TRACKER_STATE(false, false, 4u);
766 // Both observers need to finish for the BeginFrame to be finished. 734 // Both observers need to finish for the BeginFrame to be finished.
767 obs1_.OnBeginFrame(current_args_); 735 obs1_.OnBeginFrame(current_args_);
768 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 5, 5, 0, false)); 736 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(0, 5, 5, false));
769 EXPECT_ACK_TRACKER_STATE(false, false, 4u); 737 EXPECT_ACK_TRACKER_STATE(false, false, 4u);
770 obs2_.OnBeginFrame(current_args_); 738 obs2_.OnBeginFrame(current_args_);
771 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 5, 5, 0, false)); 739 tracker_->OnObserverFinishedFrame(&obs2_, BeginFrameAck(0, 5, 5, false));
772 EXPECT_ACK_TRACKER_STATE(true, false, 5u); 740 EXPECT_ACK_TRACKER_STATE(true, false, 5u);
773 } 741 }
774 742
775 TEST_F(BeginFrameObserverAckTrackerTest, ChangingSourceIdOnBeginFrame) { 743 TEST_F(BeginFrameObserverAckTrackerTest, ChangingSourceIdOnBeginFrame) {
776 // Check initial state. 744 // Check initial state.
777 EXPECT_ACK_TRACKER_STATE(true, false, 1u); 745 EXPECT_ACK_TRACKER_STATE(true, false, 1u);
778 746
779 // Changing source id without observer updates confirmed BeginFrame. 747 // Changing source id without observer updates confirmed BeginFrame.
780 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 10); 748 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 10);
781 tracker_->OnBeginFrame(current_args_); 749 tracker_->OnBeginFrame(current_args_);
782 EXPECT_ACK_TRACKER_STATE(true, false, 10u); 750 EXPECT_ACK_TRACKER_STATE(true, false, 10u);
783 751
784 // Setup an observer for current BeginFrame. 752 // Setup an observer for current BeginFrame.
785 tracker_->OnObserverAdded(&obs1_); 753 tracker_->OnObserverAdded(&obs1_);
786 EXPECT_ACK_TRACKER_STATE(false, false, 9u); // up to date to previous frame. 754 EXPECT_ACK_TRACKER_STATE(false, false, 9u); // up to date to previous frame.
787 obs1_.OnBeginFrame(current_args_); 755 obs1_.OnBeginFrame(current_args_);
788 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(1, 10, 10, 0, true)); 756 tracker_->OnObserverFinishedFrame(&obs1_, BeginFrameAck(1, 10, 10, true));
789 EXPECT_ACK_TRACKER_STATE(true, true, 10u); 757 EXPECT_ACK_TRACKER_STATE(true, true, 10u);
790 758
791 // Changing source id with an observer sets confirmed BeginFrame to invalid. 759 // Changing source id with an observer sets confirmed BeginFrame to invalid.
792 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 2, 20); 760 current_args_ = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 2, 20);
793 tracker_->OnBeginFrame(current_args_); 761 tracker_->OnBeginFrame(current_args_);
794 EXPECT_ACK_TRACKER_STATE(false, false, BeginFrameArgs::kInvalidFrameNumber); 762 EXPECT_ACK_TRACKER_STATE(false, false, BeginFrameArgs::kInvalidFrameNumber);
795 } 763 }
796 764
797 // ExternalBeginFrameSource testing -------------------------------------------- 765 // ExternalBeginFrameSource testing --------------------------------------------
798 class MockExternalBeginFrameSourceClient 766 class MockExternalBeginFrameSourceClient
(...skipping 15 matching lines...) Expand all
814 obs_.reset(new MockBeginFrameObserver); 782 obs_.reset(new MockBeginFrameObserver);
815 } 783 }
816 784
817 void TearDown() override { 785 void TearDown() override {
818 client_.reset(); 786 client_.reset();
819 obs_.reset(); 787 obs_.reset();
820 } 788 }
821 }; 789 };
822 790
823 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWithoutObservers) { 791 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWithoutObservers) {
824 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, 0, false))) 792 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false)))
825 .Times(1); 793 .Times(1);
826 source_->OnBeginFrame(CreateBeginFrameArgsForTesting( 794 source_->OnBeginFrame(CreateBeginFrameArgsForTesting(
827 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000))); 795 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)));
828 } 796 }
829 797
830 TEST_F(ExternalBeginFrameSourceTest, 798 TEST_F(ExternalBeginFrameSourceTest,
831 CallsOnDidFinishFrameWhenObserverFinishes) { 799 CallsOnDidFinishFrameWhenObserverFinishes) {
832 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 800 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
833 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 801 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
834 source_->AddObserver(obs_.get()); 802 source_->AddObserver(obs_.get());
835 803
836 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 804 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
837 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); 805 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
838 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); 806 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
839 source_->OnBeginFrame(args); 807 source_->OnBeginFrame(args);
840 808
841 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, 0, true))) 809 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, true)))
842 .Times(1); 810 .Times(1);
843 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 2, 0, true)); 811 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 2, true));
844 812
845 args = CreateBeginFrameArgsForTesting( 813 args = CreateBeginFrameArgsForTesting(
846 BEGINFRAME_FROM_HERE, 0, 3, base::TimeTicks::FromInternalValue(20000)); 814 BEGINFRAME_FROM_HERE, 0, 3, base::TimeTicks::FromInternalValue(20000));
847 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); 815 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
848 source_->OnBeginFrame(args); 816 source_->OnBeginFrame(args);
849 817
850 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 3, 2, 0, false))) 818 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 3, 2, false)))
851 .Times(1); 819 .Times(1);
852 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 3, 2, 0, false)); 820 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 3, 2, false));
853 } 821 }
854 822
855 TEST_F(ExternalBeginFrameSourceTest, 823 TEST_F(ExternalBeginFrameSourceTest,
856 CallsOnDidFinishFrameWhenObserverDropsBeginFrame) { 824 CallsOnDidFinishFrameWhenObserverDropsBeginFrame) {
857 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 825 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
858 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 826 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
859 source_->AddObserver(obs_.get()); 827 source_->AddObserver(obs_.get());
860 828
861 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 829 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
862 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); 830 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
863 EXPECT_BEGIN_FRAME_ARGS_DROP(*obs_, args); 831 EXPECT_BEGIN_FRAME_ARGS_DROP(*obs_, args);
864 source_->OnBeginFrame(args); 832 source_->OnBeginFrame(args);
865 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, 0, false))) 833 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false)))
866 .Times(1); 834 .Times(1);
867 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 0, 0, false)); 835 source_->DidFinishFrame(obs_.get(), BeginFrameAck(0, 2, 0, false));
868 } 836 }
869 837
870 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWhenObserverRemoved) { 838 TEST_F(ExternalBeginFrameSourceTest, CallsOnDidFinishFrameWhenObserverRemoved) {
871 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 839 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
872 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 840 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
873 source_->AddObserver(obs_.get()); 841 source_->AddObserver(obs_.get());
874 842
875 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 843 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
876 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); 844 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
877 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); 845 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
878 source_->OnBeginFrame(args); 846 source_->OnBeginFrame(args);
879 847
880 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, 0, false))) 848 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 2, false)))
881 .Times(1); 849 .Times(1);
882 EXPECT_CALL((*client_), OnNeedsBeginFrames(false)).Times(1); 850 EXPECT_CALL((*client_), OnNeedsBeginFrames(false)).Times(1);
883 source_->RemoveObserver(obs_.get()); 851 source_->RemoveObserver(obs_.get());
884 } 852 }
885 853
886 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash. 854 // https://crbug.com/690127: Duplicate BeginFrame caused DCHECK crash.
887 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) { 855 TEST_F(ExternalBeginFrameSourceTest, OnBeginFrameChecksBeginFrameContinuity) {
888 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 856 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
889 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 857 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
890 source_->AddObserver(obs_.get()); 858 source_->AddObserver(obs_.get());
891 859
892 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 860 BeginFrameArgs args = CreateBeginFrameArgsForTesting(
893 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000)); 861 BEGINFRAME_FROM_HERE, 0, 2, base::TimeTicks::FromInternalValue(10000));
894 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args); 862 EXPECT_BEGIN_FRAME_ARGS_USED(*obs_, args);
895 source_->OnBeginFrame(args); 863 source_->OnBeginFrame(args);
896 864
897 // Providing same args again to OnBeginFrame() should not notify observer. 865 // Providing same args again to OnBeginFrame() should not notify observer.
898 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, 0, false))) 866 EXPECT_CALL((*client_), OnDidFinishFrame(BeginFrameAck(0, 2, 0, false)))
899 .Times(1); 867 .Times(1);
900 source_->OnBeginFrame(args); 868 source_->OnBeginFrame(args);
901 869
902 // Providing same args through a different ExternalBeginFrameSource also does 870 // Providing same args through a different ExternalBeginFrameSource also does
903 // not notify observer. 871 // not notify observer.
904 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 872 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
905 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); 873 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1);
906 ExternalBeginFrameSource source2(client_.get()); 874 ExternalBeginFrameSource source2(client_.get());
907 source2.AddObserver(obs_.get()); 875 source2.AddObserver(obs_.get());
908 source2.OnBeginFrame(args); 876 source2.OnBeginFrame(args);
909 } 877 }
910 878
911 } // namespace 879 } // namespace
912 } // namespace cc 880 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/scheduler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698