OLD | NEW |
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" |
11 #include "cc/test/begin_frame_args_test.h" | 11 #include "cc/test/begin_frame_args_test.h" |
12 #include "cc/test/begin_frame_source_test.h" | 12 #include "cc/test/begin_frame_source_test.h" |
13 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 using testing::StrictMock; | 17 using testing::StrictMock; |
18 | 18 |
19 namespace cc { | 19 namespace cc { |
20 namespace { | 20 namespace { |
21 | 21 |
| 22 // BeginFrameSource testing ---------------------------------------------------- |
| 23 TEST(BeginFrameSourceTest, SourceIdsAreUnique) { |
| 24 StubBeginFrameSource source1; |
| 25 StubBeginFrameSource source2; |
| 26 StubBeginFrameSource source3; |
| 27 EXPECT_NE(source1.source_id(), source2.source_id()); |
| 28 EXPECT_NE(source1.source_id(), source3.source_id()); |
| 29 EXPECT_NE(source2.source_id(), source3.source_id()); |
| 30 } |
| 31 |
| 32 // BackToBackBeginFrameSource testing ------------------------------------------ |
22 class BackToBackBeginFrameSourceTest : public ::testing::Test { | 33 class BackToBackBeginFrameSourceTest : public ::testing::Test { |
23 protected: | 34 protected: |
24 static const int64_t kDeadline; | 35 static const int64_t kDeadline; |
25 static const int64_t kInterval; | 36 static const int64_t kInterval; |
26 | 37 |
27 void SetUp() override { | 38 void SetUp() override { |
28 now_src_.reset(new base::SimpleTestTickClock()); | 39 now_src_.reset(new base::SimpleTestTickClock()); |
29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 40 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
30 task_runner_ = | 41 task_runner_ = |
31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 42 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
(...skipping 16 matching lines...) Expand all Loading... |
48 const int64_t BackToBackBeginFrameSourceTest::kDeadline = | 59 const int64_t BackToBackBeginFrameSourceTest::kDeadline = |
49 BeginFrameArgs::DefaultInterval().ToInternalValue(); | 60 BeginFrameArgs::DefaultInterval().ToInternalValue(); |
50 | 61 |
51 const int64_t BackToBackBeginFrameSourceTest::kInterval = | 62 const int64_t BackToBackBeginFrameSourceTest::kInterval = |
52 BeginFrameArgs::DefaultInterval().ToInternalValue(); | 63 BeginFrameArgs::DefaultInterval().ToInternalValue(); |
53 | 64 |
54 TEST_F(BackToBackBeginFrameSourceTest, AddObserverSendsBeginFrame) { | 65 TEST_F(BackToBackBeginFrameSourceTest, AddObserverSendsBeginFrame) { |
55 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 66 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
56 source_->AddObserver(obs_.get()); | 67 source_->AddObserver(obs_.get()); |
57 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 68 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
58 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 69 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 70 1000 + kDeadline, kInterval); |
59 task_runner_->RunPendingTasks(); | 71 task_runner_->RunPendingTasks(); |
60 | 72 |
61 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 73 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, |
| 74 1100 + kDeadline, kInterval); |
62 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 75 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
63 source_->DidFinishFrame(obs_.get(), 0); | 76 source_->DidFinishFrame(obs_.get(), 0); |
64 task_runner_->RunPendingTasks(); | 77 task_runner_->RunPendingTasks(); |
65 } | 78 } |
66 | 79 |
67 TEST_F(BackToBackBeginFrameSourceTest, | 80 TEST_F(BackToBackBeginFrameSourceTest, |
68 DidFinishFrameThenRemoveObserverProducesNoFrame) { | 81 RemoveObserverThenDidFinishFrameProducesNoFrame) { |
69 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 82 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
70 source_->AddObserver(obs_.get()); | 83 source_->AddObserver(obs_.get()); |
71 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 84 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 85 1000 + kDeadline, kInterval); |
72 task_runner_->RunPendingTasks(); | 86 task_runner_->RunPendingTasks(); |
73 | 87 |
74 source_->RemoveObserver(obs_.get()); | 88 source_->RemoveObserver(obs_.get()); |
75 source_->DidFinishFrame(obs_.get(), 0); | 89 source_->DidFinishFrame(obs_.get(), 0); |
76 | 90 |
77 // Verify no BeginFrame is sent to |obs_|. There is a pending task in the | 91 // Verify no BeginFrame is sent to |obs_|. There is a pending task in the |
78 // task_runner_ as a BeginFrame was posted, but it gets aborted since |obs_| | 92 // task_runner_ as a BeginFrame was posted, but it gets aborted since |obs_| |
79 // is removed. | 93 // is removed. |
80 task_runner_->RunPendingTasks(); | 94 task_runner_->RunPendingTasks(); |
81 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 95 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
82 } | 96 } |
83 | 97 |
84 TEST_F(BackToBackBeginFrameSourceTest, | 98 TEST_F(BackToBackBeginFrameSourceTest, |
85 RemoveObserverThenDidFinishFrameProducesNoFrame) { | 99 DidFinishFrameThenRemoveObserverProducesNoFrame) { |
86 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 100 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
87 source_->AddObserver(obs_.get()); | 101 source_->AddObserver(obs_.get()); |
88 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 102 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 103 1000 + kDeadline, kInterval); |
89 task_runner_->RunPendingTasks(); | 104 task_runner_->RunPendingTasks(); |
90 | 105 |
91 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 106 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
92 source_->DidFinishFrame(obs_.get(), 0); | 107 source_->DidFinishFrame(obs_.get(), 0); |
93 source_->RemoveObserver(obs_.get()); | 108 source_->RemoveObserver(obs_.get()); |
94 | 109 |
95 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 110 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
96 task_runner_->RunPendingTasks(); | 111 task_runner_->RunPendingTasks(); |
97 } | 112 } |
98 | 113 |
99 TEST_F(BackToBackBeginFrameSourceTest, | 114 TEST_F(BackToBackBeginFrameSourceTest, |
100 TogglingObserverThenDidFinishFrameProducesCorrectFrame) { | 115 TogglingObserverThenDidFinishFrameProducesCorrectFrame) { |
101 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 116 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
102 source_->AddObserver(obs_.get()); | 117 source_->AddObserver(obs_.get()); |
103 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 118 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 119 1000 + kDeadline, kInterval); |
104 task_runner_->RunPendingTasks(); | 120 task_runner_->RunPendingTasks(); |
105 | 121 |
106 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 122 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
107 source_->RemoveObserver(obs_.get()); | 123 source_->RemoveObserver(obs_.get()); |
108 | 124 |
109 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 125 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
110 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 126 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
111 source_->AddObserver(obs_.get()); | 127 source_->AddObserver(obs_.get()); |
112 | 128 |
113 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 129 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
114 source_->DidFinishFrame(obs_.get(), 0); | 130 source_->DidFinishFrame(obs_.get(), 0); |
115 | 131 |
116 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
117 // The begin frame is posted at the time when the observer was added, | 133 // The begin frame is posted at the time when the observer was added, |
118 // so it ignores changes to "now" afterward. | 134 // so it ignores changes to "now" afterward. |
119 EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval); | 135 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1110, |
| 136 1110 + kDeadline, kInterval); |
120 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 137 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
121 task_runner_->RunPendingTasks(); | 138 task_runner_->RunPendingTasks(); |
122 } | 139 } |
123 | 140 |
124 TEST_F(BackToBackBeginFrameSourceTest, | 141 TEST_F(BackToBackBeginFrameSourceTest, |
125 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { | 142 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { |
126 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 143 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
127 source_->AddObserver(obs_.get()); | 144 source_->AddObserver(obs_.get()); |
128 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 145 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 146 1000 + kDeadline, kInterval); |
129 task_runner_->RunPendingTasks(); | 147 task_runner_->RunPendingTasks(); |
130 | 148 |
131 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 149 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
132 source_->DidFinishFrame(obs_.get(), 0); | 150 source_->DidFinishFrame(obs_.get(), 0); |
133 | 151 |
134 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 152 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
135 source_->RemoveObserver(obs_.get()); | 153 source_->RemoveObserver(obs_.get()); |
136 | 154 |
137 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 155 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
138 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 156 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
139 source_->AddObserver(obs_.get()); | 157 source_->AddObserver(obs_.get()); |
140 | 158 |
141 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 159 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
142 // Ticks at the time at which the observer was added, ignoring the | 160 // Ticks at the time at which the observer was added, ignoring the |
143 // last change to "now". | 161 // last change to "now". |
144 EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval); | 162 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1120, |
| 163 1120 + kDeadline, kInterval); |
145 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 164 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
146 task_runner_->RunPendingTasks(); | 165 task_runner_->RunPendingTasks(); |
147 } | 166 } |
148 | 167 |
149 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { | 168 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { |
150 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 169 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
151 source_->AddObserver(obs_.get()); | 170 source_->AddObserver(obs_.get()); |
152 source_->RemoveObserver(obs_.get()); | 171 source_->RemoveObserver(obs_.get()); |
153 source_->DidFinishFrame(obs_.get(), 0); | 172 source_->DidFinishFrame(obs_.get(), 0); |
154 EXPECT_FALSE(task_runner_->RunPendingTasks()); | 173 EXPECT_FALSE(task_runner_->RunPendingTasks()); |
155 } | 174 } |
156 | 175 |
157 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { | 176 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { |
158 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 177 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
159 source_->AddObserver(obs_.get()); | 178 source_->AddObserver(obs_.get()); |
160 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 179 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 180 1000 + kDeadline, kInterval); |
161 // Runs the pending begin frame. | 181 // Runs the pending begin frame. |
162 task_runner_->RunPendingTasks(); | 182 task_runner_->RunPendingTasks(); |
163 // While running the begin frame, the next frame was cancelled, this | 183 // While running the begin frame, the next frame was cancelled, this |
164 // runs the next frame, sees it was cancelled, and goes to sleep. | 184 // runs the next frame, sees it was cancelled, and goes to sleep. |
165 task_runner_->RunPendingTasks(); | 185 task_runner_->RunPendingTasks(); |
166 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 186 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
167 | 187 |
168 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 188 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
169 | 189 |
170 source_->DidFinishFrame(obs_.get(), 3); | 190 source_->DidFinishFrame(obs_.get(), 3); |
171 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 191 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
172 source_->DidFinishFrame(obs_.get(), 2); | 192 source_->DidFinishFrame(obs_.get(), 2); |
173 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 193 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
174 source_->DidFinishFrame(obs_.get(), 1); | 194 source_->DidFinishFrame(obs_.get(), 1); |
175 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 195 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
176 | 196 |
177 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 197 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, |
| 198 1100 + kDeadline, kInterval); |
178 source_->DidFinishFrame(obs_.get(), 0); | 199 source_->DidFinishFrame(obs_.get(), 0); |
179 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime()); | 200 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime()); |
180 task_runner_->RunPendingTasks(); | 201 task_runner_->RunPendingTasks(); |
181 } | 202 } |
182 | 203 |
183 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) { | 204 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) { |
184 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 205 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
185 source_->AddObserver(obs_.get()); | 206 source_->AddObserver(obs_.get()); |
186 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 207 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 208 1000 + kDeadline, kInterval); |
187 task_runner_->RunPendingTasks(); | 209 task_runner_->RunPendingTasks(); |
188 | 210 |
189 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 211 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
190 source_->DidFinishFrame(obs_.get(), 0); | 212 source_->DidFinishFrame(obs_.get(), 0); |
191 source_->DidFinishFrame(obs_.get(), 0); | 213 source_->DidFinishFrame(obs_.get(), 0); |
192 source_->DidFinishFrame(obs_.get(), 0); | 214 source_->DidFinishFrame(obs_.get(), 0); |
193 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 215 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, |
| 216 1100 + kDeadline, kInterval); |
194 task_runner_->RunPendingTasks(); | 217 task_runner_->RunPendingTasks(); |
195 | 218 |
196 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 219 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
197 source_->DidFinishFrame(obs_.get(), 0); | 220 source_->DidFinishFrame(obs_.get(), 0); |
198 source_->DidFinishFrame(obs_.get(), 0); | 221 source_->DidFinishFrame(obs_.get(), 0); |
199 source_->DidFinishFrame(obs_.get(), 0); | 222 source_->DidFinishFrame(obs_.get(), 0); |
200 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); | 223 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 1200, |
| 224 1200 + kDeadline, kInterval); |
201 task_runner_->RunPendingTasks(); | 225 task_runner_->RunPendingTasks(); |
202 } | 226 } |
203 | 227 |
204 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { | 228 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { |
205 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 229 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
206 source_->AddObserver(obs_.get()); | 230 source_->AddObserver(obs_.get()); |
207 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 231 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, |
| 232 1000 + kDeadline, kInterval); |
208 task_runner_->RunPendingTasks(); | 233 task_runner_->RunPendingTasks(); |
209 | 234 |
210 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 235 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
211 source_->DidFinishFrame(obs_.get(), 0); | 236 source_->DidFinishFrame(obs_.get(), 0); |
212 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); | 237 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); |
213 // Ticks at the time the last frame finished, so ignores the last change to | 238 // Ticks at the time the last frame finished, so ignores the last change to |
214 // "now". | 239 // "now". |
215 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 240 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, |
| 241 1100 + kDeadline, kInterval); |
216 | 242 |
217 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 243 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
218 task_runner_->RunPendingTasks(); | 244 task_runner_->RunPendingTasks(); |
219 } | 245 } |
220 | 246 |
221 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { | 247 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { |
222 StrictMock<MockBeginFrameObserver> obs1, obs2; | 248 StrictMock<MockBeginFrameObserver> obs1, obs2; |
223 | 249 |
224 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 250 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
225 source_->AddObserver(&obs1); | 251 source_->AddObserver(&obs1); |
226 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 252 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
227 source_->AddObserver(&obs2); | 253 source_->AddObserver(&obs2); |
228 | 254 |
229 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 255 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
230 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); | 256 kInterval); |
| 257 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, |
| 258 kInterval); |
231 task_runner_->RunPendingTasks(); | 259 task_runner_->RunPendingTasks(); |
232 | 260 |
233 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 261 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
234 source_->DidFinishFrame(&obs1, 0); | 262 source_->DidFinishFrame(&obs1, 0); |
235 source_->DidFinishFrame(&obs2, 0); | 263 source_->DidFinishFrame(&obs2, 0); |
236 EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); | 264 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, |
237 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 265 kInterval); |
| 266 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, |
| 267 kInterval); |
238 task_runner_->RunPendingTasks(); | 268 task_runner_->RunPendingTasks(); |
239 | 269 |
240 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 270 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
241 source_->DidFinishFrame(&obs1, 0); | 271 source_->DidFinishFrame(&obs1, 0); |
242 source_->DidFinishFrame(&obs2, 0); | 272 source_->DidFinishFrame(&obs2, 0); |
243 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 273 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
244 source_->RemoveObserver(&obs1); | 274 source_->RemoveObserver(&obs1); |
245 source_->RemoveObserver(&obs2); | 275 source_->RemoveObserver(&obs2); |
246 task_runner_->RunPendingTasks(); | 276 task_runner_->RunPendingTasks(); |
247 } | 277 } |
248 | 278 |
249 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { | 279 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { |
250 StrictMock<MockBeginFrameObserver> obs1, obs2; | 280 StrictMock<MockBeginFrameObserver> obs1, obs2; |
251 | 281 |
252 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 282 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
253 source_->AddObserver(&obs1); | 283 source_->AddObserver(&obs1); |
254 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 284 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
| 285 kInterval); |
255 task_runner_->RunPendingTasks(); | 286 task_runner_->RunPendingTasks(); |
256 | 287 |
257 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 288 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
258 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 289 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
259 source_->AddObserver(&obs2); | 290 source_->AddObserver(&obs2); |
260 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 291 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, |
| 292 kInterval); |
261 task_runner_->RunPendingTasks(); | 293 task_runner_->RunPendingTasks(); |
262 | 294 |
263 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 295 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
264 source_->DidFinishFrame(&obs1, 0); | 296 source_->DidFinishFrame(&obs1, 0); |
265 EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval); | 297 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 1200, 1200 + kDeadline, |
| 298 kInterval); |
266 task_runner_->RunPendingTasks(); | 299 task_runner_->RunPendingTasks(); |
267 | 300 |
268 source_->DidFinishFrame(&obs1, 0); | 301 source_->DidFinishFrame(&obs1, 0); |
269 source_->RemoveObserver(&obs1); | 302 source_->RemoveObserver(&obs1); |
270 // Removing all finished observers should disable the time source. | 303 // Removing all finished observers should disable the time source. |
271 EXPECT_FALSE(delay_based_time_source_->Active()); | 304 EXPECT_FALSE(delay_based_time_source_->Active()); |
272 // Finishing the frame for |obs1| posts a begin frame task, which will be | 305 // Finishing the frame for |obs1| posts a begin frame task, which will be |
273 // aborted since |obs1| is removed. Clear that from the task runner. | 306 // aborted since |obs1| is removed. Clear that from the task runner. |
274 task_runner_->RunPendingTasks(); | 307 task_runner_->RunPendingTasks(); |
275 | 308 |
276 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 309 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
277 source_->DidFinishFrame(&obs2, 0); | 310 source_->DidFinishFrame(&obs2, 0); |
278 EXPECT_BEGIN_FRAME_USED(obs2, 1300, 1300 + kDeadline, kInterval); | 311 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline, |
| 312 kInterval); |
279 task_runner_->RunPendingTasks(); | 313 task_runner_->RunPendingTasks(); |
280 | 314 |
281 source_->DidFinishFrame(&obs2, 0); | 315 source_->DidFinishFrame(&obs2, 0); |
282 source_->RemoveObserver(&obs2); | 316 source_->RemoveObserver(&obs2); |
283 } | 317 } |
284 | 318 |
285 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { | 319 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { |
286 StrictMock<MockBeginFrameObserver> obs1, obs2; | 320 StrictMock<MockBeginFrameObserver> obs1, obs2; |
287 | 321 |
288 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 322 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
289 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 323 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
290 source_->AddObserver(&obs1); | 324 source_->AddObserver(&obs1); |
291 source_->AddObserver(&obs2); | 325 source_->AddObserver(&obs2); |
292 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 326 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
293 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); | 327 kInterval); |
| 328 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, |
| 329 kInterval); |
294 task_runner_->RunPendingTasks(); | 330 task_runner_->RunPendingTasks(); |
295 | 331 |
296 // |obs1| finishes first. | 332 // |obs1| finishes first. |
297 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 333 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
298 source_->DidFinishFrame(&obs1, 0); | 334 source_->DidFinishFrame(&obs1, 0); |
299 | 335 |
300 // |obs2| finishes also, before getting to the newly posted begin frame. | 336 // |obs2| finishes also, before getting to the newly posted begin frame. |
301 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 337 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
302 source_->DidFinishFrame(&obs2, 0); | 338 source_->DidFinishFrame(&obs2, 0); |
303 | 339 |
304 // Because the begin frame source already ticked when |obs1| finished, | 340 // Because the begin frame source already ticked when |obs1| finished, |
305 // we see it as the frame time for both observers. | 341 // we see it as the frame time for both observers. |
306 EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); | 342 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, |
307 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 343 kInterval); |
| 344 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, |
| 345 kInterval); |
308 task_runner_->RunPendingTasks(); | 346 task_runner_->RunPendingTasks(); |
309 | 347 |
310 source_->DidFinishFrame(&obs1, 0); | 348 source_->DidFinishFrame(&obs1, 0); |
311 source_->RemoveObserver(&obs1); | 349 source_->RemoveObserver(&obs1); |
312 source_->DidFinishFrame(&obs2, 0); | 350 source_->DidFinishFrame(&obs2, 0); |
313 source_->RemoveObserver(&obs2); | 351 source_->RemoveObserver(&obs2); |
314 } | 352 } |
315 | 353 |
316 // DelayBasedBeginFrameSource testing ------------------------------------------ | 354 // DelayBasedBeginFrameSource testing ------------------------------------------ |
317 class DelayBasedBeginFrameSourceTest : public ::testing::Test { | 355 class DelayBasedBeginFrameSourceTest : public ::testing::Test { |
(...skipping 16 matching lines...) Expand all Loading... |
334 obs_.reset(new MockBeginFrameObserver); | 372 obs_.reset(new MockBeginFrameObserver); |
335 } | 373 } |
336 | 374 |
337 void TearDown() override { obs_.reset(); } | 375 void TearDown() override { obs_.reset(); } |
338 }; | 376 }; |
339 | 377 |
340 TEST_F(DelayBasedBeginFrameSourceTest, | 378 TEST_F(DelayBasedBeginFrameSourceTest, |
341 AddObserverCallsOnBeginFrameWithMissedTick) { | 379 AddObserverCallsOnBeginFrameWithMissedTick) { |
342 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 380 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
343 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 381 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
344 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); | 382 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 10000, 20000, |
| 383 10000); |
345 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent | 384 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent |
346 // No tasks should need to be run for this to occur. | 385 // No tasks should need to be run for this to occur. |
347 } | 386 } |
348 | 387 |
349 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { | 388 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { |
350 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 389 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
351 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 390 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, |
| 391 10000); |
352 source_->AddObserver(obs_.get()); | 392 source_->AddObserver(obs_.get()); |
353 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 393 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
354 | 394 |
355 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 395 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); |
356 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 396 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
357 task_runner_->RunPendingTasks(); | 397 task_runner_->RunPendingTasks(); |
358 } | 398 } |
359 | 399 |
360 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { | 400 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { |
361 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 401 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
362 | 402 |
363 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 403 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
364 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 404 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, |
| 405 10000); |
365 source_->AddObserver(obs_.get()); | 406 source_->AddObserver(obs_.get()); |
366 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 407 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); |
367 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 408 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20000, 30000, 10000); |
368 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 409 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30000, 40000, 10000); |
369 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 410 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
370 | 411 |
371 source_->RemoveObserver(obs_.get()); | 412 source_->RemoveObserver(obs_.get()); |
372 // No new frames.... | 413 // No new frames.... |
373 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); | 414 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
374 } | 415 } |
375 | 416 |
376 TEST_F(DelayBasedBeginFrameSourceTest, VSyncChanges) { | 417 TEST_F(DelayBasedBeginFrameSourceTest, VSyncChanges) { |
377 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 418 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
378 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 419 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
379 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 420 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, |
| 421 10000); |
380 source_->AddObserver(obs_.get()); | 422 source_->AddObserver(obs_.get()); |
381 | 423 |
382 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 424 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); |
383 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 425 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20000, 30000, 10000); |
384 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 426 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30000, 40000, 10000); |
385 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 427 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
386 | 428 |
387 // Update the vsync information | 429 // Update the vsync information |
388 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), | 430 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), |
389 base::TimeDelta::FromMicroseconds(10001)); | 431 base::TimeDelta::FromMicroseconds(10001)); |
390 | 432 |
391 EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001); | 433 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 5, 40000, 47502, 10001); |
392 EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001); | 434 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 47502, 57503, 10001); |
393 EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001); | 435 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 57503, 67504, 10001); |
394 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); | 436 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
395 } | 437 } |
396 | 438 |
397 TEST_F(DelayBasedBeginFrameSourceTest, AuthoritativeVSyncChanges) { | 439 TEST_F(DelayBasedBeginFrameSourceTest, AuthoritativeVSyncChanges) { |
398 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 440 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
399 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500), | 441 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500), |
400 base::TimeDelta::FromMicroseconds(10000)); | 442 base::TimeDelta::FromMicroseconds(10000)); |
401 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 443 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
402 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 500, 10500, 10000); | 444 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 500, 10500, |
| 445 10000); |
403 source_->AddObserver(obs_.get()); | 446 source_->AddObserver(obs_.get()); |
404 | 447 |
405 EXPECT_BEGIN_FRAME_USED(*obs_, 10500, 20500, 10000); | 448 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10500, 20500, 10000); |
406 EXPECT_BEGIN_FRAME_USED(*obs_, 20500, 30500, 10000); | 449 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20500, 30500, 10000); |
407 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(20501)); | 450 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(20501)); |
408 | 451 |
409 // This will keep the same timebase, so 500, 9999 | 452 // This will keep the same timebase, so 500, 9999 |
410 source_->SetAuthoritativeVSyncInterval( | 453 source_->SetAuthoritativeVSyncInterval( |
411 base::TimeDelta::FromMicroseconds(9999)); | 454 base::TimeDelta::FromMicroseconds(9999)); |
412 EXPECT_BEGIN_FRAME_USED(*obs_, 30500, 40496, 9999); | 455 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30500, 40496, 9999); |
413 EXPECT_BEGIN_FRAME_USED(*obs_, 40496, 50495, 9999); | 456 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 5, 40496, 50495, 9999); |
414 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(40497)); | 457 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(40497)); |
415 | 458 |
416 // Change the vsync params, but the new interval will be ignored. | 459 // Change the vsync params, but the new interval will be ignored. |
417 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), | 460 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), |
418 base::TimeDelta::FromMicroseconds(1)); | 461 base::TimeDelta::FromMicroseconds(1)); |
419 EXPECT_BEGIN_FRAME_USED(*obs_, 50495, 60394, 9999); | 462 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 50495, 60394, 9999); |
420 EXPECT_BEGIN_FRAME_USED(*obs_, 60394, 70393, 9999); | 463 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 60394, 70393, 9999); |
421 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); | 464 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); |
422 } | 465 } |
423 | 466 |
424 TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { | 467 TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { |
425 StrictMock<MockBeginFrameObserver> obs1, obs2; | 468 StrictMock<MockBeginFrameObserver> obs1, obs2; |
426 | 469 |
427 // now_src_ starts off at 1000. | 470 // now_src_ starts off at 1000. |
428 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); | 471 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); |
429 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 472 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
430 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, 10000, 20000, 10000); | 473 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, source_->source_id(), 1, 10000, 20000, |
| 474 10000); |
431 source_->AddObserver(&obs1); // Should cause the last tick to be sent | 475 source_->AddObserver(&obs1); // Should cause the last tick to be sent |
432 // No tasks should need to be run for this to occur. | 476 // No tasks should need to be run for this to occur. |
433 | 477 |
434 EXPECT_BEGIN_FRAME_USED(obs1, 20000, 30000, 10000); | 478 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 20000, 30000, 10000); |
435 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 479 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); |
436 | 480 |
437 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 481 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
438 EXPECT_BEGIN_FRAME_USED_MISSED(obs2, 20000, 30000, 10000); | 482 // Sequence number unchanged for missed frame with time of last normal frame. |
| 483 EXPECT_BEGIN_FRAME_USED_MISSED(obs2, source_->source_id(), 2, 20000, 30000, |
| 484 10000); |
439 source_->AddObserver(&obs2); // Should cause the last tick to be sent | 485 source_->AddObserver(&obs2); // Should cause the last tick to be sent |
440 // No tasks should need to be run for this to occur. | 486 // No tasks should need to be run for this to occur. |
441 | 487 |
442 EXPECT_BEGIN_FRAME_USED(obs1, 30000, 40000, 10000); | 488 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 30000, 40000, 10000); |
443 EXPECT_BEGIN_FRAME_USED(obs2, 30000, 40000, 10000); | 489 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 3, 30000, 40000, 10000); |
444 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 490 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); |
445 | 491 |
446 source_->RemoveObserver(&obs1); | 492 source_->RemoveObserver(&obs1); |
447 | 493 |
448 EXPECT_BEGIN_FRAME_USED(obs2, 40000, 50000, 10000); | 494 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 40000, 50000, 10000); |
449 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 495 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); |
450 | 496 |
451 source_->RemoveObserver(&obs2); | 497 source_->RemoveObserver(&obs2); |
452 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); | 498 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); |
453 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 499 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
454 } | 500 } |
455 | 501 |
456 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { | 502 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { |
457 StrictMock<MockBeginFrameObserver> obs; | 503 StrictMock<MockBeginFrameObserver> obs; |
458 | 504 |
459 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 505 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
460 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 506 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); |
461 source_->AddObserver(&obs); | 507 source_->AddObserver(&obs); |
462 | 508 |
463 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 509 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
464 base::TimeDelta::FromInternalValue(10000)); | 510 base::TimeDelta::FromInternalValue(10000)); |
465 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 511 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
466 | 512 |
467 // No begin frame received. | 513 // No begin frame received. |
468 task_runner_->RunPendingTasks(); | 514 task_runner_->RunPendingTasks(); |
469 | 515 |
470 // Begin frame received. | 516 // Begin frame received. |
471 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 517 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
472 base::TimeDelta::FromInternalValue(10000)); | 518 base::TimeDelta::FromInternalValue(10000)); |
473 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 519 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
474 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); | 520 EXPECT_BEGIN_FRAME_USED(obs, source_->source_id(), 2, 10000, 20000, 10000); |
475 task_runner_->RunPendingTasks(); | 521 task_runner_->RunPendingTasks(); |
476 } | 522 } |
477 | 523 |
478 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 524 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { |
479 StrictMock<MockBeginFrameObserver> obs; | 525 StrictMock<MockBeginFrameObserver> obs; |
480 | 526 |
481 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 527 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
482 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 528 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); |
483 source_->AddObserver(&obs); | 529 source_->AddObserver(&obs); |
484 source_->RemoveObserver(&obs); | 530 source_->RemoveObserver(&obs); |
485 | 531 |
486 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 532 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
487 base::TimeDelta::FromInternalValue(10000)); | 533 base::TimeDelta::FromInternalValue(10000)); |
488 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 534 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
489 | 535 |
490 // No missed frame received. | 536 // No missed frame received. |
491 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 537 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 538 // This does not cause a missed BeginFrame, but the sequence number is |
| 539 // incremented, because the possible missed frame has different time/interval. |
492 source_->AddObserver(&obs); | 540 source_->AddObserver(&obs); |
493 source_->RemoveObserver(&obs); | 541 source_->RemoveObserver(&obs); |
494 | 542 |
495 // Missed frame received. | 543 // Missed frame received. |
496 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 544 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
497 base::TimeDelta::FromInternalValue(10000)); | 545 base::TimeDelta::FromInternalValue(10000)); |
498 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 546 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
499 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 547 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
500 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); | 548 // Sequence number is incremented again, because the missed frame has |
| 549 // different time/interval. |
| 550 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000, |
| 551 10000); |
501 source_->AddObserver(&obs); | 552 source_->AddObserver(&obs); |
502 source_->RemoveObserver(&obs); | 553 source_->RemoveObserver(&obs); |
503 } | 554 } |
504 | 555 |
505 } // namespace | 556 } // namespace |
506 } // namespace cc | 557 } // namespace cc |
OLD | NEW |