| 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::Mock; | |
| 18 using testing::StrictMock; | 17 using testing::StrictMock; |
| 19 | 18 |
| 20 namespace cc { | 19 namespace cc { |
| 21 namespace { | 20 namespace { |
| 22 | 21 |
| 23 // BeginFrameObserverBase testing --------------------------------------- | 22 class BackToBackBeginFrameSourceTest : public ::testing::Test { |
| 24 class MockMinimalBeginFrameObserverBase : public BeginFrameObserverBase { | |
| 25 public: | |
| 26 MOCK_METHOD1(OnBeginFrameDerivedImpl, bool(const BeginFrameArgs&)); | |
| 27 MOCK_METHOD1(OnBeginFrameSourcePausedChanged, void(bool)); | |
| 28 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } | |
| 29 }; | |
| 30 | |
| 31 TEST(BeginFrameObserverBaseTest, OnBeginFrameImplementation) { | |
| 32 using ::testing::Return; | |
| 33 MockMinimalBeginFrameObserverBase obs; | |
| 34 ::testing::InSequence ordered; // These calls should be ordered | |
| 35 | |
| 36 // Initial conditions | |
| 37 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); | |
| 38 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | |
| 39 | |
| 40 #ifndef NDEBUG | |
| 41 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); | |
| 42 #endif | |
| 43 | |
| 44 BeginFrameArgs args1 = | |
| 45 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300); | |
| 46 EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args1)).WillOnce(Return(true)); | |
| 47 obs.OnBeginFrame(args1); | |
| 48 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | |
| 49 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | |
| 50 | |
| 51 #ifndef NDEBUG | |
| 52 EXPECT_DEATH({ | |
| 53 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | |
| 54 BEGINFRAME_FROM_HERE, 50, 200, 300)); | |
| 55 }, | |
| 56 ""); | |
| 57 #endif | |
| 58 | |
| 59 // Returning false shouldn't update the LastUsedBeginFrameArgs value. | |
| 60 BeginFrameArgs args2 = | |
| 61 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400); | |
| 62 EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args2)).WillOnce(Return(false)); | |
| 63 obs.OnBeginFrame(args2); | |
| 64 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | |
| 65 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | |
| 66 | |
| 67 BeginFrameArgs args3 = | |
| 68 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400); | |
| 69 EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args3)).WillOnce(Return(true)); | |
| 70 obs.OnBeginFrame(args3); | |
| 71 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); | |
| 72 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | |
| 73 } | |
| 74 | |
| 75 // BeginFrameSource testing ---------------------------------------------- | |
| 76 TEST(BeginFrameSourceBaseTest, ObserverManipulation) { | |
| 77 MockBeginFrameObserver obs; | |
| 78 MockBeginFrameObserver otherObs; | |
| 79 FakeBeginFrameSource source; | |
| 80 | |
| 81 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 82 source.AddObserver(&obs); | |
| 83 EXPECT_TRUE(source.has_observers()); | |
| 84 | |
| 85 #ifndef NDEBUG | |
| 86 // Adding an observer when it already exists should DCHECK fail. | |
| 87 EXPECT_DEATH({ source.AddObserver(&obs); }, ""); | |
| 88 | |
| 89 // Removing wrong observer should DCHECK fail. | |
| 90 EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, ""); | |
| 91 | |
| 92 // Removing an observer when there is no observer should DCHECK fail. | |
| 93 EXPECT_DEATH( | |
| 94 { | |
| 95 source.RemoveObserver(&obs); | |
| 96 source.RemoveObserver(&obs); | |
| 97 }, | |
| 98 ""); | |
| 99 #endif | |
| 100 | |
| 101 source.RemoveObserver(&obs); | |
| 102 EXPECT_FALSE(source.has_observers()); | |
| 103 | |
| 104 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(otherObs, false); | |
| 105 source.AddObserver(&otherObs); | |
| 106 EXPECT_TRUE(source.has_observers()); | |
| 107 source.RemoveObserver(&otherObs); | |
| 108 EXPECT_FALSE(source.has_observers()); | |
| 109 } | |
| 110 | |
| 111 TEST(BeginFrameSourceBaseTest, Observer) { | |
| 112 FakeBeginFrameSource source; | |
| 113 MockBeginFrameObserver obs; | |
| 114 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 115 source.AddObserver(&obs); | |
| 116 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | |
| 117 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); | |
| 118 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); | |
| 119 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | |
| 120 | |
| 121 SEND_BEGIN_FRAME_USED(source, 100, 200, 300); | |
| 122 SEND_BEGIN_FRAME_DROP(source, 400, 600, 300); | |
| 123 SEND_BEGIN_FRAME_DROP(source, 450, 650, 300); | |
| 124 SEND_BEGIN_FRAME_USED(source, 700, 900, 300); | |
| 125 } | |
| 126 | |
| 127 TEST(BeginFrameSourceBaseTest, NoObserver) { | |
| 128 FakeBeginFrameSource source; | |
| 129 SEND_BEGIN_FRAME_DROP(source, 100, 200, 300); | |
| 130 } | |
| 131 | |
| 132 TEST(BeginFrameSourceBaseTest, SetBeginFrameSourcePaused) { | |
| 133 FakeBeginFrameSource source; | |
| 134 MockBeginFrameObserver obs; | |
| 135 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 136 source.AddObserver(&obs); | |
| 137 | |
| 138 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true); | |
| 139 source.SetBeginFrameSourcePaused(true); | |
| 140 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | |
| 141 source.SetBeginFrameSourcePaused(false); | |
| 142 } | |
| 143 | |
| 144 TEST(BeginFrameSourceBaseTest, MultipleObservers) { | |
| 145 FakeBeginFrameSource source; | |
| 146 StrictMock<MockBeginFrameObserver> obs1, obs2; | |
| 147 | |
| 148 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | |
| 149 source.AddObserver(&obs1); | |
| 150 | |
| 151 EXPECT_BEGIN_FRAME_USED(obs1, 100, 200, 100); | |
| 152 SEND_BEGIN_FRAME_USED(source, 100, 200, 100); | |
| 153 | |
| 154 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | |
| 155 source.AddObserver(&obs2); | |
| 156 | |
| 157 EXPECT_BEGIN_FRAME_USED(obs1, 200, 300, 100); | |
| 158 EXPECT_BEGIN_FRAME_USED(obs2, 200, 300, 100); | |
| 159 SEND_BEGIN_FRAME_USED(source, 200, 300, 100); | |
| 160 | |
| 161 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, true); | |
| 162 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, true); | |
| 163 source.SetBeginFrameSourcePaused(true); | |
| 164 | |
| 165 source.RemoveObserver(&obs1); | |
| 166 | |
| 167 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | |
| 168 source.SetBeginFrameSourcePaused(false); | |
| 169 | |
| 170 EXPECT_BEGIN_FRAME_USED(obs2, 300, 400, 100); | |
| 171 SEND_BEGIN_FRAME_USED(source, 300, 400, 100); | |
| 172 | |
| 173 source.RemoveObserver(&obs2); | |
| 174 } | |
| 175 | |
| 176 // BackToBackBeginFrameSource testing ----------------------------------------- | |
| 177 class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource { | |
| 178 public: | |
| 179 TestBackToBackBeginFrameSource(base::SimpleTestTickClock* now_src, | |
| 180 base::SingleThreadTaskRunner* task_runner) | |
| 181 : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {} | |
| 182 | |
| 183 protected: | 23 protected: |
| 184 base::TimeTicks Now() override { return now_src_->NowTicks(); } | |
| 185 | |
| 186 // Not owned. | |
| 187 base::SimpleTestTickClock* now_src_; | |
| 188 }; | |
| 189 | |
| 190 class BackToBackBeginFrameSourceTest : public ::testing::Test { | |
| 191 public: | |
| 192 static const int64_t kDeadline; | 24 static const int64_t kDeadline; |
| 193 static const int64_t kInterval; | 25 static const int64_t kInterval; |
| 194 | 26 |
| 195 std::unique_ptr<base::SimpleTestTickClock> now_src_; | |
| 196 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | |
| 197 std::unique_ptr<TestBackToBackBeginFrameSource> source_; | |
| 198 std::unique_ptr<MockBeginFrameObserver> obs_; | |
| 199 | |
| 200 void SetUp() override { | 27 void SetUp() override { |
| 201 now_src_.reset(new base::SimpleTestTickClock()); | 28 now_src_.reset(new base::SimpleTestTickClock()); |
| 202 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
| 203 task_runner_ = | 30 task_runner_ = |
| 204 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
| 205 source_.reset( | 32 std::unique_ptr<TestDelayBasedTimeSource> time_source( |
| 206 new TestBackToBackBeginFrameSource(now_src_.get(), task_runner_.get())); | 33 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); |
| 207 obs_ = | 34 source_.reset(new BackToBackBeginFrameSource(std::move(time_source))); |
| 208 base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>()); | 35 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>); |
| 209 } | 36 } |
| 210 | 37 |
| 211 void TearDown() override { obs_.reset(); } | 38 void TearDown() override { obs_.reset(); } |
| 39 |
| 40 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
| 41 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 42 std::unique_ptr<BackToBackBeginFrameSource> source_; |
| 43 std::unique_ptr<MockBeginFrameObserver> obs_; |
| 212 }; | 44 }; |
| 213 | 45 |
| 214 const int64_t BackToBackBeginFrameSourceTest::kDeadline = | 46 const int64_t BackToBackBeginFrameSourceTest::kDeadline = |
| 215 BeginFrameArgs::DefaultInterval().ToInternalValue(); | 47 BeginFrameArgs::DefaultInterval().ToInternalValue(); |
| 216 | 48 |
| 217 const int64_t BackToBackBeginFrameSourceTest::kInterval = | 49 const int64_t BackToBackBeginFrameSourceTest::kInterval = |
| 218 BeginFrameArgs::DefaultInterval().ToInternalValue(); | 50 BeginFrameArgs::DefaultInterval().ToInternalValue(); |
| 219 | 51 |
| 220 TEST_F(BackToBackBeginFrameSourceTest, AddObserverSendsBeginFrame) { | 52 TEST_F(BackToBackBeginFrameSourceTest, AddObserverSendsBeginFrame) { |
| 221 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 53 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 233 TEST_F(BackToBackBeginFrameSourceTest, | 65 TEST_F(BackToBackBeginFrameSourceTest, |
| 234 DidFinishFrameThenRemoveObserverProducesNoFrame) { | 66 DidFinishFrameThenRemoveObserverProducesNoFrame) { |
| 235 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 67 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 236 source_->AddObserver(obs_.get()); | 68 source_->AddObserver(obs_.get()); |
| 237 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 69 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 238 task_runner_->RunPendingTasks(); | 70 task_runner_->RunPendingTasks(); |
| 239 | 71 |
| 240 source_->RemoveObserver(obs_.get()); | 72 source_->RemoveObserver(obs_.get()); |
| 241 source_->DidFinishFrame(obs_.get(), 0); | 73 source_->DidFinishFrame(obs_.get(), 0); |
| 242 | 74 |
| 75 // 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_| |
| 77 // is removed. |
| 78 task_runner_->RunPendingTasks(); |
| 243 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 79 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 244 } | 80 } |
| 245 | 81 |
| 246 TEST_F(BackToBackBeginFrameSourceTest, | 82 TEST_F(BackToBackBeginFrameSourceTest, |
| 247 RemoveObserverThenDidFinishFrameProducesNoFrame) { | 83 RemoveObserverThenDidFinishFrameProducesNoFrame) { |
| 248 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 84 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 249 source_->AddObserver(obs_.get()); | 85 source_->AddObserver(obs_.get()); |
| 250 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 86 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 251 task_runner_->RunPendingTasks(); | 87 task_runner_->RunPendingTasks(); |
| 252 | 88 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 269 source_->RemoveObserver(obs_.get()); | 105 source_->RemoveObserver(obs_.get()); |
| 270 | 106 |
| 271 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 107 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 272 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 108 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 273 source_->AddObserver(obs_.get()); | 109 source_->AddObserver(obs_.get()); |
| 274 | 110 |
| 275 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 111 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 276 source_->DidFinishFrame(obs_.get(), 0); | 112 source_->DidFinishFrame(obs_.get(), 0); |
| 277 | 113 |
| 278 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 114 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 279 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); | 115 // The begin frame is posted at the time when the observer was added, |
| 116 // so it ignores changes to "now" afterward. |
| 117 EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval); |
| 280 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 118 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
| 281 task_runner_->RunPendingTasks(); | 119 task_runner_->RunPendingTasks(); |
| 282 } | 120 } |
| 283 | 121 |
| 284 TEST_F(BackToBackBeginFrameSourceTest, | 122 TEST_F(BackToBackBeginFrameSourceTest, |
| 285 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { | 123 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { |
| 286 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 124 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 287 source_->AddObserver(obs_.get()); | 125 source_->AddObserver(obs_.get()); |
| 288 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 126 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 289 task_runner_->RunPendingTasks(); | 127 task_runner_->RunPendingTasks(); |
| 290 | 128 |
| 291 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 129 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 292 source_->DidFinishFrame(obs_.get(), 0); | 130 source_->DidFinishFrame(obs_.get(), 0); |
| 293 | 131 |
| 294 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 295 source_->RemoveObserver(obs_.get()); | 133 source_->RemoveObserver(obs_.get()); |
| 296 | 134 |
| 297 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 135 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 298 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 136 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 299 source_->AddObserver(obs_.get()); | 137 source_->AddObserver(obs_.get()); |
| 300 | 138 |
| 301 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 139 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 302 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); | 140 // Ticks at the time at which the observer was added, ignoring the |
| 141 // last change to "now". |
| 142 EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval); |
| 303 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 143 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
| 304 task_runner_->RunPendingTasks(); | 144 task_runner_->RunPendingTasks(); |
| 305 } | 145 } |
| 306 | 146 |
| 307 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { | 147 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { |
| 308 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 148 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 309 source_->AddObserver(obs_.get()); | 149 source_->AddObserver(obs_.get()); |
| 310 source_->RemoveObserver(obs_.get()); | 150 source_->RemoveObserver(obs_.get()); |
| 311 source_->DidFinishFrame(obs_.get(), 0); | 151 source_->DidFinishFrame(obs_.get(), 0); |
| 312 EXPECT_FALSE(task_runner_->RunPendingTasks()); | 152 EXPECT_FALSE(task_runner_->RunPendingTasks()); |
| 313 } | 153 } |
| 314 | 154 |
| 315 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { | 155 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { |
| 316 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 156 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 317 source_->AddObserver(obs_.get()); | 157 source_->AddObserver(obs_.get()); |
| 318 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 158 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 159 // Runs the pending begin frame. |
| 319 task_runner_->RunPendingTasks(); | 160 task_runner_->RunPendingTasks(); |
| 161 // While running the begin frame, the next frame was cancelled, this |
| 162 // runs the next frame, sees it was cancelled, and goes to sleep. |
| 163 task_runner_->RunPendingTasks(); |
| 164 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 320 | 165 |
| 321 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 166 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 322 | 167 |
| 323 source_->DidFinishFrame(obs_.get(), 3); | 168 source_->DidFinishFrame(obs_.get(), 3); |
| 324 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 169 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 325 source_->DidFinishFrame(obs_.get(), 2); | 170 source_->DidFinishFrame(obs_.get(), 2); |
| 326 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 171 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 327 source_->DidFinishFrame(obs_.get(), 1); | 172 source_->DidFinishFrame(obs_.get(), 1); |
| 328 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 173 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 329 | 174 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 356 | 201 |
| 357 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { | 202 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { |
| 358 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 203 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 359 source_->AddObserver(obs_.get()); | 204 source_->AddObserver(obs_.get()); |
| 360 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 205 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 361 task_runner_->RunPendingTasks(); | 206 task_runner_->RunPendingTasks(); |
| 362 | 207 |
| 363 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 208 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 364 source_->DidFinishFrame(obs_.get(), 0); | 209 source_->DidFinishFrame(obs_.get(), 0); |
| 365 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); | 210 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); |
| 366 EXPECT_BEGIN_FRAME_USED(*obs_, 1150, 1150 + kDeadline, kInterval); | 211 // Ticks at the time the last frame finished, so ignores the last change to |
| 212 // "now". |
| 213 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); |
| 367 | 214 |
| 368 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 215 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
| 369 task_runner_->RunPendingTasks(); | 216 task_runner_->RunPendingTasks(); |
| 370 } | 217 } |
| 371 | 218 |
| 372 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { | 219 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { |
| 373 StrictMock<MockBeginFrameObserver> obs1, obs2; | 220 StrictMock<MockBeginFrameObserver> obs1, obs2; |
| 374 | 221 |
| 375 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 222 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
| 376 source_->AddObserver(&obs1); | 223 source_->AddObserver(&obs1); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 258 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); |
| 412 task_runner_->RunPendingTasks(); | 259 task_runner_->RunPendingTasks(); |
| 413 | 260 |
| 414 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 261 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 415 source_->DidFinishFrame(&obs1, 0); | 262 source_->DidFinishFrame(&obs1, 0); |
| 416 EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval); | 263 EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval); |
| 417 task_runner_->RunPendingTasks(); | 264 task_runner_->RunPendingTasks(); |
| 418 | 265 |
| 419 source_->DidFinishFrame(&obs1, 0); | 266 source_->DidFinishFrame(&obs1, 0); |
| 420 source_->RemoveObserver(&obs1); | 267 source_->RemoveObserver(&obs1); |
| 268 // 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. |
| 270 task_runner_->RunPendingTasks(); |
| 421 | 271 |
| 422 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 272 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 423 source_->DidFinishFrame(&obs2, 0); | 273 source_->DidFinishFrame(&obs2, 0); |
| 424 EXPECT_BEGIN_FRAME_USED(obs2, 1300, 1300 + kDeadline, kInterval); | 274 EXPECT_BEGIN_FRAME_USED(obs2, 1300, 1300 + kDeadline, kInterval); |
| 425 task_runner_->RunPendingTasks(); | 275 task_runner_->RunPendingTasks(); |
| 426 | 276 |
| 427 source_->DidFinishFrame(&obs2, 0); | 277 source_->DidFinishFrame(&obs2, 0); |
| 428 source_->RemoveObserver(&obs2); | 278 source_->RemoveObserver(&obs2); |
| 429 } | 279 } |
| 430 | 280 |
| 431 // SyntheticBeginFrameSource testing ------------------------------------------ | 281 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { |
| 432 class SyntheticBeginFrameSourceTest : public ::testing::Test { | 282 StrictMock<MockBeginFrameObserver> obs1, obs2; |
| 283 |
| 284 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
| 285 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
| 286 source_->AddObserver(&obs1); |
| 287 source_->AddObserver(&obs2); |
| 288 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); |
| 289 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); |
| 290 task_runner_->RunPendingTasks(); |
| 291 |
| 292 // |obs1| finishes first. |
| 293 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 294 source_->DidFinishFrame(&obs1, 0); |
| 295 |
| 296 // |obs2| finishes also, before getting to the newly posted begin frame. |
| 297 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 298 source_->DidFinishFrame(&obs2, 0); |
| 299 |
| 300 // Because the begin frame source already ticked when |obs1| finished, |
| 301 // we see it as the frame time for both observers. |
| 302 EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); |
| 303 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); |
| 304 task_runner_->RunPendingTasks(); |
| 305 |
| 306 source_->DidFinishFrame(&obs1, 0); |
| 307 source_->RemoveObserver(&obs1); |
| 308 source_->DidFinishFrame(&obs2, 0); |
| 309 source_->RemoveObserver(&obs2); |
| 310 } |
| 311 |
| 312 // DelayBasedBeginFrameSource testing ------------------------------------------ |
| 313 class DelayBasedBeginFrameSourceTest : public ::testing::Test { |
| 433 public: | 314 public: |
| 434 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 315 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
| 435 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 316 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 436 std::unique_ptr<TestSyntheticBeginFrameSource> source_; | 317 std::unique_ptr<DelayBasedBeginFrameSource> source_; |
| 437 std::unique_ptr<MockBeginFrameObserver> obs_; | 318 std::unique_ptr<MockBeginFrameObserver> obs_; |
| 438 | 319 |
| 439 void SetUp() override { | 320 void SetUp() override { |
| 440 now_src_.reset(new base::SimpleTestTickClock()); | 321 now_src_.reset(new base::SimpleTestTickClock()); |
| 441 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 322 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
| 442 task_runner_ = | 323 task_runner_ = |
| 443 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 324 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
| 444 source_.reset(new TestSyntheticBeginFrameSource( | 325 std::unique_ptr<DelayBasedTimeSource> time_source( |
| 445 now_src_.get(), task_runner_.get(), | 326 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); |
| 446 base::TimeDelta::FromMicroseconds(10000))); | 327 time_source->SetTimebaseAndInterval( |
| 447 obs_ = base::WrapUnique(new MockBeginFrameObserver()); | 328 base::TimeTicks(), base::TimeDelta::FromMicroseconds(10000)); |
| 329 source_.reset(new DelayBasedBeginFrameSource(std::move(time_source))); |
| 330 obs_.reset(new MockBeginFrameObserver); |
| 448 } | 331 } |
| 449 | 332 |
| 450 void TearDown() override { obs_.reset(); } | 333 void TearDown() override { obs_.reset(); } |
| 451 }; | 334 }; |
| 452 | 335 |
| 453 TEST_F(SyntheticBeginFrameSourceTest, | 336 TEST_F(DelayBasedBeginFrameSourceTest, |
| 454 AddObserverCallsOnBeginFrameWithMissedTick) { | 337 AddObserverCallsOnBeginFrameWithMissedTick) { |
| 455 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 338 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
| 456 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 339 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 457 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); | 340 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); |
| 458 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent | 341 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent |
| 459 // No tasks should need to be run for this to occur. | 342 // No tasks should need to be run for this to occur. |
| 460 } | 343 } |
| 461 | 344 |
| 462 TEST_F(SyntheticBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { | 345 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { |
| 463 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 346 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 464 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 347 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); |
| 465 source_->AddObserver(obs_.get()); | 348 source_->AddObserver(obs_.get()); |
| 466 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 349 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
| 467 | 350 |
| 468 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 351 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| 469 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 352 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
| 470 task_runner_->RunPendingTasks(); | 353 task_runner_->RunPendingTasks(); |
| 471 } | 354 } |
| 472 | 355 |
| 473 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) { | 356 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { |
| 474 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 357 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 475 | 358 |
| 476 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 359 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 477 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 360 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); |
| 478 source_->AddObserver(obs_.get()); | 361 source_->AddObserver(obs_.get()); |
| 479 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 362 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| 480 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 363 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); |
| 481 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 364 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); |
| 482 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 365 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
| 483 | 366 |
| 484 source_->RemoveObserver(obs_.get()); | 367 source_->RemoveObserver(obs_.get()); |
| 485 // No new frames.... | 368 // No new frames.... |
| 486 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); | 369 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
| 487 } | 370 } |
| 488 | 371 |
| 489 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) { | 372 TEST_F(DelayBasedBeginFrameSourceTest, VSyncChanges) { |
| 490 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 373 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 491 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 374 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 492 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 375 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); |
| 493 source_->AddObserver(obs_.get()); | 376 source_->AddObserver(obs_.get()); |
| 494 | 377 |
| 495 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 378 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| 496 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 379 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); |
| 497 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 380 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); |
| 498 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 381 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); |
| 499 | 382 |
| 500 // Update the vsync information | 383 // Update the vsync information |
| 501 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), | 384 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), |
| 502 base::TimeDelta::FromMicroseconds(10001)); | 385 base::TimeDelta::FromMicroseconds(10001)); |
| 503 | 386 |
| 504 EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001); | 387 EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001); |
| 505 EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001); | 388 EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001); |
| 506 EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001); | 389 EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001); |
| 507 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); | 390 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); |
| 508 } | 391 } |
| 509 | 392 |
| 510 TEST_F(SyntheticBeginFrameSourceTest, AuthoritativeVSyncChanges) { | 393 TEST_F(DelayBasedBeginFrameSourceTest, AuthoritativeVSyncChanges) { |
| 511 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 394 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 512 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500), | 395 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500), |
| 513 base::TimeDelta::FromMicroseconds(10000)); | 396 base::TimeDelta::FromMicroseconds(10000)); |
| 514 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 397 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 515 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 500, 10500, 10000); | 398 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 500, 10500, 10000); |
| 516 source_->AddObserver(obs_.get()); | 399 source_->AddObserver(obs_.get()); |
| 517 | 400 |
| 518 EXPECT_BEGIN_FRAME_USED(*obs_, 10500, 20500, 10000); | 401 EXPECT_BEGIN_FRAME_USED(*obs_, 10500, 20500, 10000); |
| 519 EXPECT_BEGIN_FRAME_USED(*obs_, 20500, 30500, 10000); | 402 EXPECT_BEGIN_FRAME_USED(*obs_, 20500, 30500, 10000); |
| 520 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(20501)); | 403 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(20501)); |
| 521 | 404 |
| 522 // This will keep the same timebase, so 500, 9999 | 405 // This will keep the same timebase, so 500, 9999 |
| 523 source_->SetAuthoritativeVSyncInterval( | 406 source_->SetAuthoritativeVSyncInterval( |
| 524 base::TimeDelta::FromMicroseconds(9999)); | 407 base::TimeDelta::FromMicroseconds(9999)); |
| 525 EXPECT_BEGIN_FRAME_USED(*obs_, 30500, 40496, 9999); | 408 EXPECT_BEGIN_FRAME_USED(*obs_, 30500, 40496, 9999); |
| 526 EXPECT_BEGIN_FRAME_USED(*obs_, 40496, 50495, 9999); | 409 EXPECT_BEGIN_FRAME_USED(*obs_, 40496, 50495, 9999); |
| 527 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(40497)); | 410 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(40497)); |
| 528 | 411 |
| 529 // Change the vsync params, but the new interval will be ignored. | 412 // Change the vsync params, but the new interval will be ignored. |
| 530 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), | 413 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), |
| 531 base::TimeDelta::FromMicroseconds(1)); | 414 base::TimeDelta::FromMicroseconds(1)); |
| 532 EXPECT_BEGIN_FRAME_USED(*obs_, 50495, 60394, 9999); | 415 EXPECT_BEGIN_FRAME_USED(*obs_, 50495, 60394, 9999); |
| 533 EXPECT_BEGIN_FRAME_USED(*obs_, 60394, 70393, 9999); | 416 EXPECT_BEGIN_FRAME_USED(*obs_, 60394, 70393, 9999); |
| 534 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); | 417 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); |
| 535 } | 418 } |
| 536 | 419 |
| 537 TEST_F(SyntheticBeginFrameSourceTest, MultipleObservers) { | 420 TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { |
| 538 StrictMock<MockBeginFrameObserver> obs1, obs2; | 421 StrictMock<MockBeginFrameObserver> obs1, obs2; |
| 539 | 422 |
| 540 // now_src_ starts off at 1000. | 423 // now_src_ starts off at 1000. |
| 541 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); | 424 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); |
| 542 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 425 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
| 543 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, 10000, 20000, 10000); | 426 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, 10000, 20000, 10000); |
| 544 source_->AddObserver(&obs1); // Should cause the last tick to be sent | 427 source_->AddObserver(&obs1); // Should cause the last tick to be sent |
| 545 // No tasks should need to be run for this to occur. | 428 // No tasks should need to be run for this to occur. |
| 546 | 429 |
| 547 EXPECT_BEGIN_FRAME_USED(obs1, 20000, 30000, 10000); | 430 EXPECT_BEGIN_FRAME_USED(obs1, 20000, 30000, 10000); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 559 source_->RemoveObserver(&obs1); | 442 source_->RemoveObserver(&obs1); |
| 560 | 443 |
| 561 EXPECT_BEGIN_FRAME_USED(obs2, 40000, 50000, 10000); | 444 EXPECT_BEGIN_FRAME_USED(obs2, 40000, 50000, 10000); |
| 562 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 445 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); |
| 563 | 446 |
| 564 source_->RemoveObserver(&obs2); | 447 source_->RemoveObserver(&obs2); |
| 565 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); | 448 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); |
| 566 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 449 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
| 567 } | 450 } |
| 568 | 451 |
| 569 TEST_F(SyntheticBeginFrameSourceTest, DoubleTick) { | 452 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { |
| 570 StrictMock<MockBeginFrameObserver> obs; | 453 StrictMock<MockBeginFrameObserver> obs; |
| 571 | 454 |
| 572 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 455 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 573 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 456 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); |
| 574 source_->AddObserver(&obs); | 457 source_->AddObserver(&obs); |
| 575 | 458 |
| 576 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 459 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
| 577 base::TimeDelta::FromInternalValue(10000)); | 460 base::TimeDelta::FromInternalValue(10000)); |
| 578 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 461 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
| 579 | 462 |
| 580 // No begin frame received. | 463 // No begin frame received. |
| 581 task_runner_->RunPendingTasks(); | 464 task_runner_->RunPendingTasks(); |
| 582 | 465 |
| 583 // Begin frame received. | 466 // Begin frame received. |
| 584 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 467 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
| 585 base::TimeDelta::FromInternalValue(10000)); | 468 base::TimeDelta::FromInternalValue(10000)); |
| 586 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 469 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 587 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); | 470 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); |
| 588 task_runner_->RunPendingTasks(); | 471 task_runner_->RunPendingTasks(); |
| 589 } | 472 } |
| 590 | 473 |
| 591 TEST_F(SyntheticBeginFrameSourceTest, DoubleTickMissedFrame) { | 474 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { |
| 592 StrictMock<MockBeginFrameObserver> obs; | 475 StrictMock<MockBeginFrameObserver> obs; |
| 593 | 476 |
| 594 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 477 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 595 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 478 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); |
| 596 source_->AddObserver(&obs); | 479 source_->AddObserver(&obs); |
| 597 source_->RemoveObserver(&obs); | 480 source_->RemoveObserver(&obs); |
| 598 | 481 |
| 599 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 482 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
| 600 base::TimeDelta::FromInternalValue(10000)); | 483 base::TimeDelta::FromInternalValue(10000)); |
| 601 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 484 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
| 602 | 485 |
| 603 // No missed frame received. | 486 // No missed frame received. |
| 604 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 487 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 605 source_->AddObserver(&obs); | 488 source_->AddObserver(&obs); |
| 606 source_->RemoveObserver(&obs); | 489 source_->RemoveObserver(&obs); |
| 607 | 490 |
| 608 // Missed frame received. | 491 // Missed frame received. |
| 609 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 492 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
| 610 base::TimeDelta::FromInternalValue(10000)); | 493 base::TimeDelta::FromInternalValue(10000)); |
| 611 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 494 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 612 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 495 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 613 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); | 496 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); |
| 614 source_->AddObserver(&obs); | 497 source_->AddObserver(&obs); |
| 615 source_->RemoveObserver(&obs); | 498 source_->RemoveObserver(&obs); |
| 616 } | 499 } |
| 617 | 500 |
| 618 } // namespace | 501 } // namespace |
| 619 } // namespace cc | 502 } // namespace cc |
| OLD | NEW |