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