1 /**************************************************************************
3 * Copyright 2016 Samsung Electronics co., Ltd. All Rights Reserved.
5 * Contact: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
6 * Contact: Andrii Sokolenko <a.sokolenko@samsung.com>
7 * Contact: Roman Marchenko <r.marchenko@samsung.com>
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sub license, and/or sell copies of the Software, and to
14 * permit persons to whom the Software is furnished to do so, subject to
15 * the following conditions:
17 * The above copyright notice and this permission notice (including the
18 * next paragraph) shall be included in all copies or substantial portions
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
31 #include "gtest/gtest.h"
33 #include "tbm_bufmgr.h"
34 #include "ut_common.h"
35 #include <sys/epoll.h>
36 #include <sys/timerfd.h>
39 class TDMVblankWithoutCreating: public ::testing::Test {
45 tdm_output *connected_output;
46 const tdm_output_mode *preferred_mode;
47 tdm_output *disconnected_output;
48 tdm_output *default_output;
52 tdm_output_conn_status status;
53 tdm_error error = TDM_ERROR_NONE;
58 connected_output = NULL;
59 connected_output = NULL;
60 default_output = NULL;
61 preferred_mode = NULL;
63 setenv("TDM_DLOG", "1", 1);
64 setenv("XDG_RUNTIME_DIR", ".", 1);
65 setenv("TBM_DLOG", "1", 1);
66 setenv("TBM_DISPLAY_SERVER", "1", 1);
68 bufmgr = tbm_bufmgr_init(-1);
69 ASSERT_FALSE(bufmgr == NULL);
71 dpy = tdm_display_init(&error);
72 ASSERT_TRUE(error == TDM_ERROR_NONE);
73 ASSERT_FALSE(dpy == NULL);
75 error = tdm_display_get_output_count(dpy, &output_count);
76 ASSERT_TRUE(error == TDM_ERROR_NONE);
82 for(int i = 0; i < output_count; i++) {
83 output = tdm_display_get_output(dpy, i, &error);
84 ASSERT_TRUE(error == TDM_ERROR_NONE);
85 ASSERT_FALSE(dpy == NULL);
87 error = tdm_output_get_conn_status(output, &status);
88 ASSERT_TRUE(error == TDM_ERROR_NONE);
90 if (status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
91 connected_output = output;
93 disconnected_output = output;
96 default_output = disconnected_output;
98 if (connected_output) {
99 int output_modes_cnt = 0;
100 const tdm_output_mode* output_modes;
102 error = tdm_output_get_available_modes(connected_output, &output_modes, &output_modes_cnt);
103 ASSERT_TRUE(error == TDM_ERROR_NONE);
104 if (output_modes_cnt <= 0) {
105 connected_output = NULL;
109 for(int i = 0; i < output_modes_cnt; i++) {
110 if(output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) {
111 preferred_mode = &output_modes[i];
113 error = tdm_output_set_mode(connected_output, preferred_mode);
114 ASSERT_TRUE(error == TDM_ERROR_NONE);
116 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
117 ASSERT_TRUE(error == TDM_ERROR_NONE);
119 default_output = connected_output;
126 connected_output = NULL;
130 if (connected_output)
131 tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
134 tbm_bufmgr_deinit(bufmgr);
136 tdm_display_deinit(dpy);
143 class TDMVblank: public TDMVblankWithoutCreating {
145 tdm_vblank *con_output_vblank;
146 tdm_vblank *discon_output_vblank;
147 tdm_output *default_vblank;
152 con_output_vblank = NULL;
153 discon_output_vblank = NULL;
154 default_vblank = NULL;
156 TDMVblankWithoutCreating::SetUp();
158 if (disconnected_output) {
159 discon_output_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
160 EXPECT_TRUE(discon_output_vblank != NULL);
161 EXPECT_TRUE(error == TDM_ERROR_NONE);
164 if (connected_output) {
165 con_output_vblank = tdm_vblank_create(dpy, connected_output, &error);
166 EXPECT_TRUE(con_output_vblank != NULL);
167 EXPECT_TRUE(error == TDM_ERROR_NONE);
170 if (connected_output)
171 default_vblank = discon_output_vblank;
173 default_vblank = con_output_vblank;
175 ASSERT_TRUE(default_vblank != NULL);
179 class TDMVblankWait : public TDMVblank {
181 static int utVblankHandlerIsCalled;
182 static void UtVblankHandler(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
183 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
185 int *data = (int *)user_data;
190 utVblankHandlerIsCalled = 1;
192 int utWaitVblankThreadHndlResult;
193 friend void *UtWaitVblankThreadHndl(void *ptr);
194 int utWaitVblankSeqThreadHndlResult;
195 friend void *UtWaitVblankSeqThreadHndl(void *ptr);
201 static const int timeLimitSec = 1;
206 struct epoll_event ep;
210 utVblankHandlerIsCalled = 0;
211 utWaitVblankThreadHndlResult = -1;
212 utWaitVblankSeqThreadHndlResult = -1;
216 epFd = epoll_create1(0);
217 ASSERT_TRUE(epFd != -1);
219 timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
220 ASSERT_TRUE(timerFd != -1);
222 memset(&ep, 0, sizeof ep);
223 ep.events |= EPOLLIN;
224 ep.data.fd = timerFd;
225 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ep) == 0);
227 ASSERT_TRUE(tdm_display_get_fd(dpy, &tdmFd) == TDM_ERROR_NONE);
229 memset(&ep, 0, sizeof ep);
230 ep.events |= EPOLLIN;
232 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, tdmFd, &ep) == 0);
235 void UtHandleVblankEvent()
237 struct itimerspec its;
239 struct epoll_event ep_event[2];
241 if (utVblankHandlerIsCalled)
244 its.it_interval.tv_sec = 0;
245 its.it_interval.tv_nsec = 0;
246 its.it_value.tv_sec = timeLimitSec;
247 its.it_value.tv_nsec = 0;
249 ASSERT_TRUE(timerfd_settime(timerFd, 0, &its, NULL) == 0);
252 count = epoll_wait(epFd, ep_event, sizeof(ep_event), -1);
253 ASSERT_TRUE(count >= 0);
255 for (int i = 0; i < count; i++) {
256 if (ep_event[i].data.fd == timerFd) {
259 ASSERT_TRUE(tdm_display_handle_events(dpy) == TDM_ERROR_NONE);
260 if (utVblankHandlerIsCalled)
268 class TDMVblankWaitThread : public TDMVblankWait {
272 setenv("TDM_THREAD", "1", 1);
273 TDMVblankWait::SetUp();
277 int TDMVblankWait::utVblankHandlerIsCalled = 0;
279 /* tdm_vblank_enable_global_fps() */
281 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpFailFpsNull)
283 tdm_error error = TDM_ERROR_BAD_MODULE;
285 SKIP_FLAG(has_output);
286 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 0);
287 if (error == TDM_ERROR_NONE)
290 ::testing::ExitedWithCode(0), "");
293 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessEnable)
295 tdm_error error = TDM_ERROR_BAD_MODULE;
297 SKIP_FLAG(has_output);
298 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 60);
299 if (error != TDM_ERROR_NONE)
302 ::testing::ExitedWithCode(0), "");
305 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessDisable)
307 tdm_error error = TDM_ERROR_BAD_MODULE;
309 SKIP_FLAG(has_output);
310 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(0, 0);
311 if (error != TDM_ERROR_NONE)
314 ::testing::ExitedWithCode(0), "");
317 /* tdm_vblank_create() */
319 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullAll)
321 tdm_vblank *ret_vblank;
323 SKIP_FLAG(has_output);
325 ret_vblank = tdm_vblank_create(NULL, NULL, NULL);
326 ASSERT_TRUE(ret_vblank == NULL);
329 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullDpy)
331 tdm_vblank *ret_vblank;
334 SKIP_FLAG(has_output);
336 ret_vblank = tdm_vblank_create(NULL, default_output, &error);
337 ASSERT_TRUE(ret_vblank == NULL);
338 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
341 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullOutput)
343 tdm_vblank *ret_vblank;
346 SKIP_FLAG(has_output);
348 ret_vblank = tdm_vblank_create(dpy, NULL, &error);
349 ASSERT_TRUE(ret_vblank == NULL);
350 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
353 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongDpy)
355 tdm_vblank *ret_vblank = NULL;
358 SKIP_FLAG(has_output);
360 ASSERT_EXIT({ret_vblank = tdm_vblank_create((tdm_display *)0xFFFFFFFF, default_output, &error);
361 if (ret_vblank || error == TDM_ERROR_NONE)
365 ::testing::ExitedWithCode(0), "");
368 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongOutput)
370 tdm_vblank *ret_vblank = NULL;
373 SKIP_FLAG(has_output);
375 ASSERT_EXIT({ret_vblank = tdm_vblank_create(dpy, (tdm_output *)0xFFFFFFFF, &error);
376 if (ret_vblank || error == TDM_ERROR_NONE)
380 ::testing::ExitedWithCode(0), "");
383 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForConnectedOutput)
385 tdm_vblank *ret_vblank;
388 SKIP_FLAG(has_output);
390 if (!connected_output)
393 ret_vblank = tdm_vblank_create(dpy, connected_output, &error);
394 ASSERT_TRUE(ret_vblank != NULL);
395 ASSERT_TRUE(error == TDM_ERROR_NONE);
398 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForDisconnectedOutput)
400 tdm_vblank *ret_vblank;
403 SKIP_FLAG(has_output);
405 if (!disconnected_output)
408 ret_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
409 ASSERT_TRUE(ret_vblank != NULL);
410 ASSERT_TRUE(error == TDM_ERROR_NONE);
413 /* tdm_vblank_destroy() */
415 TEST_F(TDMVblank, VblankDestroyWrongVblankPtr)
417 SKIP_FLAG(has_output);
419 ASSERT_EXIT({tdm_vblank_destroy((tdm_vblank *)0xFFFFFFFF);},
420 ::testing::ExitedWithCode(0), "");
423 TEST_F(TDMVblank, VblankDestroySuccess)
426 SKIP_FLAG(has_output);
428 tdm_vblank_destroy(con_output_vblank);
430 error = tdm_vblank_set_enable_fake(default_vblank, 1);
431 ASSERT_TRUE(error != TDM_ERROR_NONE);
434 /* tdm_vblank_set_name() */
436 TEST_F(TDMVblank, VblankSetNameFailNullAll)
439 SKIP_FLAG(has_output);
441 error = tdm_vblank_set_name(NULL, NULL);
442 ASSERT_TRUE(error != TDM_ERROR_NONE);
445 TEST_F(TDMVblank, VblankSetNameFailWrongVblankPtr)
447 tdm_error error = TDM_ERROR_BAD_MODULE;
449 SKIP_FLAG(has_output);
451 ASSERT_EXIT({error = tdm_vblank_set_name((tdm_vblank *)0xFFFFFFFF, "ut_vblank");
452 if (error == TDM_ERROR_NONE)
456 ::testing::ExitedWithCode(0), "");
459 TEST_F(TDMVblank, VblankSetNameSuccess)
462 SKIP_FLAG(has_output);
464 error = tdm_vblank_set_name(default_vblank, "ut_vblank");
465 ASSERT_TRUE(error == TDM_ERROR_NONE);
468 TEST_F(TDMVblank, VblankSetNameSuccessNullName)
471 SKIP_FLAG(has_output);
473 error = tdm_vblank_set_name(default_vblank, NULL);
474 ASSERT_TRUE(error == TDM_ERROR_NONE);
477 /* tdm_vblank_get_name() */
479 TEST_F(TDMVblank, VblankGetNameFailNullAll)
482 SKIP_FLAG(has_output);
484 error = tdm_vblank_get_name(NULL, NULL);
485 ASSERT_TRUE(error != TDM_ERROR_NONE);
488 TEST_F(TDMVblank, VblankGetNameFailNullVblank)
491 const char *ret_name;
492 SKIP_FLAG(has_output);
494 error = tdm_vblank_get_name(NULL, &ret_name);
495 ASSERT_TRUE(error != TDM_ERROR_NONE);
498 TEST_F(TDMVblank, VblankGetNameFailWrongVblankPtr)
500 tdm_error error = TDM_ERROR_BAD_MODULE;
501 const char *ret_name;
503 SKIP_FLAG(has_output);
505 ASSERT_EXIT({error = tdm_vblank_get_name((tdm_vblank *)0xFFFFFFFF, &ret_name);
506 if (error == TDM_ERROR_NONE)
510 ::testing::ExitedWithCode(0), "");
513 TEST_F(TDMVblank, VblankGetNameFailNullName)
516 SKIP_FLAG(has_output);
518 error = tdm_vblank_get_name(default_vblank, NULL);
519 ASSERT_TRUE(error != TDM_ERROR_NONE);
522 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetName)
525 const char *ret_name;
526 SKIP_FLAG(has_output);
528 error = tdm_vblank_get_name(default_vblank, &ret_name);
529 ASSERT_TRUE(error == TDM_ERROR_NONE);
532 TEST_F(TDMVblank, VblankGetNameSuccess)
535 const char *ret_name;
536 SKIP_FLAG(has_output);
537 const char *set_name = "ut_vblank";
539 error = tdm_vblank_set_name(default_vblank, set_name);
540 ASSERT_TRUE(error == TDM_ERROR_NONE);
542 error = tdm_vblank_get_name(default_vblank, &ret_name);
543 ASSERT_TRUE(error == TDM_ERROR_NONE);
545 ASSERT_STREQ(set_name, ret_name);
548 /* tdm_vblank_set_fps() */
550 TEST_F(TDMVblank, VblankSetFpsFailNullVblank)
553 SKIP_FLAG(has_output);
555 error = tdm_vblank_set_fps(NULL, 10);
556 ASSERT_TRUE(error != TDM_ERROR_NONE);
559 TEST_F(TDMVblank, VblankSetFpsFailFpsNull)
562 SKIP_FLAG(has_output);
564 error = tdm_vblank_set_fps(default_vblank, 0);
565 ASSERT_TRUE(error != TDM_ERROR_NONE);
568 TEST_F(TDMVblank, VblankSetFpsFailWrongVblankPtr)
570 tdm_error error = TDM_ERROR_BAD_MODULE;
572 SKIP_FLAG(has_output);
574 ASSERT_EXIT({error = tdm_vblank_set_fps((tdm_vblank *)0xFFFFFFFF, 60);
575 if (error == TDM_ERROR_NONE)
579 ::testing::ExitedWithCode(0), "");
582 TEST_F(TDMVblank, VblankSetFpsSuccess)
585 SKIP_FLAG(has_output);
587 error = tdm_vblank_set_fps(default_vblank, 60);
588 ASSERT_TRUE(error == TDM_ERROR_NONE);
591 TEST_F(TDMVblank, VblankSetFpsSuccessSetTwice)
594 SKIP_FLAG(has_output);
596 error = tdm_vblank_set_fps(default_vblank, 60);
597 ASSERT_TRUE(error == TDM_ERROR_NONE);
599 error = tdm_vblank_set_fps(default_vblank, 60);
600 ASSERT_TRUE(error == TDM_ERROR_NONE);
603 /* tdm_vblank_get_fps() */
605 TEST_F(TDMVblank, VblankGetFpsFailNullAll)
608 SKIP_FLAG(has_output);
610 error = tdm_vblank_get_fps(NULL, NULL);
611 ASSERT_TRUE(error != TDM_ERROR_NONE);
614 TEST_F(TDMVblank, VblankGetFpsFailNullVblank)
617 unsigned int ret_fps;
618 SKIP_FLAG(has_output);
620 error = tdm_vblank_get_fps(NULL, &ret_fps);
621 ASSERT_TRUE(error != TDM_ERROR_NONE);
624 TEST_F(TDMVblank, VblankGetFpsFailNullFps)
627 SKIP_FLAG(has_output);
629 error = tdm_vblank_get_fps(default_vblank, NULL);
630 ASSERT_TRUE(error != TDM_ERROR_NONE);
633 TEST_F(TDMVblank, VblankGetFpsFailWrongVblankPtr)
635 tdm_error error = TDM_ERROR_BAD_MODULE;
636 unsigned int ret_fps;
638 SKIP_FLAG(has_output);
640 ASSERT_EXIT({error = tdm_vblank_get_fps((tdm_vblank *)0xFFFFFFFF, &ret_fps);
641 if (error == TDM_ERROR_NONE)
645 ::testing::ExitedWithCode(0), "");
648 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetFps)
651 unsigned int ret_fps;
652 SKIP_FLAG(has_output);
654 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
655 ASSERT_TRUE(error == TDM_ERROR_NONE);
658 TEST_F(TDMVblank, VblankGetFpsSuccess)
661 unsigned int ret_fps = 10;
662 SKIP_FLAG(has_output);
663 unsigned int set_fps = 50;
665 error = tdm_vblank_set_fps(default_vblank, set_fps);
666 ASSERT_TRUE(error == TDM_ERROR_NONE);
668 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
669 ASSERT_TRUE(error == TDM_ERROR_NONE);
671 ASSERT_TRUE(set_fps == ret_fps);
674 /* tdm_vblank_ignore_global_fps() */
676 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailNullVblank)
679 SKIP_FLAG(has_output);
681 error = tdm_vblank_ignore_global_fps(NULL, 1);
682 ASSERT_TRUE(error != TDM_ERROR_NONE);
685 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailWrongVblankPtr)
687 tdm_error error = TDM_ERROR_BAD_MODULE;
689 SKIP_FLAG(has_output);
691 ASSERT_EXIT({error = tdm_vblank_ignore_global_fps((tdm_vblank *)0xFFFFFFFF, 1);
692 if (error == TDM_ERROR_NONE)
696 ::testing::ExitedWithCode(0), "");
699 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnset)
702 SKIP_FLAG(has_output);
704 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
705 ASSERT_TRUE(error == TDM_ERROR_NONE);
708 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnsetTwice)
711 SKIP_FLAG(has_output);
713 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
714 ASSERT_TRUE(error == TDM_ERROR_NONE);
716 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
717 ASSERT_TRUE(error == TDM_ERROR_NONE);
720 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSet)
723 SKIP_FLAG(has_output);
725 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
726 ASSERT_TRUE(error == TDM_ERROR_NONE);
729 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSetTwice)
732 SKIP_FLAG(has_output);
734 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
735 ASSERT_TRUE(error == TDM_ERROR_NONE);
737 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
738 ASSERT_TRUE(error == TDM_ERROR_NONE);
741 /* tdm_vblank_set_offset() */
743 TEST_F(TDMVblank, VblankSetOffsetFailNullVblank)
746 SKIP_FLAG(has_output);
748 error = tdm_vblank_set_offset(NULL, 10);
749 ASSERT_TRUE(error != TDM_ERROR_NONE);
752 TEST_F(TDMVblank, VblankSetOffsetFailFailWrongVblankPtr)
754 tdm_error error = TDM_ERROR_BAD_MODULE;
756 SKIP_FLAG(has_output);
758 ASSERT_EXIT({error = tdm_vblank_set_offset((tdm_vblank *)0xFFFFFFFF, 10);
759 if (error == TDM_ERROR_NONE)
763 ::testing::ExitedWithCode(0), "");
766 TEST_F(TDMVblank, VblankSetOffsetSuccess)
769 SKIP_FLAG(has_output);
771 error = tdm_vblank_set_offset(default_vblank, 50);
772 ASSERT_TRUE(error == TDM_ERROR_NONE);
775 TEST_F(TDMVblank, VblankSetOffsetSuccessSuccessSetTwice)
778 SKIP_FLAG(has_output);
780 error = tdm_vblank_set_offset(default_vblank, 50);
781 ASSERT_TRUE(error == TDM_ERROR_NONE);
783 error = tdm_vblank_set_offset(default_vblank, 50);
784 ASSERT_TRUE(error == TDM_ERROR_NONE);
787 /* tdm_vblank_get_offset() */
789 TEST_F(TDMVblank, VblankGetOffsetFailNullAll)
792 SKIP_FLAG(has_output);
794 error = tdm_vblank_get_offset(NULL, NULL);
795 ASSERT_TRUE(error != TDM_ERROR_NONE);
798 TEST_F(TDMVblank, VblankGetOffsetFailNullVblank)
802 SKIP_FLAG(has_output);
804 error = tdm_vblank_get_offset(NULL, &offset);
805 ASSERT_TRUE(error != TDM_ERROR_NONE);
808 TEST_F(TDMVblank, VblankGetOffsetFailNullOffset)
811 SKIP_FLAG(has_output);
813 error = tdm_vblank_get_offset(default_vblank, NULL);
814 ASSERT_TRUE(error != TDM_ERROR_NONE);
817 TEST_F(TDMVblank, VblankGetOffsetFailWrongVblankPtr)
819 tdm_error error = TDM_ERROR_BAD_MODULE;
821 SKIP_FLAG(has_output);
823 ASSERT_EXIT({error = tdm_vblank_get_offset((tdm_vblank *)0xFFFFFFFF, &offset);
824 if (error == TDM_ERROR_NONE)
828 ::testing::ExitedWithCode(0), "");
831 TEST_F(TDMVblank, VblankGetOffsetFailWrongOffsetPtr)
833 tdm_error error = TDM_ERROR_BAD_MODULE;
834 SKIP_FLAG(has_output);
836 ASSERT_EXIT({error = tdm_vblank_get_offset(default_vblank, (int *)0xFFFFFFFF);
837 if (error == TDM_ERROR_NONE)
841 ::testing::ExitedWithCode(0), "");
844 TEST_F(TDMVblank, VblankGetOffsetSuccesWithoutSet)
849 SKIP_FLAG(has_output);
851 error = tdm_vblank_get_offset(default_vblank, &offset);
852 ASSERT_TRUE(error == TDM_ERROR_NONE);
855 TEST_F(TDMVblank, VblankGetOffsetSucces)
858 int set_offset = 567;
861 SKIP_FLAG(has_output);
863 error = tdm_vblank_set_offset(default_vblank, set_offset);
864 ASSERT_TRUE(error != TDM_ERROR_NONE);
866 error = tdm_vblank_get_offset(default_vblank, &ret_offset);
867 ASSERT_TRUE(error != TDM_ERROR_NONE);
869 ASSERT_TRUE(set_offset == ret_offset);
872 /* tdm_vblank_set_enable_fake() */
874 TEST_F(TDMVblank, VblankSetEnableFakeFailNullVblank)
877 SKIP_FLAG(has_output);
879 error = tdm_vblank_set_enable_fake(NULL, 1);
880 ASSERT_TRUE(error != TDM_ERROR_NONE);
883 TEST_F(TDMVblank, VblankSetEnableFakeFailFailWrongVblankPtr)
885 tdm_error error = TDM_ERROR_BAD_MODULE;
887 SKIP_FLAG(has_output);
889 ASSERT_EXIT({error = tdm_vblank_set_enable_fake((tdm_vblank *)0xFFFFFFFF, 1);
890 if (error == TDM_ERROR_NONE)
894 ::testing::ExitedWithCode(0), "");
897 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSet)
900 SKIP_FLAG(has_output);
902 error = tdm_vblank_set_enable_fake(default_vblank, 1);
903 ASSERT_TRUE(error == TDM_ERROR_NONE);
906 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSetTwice)
909 SKIP_FLAG(has_output);
911 error = tdm_vblank_set_enable_fake(default_vblank, 1);
912 ASSERT_TRUE(error == TDM_ERROR_NONE);
914 error = tdm_vblank_set_enable_fake(default_vblank, 1);
915 ASSERT_TRUE(error == TDM_ERROR_NONE);
918 /* tdm_vblank_get_enable_fake() */
920 TEST_F(TDMVblank, VblankGetEnableFakeFailNullAll)
923 SKIP_FLAG(has_output);
925 error = tdm_vblank_get_enable_fake(NULL, NULL);
926 ASSERT_TRUE(error != TDM_ERROR_NONE);
929 TEST_F(TDMVblank, VblankGetEnableFakeFailNullVblank)
932 unsigned int enable_fake;
933 SKIP_FLAG(has_output);
935 error = tdm_vblank_get_enable_fake(NULL, &enable_fake);
936 ASSERT_TRUE(error != TDM_ERROR_NONE);
939 TEST_F(TDMVblank, VblankGetEnableFakeFailNullEnableFake)
942 SKIP_FLAG(has_output);
944 error = tdm_vblank_get_enable_fake(default_vblank, NULL);
945 ASSERT_TRUE(error != TDM_ERROR_NONE);
948 TEST_F(TDMVblank, VblankGetEnableFakeFailWrongVblankPtr)
950 tdm_error error = TDM_ERROR_BAD_MODULE;
951 unsigned int enable_fake;
952 SKIP_FLAG(has_output);
954 ASSERT_EXIT({error = tdm_vblank_get_enable_fake((tdm_vblank *)0xFFFFFFFF, &enable_fake);
955 if (error == TDM_ERROR_NONE)
959 ::testing::ExitedWithCode(0), "");
962 TEST_F(TDMVblank, DISABLED_VblankGetEnableFakeFailWrongOffsetPtr)
964 tdm_error error = TDM_ERROR_BAD_MODULE;
965 SKIP_FLAG(has_output);
967 ASSERT_EXIT({error = tdm_vblank_get_enable_fake(default_vblank, (unsigned int *)0xFFFFFFFF);
968 if (error == TDM_ERROR_NONE)
972 ::testing::ExitedWithCode(0), "");
975 TEST_F(TDMVblank, VblankGetEnableFakeSuccessWithoutSet)
978 unsigned int enable_fake;
980 SKIP_FLAG(has_output);
982 error = tdm_vblank_get_enable_fake(default_vblank, &enable_fake);
983 ASSERT_TRUE(error == TDM_ERROR_NONE);
986 TEST_F(TDMVblank, VblankGetEnableFakeSuccess)
989 unsigned int set_enable_fake = 1;
990 unsigned int ret_enable_fake;
992 SKIP_FLAG(has_output);
994 error = tdm_vblank_set_enable_fake(default_vblank, set_enable_fake);
995 ASSERT_TRUE(error == TDM_ERROR_NONE);
997 error = tdm_vblank_get_enable_fake(default_vblank, &ret_enable_fake);
998 ASSERT_TRUE(error == TDM_ERROR_NONE);
1000 ASSERT_TRUE(set_enable_fake == ret_enable_fake);
1003 /* tdm_vblank_set_client_vblank_fps() */
1005 /* TODO: need to create the tdm client */
1006 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullAll)
1010 SKIP_FLAG(has_output);
1012 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1013 ASSERT_TRUE(error != TDM_ERROR_NONE);
1016 /* TODO: need to create the tdm client */
1017 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullPid)
1021 SKIP_FLAG(has_output);
1023 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1024 ASSERT_TRUE(error != TDM_ERROR_NONE);
1027 /* tdm_vblank_wait() */
1029 TEST_F(TDMVblank, VblankWaitFailNullAll)
1033 SKIP_FLAG(has_output);
1035 error = tdm_vblank_wait(NULL, 0, 0, 0, NULL, NULL);
1036 ASSERT_TRUE(error != TDM_ERROR_NONE);
1039 TEST_F(TDMVblankWait, VblankWaitFailNullVblank)
1043 SKIP_FLAG(has_output);
1045 error = tdm_vblank_wait(NULL, 0, 0, 1, UtVblankHandler, NULL);
1046 ASSERT_TRUE(error != TDM_ERROR_NONE);
1049 TEST_F(TDMVblankWait, VblankWaitFailNullFunc)
1053 SKIP_FLAG(has_output);
1055 error = tdm_vblank_wait(default_vblank, 0, 0, 1, NULL, NULL);
1056 ASSERT_TRUE(error != TDM_ERROR_NONE);
1059 TEST_F(TDMVblankWait, VblankWaitFailWrongVblankPtr)
1061 tdm_error error = TDM_ERROR_BAD_MODULE;
1062 SKIP_FLAG(has_output);
1064 ASSERT_EXIT({error = tdm_vblank_wait((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1065 if (error == TDM_ERROR_NONE)
1069 ::testing::ExitedWithCode(0), "");
1072 void *UtWaitVblankThreadHndl(void *ptr)
1075 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1077 error = tdm_vblank_wait(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1078 if (error != TDM_ERROR_NONE)
1079 vblankWait->utWaitVblankThreadHndlResult = 0;
1081 vblankWait->utWaitVblankThreadHndlResult = 0;
1084 TEST_F(TDMVblankWait, VblankWaitFailInOtherThread)
1088 SKIP_FLAG(has_output);
1090 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankThreadHndl, this));
1092 ASSERT_FALSE(pthread_join(thread, NULL));
1094 ASSERT_FALSE(utWaitVblankThreadHndlResult);
1097 TEST_F(TDMVblankWait, VblankWaitFailDisconnectedOutput)
1101 SKIP_FLAG(has_output);
1103 if (!discon_output_vblank)
1106 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1107 ASSERT_TRUE(error != TDM_ERROR_NONE);
1110 TEST_F(TDMVblankWait, VblankWaitFailDpmsOff)
1114 SKIP_FLAG(has_output);
1116 if (!con_output_vblank)
1119 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1120 ASSERT_TRUE(error == TDM_ERROR_NONE);
1122 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1123 ASSERT_TRUE(error != TDM_ERROR_NONE);
1126 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefresh)
1131 SKIP_FLAG(has_output);
1133 if (!con_output_vblank)
1136 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1137 ASSERT_TRUE(error == TDM_ERROR_NONE);
1139 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1140 ASSERT_TRUE(error == TDM_ERROR_NONE);
1142 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1143 ASSERT_TRUE(error == TDM_ERROR_NONE);
1145 UtHandleVblankEvent();
1147 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1148 ASSERT_TRUE(data == 1);
1151 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1156 SKIP_FLAG(has_output);
1158 if (!con_output_vblank)
1161 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1162 ASSERT_TRUE(error == TDM_ERROR_NONE);
1164 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1165 ASSERT_TRUE(error == TDM_ERROR_NONE);
1167 for (int i = 0; i < 10; ++i) {
1168 utVblankHandlerIsCalled = 0;
1171 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1172 ASSERT_TRUE(error == TDM_ERROR_NONE);
1174 UtHandleVblankEvent();
1176 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1177 ASSERT_TRUE(data == 1);
1181 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutput)
1186 SKIP_FLAG(has_output);
1188 if (!discon_output_vblank)
1191 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1192 ASSERT_TRUE(error == TDM_ERROR_NONE);
1194 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1195 ASSERT_TRUE(error == TDM_ERROR_NONE);
1197 UtHandleVblankEvent();
1199 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1200 ASSERT_TRUE(data == 1);
1203 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutputRepeatedly)
1208 SKIP_FLAG(has_output);
1210 if (!discon_output_vblank)
1213 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1214 ASSERT_TRUE(error == TDM_ERROR_NONE);
1216 for (int i = 0; i < 10; ++i) {
1217 utVblankHandlerIsCalled = 0;
1220 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1221 ASSERT_TRUE(error == TDM_ERROR_NONE);
1223 UtHandleVblankEvent();
1225 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1226 ASSERT_TRUE(data == 1);
1230 TEST_F(TDMVblankWait, VblankWaitSuccessHW)
1235 SKIP_FLAG(has_output);
1237 if (!con_output_vblank)
1240 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1241 ASSERT_TRUE(error == TDM_ERROR_NONE);
1243 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1244 ASSERT_TRUE(error == TDM_ERROR_NONE);
1246 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1247 ASSERT_TRUE(error == TDM_ERROR_NONE);
1249 error = tdm_vblank_set_offset(con_output_vblank, 0);
1250 ASSERT_TRUE(error == TDM_ERROR_NONE);
1252 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1253 ASSERT_TRUE(error == TDM_ERROR_NONE);
1255 UtHandleVblankEvent();
1257 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1258 ASSERT_TRUE(data == 1);
1261 TEST_F(TDMVblankWait, VblankWaitSuccessDestroy)
1266 SKIP_FLAG(has_output);
1268 if (!con_output_vblank)
1271 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1272 ASSERT_TRUE(error == TDM_ERROR_NONE);
1274 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1275 ASSERT_TRUE(error == TDM_ERROR_NONE);
1277 error = tdm_vblank_set_offset(con_output_vblank, 0);
1278 ASSERT_TRUE(error == TDM_ERROR_NONE);
1280 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1281 ASSERT_TRUE(error == TDM_ERROR_NONE);
1283 tdm_vblank_destroy(con_output_vblank);
1285 ASSERT_TRUE(utVblankHandlerIsCalled == 0);
1286 ASSERT_TRUE(data == 0);
1289 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpms)
1294 SKIP_FLAG(has_output);
1296 if (!con_output_vblank)
1299 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1300 ASSERT_TRUE(error == TDM_ERROR_NONE);
1302 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1303 ASSERT_TRUE(error == TDM_ERROR_NONE);
1305 error = tdm_vblank_set_offset(con_output_vblank, 0);
1306 ASSERT_TRUE(error == TDM_ERROR_NONE);
1308 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1309 ASSERT_TRUE(error == TDM_ERROR_NONE);
1311 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1312 ASSERT_TRUE(error == TDM_ERROR_NONE);
1314 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1315 ASSERT_TRUE(data == 1);
1318 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpmsWithEnableFake)
1323 SKIP_FLAG(has_output);
1325 if (!con_output_vblank)
1328 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1329 ASSERT_TRUE(error == TDM_ERROR_NONE);
1331 error = tdm_vblank_set_enable_fake(con_output_vblank, 1);
1332 ASSERT_TRUE(error == TDM_ERROR_NONE);
1334 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1335 ASSERT_TRUE(error == TDM_ERROR_NONE);
1337 error = tdm_vblank_set_offset(con_output_vblank, 0);
1338 ASSERT_TRUE(error == TDM_ERROR_NONE);
1340 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1341 ASSERT_TRUE(error == TDM_ERROR_NONE);
1343 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1344 ASSERT_TRUE(error == TDM_ERROR_NONE);
1346 UtHandleVblankEvent();
1348 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1349 ASSERT_TRUE(data == 1);
1352 TEST_F(TDMVblankWait, VblankWaitSuccessHWRepeatedly)
1357 SKIP_FLAG(has_output);
1359 if (!con_output_vblank)
1362 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1363 ASSERT_TRUE(error == TDM_ERROR_NONE);
1365 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1366 ASSERT_TRUE(error == TDM_ERROR_NONE);
1368 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1369 ASSERT_TRUE(error == TDM_ERROR_NONE);
1371 error = tdm_vblank_set_offset(con_output_vblank, 0);
1372 ASSERT_TRUE(error == TDM_ERROR_NONE);
1374 for (int i = 0; i < 10; ++i) {
1375 utVblankHandlerIsCalled = 0;
1378 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1379 ASSERT_TRUE(error == TDM_ERROR_NONE);
1381 UtHandleVblankEvent();
1383 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1384 ASSERT_TRUE(data == 1);
1388 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZero)
1393 SKIP_FLAG(has_output);
1395 if (!con_output_vblank)
1398 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1399 ASSERT_TRUE(error == TDM_ERROR_NONE);
1401 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1402 ASSERT_TRUE(error == TDM_ERROR_NONE);
1404 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1405 ASSERT_TRUE(error == TDM_ERROR_NONE);
1407 error = tdm_vblank_set_offset(con_output_vblank, 10);
1408 ASSERT_TRUE(error == TDM_ERROR_NONE);
1410 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1411 ASSERT_TRUE(error == TDM_ERROR_NONE);
1413 UtHandleVblankEvent();
1415 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1416 ASSERT_TRUE(data == 1);
1419 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1424 SKIP_FLAG(has_output);
1426 if (!con_output_vblank)
1429 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1430 ASSERT_TRUE(error == TDM_ERROR_NONE);
1432 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1433 ASSERT_TRUE(error == TDM_ERROR_NONE);
1435 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1436 ASSERT_TRUE(error == TDM_ERROR_NONE);
1438 error = tdm_vblank_set_offset(con_output_vblank, 10);
1439 ASSERT_TRUE(error == TDM_ERROR_NONE);
1441 for (int i = 0; i < 10; ++i) {
1442 utVblankHandlerIsCalled = 0;
1445 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1446 ASSERT_TRUE(error == TDM_ERROR_NONE);
1448 UtHandleVblankEvent();
1450 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1451 ASSERT_TRUE(data == 1);
1455 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefresh)
1460 SKIP_FLAG(has_output);
1462 if (!con_output_vblank)
1465 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1466 ASSERT_TRUE(error == TDM_ERROR_NONE);
1468 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1469 ASSERT_TRUE(error == TDM_ERROR_NONE);
1471 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1472 ASSERT_TRUE(error == TDM_ERROR_NONE);
1474 UtHandleVblankEvent();
1476 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1477 ASSERT_TRUE(data == 1);
1480 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1485 SKIP_FLAG(has_output);
1487 if (!con_output_vblank)
1490 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1491 ASSERT_TRUE(error == TDM_ERROR_NONE);
1493 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1494 ASSERT_TRUE(error == TDM_ERROR_NONE);
1496 for (int i = 0; i < 10; ++i) {
1497 utVblankHandlerIsCalled = 0;
1500 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1501 ASSERT_TRUE(error == TDM_ERROR_NONE);
1503 UtHandleVblankEvent();
1505 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1506 ASSERT_TRUE(data == 1);
1510 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutput)
1515 SKIP_FLAG(has_output);
1517 if (!discon_output_vblank)
1520 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1521 ASSERT_TRUE(error == TDM_ERROR_NONE);
1523 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1524 ASSERT_TRUE(error == TDM_ERROR_NONE);
1526 UtHandleVblankEvent();
1528 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1529 ASSERT_TRUE(data == 1);
1532 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutputRepeatedly)
1537 SKIP_FLAG(has_output);
1539 if (!discon_output_vblank)
1542 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1543 ASSERT_TRUE(error == TDM_ERROR_NONE);
1545 for (int i = 0; i < 10; ++i) {
1546 utVblankHandlerIsCalled = 0;
1549 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1550 ASSERT_TRUE(error == TDM_ERROR_NONE);
1552 UtHandleVblankEvent();
1554 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1555 ASSERT_TRUE(data == 1);
1559 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHW)
1564 SKIP_FLAG(has_output);
1566 if (!con_output_vblank)
1569 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1570 ASSERT_TRUE(error == TDM_ERROR_NONE);
1572 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1573 ASSERT_TRUE(error == TDM_ERROR_NONE);
1575 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1576 ASSERT_TRUE(error == TDM_ERROR_NONE);
1578 error = tdm_vblank_set_offset(con_output_vblank, 0);
1579 ASSERT_TRUE(error == TDM_ERROR_NONE);
1581 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1582 ASSERT_TRUE(error == TDM_ERROR_NONE);
1584 UtHandleVblankEvent();
1586 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1587 ASSERT_TRUE(data == 1);
1590 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHWRepeatedly)
1595 SKIP_FLAG(has_output);
1597 if (!con_output_vblank)
1600 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1601 ASSERT_TRUE(error == TDM_ERROR_NONE);
1603 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1604 ASSERT_TRUE(error == TDM_ERROR_NONE);
1606 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1607 ASSERT_TRUE(error == TDM_ERROR_NONE);
1609 error = tdm_vblank_set_offset(con_output_vblank, 0);
1610 ASSERT_TRUE(error == TDM_ERROR_NONE);
1612 for (int i = 0; i < 10; ++i) {
1613 utVblankHandlerIsCalled = 0;
1616 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1617 ASSERT_TRUE(error == TDM_ERROR_NONE);
1619 UtHandleVblankEvent();
1621 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1622 ASSERT_TRUE(data == 1);
1626 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZero)
1631 SKIP_FLAG(has_output);
1633 if (!con_output_vblank)
1636 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1637 ASSERT_TRUE(error == TDM_ERROR_NONE);
1639 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1640 ASSERT_TRUE(error == TDM_ERROR_NONE);
1642 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1643 ASSERT_TRUE(error == TDM_ERROR_NONE);
1645 error = tdm_vblank_set_offset(con_output_vblank, 10);
1646 ASSERT_TRUE(error == TDM_ERROR_NONE);
1648 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1649 ASSERT_TRUE(error == TDM_ERROR_NONE);
1651 UtHandleVblankEvent();
1653 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1654 ASSERT_TRUE(data == 1);
1657 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1662 SKIP_FLAG(has_output);
1664 if (!con_output_vblank)
1667 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1668 ASSERT_TRUE(error == TDM_ERROR_NONE);
1670 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1671 ASSERT_TRUE(error == TDM_ERROR_NONE);
1673 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1674 ASSERT_TRUE(error == TDM_ERROR_NONE);
1676 error = tdm_vblank_set_offset(con_output_vblank, 10);
1677 ASSERT_TRUE(error == TDM_ERROR_NONE);
1679 for (int i = 0; i < 10; ++i) {
1680 utVblankHandlerIsCalled = 0;
1683 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1684 ASSERT_TRUE(error == TDM_ERROR_NONE);
1686 UtHandleVblankEvent();
1688 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1689 ASSERT_TRUE(data == 1);
1693 /* tdm_vblank_wait_seq() */
1695 TEST_F(TDMVblank, VblankWaitSeqFailNullAll)
1699 SKIP_FLAG(has_output);
1701 error = tdm_vblank_wait_seq(NULL, 0, 0, 0, NULL, NULL);
1702 ASSERT_TRUE(error != TDM_ERROR_NONE);
1705 TEST_F(TDMVblankWait, VblankWaitSeqFailNullVblank)
1709 SKIP_FLAG(has_output);
1711 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1712 ASSERT_TRUE(error != TDM_ERROR_NONE);
1715 TEST_F(TDMVblankWait, VblankWaitSeqFailWrongVblankPtr)
1717 tdm_error error = TDM_ERROR_BAD_MODULE;
1718 SKIP_FLAG(has_output);
1720 ASSERT_EXIT({error = tdm_vblank_wait_seq((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1721 if (error == TDM_ERROR_NONE)
1725 ::testing::ExitedWithCode(0), "");
1728 TEST_F(TDMVblankWait, VblankWaitSeqFailNullFunc)
1732 SKIP_FLAG(has_output);
1734 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1735 ASSERT_TRUE(error != TDM_ERROR_NONE);
1738 void *UtWaitVblankSeqThreadHndl(void *ptr)
1741 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1743 error = tdm_vblank_wait_seq(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1744 if (error != TDM_ERROR_NONE)
1745 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1747 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1750 TEST_F(TDMVblankWait, VblankWaitSeqFailInOtherThread)
1754 SKIP_FLAG(has_output);
1756 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankSeqThreadHndl, this));
1758 ASSERT_FALSE(pthread_join(thread, NULL));
1760 ASSERT_FALSE(utWaitVblankSeqThreadHndlResult);
1763 TEST_F(TDMVblankWait, VblankWaitSeqFailDisconnectedOutput)
1767 SKIP_FLAG(has_output);
1769 if (!discon_output_vblank)
1772 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1773 ASSERT_TRUE(error != TDM_ERROR_NONE);
1776 TEST_F(TDMVblankWait, VblankWaitSeqFailDpmsOff)
1780 SKIP_FLAG(has_output);
1782 if (!con_output_vblank)
1785 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1786 ASSERT_TRUE(error == TDM_ERROR_NONE);
1788 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1789 ASSERT_TRUE(error != TDM_ERROR_NONE);
1792 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefresh)
1797 SKIP_FLAG(has_output);
1799 if (!con_output_vblank)
1802 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1803 ASSERT_TRUE(error == TDM_ERROR_NONE);
1805 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1806 ASSERT_TRUE(error == TDM_ERROR_NONE);
1808 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1809 ASSERT_TRUE(error == TDM_ERROR_NONE);
1811 UtHandleVblankEvent();
1813 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1814 ASSERT_TRUE(data == 1);
1817 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefreshRepeatedly)
1822 SKIP_FLAG(has_output);
1824 if (!con_output_vblank)
1827 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1828 ASSERT_TRUE(error == TDM_ERROR_NONE);
1830 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1831 ASSERT_TRUE(error == TDM_ERROR_NONE);
1833 for (int i = 1; i < 10; ++i) {
1834 utVblankHandlerIsCalled = 0;
1837 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1838 ASSERT_TRUE(error == TDM_ERROR_NONE);
1840 UtHandleVblankEvent();
1842 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1843 ASSERT_TRUE(data == 1);
1847 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutput)
1852 SKIP_FLAG(has_output);
1854 if (!discon_output_vblank)
1857 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1858 ASSERT_TRUE(error == TDM_ERROR_NONE);
1860 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1861 ASSERT_TRUE(error == TDM_ERROR_NONE);
1863 UtHandleVblankEvent();
1865 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1866 ASSERT_TRUE(data == 1);
1869 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutputRepeatedly)
1874 SKIP_FLAG(has_output);
1876 if (!discon_output_vblank)
1879 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1880 ASSERT_TRUE(error == TDM_ERROR_NONE);
1882 for (int i = 1; i < 10; ++i) {
1883 utVblankHandlerIsCalled = 0;
1886 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, i, UtVblankHandler, &data);
1887 ASSERT_TRUE(error == TDM_ERROR_NONE);
1889 UtHandleVblankEvent();
1891 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1892 ASSERT_TRUE(data == 1);
1896 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHW)
1901 SKIP_FLAG(has_output);
1903 if (!con_output_vblank)
1906 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1907 ASSERT_TRUE(error == TDM_ERROR_NONE);
1909 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1910 ASSERT_TRUE(error == TDM_ERROR_NONE);
1912 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1913 ASSERT_TRUE(error == TDM_ERROR_NONE);
1915 error = tdm_vblank_set_offset(con_output_vblank, 0);
1916 ASSERT_TRUE(error == TDM_ERROR_NONE);
1918 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1919 ASSERT_TRUE(error == TDM_ERROR_NONE);
1921 UtHandleVblankEvent();
1923 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1924 ASSERT_TRUE(data == 1);
1927 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHWRepeatedly)
1932 SKIP_FLAG(has_output);
1934 if (!con_output_vblank)
1937 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1938 ASSERT_TRUE(error == TDM_ERROR_NONE);
1940 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1941 ASSERT_TRUE(error == TDM_ERROR_NONE);
1943 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1944 ASSERT_TRUE(error == TDM_ERROR_NONE);
1946 error = tdm_vblank_set_offset(con_output_vblank, 0);
1947 ASSERT_TRUE(error == TDM_ERROR_NONE);
1949 for (int i = 1; i < 10; ++i) {
1950 utVblankHandlerIsCalled = 0;
1953 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1954 ASSERT_TRUE(error == TDM_ERROR_NONE);
1956 UtHandleVblankEvent();
1958 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1959 ASSERT_TRUE(data == 1);
1963 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZero)
1968 SKIP_FLAG(has_output);
1970 if (!con_output_vblank)
1973 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1974 ASSERT_TRUE(error == TDM_ERROR_NONE);
1976 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1977 ASSERT_TRUE(error == TDM_ERROR_NONE);
1979 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1980 ASSERT_TRUE(error == TDM_ERROR_NONE);
1982 error = tdm_vblank_set_offset(con_output_vblank, 10);
1983 ASSERT_TRUE(error == TDM_ERROR_NONE);
1985 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1986 ASSERT_TRUE(error == TDM_ERROR_NONE);
1988 UtHandleVblankEvent();
1990 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1991 ASSERT_TRUE(data == 1);
1994 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZeroRepeatedly)
1999 SKIP_FLAG(has_output);
2001 if (!con_output_vblank)
2004 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2005 ASSERT_TRUE(error == TDM_ERROR_NONE);
2007 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2008 ASSERT_TRUE(error == TDM_ERROR_NONE);
2010 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2011 ASSERT_TRUE(error == TDM_ERROR_NONE);
2013 error = tdm_vblank_set_offset(con_output_vblank, 10);
2014 ASSERT_TRUE(error == TDM_ERROR_NONE);
2016 for (int i = 1; i < 10; ++i) {
2017 utVblankHandlerIsCalled = 0;
2019 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2020 ASSERT_TRUE(error == TDM_ERROR_NONE);
2022 UtHandleVblankEvent();
2024 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2025 ASSERT_TRUE(data == 1);
2029 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithSameSeq)
2034 SKIP_FLAG(has_output);
2036 if (!con_output_vblank)
2039 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2040 ASSERT_TRUE(error == TDM_ERROR_NONE);
2042 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2043 ASSERT_TRUE(error == TDM_ERROR_NONE);
2045 error = tdm_vblank_set_offset(con_output_vblank, 0);
2046 ASSERT_TRUE(error == TDM_ERROR_NONE);
2048 for (int i = 1; i < 10; ++i) {
2049 utVblankHandlerIsCalled = 0;
2052 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 2, UtVblankHandler, &data);
2053 ASSERT_TRUE(error == TDM_ERROR_NONE);
2055 UtHandleVblankEvent();
2057 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2058 ASSERT_TRUE(data == 1);
2062 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithBigFps)
2067 SKIP_FLAG(has_output);
2069 if (!con_output_vblank)
2072 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2073 ASSERT_TRUE(error == TDM_ERROR_NONE);
2075 error = tdm_vblank_set_fps(con_output_vblank, 5000);
2076 ASSERT_TRUE(error == TDM_ERROR_NONE);
2078 for (int i = 1; i < 10; ++i) {
2079 utVblankHandlerIsCalled = 0;
2082 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2083 ASSERT_TRUE(error == TDM_ERROR_NONE);
2088 UtHandleVblankEvent();
2090 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2091 ASSERT_TRUE(data == 1);
2095 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithDelay)
2100 SKIP_FLAG(has_output);
2102 if (!con_output_vblank)
2105 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2106 ASSERT_TRUE(error == TDM_ERROR_NONE);
2108 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2109 ASSERT_TRUE(error == TDM_ERROR_NONE);
2111 for (int i = 1; i < 10; ++i) {
2112 utVblankHandlerIsCalled = 0;
2115 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2116 ASSERT_TRUE(error == TDM_ERROR_NONE);
2120 UtHandleVblankEvent();
2122 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2123 ASSERT_TRUE(data == 1);