1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "vsync_generator.h"
17 #include "vsync_controller.h"
18 #include "vsync_distributor.h"
19
20 #include <gtest/gtest.h>
21
22 using namespace testing;
23 using namespace testing::ext;
24
25 namespace OHOS {
26 namespace Rosen {
SystemTime()27 static int64_t SystemTime()
28 {
29 timespec t = {};
30 clock_gettime(CLOCK_MONOTONIC, &t);
31 return int64_t(t.tv_sec) * 1000000000LL + t.tv_nsec; // 1000000000ns == 1s
32 }
33
34 class VSyncGeneratorTest : public testing::Test {
35 public:
36 static void SetUpTestCase();
37 static void TearDownTestCase();
38
39 static inline sptr<VSyncGenerator> vsyncGenerator_;
40 static constexpr const int32_t WAIT_SYSTEM_ABILITY_REPORT_DATA_SECONDS = 5;
41 static inline sptr<VSyncController> appController;
42 static inline sptr<VSyncController> rsController;
43 static inline sptr<VSyncDistributor> appDistributor;
44 static inline sptr<VSyncDistributor> rsDistributor;
45 };
46
SetUpTestCase()47 void VSyncGeneratorTest::SetUpTestCase()
48 {
49 vsyncGenerator_ = CreateVSyncGenerator();
50 appController = new VSyncController(vsyncGenerator_, 0);
51 rsController = new VSyncController(vsyncGenerator_, 0);
52 appDistributor = new VSyncDistributor(appController, "app");
53 rsDistributor = new VSyncDistributor(rsController, "app");
54 vsyncGenerator_->SetRSDistributor(rsDistributor);
55 vsyncGenerator_->SetAppDistributor(appDistributor);
56 }
57
TearDownTestCase()58 void VSyncGeneratorTest::TearDownTestCase()
59 {
60 sleep(WAIT_SYSTEM_ABILITY_REPORT_DATA_SECONDS);
61 vsyncGenerator_ = nullptr;
62 DestroyVSyncGenerator();
63 }
64
65 class VSyncGeneratorTestCallback : public VSyncGenerator::Callback {
66 public:
67 void OnVSyncEvent(int64_t now, int64_t period, uint32_t refreshRate, VSyncMode vsyncMode) override;
68 void OnPhaseOffsetChanged(int64_t phaseOffset) override;
69 void OnConnsRefreshRateChanged(const std::vector<std::pair<uint64_t, uint32_t>> &refreshRates) override;
70 };
71
OnVSyncEvent(int64_t now,int64_t period,uint32_t refreshRate,VSyncMode vsyncMode)72 void VSyncGeneratorTestCallback::OnVSyncEvent(int64_t now, int64_t period, uint32_t refreshRate, VSyncMode vsyncMode)
73 {
74 }
75
OnPhaseOffsetChanged(int64_t phaseOffset)76 void VSyncGeneratorTestCallback::OnPhaseOffsetChanged(int64_t phaseOffset)
77 {
78 }
79
OnConnsRefreshRateChanged(const std::vector<std::pair<uint64_t,uint32_t>> & refreshRates)80 void VSyncGeneratorTestCallback::OnConnsRefreshRateChanged(
81 const std::vector<std::pair<uint64_t, uint32_t>> &refreshRates)
82 {
83 }
84
85 namespace {
86 /*
87 * Function: UpdateMode001
88 * Type: Function
89 * Rank: Important(2)
90 * EnvConditions: N/A
91 * CaseDescription: 1. call UpdateMode
92 */
93 HWTEST_F(VSyncGeneratorTest, UpdateMode001, Function | MediumTest| Level0)
94 {
95 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->UpdateMode(2, 0, 0), VSYNC_ERROR_OK);
96 }
97
98 /*
99 * Function: UpdateMode002
100 * Type: Function
101 * Rank: Important(2)
102 * EnvConditions: N/A
103 * CaseDescription: 1. call UpdateMode
104 */
105 HWTEST_F(VSyncGeneratorTest, UpdateMode002, Function | MediumTest| Level0)
106 {
107 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->UpdateMode(2, 0, -1), VSYNC_ERROR_INVALID_ARGUMENTS);
108 }
109
110 /*
111 * Function: UpdateMode003
112 * Type: Function
113 * Rank: Important(2)
114 * EnvConditions: N/A
115 * CaseDescription: 1. call UpdateMode
116 */
117 HWTEST_F(VSyncGeneratorTest, UpdateMode003, Function | MediumTest| Level0)
118 {
119 VSyncGeneratorTest::vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
120 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->UpdateMode(0, 0, 0), VSYNC_ERROR_OK);
121 // 25000000 is period, refreshRate is 40hz,for JudgeRefreshRateLocked test
122 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->UpdateMode(25000000, 0, 0), VSYNC_ERROR_OK);
123 }
124
125 /*
126 * Function: AddListener001
127 * Type: Function
128 * Rank: Important(2)
129 * EnvConditions: N/A
130 * CaseDescription: 1. call AddListener
131 */
132 HWTEST_F(VSyncGeneratorTest, AddListener001, Function | MediumTest| Level0)
133 {
134 sptr<VSyncGeneratorTestCallback> callback1 = new VSyncGeneratorTestCallback;
135 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback1), VSYNC_ERROR_OK);
136 }
137
138 /*
139 * Function: AddListener002
140 * Type: Function
141 * Rank: Important(2)
142 * EnvConditions: N/A
143 * CaseDescription: 1. call AddListener
144 */
145 HWTEST_F(VSyncGeneratorTest, AddListener002, Function | MediumTest| Level0)
146 {
147 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->AddListener(2, nullptr), VSYNC_ERROR_INVALID_ARGUMENTS);
148 }
149
150 /*
151 * Function: AddListener003
152 * Type: Function
153 * Rank: Important(2)
154 * EnvConditions: N/A
155 * CaseDescription: 1. call AddListener
156 */
157 HWTEST_F(VSyncGeneratorTest, AddListener003, Function | MediumTest| Level0)
158 {
159 VSyncGeneratorTest::vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
160 VSyncGeneratorTest::vsyncGenerator_->UpdateMode(2, 0, 0);
161 sptr<VSyncGeneratorTestCallback> callback = new VSyncGeneratorTestCallback;
162 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback), VSYNC_ERROR_OK);
163 }
164
165 /*
166 * Function: RemoveListener001
167 * Type: Function
168 * Rank: Important(2)
169 * EnvConditions: N/A
170 * CaseDescription: 1. call RemoveListener
171 */
172 HWTEST_F(VSyncGeneratorTest, RemoveListener001, Function | MediumTest| Level0)
173 {
174 sptr<VSyncGeneratorTestCallback> callback2 = new VSyncGeneratorTestCallback;
175 VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback2);
176 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->RemoveListener(callback2), VSYNC_ERROR_OK);
177 }
178
179 /*
180 * Function: RemoveListener002
181 * Type: Function
182 * Rank: Important(2)
183 * EnvConditions: N/A
184 * CaseDescription: 1. call RemoveListener
185 */
186 HWTEST_F(VSyncGeneratorTest, RemoveListener002, Function | MediumTest| Level0)
187 {
188 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->RemoveListener(nullptr), VSYNC_ERROR_INVALID_ARGUMENTS);
189 }
190
191 /*
192 * Function: RemoveListener003
193 * Type: Function
194 * Rank: Important(2)
195 * EnvConditions: N/A
196 * CaseDescription: 1. call RemoveListener
197 */
198 HWTEST_F(VSyncGeneratorTest, RemoveListener003, Function | MediumTest| Level0)
199 {
200 sptr<VSyncGeneratorTestCallback> callback3 = new VSyncGeneratorTestCallback;
201 VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback3);
202 sptr<VSyncGeneratorTestCallback> callback4 = new VSyncGeneratorTestCallback;
203 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->RemoveListener(callback4), VSYNC_ERROR_INVALID_ARGUMENTS);
204 }
205
206 /*
207 * Function: ChangePhaseOffset001
208 * Type: Function
209 * Rank: Important(2)
210 * EnvConditions: N/A
211 * CaseDescription: 1. call ChangePhaseOffset
212 */
213 HWTEST_F(VSyncGeneratorTest, ChangePhaseOffset001, Function | MediumTest| Level0)
214 {
215 sptr<VSyncGeneratorTestCallback> callback5 = new VSyncGeneratorTestCallback;
216 VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback5);
217 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->ChangePhaseOffset(callback5, 1), VSYNC_ERROR_OK);
218 }
219
220 /*
221 * Function: ChangePhaseOffset002
222 * Type: Function
223 * Rank: Important(2)
224 * EnvConditions: N/A
225 * CaseDescription: 1. call ChangePhaseOffset
226 */
227 HWTEST_F(VSyncGeneratorTest, ChangePhaseOffset002, Function | MediumTest| Level0)
228 {
229 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->ChangePhaseOffset(nullptr, 1), VSYNC_ERROR_INVALID_ARGUMENTS);
230 }
231
232 /*
233 * Function: ChangePhaseOffset003
234 * Type: Function
235 * Rank: Important(2)
236 * EnvConditions: N/A
237 * CaseDescription: 1. call ChangePhaseOffset
238 */
239 HWTEST_F(VSyncGeneratorTest, ChangePhaseOffset003, Function | MediumTest| Level0)
240 {
241 sptr<VSyncGeneratorTestCallback> callback6 = new VSyncGeneratorTestCallback;
242 VSyncGeneratorTest::vsyncGenerator_->AddListener(2, callback6);
243 sptr<VSyncGeneratorTestCallback> callback7 = new VSyncGeneratorTestCallback;
244 ASSERT_EQ(VSyncGeneratorTest::vsyncGenerator_->ChangePhaseOffset(callback7, 1), VSYNC_ERROR_INVALID_OPERATING);
245 }
246
247 /*
248 * Function: expectNextVsyncTimeTest001
249 * Type: Function
250 * Rank: Important(2)
251 * EnvConditions: N/A
252 * CaseDescription: Test expectNextVsyncTime 0
253 */
254 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest001, Function | MediumTest| Level0)
255 {
256 int64_t period = 8333333; // 8333333ns
257 int64_t referenceTime = SystemTime();
258 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
259 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
260 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
261 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
262 int64_t refreshRate = 120; // 120hz
263 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
264 listenerRefreshRates, listenerPhaseOffset, refreshRate, 0); // expectNextVsyncTime 0
265 ASSERT_EQ(ret, VSYNC_ERROR_OK);
266 }
267
268 /*
269 * Function: expectNextVsyncTimeTest002
270 * Type: Function
271 * Rank: Important(2)
272 * EnvConditions: N/A
273 * CaseDescription: Test expectNextVsyncTime -1
274 */
275 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest002, Function | MediumTest| Level0)
276 {
277 int64_t period = 8333333; // 8333333ns
278 int64_t referenceTime = SystemTime();
279 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
280 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
281 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
282 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
283 int64_t refreshRate = 120; // 120hz
284 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
285 listenerRefreshRates, listenerPhaseOffset, refreshRate, -1); // expectNextVsyncTime -1
286 ASSERT_EQ(ret, VSYNC_ERROR_OK);
287 }
288
289 /*
290 * Function: expectNextVsyncTimeTest003
291 * Type: Function
292 * Rank: Important(2)
293 * EnvConditions: N/A
294 * CaseDescription: Test expectNextVsyncTime earlier than referenceTime.
295 */
296 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest003, Function | MediumTest| Level0)
297 {
298 int64_t period = 8333333; // 8333333ns
299 int64_t referenceTime = SystemTime();
300 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
301 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
302 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
303 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
304 int64_t refreshRate = 120; // 120hz
305 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
306 listenerRefreshRates, listenerPhaseOffset, refreshRate, referenceTime - 10000000); // 10ms == 10000000ns
307 ASSERT_EQ(ret, VSYNC_ERROR_INVALID_ARGUMENTS);
308 }
309
310 /*
311 * Function: expectNextVsyncTimeTest004
312 * Type: Function
313 * Rank: Important(2)
314 * EnvConditions: N/A
315 * CaseDescription: Test expectNextVsyncTime current system time.
316 */
317 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest004, Function | MediumTest| Level0)
318 {
319 int64_t period = 8333333; // 8333333ns
320 int64_t referenceTime = SystemTime();
321 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
322 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
323 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
324 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
325 int64_t refreshRate = 120; // 120hz
326 int64_t now = SystemTime();
327 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
328 listenerRefreshRates, listenerPhaseOffset, refreshRate, now);
329 ASSERT_EQ(ret, VSYNC_ERROR_OK);
330 }
331
332 /*
333 * Function: expectNextVsyncTimeTest005
334 * Type: Function
335 * Rank: Important(2)
336 * EnvConditions: N/A
337 * CaseDescription: Test expectNextVsyncTime current system time plus 5ms.
338 */
339 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest005, Function | MediumTest| Level0)
340 {
341 int64_t period = 8333333; // 8333333ns
342 int64_t referenceTime = SystemTime();
343 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
344 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
345 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
346 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
347 int64_t refreshRate = 120; // 120hz
348 int64_t now = SystemTime();
349 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
350 listenerRefreshRates, listenerPhaseOffset, refreshRate, now + 5000000); // 5ms == 5000000ns
351 ASSERT_EQ(ret, VSYNC_ERROR_OK);
352 }
353
354 /*
355 * Function: expectNextVsyncTimeTest006
356 * Type: Function
357 * Rank: Important(2)
358 * EnvConditions: N/A
359 * CaseDescription: Test expectNextVsyncTime current system time plus 5.5ms.
360 */
361 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest006, Function | MediumTest| Level0)
362 {
363 int64_t period = 8333333; // 8333333ns
364 int64_t referenceTime = SystemTime();
365 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
366 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
367 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
368 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
369 int64_t refreshRate = 120; // 120hz
370 int64_t now = SystemTime();
371 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
372 listenerRefreshRates, listenerPhaseOffset, refreshRate, now + 5500000); // 5.5ms == 5500000ns
373 ASSERT_EQ(ret, VSYNC_ERROR_OK);
374 }
375
376 /*
377 * Function: expectNextVsyncTimeTest007
378 * Type: Function
379 * Rank: Important(2)
380 * EnvConditions: N/A
381 * CaseDescription: Test expectNextVsyncTime current system time plus 90ms.
382 */
383 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest007, Function | MediumTest| Level0)
384 {
385 int64_t period = 8333333; // 8333333ns
386 int64_t referenceTime = SystemTime();
387 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
388 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
389 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
390 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
391 int64_t refreshRate = 120; // 120hz
392 int64_t now = SystemTime();
393 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
394 listenerRefreshRates, listenerPhaseOffset, refreshRate, now + 90000000); // 90ms == 90000000ns
395 ASSERT_EQ(ret, VSYNC_ERROR_OK);
396 }
397
398 /*
399 * Function: expectNextVsyncTimeTest008
400 * Type: Function
401 * Rank: Important(2)
402 * EnvConditions: N/A
403 * CaseDescription: Test expectNextVsyncTime current system time plus 110ms.
404 */
405 HWTEST_F(VSyncGeneratorTest, expectNextVsyncTimeTest008, Function | MediumTest| Level0)
406 {
407 int64_t period = 8333333; // 8333333ns
408 int64_t referenceTime = SystemTime();
409 vsyncGenerator_->SetVSyncMode(VSYNC_MODE_LTPO);
410 vsyncGenerator_->UpdateMode(period, 0, referenceTime);
411 VSyncGenerator::ListenerRefreshRateData listenerRefreshRates = {};
412 VSyncGenerator::ListenerPhaseOffsetData listenerPhaseOffset = {};
413 int64_t refreshRate = 120; // 120hz
414 int64_t now = SystemTime();
415 VsyncError ret = VSyncGeneratorTest::vsyncGenerator_->ChangeGeneratorRefreshRateModel(
416 listenerRefreshRates, listenerPhaseOffset, refreshRate, now + 110000000); // 110ms == 110000000ns
417 ASSERT_EQ(ret, VSYNC_ERROR_INVALID_ARGUMENTS);
418 }
419 } // namespace
420 } // namespace Rosen
421 } // namespace OHOS