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 <deque> | 5 #include <deque> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
11 #include "cc/scheduler/begin_frame_source.h" | 11 #include "cc/scheduler/begin_frame_source.h" |
12 #include "cc/test/begin_frame_args_test.h" | 12 #include "cc/test/begin_frame_args_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 // Macros to help set up expected calls on the MockBeginFrameObserver. | 17 // Macros to help set up expected calls on the MockBeginFrameObserver. |
18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ | 18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ |
19 { \ | 19 { \ |
20 ::testing::Expectation exp = \ | 20 ::testing::Expectation exp = \ |
21 EXPECT_CALL((obs), \ | 21 EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \ |
22 OnBeginFrame(CreateBeginFrameArgsForTesting( \ | 22 BEGINFRAME_FROM_HERE, frame_time, deadline, \ |
23 frame_time, deadline, interval))) \ | 23 interval))).InSequence((obs).sequence); \ |
24 .InSequence((obs).sequence); \ | |
25 } | 24 } |
26 | 25 |
27 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ | 26 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ |
28 { \ | 27 { \ |
29 BeginFrameArgs args = \ | 28 BeginFrameArgs args = CreateBeginFrameArgsForTesting( \ |
30 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 29 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
31 ::testing::Expectation exp = \ | 30 ::testing::Expectation exp = \ |
32 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ | 31 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ |
33 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ | 32 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ |
34 .Times(::testing::AnyNumber()) \ | 33 .Times(::testing::AnyNumber()) \ |
35 .After(exp) \ | 34 .After(exp) \ |
36 .WillRepeatedly(::testing::Return(args)); \ | 35 .WillRepeatedly(::testing::Return(args)); \ |
37 } | 36 } |
38 | 37 |
39 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting | 38 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting |
40 // observer behaviour). | 39 // observer behaviour). |
41 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ | 40 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ |
42 interval) \ | 41 interval) \ |
43 { \ | 42 { \ |
44 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ | 43 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ |
45 BeginFrameArgs new_args = \ | 44 BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \ |
46 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 45 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
47 ASSERT_FALSE(old_args == new_args); \ | 46 ASSERT_FALSE(old_args == new_args); \ |
48 (source).TestOnBeginFrame(new_args); \ | 47 (source).TestOnBeginFrame(new_args); \ |
49 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ | 48 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ |
50 } | 49 } |
51 | 50 |
52 // When dropping LastUsedBeginFrameArgs **shouldn't** change. | 51 // When dropping LastUsedBeginFrameArgs **shouldn't** change. |
53 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ | 52 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ |
54 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); | 53 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); |
55 | 54 |
56 // When used LastUsedBeginFrameArgs **should** be updated. | 55 // When used LastUsedBeginFrameArgs **should** be updated. |
57 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ | 56 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ |
58 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); | 57 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); |
59 | 58 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { | 91 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { |
93 ::testing::NiceMock<MockBeginFrameObserver> obs; | 92 ::testing::NiceMock<MockBeginFrameObserver> obs; |
94 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 93 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
95 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | 94 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
96 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 95 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
97 | 96 |
98 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 97 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
99 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 98 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
100 | 99 |
101 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 100 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
102 100, 200, 300)); // One call to LastUsedBeginFrameArgs | 101 BEGINFRAME_FROM_HERE, 100, 200, |
103 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 102 300)); // One call to LastUsedBeginFrameArgs |
104 CreateBeginFrameArgsForTesting(100, 200, 300)); | 103 EXPECT_EQ( |
| 104 obs.LastUsedBeginFrameArgs(), |
| 105 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
105 | 106 |
106 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 107 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
107 400, 600, 300)); // Multiple calls to LastUsedBeginFrameArgs | 108 BEGINFRAME_FROM_HERE, 400, 600, |
108 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 109 300)); // Multiple calls to LastUsedBeginFrameArgs |
109 CreateBeginFrameArgsForTesting(400, 600, 300)); | 110 EXPECT_EQ( |
110 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 111 obs.LastUsedBeginFrameArgs(), |
111 CreateBeginFrameArgsForTesting(400, 600, 300)); | 112 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 113 EXPECT_EQ( |
| 114 obs.LastUsedBeginFrameArgs(), |
| 115 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
112 | 116 |
113 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 117 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
114 700, 900, 300)); // No calls to LastUsedBeginFrameArgs | 118 BEGINFRAME_FROM_HERE, 700, 900, |
| 119 300)); // No calls to LastUsedBeginFrameArgs |
115 } | 120 } |
116 | 121 |
117 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { | 122 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { |
118 ::testing::NiceMock<MockBeginFrameObserver> obs; | 123 ::testing::NiceMock<MockBeginFrameObserver> obs; |
119 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 124 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
120 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); | 125 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); |
121 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); | 126 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); |
122 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 127 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
123 | 128 |
124 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
125 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 130 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
126 | 131 |
127 // Used | 132 // Used |
128 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300)); | 133 obs.OnBeginFrame( |
129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 134 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
130 CreateBeginFrameArgsForTesting(100, 200, 300)); | 135 EXPECT_EQ( |
| 136 obs.LastUsedBeginFrameArgs(), |
| 137 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
131 | 138 |
132 // Dropped | 139 // Dropped |
133 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300)); | 140 obs.OnBeginFrame( |
134 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 141 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
135 CreateBeginFrameArgsForTesting(100, 200, 300)); | 142 EXPECT_EQ( |
| 143 obs.LastUsedBeginFrameArgs(), |
| 144 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
136 | 145 |
137 // Dropped | 146 // Dropped |
138 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300)); | 147 obs.OnBeginFrame( |
139 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 148 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 450, 650, 300)); |
140 CreateBeginFrameArgsForTesting(100, 200, 300)); | 149 EXPECT_EQ( |
| 150 obs.LastUsedBeginFrameArgs(), |
| 151 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
141 | 152 |
142 // Used | 153 // Used |
143 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300)); | 154 obs.OnBeginFrame( |
144 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 155 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
145 CreateBeginFrameArgsForTesting(700, 900, 300)); | 156 EXPECT_EQ( |
| 157 obs.LastUsedBeginFrameArgs(), |
| 158 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
146 } | 159 } |
147 | 160 |
148 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = | 161 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = |
149 CreateBeginFrameArgsForTesting(-1, -1, -1); | 162 CreateBeginFrameArgsForTesting( |
| 163 #ifdef NDEBUG |
| 164 nullptr, |
| 165 #else |
| 166 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 167 "MockBeginFrameObserver::kDefaultBeginFrameArgs"), |
| 168 #endif |
| 169 -1, |
| 170 -1, |
| 171 -1); |
150 | 172 |
151 // BeginFrameObserverMixIn testing --------------------------------------- | 173 // BeginFrameObserverMixIn testing --------------------------------------- |
152 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { | 174 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { |
153 public: | 175 public: |
154 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); | 176 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); |
155 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } | 177 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } |
156 }; | 178 }; |
157 | 179 |
158 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { | 180 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { |
159 using ::testing::Return; | 181 using ::testing::Return; |
160 MockMinimalBeginFrameObserverMixIn obs; | 182 MockMinimalBeginFrameObserverMixIn obs; |
161 ::testing::InSequence ordered; // These calls should be ordered | 183 ::testing::InSequence ordered; // These calls should be ordered |
162 | 184 |
163 // Initial conditions | 185 // Initial conditions |
164 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); | 186 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); |
165 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 187 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
166 | 188 |
167 #ifndef NDEBUG | 189 #ifndef NDEBUG |
168 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); | 190 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); |
169 #endif | 191 #endif |
170 | 192 |
171 BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(100, 200, 300); | 193 BeginFrameArgs args1 = |
| 194 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300); |
172 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); | 195 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); |
173 obs.OnBeginFrame(args1); | 196 obs.OnBeginFrame(args1); |
174 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 197 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
175 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 198 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
176 | 199 |
177 #ifndef NDEBUG | 200 #ifndef NDEBUG |
178 EXPECT_DEATH( | 201 EXPECT_DEATH({ |
179 { obs.OnBeginFrame(CreateBeginFrameArgsForTesting(50, 200, 300)); }, ""); | 202 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 203 BEGINFRAME_FROM_HERE, 50, 200, 300)); |
| 204 }, |
| 205 ""); |
180 #endif | 206 #endif |
181 | 207 |
182 // Returning false shouldn't update the LastUsedBeginFrameArgs value. | 208 // Returning false shouldn't update the LastUsedBeginFrameArgs value. |
183 BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(200, 300, 400); | 209 BeginFrameArgs args2 = |
| 210 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400); |
184 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); | 211 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); |
185 obs.OnBeginFrame(args2); | 212 obs.OnBeginFrame(args2); |
186 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 213 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
187 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 214 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
188 | 215 |
189 BeginFrameArgs args3 = CreateBeginFrameArgsForTesting(150, 300, 400); | 216 BeginFrameArgs args3 = |
| 217 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400); |
190 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); | 218 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); |
191 obs.OnBeginFrame(args3); | 219 obs.OnBeginFrame(args3); |
192 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); | 220 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); |
193 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 221 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
194 } | 222 } |
195 | 223 |
196 // BeginFrameSource testing ---------------------------------------------- | 224 // BeginFrameSource testing ---------------------------------------------- |
197 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { | 225 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { |
198 MockBeginFrameObserver obs; | 226 MockBeginFrameObserver obs; |
199 MockBeginFrameObserver otherObs; | 227 MockBeginFrameObserver otherObs; |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 source_->AddObserver(obs_.get()); | 516 source_->AddObserver(obs_.get()); |
489 } | 517 } |
490 | 518 |
491 void TearDown() override { obs_.reset(); } | 519 void TearDown() override { obs_.reset(); } |
492 }; | 520 }; |
493 | 521 |
494 TEST_F(SyntheticBeginFrameSourceTest, | 522 TEST_F(SyntheticBeginFrameSourceTest, |
495 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { | 523 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { |
496 now_src_->SetNowMicroseconds(10010); | 524 now_src_->SetNowMicroseconds(10010); |
497 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( | 525 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( |
498 10000, 20000, 10000, BeginFrameArgs::MISSED))); | 526 BEGINFRAME_FROM_HERE, 10000, 20000, 10000, |
| 527 BeginFrameArgs::MISSED))); |
499 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent | 528 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent |
500 // No tasks should need to be run for this to occur. | 529 // No tasks should need to be run for this to occur. |
501 } | 530 } |
502 | 531 |
503 TEST_F(SyntheticBeginFrameSourceTest, | 532 TEST_F(SyntheticBeginFrameSourceTest, |
504 SetNeedsBeginFramesCallsCausesOnBeginFrame) { | 533 SetNeedsBeginFramesCallsCausesOnBeginFrame) { |
505 source_->SetNeedsBeginFrames(true); | 534 source_->SetNeedsBeginFrames(true); |
506 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 535 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
507 | 536 |
508 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 537 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 mux_->SetActiveSource(source2_); | 766 mux_->SetActiveSource(source2_); |
738 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); | 767 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); |
739 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); | 768 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); |
740 | 769 |
741 mux_->SetActiveSource(source1_); | 770 mux_->SetActiveSource(source1_); |
742 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); | 771 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); |
743 } | 772 } |
744 | 773 |
745 } // namespace | 774 } // namespace |
746 } // namespace cc | 775 } // namespace cc |
OLD | NEW |