1 /**************************************************************************
3 * Copyright 2017 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>
8 * Contact: Sergey Sizonov <s.sizonov@samsung.com>
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the
12 * "Software"), to deal in the Software without restriction, including
13 * without limitation the rights to use, copy, modify, merge, publish,
14 * distribute, sub license, and/or sell copies of the Software, and to
15 * permit persons to whom the Software is furnished to do so, subject to
16 * the following conditions:
18 * The above copyright notice and this permission notice (including the
19 * next paragraph) shall be included in all copies or substantial portions
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
34 #include <sys/signalfd.h>
36 #include <sys/prctl.h>
39 #include "tdm_client.h"
45 TDM_UT_PIPE_MSG_REPLY,
46 TDM_UT_PIPE_MSG_SERVER_READY,
47 TDM_UT_PIPE_MSG_SERVER_FAILED,
48 TDM_UT_PIPE_MSG_DPMS_ON,
49 TDM_UT_PIPE_MSG_DPMS_OFF,
50 TDM_UT_PIPE_MSG_TERMINATE_SERVER,
53 static int _ut_tdm_pipe_read_msg(int fd);
54 static bool _ut_tdm_pipe_write_msg(int fd, int reply_fd, int msg);
55 static pid_t _ut_tdm_client_server_fork(int *pipe_to_parent, int *pipe_to_child);
57 class TDMClient : public TDMEnv
60 static pid_t server_pid;
62 /* 0: read, 1: write */
63 static int pipe_parent[2];
64 static int pipe_child[2];
67 tdm_client_output *output;
68 tdm_client_vblank *vblank;
70 double vrefresh_interval, start, end;
76 bool PrepareClient(void);
77 bool PrepareOutput(void);
78 bool PrepareVblank(void);
80 static void TearDownTestCase(void);
81 static void ServerFork(void);
82 static void ServerKill(void);
85 pid_t TDMClient::server_pid = -1;
86 int TDMClient::pipe_parent[2] = {-1, -1};
87 int TDMClient::pipe_child[2] = {-1, -1};
89 void TDMClient::TearDownTestCase(void)
94 void TDMClient::ServerFork(void)
99 server_pid = _ut_tdm_client_server_fork(pipe_parent, pipe_child);
100 ASSERT_GT(server_pid, 0);
103 void TDMClient::ServerKill(void)
105 if (pipe_child[0] >= 0)
106 close(pipe_child[0]);
107 if (pipe_child[1] >= 0) {
108 if (server_pid > 0) {
109 bool ret = _ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_TERMINATE_SERVER);
111 if (waitpid(server_pid, NULL, 0) == server_pid)
112 TDM_INFO("*** server terminated ***");
114 TDM_ERR("*** failed to terminate server ***");
116 if (kill(server_pid, 9) < 0)
117 TDM_ERR("*** failed to kill server ***");
120 close(pipe_child[1]);
123 if (pipe_parent[0] >= 0)
124 close(pipe_parent[0]);
125 if (pipe_parent[1] >= 0)
126 close(pipe_parent[1]);
129 pipe_parent[0] = pipe_parent[1] = -1;
130 pipe_child[0] = pipe_child[1] = -1;
133 TDMClient::TDMClient()
138 vrefresh_interval = start = end = 0.0;
141 void TDMClient::SetUp(void)
145 if (server_pid == -1)
149 void TDMClient::TearDown(void)
152 tdm_client_vblank_destroy(vblank);
154 tdm_client_destroy(client);
159 bool TDMClient::PrepareClient(void)
162 client = tdm_client_create(&ret);
163 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
164 TDM_UT_RETURN_FALSE_IF_FAIL(client != NULL);
169 bool TDMClient::PrepareOutput(void)
173 TDM_UT_RETURN_FALSE_IF_FAIL(client != NULL);
175 output = tdm_client_get_output(client, NULL, &ret);
176 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
177 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
182 bool TDMClient::PrepareVblank(void)
185 unsigned int refresh;
187 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
189 vblank = tdm_client_output_create_vblank(output, &ret);
190 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
191 TDM_UT_RETURN_FALSE_IF_FAIL(vblank != NULL);
193 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_client_output_get_refresh_rate(output, &refresh) == TDM_ERROR_NONE);
194 TDM_UT_RETURN_FALSE_IF_FAIL(refresh > 0);
196 vrefresh_interval = 1.0 / (double)refresh;
197 TDM_UT_RETURN_FALSE_IF_FAIL(vrefresh_interval > 0);
203 _ut_tdm_pipe_read_msg(int fd)
209 len = read(fd, &msg, sizeof msg);
210 } while (len < 0 && errno == EINTR);
213 msg = TDM_UT_PIPE_MSG_NONE;
219 _ut_tdm_pipe_write_msg(int fd, int reply_fd, int msg)
221 ssize_t len = write(fd, &msg, sizeof msg);
222 TDM_UT_RETURN_FALSE_IF_FAIL(len == sizeof msg);
225 int reply = _ut_tdm_pipe_read_msg(reply_fd);
226 TDM_UT_RETURN_FALSE_IF_FAIL(reply == TDM_UT_PIPE_MSG_REPLY);
233 _ut_tdm_server_set_output_dpms(tdm_display *dpy, int msg)
237 tdm_output_dpms dpms;
239 output = tdm_display_find_output(dpy, "primary", &ret);
240 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
241 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
243 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_dpms(output, &dpms) == TDM_ERROR_NONE);
246 case TDM_UT_PIPE_MSG_DPMS_ON:
247 if (dpms != TDM_OUTPUT_DPMS_ON)
248 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_ON) == TDM_ERROR_NONE);
250 case TDM_UT_PIPE_MSG_DPMS_OFF:
251 if (dpms != TDM_OUTPUT_DPMS_OFF)
252 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF) == TDM_ERROR_NONE);
262 _ut_tdm_server_run(int *pipe_parent, int *pipe_child)
264 tdm_display *dpy = NULL;
266 struct pollfd fds[2];
268 int output_count = 0;
270 dpy = tdm_display_init(&ret);
271 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed);
272 TDM_UT_GOTO_IF_FAIL(dpy != NULL, failed);
274 TDM_UT_GOTO_IF_FAIL(tdm_display_get_output_count(dpy, &output_count) == TDM_ERROR_NONE, failed);
276 for (int o = 0; o < output_count; o++) {
277 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
278 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed);
279 TDM_UT_GOTO_IF_FAIL(output != NULL, failed);
281 if (!ut_tdm_output_is_connected(output))
284 TDM_UT_GOTO_IF_FAIL(ut_tdm_output_prepare(dpy, output, true) == true, failed);
287 TDM_UT_GOTO_IF_FAIL(_ut_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_SERVER_READY) == true, done);
289 TDM_INFO("*** server ready ***");
291 ret = tdm_display_get_fd(dpy, &tdm_fd);
292 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
294 fds[0].events = POLLIN;
298 fds[1].events = POLLIN;
299 fds[1].fd = pipe_child[0];
303 /* make sure all events are flushed to clients before falling in sleep */
304 tdm_display_flush(dpy);
306 err = poll(fds, 2, -1);
308 if (errno == EINTR || errno == EAGAIN) {
311 TDM_ERR("server-process: poll failed: %m\n");
316 if (fds[0].revents & POLLIN)
317 ret = ut_tdm_display_handle_events(dpy);
319 if (fds[1].revents & POLLIN) {
320 int msg = _ut_tdm_pipe_read_msg(pipe_child[0]);
321 _ut_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_REPLY);
324 case TDM_UT_PIPE_MSG_DPMS_ON:
325 case TDM_UT_PIPE_MSG_DPMS_OFF:
326 _ut_tdm_server_set_output_dpms(dpy, msg);
328 case TDM_UT_PIPE_MSG_TERMINATE_SERVER:
338 tdm_display_deinit(dpy);
342 TDM_UT_GOTO_IF_FAIL(_ut_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_SERVER_FAILED) == true, done);
343 TDM_INFO("*** server failed ***");
346 tdm_display_deinit(dpy);
351 static void _ut_tdm_client_sig_handler(int sig)
353 TDM_UT_ERR("got signal: %d", sig);
354 kill(TDMClient::server_pid, 9);
359 _ut_tdm_client_server_fork(int *pipe_parent, int *pipe_child)
364 TDM_UT_GOTO_IF_FAIL(pipe(pipe_parent) == 0, failed);
365 TDM_UT_GOTO_IF_FAIL(pipe(pipe_child) == 0, failed);
367 signal(SIGCHLD, SIG_IGN);
368 signal(SIGSEGV, _ut_tdm_client_sig_handler);
370 prctl(PR_SET_PDEATHSIG, SIGHUP);
373 TDM_UT_GOTO_IF_FAIL(pid >= 0, failed);
376 _ut_tdm_server_run(pipe_parent, pipe_child);
377 close(pipe_child[0]);
378 close(pipe_child[1]);
379 close(pipe_parent[0]);
380 close(pipe_parent[1]);
382 #ifdef TIZEN_TEST_GCOV
389 msg = _ut_tdm_pipe_read_msg(pipe_parent[0]);
390 TDM_UT_GOTO_IF_FAIL(msg == TDM_UT_PIPE_MSG_SERVER_READY, failed);
392 TDM_INFO("*** server fork done ***");
400 TEST_P(TDMClient, ClientCreate)
404 client = tdm_client_create(&ret);
405 ASSERT_EQ(ret, TDM_ERROR_NONE);
406 ASSERT_NE(client, NULL);
409 TEST_P(TDMClient, ClientCreateNullOther)
411 client = tdm_client_create(NULL);
412 ASSERT_NE(client, NULL);
415 TEST_P(TDMClient, ClientDestroy)
419 client = tdm_client_create(&ret);
420 ASSERT_EQ(ret, TDM_ERROR_NONE);
421 ASSERT_NE(client, NULL);
423 tdm_client_destroy(client);
427 TEST_P(TDMClient, ClientNullObject)
429 tdm_client_destroy(NULL);
432 /* tdm_client_get_fd */
433 TEST_P(TDMClient, ClientGetFd)
435 int fd = TDM_UT_INVALID_VALUE;
437 ASSERT_EQ(PrepareClient(), true);
439 ASSERT_EQ(tdm_client_get_fd(client, &fd), TDM_ERROR_NONE);
443 TEST_P(TDMClient, ClientGetFdNullObject)
445 int fd = TDM_UT_INVALID_VALUE;
446 ASSERT_EQ(tdm_client_get_fd(NULL, &fd), TDM_ERROR_INVALID_PARAMETER);
447 ASSERT_EQ(fd, TDM_UT_INVALID_VALUE);
450 TEST_P(TDMClient, ClientGetFdNullOther)
452 ASSERT_EQ(PrepareClient(), true);
454 ASSERT_EQ(tdm_client_get_fd(client, NULL), TDM_ERROR_INVALID_PARAMETER);
458 _ut_tdm_client_vblank_cb(unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data)
460 bool *done = (bool *)user_data;
465 /* tdm_client_handle_events_timeout */
466 TEST_P(TDMClient, ClientHandleEvent)
470 ASSERT_EQ(PrepareClient(), true);
472 ASSERT_EQ(tdm_client_wait_vblank(client, NULL, 1, 1, 0, _ut_tdm_client_vblank_cb, &done), TDM_ERROR_NONE);
473 ASSERT_EQ(done, false);
476 ASSERT_EQ(tdm_client_handle_events(client), TDM_ERROR_NONE);
479 TEST_P(TDMClient, ClientHandleEventNullObject)
481 ASSERT_EQ(tdm_client_handle_events(NULL), TDM_ERROR_INVALID_PARAMETER);
484 /* tdm_client_wait_vblank, deprecated */
485 TEST_P(TDMClient, ClientWaitVblank)
489 ASSERT_EQ(PrepareClient(), true);
491 ASSERT_EQ(tdm_client_wait_vblank(client, NULL, 1, 1, 0, _ut_tdm_client_vblank_cb, &done), TDM_ERROR_NONE);
492 ASSERT_EQ(done, false);
495 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
498 /* tdm_client_get_output */
499 TEST_P(TDMClient, ClientGetOutput)
503 ASSERT_EQ(PrepareClient(), true);
505 output = tdm_client_get_output(client, NULL, &ret);
506 ASSERT_EQ(ret, TDM_ERROR_NONE);
507 ASSERT_NE(output, NULL);
510 TEST_P(TDMClient, ClientGetOutputPrimary)
514 ASSERT_EQ(PrepareClient(), true);
516 output = tdm_client_get_output(client, (char*)"primary", &ret);
517 ASSERT_EQ(ret, TDM_ERROR_NONE);
518 ASSERT_NE(output, NULL);
521 TEST_P(TDMClient, ClientGetOutputDefault)
525 ASSERT_EQ(PrepareClient(), true);
527 output = tdm_client_get_output(client, (char*)"default", &ret);
528 ASSERT_EQ(ret, TDM_ERROR_NONE);
529 ASSERT_NE(output, NULL);
532 TEST_P(TDMClient, ClientGetOutputInvalidName)
536 ASSERT_EQ(PrepareClient(), true);
538 output = tdm_client_get_output(client, (char*)"invalid", &ret);
539 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
540 ASSERT_EQ(output, NULL);
543 TEST_P(TDMClient, ClientGetOutputNullObject)
547 output = tdm_client_get_output(NULL, NULL, &ret);
548 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
549 ASSERT_EQ(output, NULL);
552 TEST_P(TDMClient, ClientGetOutputNullOther)
554 ASSERT_EQ(PrepareClient(), true);
556 output = tdm_client_get_output(client, NULL, NULL);
557 ASSERT_NE(output, NULL);
561 _ut_tdm_client_output_change_dpms_cb(tdm_client_output *output,
562 tdm_output_change_type type,
566 bool *done = (bool *)user_data;
569 case TDM_OUTPUT_CHANGE_DPMS:
578 /* tdm_client_output_add_change_handler */
579 TEST_P(TDMClient, ClientOutputAddChangeHandler)
582 tdm_output_dpms dpms;
584 ASSERT_EQ(PrepareClient(), true);
585 ASSERT_EQ(PrepareOutput(), true);
587 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb, &done), TDM_ERROR_NONE);
588 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
591 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
593 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
594 ASSERT_EQ(dpms, TDM_OUTPUT_DPMS_OFF);
596 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
597 while (dpms != TDM_OUTPUT_DPMS_ON) {
598 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
599 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
603 TEST_P(TDMClient, ClientOutputAddChangeHandlerTwice)
605 ASSERT_EQ(PrepareClient(), true);
606 ASSERT_EQ(PrepareOutput(), true);
608 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_NONE);
609 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_BAD_REQUEST);
612 TEST_P(TDMClient, ClientOutputAddChangeHandlerNullObject)
614 ASSERT_EQ(tdm_client_output_add_change_handler(NULL, _ut_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
617 TEST_P(TDMClient, ClientOutputAddChangeHandlerNullOther)
619 ASSERT_EQ(PrepareClient(), true);
620 ASSERT_EQ(PrepareOutput(), true);
622 ASSERT_EQ(tdm_client_output_add_change_handler(output, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
625 /* tdm_client_output_remove_change_handler */
626 TEST_P(TDMClient, ClientOutputRemoveChangeHandler)
628 ASSERT_EQ(PrepareClient(), true);
629 ASSERT_EQ(PrepareOutput(), true);
631 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_NONE);
632 tdm_client_output_remove_change_handler(output, _ut_tdm_client_output_change_dpms_cb, NULL);
635 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerDifferentData)
637 bool done = (bool)TDM_UT_INVALID_VALUE;
639 ASSERT_EQ(PrepareClient(), true);
640 ASSERT_EQ(PrepareOutput(), true);
642 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb, &done), TDM_ERROR_NONE);
643 tdm_client_output_remove_change_handler(output, _ut_tdm_client_output_change_dpms_cb, NULL);
647 _ut_tdm_client_output_change_dpms_cb2(tdm_client_output *output,
648 tdm_output_change_type type,
653 case TDM_OUTPUT_CHANGE_DPMS:
654 tdm_client_output_remove_change_handler(output, _ut_tdm_client_output_change_dpms_cb2, user_data);
661 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerInHandler)
663 tdm_output_dpms dpms = TDM_OUTPUT_DPMS_ON;
665 ASSERT_EQ(PrepareClient(), true);
666 ASSERT_EQ(PrepareOutput(), true);
668 ASSERT_EQ(tdm_client_output_add_change_handler(output, _ut_tdm_client_output_change_dpms_cb2, NULL), TDM_ERROR_NONE);
669 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
670 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
671 while (dpms != TDM_OUTPUT_DPMS_OFF) {
672 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
673 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
676 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
677 while (dpms != TDM_OUTPUT_DPMS_ON)
678 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
681 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerNullObject)
683 tdm_client_output_remove_change_handler(NULL, _ut_tdm_client_output_change_dpms_cb, NULL);
686 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerNullOther)
688 ASSERT_EQ(PrepareClient(), true);
689 ASSERT_EQ(PrepareOutput(), true);
691 tdm_client_output_remove_change_handler(output, NULL, NULL);
694 /* tdm_client_output_get_refresh_rate */
695 TEST_P(TDMClient, ClientOutputGetRefreshRate)
697 unsigned int refresh = 0;
699 ASSERT_EQ(PrepareClient(), true);
700 ASSERT_EQ(PrepareOutput(), true);
702 ASSERT_EQ(tdm_client_output_get_refresh_rate(output, &refresh), TDM_ERROR_NONE);
703 ASSERT_GT(refresh, 0);
706 TEST_P(TDMClient, ClientOutputGetRefreshRateNullObject)
708 unsigned int refresh = (unsigned int)TDM_UT_INVALID_VALUE;
710 ASSERT_EQ(tdm_client_output_get_refresh_rate(NULL, &refresh), TDM_ERROR_INVALID_PARAMETER);
711 ASSERT_EQ(refresh, (unsigned int)TDM_UT_INVALID_VALUE);
714 TEST_P(TDMClient, ClientOutputGetRefreshRateNullOther)
716 ASSERT_EQ(PrepareClient(), true);
717 ASSERT_EQ(PrepareOutput(), true);
719 ASSERT_EQ(tdm_client_output_get_refresh_rate(output, NULL), TDM_ERROR_INVALID_PARAMETER);
722 /* tdm_client_output_get_refresh_rate */
723 TEST_P(TDMClient, ClientOutputGetConnStatus)
725 tdm_output_conn_status status = (tdm_output_conn_status)TDM_UT_INVALID_VALUE;
727 ASSERT_EQ(PrepareClient(), true);
728 ASSERT_EQ(PrepareOutput(), true);
730 ASSERT_EQ(tdm_client_output_get_conn_status(output, &status), TDM_ERROR_NONE);
731 ASSERT_NE(status, (tdm_output_conn_status)TDM_UT_INVALID_VALUE);
734 TEST_P(TDMClient, ClientOutputGetConnStatusNullObject)
736 tdm_output_conn_status status = (tdm_output_conn_status)TDM_UT_INVALID_VALUE;
738 ASSERT_EQ(tdm_client_output_get_conn_status(NULL, &status), TDM_ERROR_INVALID_PARAMETER);
739 ASSERT_EQ(status, (tdm_output_conn_status)TDM_UT_INVALID_VALUE);
742 TEST_P(TDMClient, ClientOutputGetConnStatusNullOther)
744 ASSERT_EQ(PrepareClient(), true);
745 ASSERT_EQ(PrepareOutput(), true);
747 ASSERT_EQ(tdm_client_output_get_conn_status(output, NULL), TDM_ERROR_INVALID_PARAMETER);
750 /* tdm_client_output_get_dpms */
751 TEST_P(TDMClient, ClientOutputGetDpms)
753 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
755 ASSERT_EQ(PrepareClient(), true);
756 ASSERT_EQ(PrepareOutput(), true);
758 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
759 ASSERT_NE(dpms, (tdm_output_dpms)TDM_UT_INVALID_VALUE);
762 TEST_P(TDMClient, ClientOutputGetDpmsNullObject)
764 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
766 ASSERT_EQ(tdm_client_output_get_dpms(NULL, &dpms), TDM_ERROR_INVALID_PARAMETER);
767 ASSERT_EQ(dpms, (tdm_output_dpms)TDM_UT_INVALID_VALUE);
770 TEST_P(TDMClient, ClientOutputGetDpmsNullOther)
772 ASSERT_EQ(PrepareClient(), true);
773 ASSERT_EQ(PrepareOutput(), true);
775 ASSERT_EQ(tdm_client_output_get_dpms(output, NULL), TDM_ERROR_INVALID_PARAMETER);
778 /* tdm_client_output_create_vblank */
779 TEST_P(TDMClient, ClientOutputCreateVblank)
783 ASSERT_EQ(PrepareClient(), true);
784 ASSERT_EQ(PrepareOutput(), true);
786 vblank = tdm_client_output_create_vblank(output, &ret);
787 ASSERT_EQ(ret, TDM_ERROR_NONE);
788 ASSERT_NE(vblank, NULL);
791 TEST_P(TDMClient, ClientOutputCreateVblankNullObject)
795 vblank = tdm_client_output_create_vblank(NULL, &ret);
796 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
797 ASSERT_EQ(vblank, NULL);
800 TEST_P(TDMClient, ClientOutputCreateVblankNullOther)
802 ASSERT_EQ(PrepareClient(), true);
803 ASSERT_EQ(PrepareOutput(), true);
805 vblank = tdm_client_output_create_vblank(output, NULL);
806 ASSERT_NE(vblank, NULL);
809 /* tdm_client_vblank_destroy */
810 TEST_P(TDMClient, ClientVblankDestroy)
814 ASSERT_EQ(PrepareClient(), true);
815 ASSERT_EQ(PrepareOutput(), true);
817 vblank = tdm_client_output_create_vblank(output, &ret);
818 ASSERT_EQ(ret, TDM_ERROR_NONE);
819 ASSERT_NE(vblank, NULL);
821 tdm_client_vblank_destroy(vblank);
825 TEST_P(TDMClient, ClientVblankDestroyNullObject)
827 tdm_client_vblank_destroy(NULL);
830 /* tdm_client_vblank_set_name */
831 TEST_P(TDMClient, ClientVblankSetName)
833 ASSERT_EQ(PrepareClient(), true);
834 ASSERT_EQ(PrepareOutput(), true);
835 ASSERT_EQ(PrepareVblank(), true);
837 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
840 TEST_P(TDMClient, ClientVblankSetNameTwice)
842 ASSERT_EQ(PrepareClient(), true);
843 ASSERT_EQ(PrepareOutput(), true);
844 ASSERT_EQ(PrepareVblank(), true);
846 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
847 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
850 TEST_P(TDMClient, ClientVblankSetNameNullObject)
852 ASSERT_EQ(tdm_client_vblank_set_name(NULL, TDM_UT_VBLANK_NAME), TDM_ERROR_INVALID_PARAMETER);
855 /* tdm_client_vblank_set_sync */
856 TEST_P(TDMClient, ClientVblankSetSync)
858 ASSERT_EQ(PrepareClient(), true);
859 ASSERT_EQ(PrepareOutput(), true);
860 ASSERT_EQ(PrepareVblank(), true);
862 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
865 TEST_P(TDMClient, ClientVblankSetSyncTwice)
867 ASSERT_EQ(PrepareClient(), true);
868 ASSERT_EQ(PrepareOutput(), true);
869 ASSERT_EQ(PrepareVblank(), true);
871 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
872 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
875 TEST_P(TDMClient, ClientVblankSetSyncNullObject)
877 ASSERT_EQ(tdm_client_vblank_set_sync(NULL, 1), TDM_ERROR_INVALID_PARAMETER);
880 /* tdm_client_vblank_set_fps */
881 TEST_P(TDMClient, ClientVblankSetFps)
883 ASSERT_EQ(PrepareClient(), true);
884 ASSERT_EQ(PrepareOutput(), true);
885 ASSERT_EQ(PrepareVblank(), true);
887 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
890 TEST_P(TDMClient, ClientVblankSetFpsTwice)
892 ASSERT_EQ(PrepareClient(), true);
893 ASSERT_EQ(PrepareOutput(), true);
894 ASSERT_EQ(PrepareVblank(), true);
896 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
897 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
900 TEST_P(TDMClient, ClientVblankSetFpsNullObject)
902 ASSERT_EQ(tdm_client_vblank_set_fps(NULL, 30), TDM_ERROR_INVALID_PARAMETER);
905 /* tdm_client_vblank_set_offset */
906 TEST_P(TDMClient, ClientVblankSetOffset)
908 ASSERT_EQ(PrepareClient(), true);
909 ASSERT_EQ(PrepareOutput(), true);
910 ASSERT_EQ(PrepareVblank(), true);
912 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
915 TEST_P(TDMClient, ClientVblankSetOffsetTwice)
917 ASSERT_EQ(PrepareClient(), true);
918 ASSERT_EQ(PrepareOutput(), true);
919 ASSERT_EQ(PrepareVblank(), true);
921 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
922 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
925 TEST_P(TDMClient, ClientVblankSetOffsetNullObject)
927 ASSERT_EQ(tdm_client_vblank_set_offset(NULL, 10), TDM_ERROR_INVALID_PARAMETER);
930 /* tdm_client_vblank_set_enable_fake */
931 TEST_P(TDMClient, ClientVblankSetEnableFake)
933 ASSERT_EQ(PrepareClient(), true);
934 ASSERT_EQ(PrepareOutput(), true);
935 ASSERT_EQ(PrepareVblank(), true);
937 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
940 TEST_P(TDMClient, ClientVblankSetEnableFakeTwice)
942 ASSERT_EQ(PrepareClient(), true);
943 ASSERT_EQ(PrepareOutput(), true);
944 ASSERT_EQ(PrepareVblank(), true);
946 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
947 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
950 TEST_P(TDMClient, ClientVblankSetEnableFakeNullObject)
952 ASSERT_EQ(tdm_client_vblank_set_enable_fake(NULL, 1), TDM_ERROR_INVALID_PARAMETER);
956 _ut_tdm_client_vblank_cb2(tdm_client_vblank *vblank,
958 unsigned int sequence,
960 unsigned int tv_usec,
963 bool *done = (bool *)user_data;
968 /* tdm_client_vblank_wait */
969 TEST_P(TDMClient, ClientVblankWait)
973 ASSERT_EQ(PrepareClient(), true);
974 ASSERT_EQ(PrepareOutput(), true);
975 ASSERT_EQ(PrepareVblank(), true);
978 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
980 start = tdm_helper_get_time();
982 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
983 end = tdm_helper_get_time();
985 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
986 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
989 TEST_P(TDMClient, ClientVblankWaitFewTime)
991 bool done1, done2, done3;
993 ASSERT_EQ(PrepareClient(), true);
994 ASSERT_EQ(PrepareOutput(), true);
995 ASSERT_EQ(PrepareVblank(), true);
997 done1 = done2 = done3 = false;
998 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done1), TDM_ERROR_NONE);
999 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done2), TDM_ERROR_NONE);
1000 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done3), TDM_ERROR_NONE);
1002 start = tdm_helper_get_time();
1003 while (!done1 || !done2 || !done3)
1004 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1005 end = tdm_helper_get_time();
1007 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1008 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1012 TEST_P(TDMClient, ClientVblankWaitInterval0)
1014 ASSERT_EQ(PrepareClient(), true);
1015 ASSERT_EQ(PrepareOutput(), true);
1016 ASSERT_EQ(PrepareVblank(), true);
1018 ASSERT_EQ(tdm_client_vblank_wait(vblank, 0, _ut_tdm_client_vblank_cb2, NULL), TDM_ERROR_INVALID_PARAMETER);
1021 TEST_P(TDMClient, ClientVblankWaitInterval)
1025 ASSERT_EQ(PrepareClient(), true);
1026 ASSERT_EQ(PrepareOutput(), true);
1027 ASSERT_EQ(PrepareVblank(), true);
1030 for (int t = 1; t < 10; t++) {
1032 ASSERT_EQ(tdm_client_vblank_wait(vblank, t, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1034 start = tdm_helper_get_time();
1036 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1037 end = tdm_helper_get_time();
1039 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1040 ASSERT_GT((end - start), (vrefresh_interval * (t - 1)));
1041 ASSERT_LT((end - start), (vrefresh_interval * t + vrefresh_interval));
1046 _ut_tdm_client_vblank_cb3(tdm_client_vblank *vblank,
1048 unsigned int sequence,
1049 unsigned int tv_sec,
1050 unsigned int tv_usec,
1053 unsigned int *cur_seq = (unsigned int *)user_data;
1055 *cur_seq = sequence;
1058 TEST_P(TDMClient, ClientVblankWaitSeq)
1060 ASSERT_EQ(PrepareClient(), true);
1061 ASSERT_EQ(PrepareOutput(), true);
1062 ASSERT_EQ(PrepareVblank(), true);
1064 for (int t = 0; t < 10; t++) {
1065 unsigned int cur_seq = 0, temp = 0;
1067 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_NONE);
1068 while (cur_seq == 0)
1069 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1071 start = tdm_helper_get_time();
1072 ASSERT_EQ(tdm_client_vblank_wait_seq(vblank, cur_seq + 1, _ut_tdm_client_vblank_cb3, &temp), TDM_ERROR_NONE);
1074 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1075 end = tdm_helper_get_time();
1077 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1078 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1082 TEST_P(TDMClient, ClientVblankWaitSeqInterval)
1084 ASSERT_EQ(PrepareClient(), true);
1085 ASSERT_EQ(PrepareOutput(), true);
1086 ASSERT_EQ(PrepareVblank(), true);
1089 for (int t = 1; t < 10; t++) {
1090 unsigned int cur_seq = 0, temp = 0;
1092 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_NONE);
1093 while (cur_seq == 0)
1094 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1096 start = tdm_helper_get_time();
1097 ASSERT_EQ(tdm_client_vblank_wait_seq(vblank, cur_seq + t, _ut_tdm_client_vblank_cb3, &temp), TDM_ERROR_NONE);
1099 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1100 end = tdm_helper_get_time();
1102 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1103 ASSERT_GT((end - start), (vrefresh_interval * (t - 1)));
1104 ASSERT_LT((end - start), (vrefresh_interval * t + vrefresh_interval));
1108 TEST_P(TDMClient, ClientVblankWaitSetOffset)
1112 ASSERT_EQ(PrepareClient(), true);
1113 ASSERT_EQ(PrepareOutput(), true);
1114 ASSERT_EQ(PrepareVblank(), true);
1116 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 100), TDM_ERROR_NONE);
1119 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1121 start = tdm_helper_get_time();
1123 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1124 end = tdm_helper_get_time();
1126 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1127 ASSERT_GT((end - start), (0.1));
1128 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval + 0.1));
1131 TEST_P(TDMClient, ClientVblankWaitSetFps)
1135 unsigned int fps = 10;
1137 ASSERT_EQ(PrepareClient(), true);
1138 ASSERT_EQ(PrepareOutput(), true);
1139 ASSERT_EQ(PrepareVblank(), true);
1141 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, fps), TDM_ERROR_NONE);
1142 interval = 1.0 / (double)fps;
1145 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1147 start = tdm_helper_get_time();
1149 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1150 end = tdm_helper_get_time();
1152 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1153 ASSERT_GT((end - start), (interval - vrefresh_interval));
1154 ASSERT_LT((end - start), (interval + vrefresh_interval));
1159 TEST_P(TDMVblank, VblankWaitEnableDisableGlobalFps)
1161 TDM_UT_SKIP_FLAG(has_outputs);
1163 unsigned int fps = (unsigned int)TDM_UT_INVALID_VALUE;
1164 double vrefresh_interval;
1165 unsigned int cur_seq[3];
1166 unsigned int global_fps = 5;
1167 double start, end, interval;
1169 ASSERT_EQ(TestPrepareOutput(), true);
1170 ASSERT_EQ(TestCreateVblanks3(), true);
1171 ASSERT_EQ(vblank_count, 3);
1173 ASSERT_EQ(tdm_vblank_get_fps(vblanks[0], &fps), TDM_ERROR_NONE);
1174 ASSERT_TRUE(fps >= 30 && fps != (unsigned int)TDM_UT_INVALID_VALUE);
1175 vrefresh_interval = 1.0 / (double)fps;
1177 for (int v = 0; v < 3; v++)
1178 ASSERT_EQ(tdm_vblank_set_fixed_fps(vblanks[v], 10 * (v + 1)), TDM_ERROR_NONE);
1181 tdm_vblank_enable_global_fps(1, global_fps);
1182 interval = 1.0 / (double)global_fps;
1184 for (int v = 0; v < 3; v++) {
1186 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _ut_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1189 start = tdm_helper_get_time();
1190 while (cur_seq[0] == 0)
1191 ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1192 end = tdm_helper_get_time();
1194 ASSERT_NE(cur_seq[1], 0);
1195 ASSERT_NE(cur_seq[2], 0);
1197 /* "+- vrefresh_interval" consider the delay of socket communication between kernel and platform */
1198 ASSERT_GT((end - start), (interval - vrefresh_interval));
1199 ASSERT_LT((end - start), (interval + vrefresh_interval));
1202 tdm_vblank_enable_global_fps(0, 0);
1204 for (int v = 0; v < 3; v++) {
1206 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _ut_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1209 while (cur_seq[0] == 0)
1210 ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1211 ASSERT_EQ(cur_seq[1], 0);
1212 ASSERT_EQ(cur_seq[2], 0);
1214 while (cur_seq[1] == 0)
1215 ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1216 ASSERT_EQ(cur_seq[2], 0);
1219 TEST_P(TDMVblank, VblankWaitIgnoreGlobalFps)
1221 TDM_UT_SKIP_FLAG(has_outputs);
1223 unsigned int fps = (unsigned int)TDM_UT_INVALID_VALUE;
1224 unsigned int cur_seq[3];
1225 unsigned int global_fps = 5;
1226 double start, end, interval;
1228 ASSERT_EQ(TestPrepareOutput(), true);
1229 ASSERT_EQ(TestCreateVblanks3(), true);
1230 ASSERT_EQ(vblank_count, 3);
1232 ASSERT_EQ(tdm_vblank_get_fps(vblanks[0], &fps), TDM_ERROR_NONE);
1233 ASSERT_TRUE(fps >= 30 && fps != (unsigned int)TDM_UT_INVALID_VALUE);
1234 interval = 1.0 / (double)fps;
1236 /* 2nd vblank will ignore the global fps. */
1237 ASSERT_EQ(tdm_vblank_ignore_global_fps(vblanks[1], 1), TDM_ERROR_NONE);
1239 tdm_vblank_enable_global_fps(1, global_fps);
1241 for (int v = 0; v < 3; v++) {
1243 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _ut_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1246 start = tdm_helper_get_time();
1247 while (cur_seq[1] == 0)
1248 ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1249 end = tdm_helper_get_time();
1251 ASSERT_EQ(cur_seq[0], 0);
1252 ASSERT_EQ(cur_seq[2], 0);
1254 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1255 ASSERT_LT((end - start), (interval + interval));
1257 while (cur_seq[0] == 0)
1258 ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1259 ASSERT_NE(cur_seq[2], 0);
1264 TEST_P(TDMClient, ClientVblankWaitNullObject)
1266 unsigned int cur_seq = 0;
1268 ASSERT_EQ(tdm_client_vblank_wait(NULL, 1, _ut_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_INVALID_PARAMETER);
1271 TEST_P(TDMClient, ClientVblankWaitNullOther)
1273 ASSERT_EQ(PrepareClient(), true);
1274 ASSERT_EQ(PrepareOutput(), true);
1275 ASSERT_EQ(PrepareVblank(), true);
1277 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
1280 TEST_P(TDMClient, ClientVblankWaitDpmsOff)
1282 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
1284 ASSERT_EQ(PrepareClient(), true);
1285 ASSERT_EQ(PrepareOutput(), true);
1286 ASSERT_EQ(PrepareVblank(), true);
1288 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
1289 while (dpms != TDM_OUTPUT_DPMS_OFF)
1290 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1291 ASSERT_EQ(dpms, TDM_OUTPUT_DPMS_OFF);
1293 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, NULL), TDM_ERROR_DPMS_OFF);
1295 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
1296 while (dpms != TDM_OUTPUT_DPMS_ON)
1297 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1300 TEST_P(TDMClient, ClientVblankWaitSetEnableFakeDpmsOff)
1302 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
1305 ASSERT_EQ(PrepareClient(), true);
1306 ASSERT_EQ(PrepareOutput(), true);
1307 ASSERT_EQ(PrepareVblank(), true);
1309 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
1310 while (dpms != TDM_OUTPUT_DPMS_OFF)
1311 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1313 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
1316 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1319 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1321 ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
1322 while (dpms != TDM_OUTPUT_DPMS_ON)
1323 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1326 /* tdm_client_vblank_wait */
1327 TEST_P(TDMClient, ClientVblankIsWaiting)
1330 unsigned int waiting;
1332 ASSERT_EQ(PrepareClient(), true);
1333 ASSERT_EQ(PrepareOutput(), true);
1334 ASSERT_EQ(PrepareVblank(), true);
1337 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _ut_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1339 waiting = tdm_client_vblank_is_waiting(vblank);
1340 ASSERT_EQ(waiting, 1);
1342 start = tdm_helper_get_time();
1344 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1345 end = tdm_helper_get_time();
1347 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1348 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1350 waiting = tdm_client_vblank_is_waiting(vblank);
1351 ASSERT_EQ(waiting, 0);
1354 /* tdm_client_vblank_wait */
1355 TEST_P(TDMClient, ClientVblankIsWaitingNullObject)
1357 unsigned int waiting = tdm_client_vblank_is_waiting(NULL);
1358 ASSERT_EQ(waiting, 0);
1361 #ifdef TDM_UT_TEST_WITH_PARAMS
1362 INSTANTIATE_TEST_CASE_P(TDMClientParams,
1364 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
1366 INSTANTIATE_TEST_CASE_P(TDMClientParams,
1368 Values(TDM_DEFAULT_MODULE));