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