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 _tc_tdm_pipe_read_msg(int fd);
54 static bool _tc_tdm_pipe_write_msg(int fd, int reply_fd, int msg);
55 static pid_t _tc_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;
69 tdm_client_voutput *voutput;
71 double vrefresh_interval, start, end;
77 bool PrepareClient(void);
78 bool PrepareOutput(void);
79 bool PrepareVblank(void);
81 static void TearDownTestCase(void);
82 static void ServerFork(void);
83 static void ServerKill(void);
86 pid_t TDMClient::server_pid = -1;
87 int TDMClient::pipe_parent[2] = {-1, -1};
88 int TDMClient::pipe_child[2] = {-1, -1};
90 void TDMClient::TearDownTestCase(void)
95 void TDMClient::ServerFork(void)
100 server_pid = _tc_tdm_client_server_fork(pipe_parent, pipe_child);
101 ASSERT_GT(server_pid, 0);
104 void TDMClient::ServerKill(void)
106 if (pipe_child[0] >= 0)
107 close(pipe_child[0]);
108 if (pipe_child[1] >= 0) {
109 if (server_pid > 0) {
110 bool ret = _tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_TERMINATE_SERVER);
112 if (waitpid(server_pid, NULL, 0) == server_pid)
113 TDM_INFO("*** server terminated ***");
115 TDM_ERR("*** failed to terminate server ***");
117 if (kill(server_pid, 9) < 0)
118 TDM_ERR("*** failed to kill server ***");
121 close(pipe_child[1]);
124 if (pipe_parent[0] >= 0)
125 close(pipe_parent[0]);
126 if (pipe_parent[1] >= 0)
127 close(pipe_parent[1]);
130 pipe_parent[0] = pipe_parent[1] = -1;
131 pipe_child[0] = pipe_child[1] = -1;
134 TDMClient::TDMClient()
139 vrefresh_interval = start = end = 0.0;
142 void TDMClient::SetUp(void)
146 if (server_pid == -1)
150 void TDMClient::TearDown(void)
153 tdm_client_vblank_destroy(vblank);
155 tdm_client_destroy(client);
160 bool TDMClient::PrepareClient(void)
163 client = tdm_client_create(&ret);
164 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
165 TDM_UT_RETURN_FALSE_IF_FAIL(client != NULL);
170 bool TDMClient::PrepareOutput(void)
174 TDM_UT_RETURN_FALSE_IF_FAIL(client != NULL);
176 output = tdm_client_get_output(client, NULL, &ret);
177 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
178 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
183 bool TDMClient::PrepareVblank(void)
186 unsigned int refresh;
188 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
190 vblank = tdm_client_output_create_vblank(output, &ret);
191 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
192 TDM_UT_RETURN_FALSE_IF_FAIL(vblank != NULL);
194 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_client_output_get_refresh_rate(output, &refresh) == TDM_ERROR_NONE);
195 TDM_UT_RETURN_FALSE_IF_FAIL(refresh > 0);
197 vrefresh_interval = 1.0 / (double)refresh;
198 TDM_UT_RETURN_FALSE_IF_FAIL(vrefresh_interval > 0);
204 _tc_tdm_pipe_read_msg(int fd)
210 len = read(fd, &msg, sizeof msg);
211 } while (len < 0 && errno == EINTR);
214 msg = TDM_UT_PIPE_MSG_NONE;
220 _tc_tdm_pipe_write_msg(int fd, int reply_fd, int msg)
222 ssize_t len = write(fd, &msg, sizeof msg);
223 TDM_UT_RETURN_FALSE_IF_FAIL(len == sizeof msg);
226 int reply = _tc_tdm_pipe_read_msg(reply_fd);
227 TDM_UT_RETURN_FALSE_IF_FAIL(reply == TDM_UT_PIPE_MSG_REPLY);
234 _tc_tdm_server_set_output_dpms(tdm_display *dpy, int msg)
238 tdm_output_dpms dpms;
240 output = tdm_display_find_output(dpy, "primary", &ret);
241 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
242 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
244 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_dpms(output, &dpms) == TDM_ERROR_NONE);
247 case TDM_UT_PIPE_MSG_DPMS_ON:
248 if (dpms != TDM_OUTPUT_DPMS_ON)
249 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_ON) == TDM_ERROR_NONE);
251 case TDM_UT_PIPE_MSG_DPMS_OFF:
252 if (dpms != TDM_OUTPUT_DPMS_OFF)
253 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF) == TDM_ERROR_NONE);
263 _tc_tdm_server_run(int *pipe_parent, int *pipe_child)
265 tdm_display *dpy = NULL;
267 struct pollfd fds[2];
269 int output_count = 0;
271 dpy = tdm_display_init(&ret);
272 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed);
273 TDM_UT_GOTO_IF_FAIL(dpy != NULL, failed);
275 TDM_UT_GOTO_IF_FAIL(tdm_display_get_output_count(dpy, &output_count) == TDM_ERROR_NONE, failed);
277 for (int o = 0; o < output_count; o++) {
278 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
279 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed);
280 TDM_UT_GOTO_IF_FAIL(output != NULL, failed);
282 if (!tc_tdm_output_is_connected(output))
285 TDM_UT_GOTO_IF_FAIL(tc_tdm_output_prepare(dpy, output, true) == true, failed);
288 TDM_UT_GOTO_IF_FAIL(_tc_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_SERVER_READY) == true, done);
290 TDM_INFO("*** server ready ***");
292 ret = tdm_display_get_fd(dpy, &tdm_fd);
293 TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done);
295 fds[0].events = POLLIN;
299 fds[1].events = POLLIN;
300 fds[1].fd = pipe_child[0];
304 /* make sure all events are flushed to clients before falling in sleep */
305 tdm_display_flush(dpy);
307 err = poll(fds, 2, -1);
309 if (errno == EINTR || errno == EAGAIN) {
312 TDM_ERR("server-process: poll failed: %m\n");
317 if (fds[0].revents & POLLIN)
318 ret = tc_tdm_display_handle_events(dpy);
320 if (fds[1].revents & POLLIN) {
321 int msg = _tc_tdm_pipe_read_msg(pipe_child[0]);
322 _tc_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_REPLY);
325 case TDM_UT_PIPE_MSG_DPMS_ON:
326 case TDM_UT_PIPE_MSG_DPMS_OFF:
327 _tc_tdm_server_set_output_dpms(dpy, msg);
329 case TDM_UT_PIPE_MSG_TERMINATE_SERVER:
339 tdm_display_deinit(dpy);
343 TDM_UT_GOTO_IF_FAIL(_tc_tdm_pipe_write_msg(pipe_parent[1], -1, TDM_UT_PIPE_MSG_SERVER_FAILED) == true, done);
344 TDM_INFO("*** server failed ***");
347 tdm_display_deinit(dpy);
352 static void _tc_tdm_client_sig_handler(int sig)
354 TDM_UT_ERR("got signal: %d", sig);
355 kill(TDMClient::server_pid, 9);
360 _tc_tdm_client_server_fork(int *pipe_parent, int *pipe_child)
365 TDM_UT_GOTO_IF_FAIL(pipe(pipe_parent) == 0, failed);
366 TDM_UT_GOTO_IF_FAIL(pipe(pipe_child) == 0, failed);
368 signal(SIGCHLD, SIG_IGN);
369 signal(SIGSEGV, _tc_tdm_client_sig_handler);
371 prctl(PR_SET_PDEATHSIG, SIGHUP);
374 TDM_UT_GOTO_IF_FAIL(pid >= 0, failed);
377 _tc_tdm_server_run(pipe_parent, pipe_child);
378 close(pipe_child[0]);
379 close(pipe_child[1]);
380 close(pipe_parent[0]);
381 close(pipe_parent[1]);
383 #ifdef TIZEN_TEST_GCOV
390 msg = _tc_tdm_pipe_read_msg(pipe_parent[0]);
391 TDM_UT_GOTO_IF_FAIL(msg == TDM_UT_PIPE_MSG_SERVER_READY, failed);
393 TDM_INFO("*** server fork done ***");
401 TEST_P(TDMClient, ClientCreate)
405 client = tdm_client_create(&ret);
406 ASSERT_EQ(ret, TDM_ERROR_NONE);
407 ASSERT_NE(client, NULL);
410 TEST_P(TDMClient, ClientCreateNullOther)
412 client = tdm_client_create(NULL);
413 ASSERT_NE(client, NULL);
416 TEST_P(TDMClient, ClientDestroy)
420 client = tdm_client_create(&ret);
421 ASSERT_EQ(ret, TDM_ERROR_NONE);
422 ASSERT_NE(client, NULL);
424 tdm_client_destroy(client);
428 TEST_P(TDMClient, ClientNullObject)
430 tdm_client_destroy(NULL);
433 /* tdm_client_get_fd */
434 TEST_P(TDMClient, ClientGetFd)
436 int fd = TDM_UT_INVALID_VALUE;
438 ASSERT_EQ(PrepareClient(), true);
440 ASSERT_EQ(tdm_client_get_fd(client, &fd), TDM_ERROR_NONE);
444 TEST_P(TDMClient, ClientGetFdNullObject)
446 int fd = TDM_UT_INVALID_VALUE;
447 ASSERT_EQ(tdm_client_get_fd(NULL, &fd), TDM_ERROR_INVALID_PARAMETER);
448 ASSERT_EQ(fd, TDM_UT_INVALID_VALUE);
451 TEST_P(TDMClient, ClientGetFdNullOther)
453 ASSERT_EQ(PrepareClient(), true);
455 ASSERT_EQ(tdm_client_get_fd(client, NULL), TDM_ERROR_INVALID_PARAMETER);
459 _tc_tdm_client_vblank_cb(unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data)
461 bool *done = (bool *)user_data;
466 /* tdm_client_handle_events_timeout */
467 TEST_P(TDMClient, ClientHandleEvent)
471 ASSERT_EQ(PrepareClient(), true);
473 ASSERT_EQ(tdm_client_wait_vblank(client, NULL, 1, 1, 0, _tc_tdm_client_vblank_cb, &done), TDM_ERROR_NONE);
474 ASSERT_EQ(done, false);
477 ASSERT_EQ(tdm_client_handle_events(client), TDM_ERROR_NONE);
480 TEST_P(TDMClient, ClientHandleEventNullObject)
482 ASSERT_EQ(tdm_client_handle_events(NULL), TDM_ERROR_INVALID_PARAMETER);
485 /* tdm_client_wait_vblank, deprecated */
486 TEST_P(TDMClient, ClientWaitVblank)
490 ASSERT_EQ(PrepareClient(), true);
492 ASSERT_EQ(tdm_client_wait_vblank(client, NULL, 1, 1, 0, _tc_tdm_client_vblank_cb, &done), TDM_ERROR_NONE);
493 ASSERT_EQ(done, false);
496 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
499 /* tdm_client_get_output */
500 TEST_P(TDMClient, ClientGetOutput)
504 ASSERT_EQ(PrepareClient(), true);
506 output = tdm_client_get_output(client, NULL, &ret);
507 ASSERT_EQ(ret, TDM_ERROR_NONE);
508 ASSERT_NE(output, NULL);
511 TEST_P(TDMClient, ClientGetOutputPrimary)
515 ASSERT_EQ(PrepareClient(), true);
517 output = tdm_client_get_output(client, (char*)"primary", &ret);
518 ASSERT_EQ(ret, TDM_ERROR_NONE);
519 ASSERT_NE(output, NULL);
522 TEST_P(TDMClient, ClientGetOutputDefault)
526 ASSERT_EQ(PrepareClient(), true);
528 output = tdm_client_get_output(client, (char*)"default", &ret);
529 ASSERT_EQ(ret, TDM_ERROR_NONE);
530 ASSERT_NE(output, NULL);
533 TEST_P(TDMClient, ClientGetOutputInvalidName)
537 ASSERT_EQ(PrepareClient(), true);
539 output = tdm_client_get_output(client, (char*)"invalid", &ret);
540 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
541 ASSERT_EQ(output, NULL);
544 TEST_P(TDMClient, ClientGetOutputNullObject)
548 output = tdm_client_get_output(NULL, NULL, &ret);
549 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
550 ASSERT_EQ(output, NULL);
553 TEST_P(TDMClient, ClientGetOutputNullOther)
555 ASSERT_EQ(PrepareClient(), true);
557 output = tdm_client_get_output(client, NULL, NULL);
558 ASSERT_NE(output, NULL);
562 _tc_tdm_client_output_change_dpms_cb(tdm_client_output *output,
563 tdm_output_change_type type,
567 bool *done = (bool *)user_data;
570 case TDM_OUTPUT_CHANGE_DPMS:
579 /* tdm_client_output_add_change_handler */
580 TEST_P(TDMClient, ClientOutputAddChangeHandler)
583 tdm_output_dpms dpms;
585 ASSERT_EQ(PrepareClient(), true);
586 ASSERT_EQ(PrepareOutput(), true);
588 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb, &done), TDM_ERROR_NONE);
589 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
592 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
594 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
595 ASSERT_EQ(dpms, TDM_OUTPUT_DPMS_OFF);
597 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
598 while (dpms != TDM_OUTPUT_DPMS_ON) {
599 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
600 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
604 TEST_P(TDMClient, ClientOutputAddChangeHandlerTwice)
606 ASSERT_EQ(PrepareClient(), true);
607 ASSERT_EQ(PrepareOutput(), true);
609 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_NONE);
610 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_BAD_REQUEST);
613 TEST_P(TDMClient, ClientOutputAddChangeHandlerNullObject)
615 ASSERT_EQ(tdm_client_output_add_change_handler(NULL, _tc_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
618 TEST_P(TDMClient, ClientOutputAddChangeHandlerNullOther)
620 ASSERT_EQ(PrepareClient(), true);
621 ASSERT_EQ(PrepareOutput(), true);
623 ASSERT_EQ(tdm_client_output_add_change_handler(output, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
626 /* tdm_client_output_remove_change_handler */
627 TEST_P(TDMClient, ClientOutputRemoveChangeHandler)
629 ASSERT_EQ(PrepareClient(), true);
630 ASSERT_EQ(PrepareOutput(), true);
632 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb, NULL), TDM_ERROR_NONE);
633 tdm_client_output_remove_change_handler(output, _tc_tdm_client_output_change_dpms_cb, NULL);
636 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerDifferentData)
638 bool done = (bool)TDM_UT_INVALID_VALUE;
640 ASSERT_EQ(PrepareClient(), true);
641 ASSERT_EQ(PrepareOutput(), true);
643 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb, &done), TDM_ERROR_NONE);
644 tdm_client_output_remove_change_handler(output, _tc_tdm_client_output_change_dpms_cb, NULL);
648 _tc_tdm_client_output_change_dpms_cb2(tdm_client_output *output,
649 tdm_output_change_type type,
654 case TDM_OUTPUT_CHANGE_DPMS:
655 tdm_client_output_remove_change_handler(output, _tc_tdm_client_output_change_dpms_cb2, user_data);
662 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerInHandler)
664 tdm_output_dpms dpms = TDM_OUTPUT_DPMS_ON;
666 ASSERT_EQ(PrepareClient(), true);
667 ASSERT_EQ(PrepareOutput(), true);
669 ASSERT_EQ(tdm_client_output_add_change_handler(output, _tc_tdm_client_output_change_dpms_cb2, NULL), TDM_ERROR_NONE);
670 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
671 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
672 while (dpms != TDM_OUTPUT_DPMS_OFF) {
673 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
674 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
677 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
678 while (dpms != TDM_OUTPUT_DPMS_ON)
679 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
682 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerNullObject)
684 tdm_client_output_remove_change_handler(NULL, _tc_tdm_client_output_change_dpms_cb, NULL);
687 TEST_P(TDMClient, ClientOutputRemoveChangeHandlerNullOther)
689 ASSERT_EQ(PrepareClient(), true);
690 ASSERT_EQ(PrepareOutput(), true);
692 tdm_client_output_remove_change_handler(output, NULL, NULL);
695 /* tdm_client_output_get_refresh_rate */
696 TEST_P(TDMClient, ClientOutputGetRefreshRate)
698 unsigned int refresh = 0;
700 ASSERT_EQ(PrepareClient(), true);
701 ASSERT_EQ(PrepareOutput(), true);
703 ASSERT_EQ(tdm_client_output_get_refresh_rate(output, &refresh), TDM_ERROR_NONE);
704 ASSERT_GT(refresh, 0);
707 TEST_P(TDMClient, ClientOutputGetRefreshRateNullObject)
709 unsigned int refresh = (unsigned int)TDM_UT_INVALID_VALUE;
711 ASSERT_EQ(tdm_client_output_get_refresh_rate(NULL, &refresh), TDM_ERROR_INVALID_PARAMETER);
712 ASSERT_EQ(refresh, (unsigned int)TDM_UT_INVALID_VALUE);
715 TEST_P(TDMClient, ClientOutputGetRefreshRateNullOther)
717 ASSERT_EQ(PrepareClient(), true);
718 ASSERT_EQ(PrepareOutput(), true);
720 ASSERT_EQ(tdm_client_output_get_refresh_rate(output, NULL), TDM_ERROR_INVALID_PARAMETER);
723 /* tdm_client_output_get_refresh_rate */
724 TEST_P(TDMClient, ClientOutputGetConnStatus)
726 tdm_output_conn_status status = (tdm_output_conn_status)TDM_UT_INVALID_VALUE;
728 ASSERT_EQ(PrepareClient(), true);
729 ASSERT_EQ(PrepareOutput(), true);
731 ASSERT_EQ(tdm_client_output_get_conn_status(output, &status), TDM_ERROR_NONE);
732 ASSERT_NE(status, (tdm_output_conn_status)TDM_UT_INVALID_VALUE);
735 TEST_P(TDMClient, ClientOutputGetConnStatusNullObject)
737 tdm_output_conn_status status = (tdm_output_conn_status)TDM_UT_INVALID_VALUE;
739 ASSERT_EQ(tdm_client_output_get_conn_status(NULL, &status), TDM_ERROR_INVALID_PARAMETER);
740 ASSERT_EQ(status, (tdm_output_conn_status)TDM_UT_INVALID_VALUE);
743 TEST_P(TDMClient, ClientOutputGetConnStatusNullOther)
745 ASSERT_EQ(PrepareClient(), true);
746 ASSERT_EQ(PrepareOutput(), true);
748 ASSERT_EQ(tdm_client_output_get_conn_status(output, NULL), TDM_ERROR_INVALID_PARAMETER);
751 /* tdm_client_output_get_dpms */
752 TEST_P(TDMClient, ClientOutputGetDpms)
754 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
756 ASSERT_EQ(PrepareClient(), true);
757 ASSERT_EQ(PrepareOutput(), true);
759 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
760 ASSERT_NE(dpms, (tdm_output_dpms)TDM_UT_INVALID_VALUE);
763 TEST_P(TDMClient, ClientOutputGetDpmsNullObject)
765 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
767 ASSERT_EQ(tdm_client_output_get_dpms(NULL, &dpms), TDM_ERROR_INVALID_PARAMETER);
768 ASSERT_EQ(dpms, (tdm_output_dpms)TDM_UT_INVALID_VALUE);
771 TEST_P(TDMClient, ClientOutputGetDpmsNullOther)
773 ASSERT_EQ(PrepareClient(), true);
774 ASSERT_EQ(PrepareOutput(), true);
776 ASSERT_EQ(tdm_client_output_get_dpms(output, NULL), TDM_ERROR_INVALID_PARAMETER);
779 /* tdm_client_output_create_vblank */
780 TEST_P(TDMClient, ClientOutputCreateVblank)
784 ASSERT_EQ(PrepareClient(), true);
785 ASSERT_EQ(PrepareOutput(), true);
787 vblank = tdm_client_output_create_vblank(output, &ret);
788 ASSERT_EQ(ret, TDM_ERROR_NONE);
789 ASSERT_NE(vblank, NULL);
792 TEST_P(TDMClient, ClientOutputCreateVblankNullObject)
796 vblank = tdm_client_output_create_vblank(NULL, &ret);
797 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
798 ASSERT_EQ(vblank, NULL);
801 TEST_P(TDMClient, ClientOutputCreateVblankNullOther)
803 ASSERT_EQ(PrepareClient(), true);
804 ASSERT_EQ(PrepareOutput(), true);
806 vblank = tdm_client_output_create_vblank(output, NULL);
807 ASSERT_NE(vblank, NULL);
810 /* tdm_client_vblank_destroy */
811 TEST_P(TDMClient, ClientVblankDestroy)
815 ASSERT_EQ(PrepareClient(), true);
816 ASSERT_EQ(PrepareOutput(), true);
818 vblank = tdm_client_output_create_vblank(output, &ret);
819 ASSERT_EQ(ret, TDM_ERROR_NONE);
820 ASSERT_NE(vblank, NULL);
822 tdm_client_vblank_destroy(vblank);
826 TEST_P(TDMClient, ClientVblankDestroyNullObject)
828 tdm_client_vblank_destroy(NULL);
831 /* tdm_client_vblank_set_name */
832 TEST_P(TDMClient, ClientVblankSetName)
834 ASSERT_EQ(PrepareClient(), true);
835 ASSERT_EQ(PrepareOutput(), true);
836 ASSERT_EQ(PrepareVblank(), true);
838 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
841 TEST_P(TDMClient, ClientVblankSetNameTwice)
843 ASSERT_EQ(PrepareClient(), true);
844 ASSERT_EQ(PrepareOutput(), true);
845 ASSERT_EQ(PrepareVblank(), true);
847 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
848 ASSERT_EQ(tdm_client_vblank_set_name(vblank, TDM_UT_VBLANK_NAME), TDM_ERROR_NONE);
851 TEST_P(TDMClient, ClientVblankSetNameNullObject)
853 ASSERT_EQ(tdm_client_vblank_set_name(NULL, TDM_UT_VBLANK_NAME), TDM_ERROR_INVALID_PARAMETER);
856 /* tdm_client_vblank_set_sync */
857 TEST_P(TDMClient, ClientVblankSetSync)
859 ASSERT_EQ(PrepareClient(), true);
860 ASSERT_EQ(PrepareOutput(), true);
861 ASSERT_EQ(PrepareVblank(), true);
863 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
866 TEST_P(TDMClient, ClientVblankSetSyncTwice)
868 ASSERT_EQ(PrepareClient(), true);
869 ASSERT_EQ(PrepareOutput(), true);
870 ASSERT_EQ(PrepareVblank(), true);
872 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
873 ASSERT_EQ(tdm_client_vblank_set_sync(vblank, 1), TDM_ERROR_NONE);
876 TEST_P(TDMClient, ClientVblankSetSyncNullObject)
878 ASSERT_EQ(tdm_client_vblank_set_sync(NULL, 1), TDM_ERROR_INVALID_PARAMETER);
881 /* tdm_client_vblank_set_fps */
882 TEST_P(TDMClient, ClientVblankSetFps)
884 ASSERT_EQ(PrepareClient(), true);
885 ASSERT_EQ(PrepareOutput(), true);
886 ASSERT_EQ(PrepareVblank(), true);
888 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
891 TEST_P(TDMClient, ClientVblankSetFpsTwice)
893 ASSERT_EQ(PrepareClient(), true);
894 ASSERT_EQ(PrepareOutput(), true);
895 ASSERT_EQ(PrepareVblank(), true);
897 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
898 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, 30), TDM_ERROR_NONE);
901 TEST_P(TDMClient, ClientVblankSetFpsNullObject)
903 ASSERT_EQ(tdm_client_vblank_set_fps(NULL, 30), TDM_ERROR_INVALID_PARAMETER);
906 /* tdm_client_vblank_set_offset */
907 TEST_P(TDMClient, ClientVblankSetOffset)
909 ASSERT_EQ(PrepareClient(), true);
910 ASSERT_EQ(PrepareOutput(), true);
911 ASSERT_EQ(PrepareVblank(), true);
913 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
916 TEST_P(TDMClient, ClientVblankSetOffsetTwice)
918 ASSERT_EQ(PrepareClient(), true);
919 ASSERT_EQ(PrepareOutput(), true);
920 ASSERT_EQ(PrepareVblank(), true);
922 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
923 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 10), TDM_ERROR_NONE);
926 TEST_P(TDMClient, ClientVblankSetOffsetNullObject)
928 ASSERT_EQ(tdm_client_vblank_set_offset(NULL, 10), TDM_ERROR_INVALID_PARAMETER);
931 /* tdm_client_vblank_set_enable_fake */
932 TEST_P(TDMClient, ClientVblankSetEnableFake)
934 ASSERT_EQ(PrepareClient(), true);
935 ASSERT_EQ(PrepareOutput(), true);
936 ASSERT_EQ(PrepareVblank(), true);
938 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
941 TEST_P(TDMClient, ClientVblankSetEnableFakeTwice)
943 ASSERT_EQ(PrepareClient(), true);
944 ASSERT_EQ(PrepareOutput(), true);
945 ASSERT_EQ(PrepareVblank(), true);
947 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
948 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
951 TEST_P(TDMClient, ClientVblankSetEnableFakeNullObject)
953 ASSERT_EQ(tdm_client_vblank_set_enable_fake(NULL, 1), TDM_ERROR_INVALID_PARAMETER);
957 _tc_tdm_client_vblank_cb2(tdm_client_vblank *vblank,
959 unsigned int sequence,
961 unsigned int tv_usec,
964 bool *done = (bool *)user_data;
969 /* tdm_client_vblank_wait */
970 TEST_P(TDMClient, ClientVblankWait)
974 ASSERT_EQ(PrepareClient(), true);
975 ASSERT_EQ(PrepareOutput(), true);
976 ASSERT_EQ(PrepareVblank(), true);
979 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
981 start = tdm_helper_get_time();
983 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
984 end = tdm_helper_get_time();
986 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
987 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
990 TEST_P(TDMClient, ClientVblankWaitFewTime)
992 bool done1, done2, done3;
994 ASSERT_EQ(PrepareClient(), true);
995 ASSERT_EQ(PrepareOutput(), true);
996 ASSERT_EQ(PrepareVblank(), true);
998 done1 = done2 = done3 = false;
999 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done1), TDM_ERROR_NONE);
1000 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done2), TDM_ERROR_NONE);
1001 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done3), TDM_ERROR_NONE);
1003 start = tdm_helper_get_time();
1004 while (!done1 || !done2 || !done3)
1005 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1006 end = tdm_helper_get_time();
1008 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1009 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1013 TEST_P(TDMClient, ClientVblankWaitInterval0)
1015 ASSERT_EQ(PrepareClient(), true);
1016 ASSERT_EQ(PrepareOutput(), true);
1017 ASSERT_EQ(PrepareVblank(), true);
1019 ASSERT_EQ(tdm_client_vblank_wait(vblank, 0, _tc_tdm_client_vblank_cb2, NULL), TDM_ERROR_INVALID_PARAMETER);
1022 TEST_P(TDMClient, ClientVblankWaitInterval)
1026 ASSERT_EQ(PrepareClient(), true);
1027 ASSERT_EQ(PrepareOutput(), true);
1028 ASSERT_EQ(PrepareVblank(), true);
1031 for (int t = 1; t < 10; t++) {
1033 ASSERT_EQ(tdm_client_vblank_wait(vblank, t, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1035 start = tdm_helper_get_time();
1037 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1038 end = tdm_helper_get_time();
1040 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1041 ASSERT_GT((end - start), (vrefresh_interval * (t - 1)));
1042 ASSERT_LT((end - start), (vrefresh_interval * t + vrefresh_interval));
1047 _tc_tdm_client_vblank_cb3(tdm_client_vblank *vblank,
1049 unsigned int sequence,
1050 unsigned int tv_sec,
1051 unsigned int tv_usec,
1054 unsigned int *cur_seq = (unsigned int *)user_data;
1056 *cur_seq = sequence;
1059 TEST_P(TDMClient, ClientVblankWaitSeq)
1061 ASSERT_EQ(PrepareClient(), true);
1062 ASSERT_EQ(PrepareOutput(), true);
1063 ASSERT_EQ(PrepareVblank(), true);
1065 for (int t = 0; t < 10; t++) {
1066 unsigned int cur_seq = 0, temp = 0;
1068 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_NONE);
1069 while (cur_seq == 0)
1070 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1072 start = tdm_helper_get_time();
1073 ASSERT_EQ(tdm_client_vblank_wait_seq(vblank, cur_seq + 1, _tc_tdm_client_vblank_cb3, &temp), TDM_ERROR_NONE);
1075 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1076 end = tdm_helper_get_time();
1078 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1079 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1083 TEST_P(TDMClient, ClientVblankWaitSeqInterval)
1085 ASSERT_EQ(PrepareClient(), true);
1086 ASSERT_EQ(PrepareOutput(), true);
1087 ASSERT_EQ(PrepareVblank(), true);
1090 for (int t = 1; t < 10; t++) {
1091 unsigned int cur_seq = 0, temp = 0;
1093 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_NONE);
1094 while (cur_seq == 0)
1095 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1097 start = tdm_helper_get_time();
1098 ASSERT_EQ(tdm_client_vblank_wait_seq(vblank, cur_seq + t, _tc_tdm_client_vblank_cb3, &temp), TDM_ERROR_NONE);
1100 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1101 end = tdm_helper_get_time();
1103 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1104 ASSERT_GT((end - start), (vrefresh_interval * (t - 1)));
1105 ASSERT_LT((end - start), (vrefresh_interval * t + vrefresh_interval));
1109 TEST_P(TDMClient, ClientVblankWaitSetOffset)
1113 ASSERT_EQ(PrepareClient(), true);
1114 ASSERT_EQ(PrepareOutput(), true);
1115 ASSERT_EQ(PrepareVblank(), true);
1117 ASSERT_EQ(tdm_client_vblank_set_offset(vblank, 100), TDM_ERROR_NONE);
1120 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1122 start = tdm_helper_get_time();
1124 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1125 end = tdm_helper_get_time();
1127 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1128 ASSERT_GT((end - start), (0.1));
1129 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval + 0.1));
1132 TEST_P(TDMClient, ClientVblankWaitSetFps)
1136 unsigned int fps = 10;
1138 ASSERT_EQ(PrepareClient(), true);
1139 ASSERT_EQ(PrepareOutput(), true);
1140 ASSERT_EQ(PrepareVblank(), true);
1142 ASSERT_EQ(tdm_client_vblank_set_fps(vblank, fps), TDM_ERROR_NONE);
1143 interval = 1.0 / (double)fps;
1146 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1148 start = tdm_helper_get_time();
1150 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1151 end = tdm_helper_get_time();
1153 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1154 ASSERT_GT((end - start), (interval - vrefresh_interval));
1155 ASSERT_LT((end - start), (interval + vrefresh_interval));
1160 TEST_P(TDMVblank, VblankWaitEnableDisableGlobalFps)
1162 TDM_UT_SKIP_FLAG(has_outputs);
1164 unsigned int fps = (unsigned int)TDM_UT_INVALID_VALUE;
1165 double vrefresh_interval;
1166 unsigned int cur_seq[3];
1167 unsigned int global_fps = 5;
1168 double start, end, interval;
1170 ASSERT_EQ(TestPrepareOutput(), true);
1171 ASSERT_EQ(TestCreateVblanks3(), true);
1172 ASSERT_EQ(vblank_count, 3);
1174 ASSERT_EQ(tdm_vblank_get_fps(vblanks[0], &fps), TDM_ERROR_NONE);
1175 ASSERT_TRUE(fps >= 30 && fps != (unsigned int)TDM_UT_INVALID_VALUE);
1176 vrefresh_interval = 1.0 / (double)fps;
1178 for (int v = 0; v < 3; v++)
1179 ASSERT_EQ(tdm_vblank_set_fixed_fps(vblanks[v], 10 * (v + 1)), TDM_ERROR_NONE);
1182 tdm_vblank_enable_global_fps(1, global_fps);
1183 interval = 1.0 / (double)global_fps;
1185 for (int v = 0; v < 3; v++) {
1187 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _tc_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1190 start = tdm_helper_get_time();
1191 while (cur_seq[0] == 0)
1192 ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1193 end = tdm_helper_get_time();
1195 ASSERT_NE(cur_seq[1], 0);
1196 ASSERT_NE(cur_seq[2], 0);
1198 /* "+- vrefresh_interval" consider the delay of socket communication between kernel and platform */
1199 ASSERT_GT((end - start), (interval - vrefresh_interval));
1200 ASSERT_LT((end - start), (interval + vrefresh_interval));
1203 tdm_vblank_enable_global_fps(0, 0);
1205 for (int v = 0; v < 3; v++) {
1207 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _tc_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1210 while (cur_seq[0] == 0)
1211 ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1212 ASSERT_EQ(cur_seq[1], 0);
1213 ASSERT_EQ(cur_seq[2], 0);
1215 while (cur_seq[1] == 0)
1216 ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1217 ASSERT_EQ(cur_seq[2], 0);
1220 TEST_P(TDMVblank, VblankWaitIgnoreGlobalFps)
1222 TDM_UT_SKIP_FLAG(has_outputs);
1224 unsigned int fps = (unsigned int)TDM_UT_INVALID_VALUE;
1225 unsigned int cur_seq[3];
1226 unsigned int global_fps = 5;
1227 double start, end, interval;
1229 ASSERT_EQ(TestPrepareOutput(), true);
1230 ASSERT_EQ(TestCreateVblanks3(), true);
1231 ASSERT_EQ(vblank_count, 3);
1233 ASSERT_EQ(tdm_vblank_get_fps(vblanks[0], &fps), TDM_ERROR_NONE);
1234 ASSERT_TRUE(fps >= 30 && fps != (unsigned int)TDM_UT_INVALID_VALUE);
1235 interval = 1.0 / (double)fps;
1237 /* 2nd vblank will ignore the global fps. */
1238 ASSERT_EQ(tdm_vblank_ignore_global_fps(vblanks[1], 1), TDM_ERROR_NONE);
1240 tdm_vblank_enable_global_fps(1, global_fps);
1242 for (int v = 0; v < 3; v++) {
1244 ASSERT_EQ(tdm_vblank_wait(vblanks[v], 0, 0, 1, _tc_tdm_vblank_cb, &cur_seq[v]), TDM_ERROR_NONE);
1247 start = tdm_helper_get_time();
1248 while (cur_seq[1] == 0)
1249 ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1250 end = tdm_helper_get_time();
1252 ASSERT_EQ(cur_seq[0], 0);
1253 ASSERT_EQ(cur_seq[2], 0);
1255 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1256 ASSERT_LT((end - start), (interval + interval));
1258 while (cur_seq[0] == 0)
1259 ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1260 ASSERT_NE(cur_seq[2], 0);
1265 TEST_P(TDMClient, ClientVblankWaitNullObject)
1267 unsigned int cur_seq = 0;
1269 ASSERT_EQ(tdm_client_vblank_wait(NULL, 1, _tc_tdm_client_vblank_cb3, &cur_seq), TDM_ERROR_INVALID_PARAMETER);
1272 TEST_P(TDMClient, ClientVblankWaitNullOther)
1274 ASSERT_EQ(PrepareClient(), true);
1275 ASSERT_EQ(PrepareOutput(), true);
1276 ASSERT_EQ(PrepareVblank(), true);
1278 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
1281 TEST_P(TDMClient, ClientVblankWaitDpmsOff)
1283 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
1285 ASSERT_EQ(PrepareClient(), true);
1286 ASSERT_EQ(PrepareOutput(), true);
1287 ASSERT_EQ(PrepareVblank(), true);
1289 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
1290 while (dpms != TDM_OUTPUT_DPMS_OFF)
1291 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1292 ASSERT_EQ(dpms, TDM_OUTPUT_DPMS_OFF);
1294 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, NULL), TDM_ERROR_DPMS_OFF);
1296 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
1297 while (dpms != TDM_OUTPUT_DPMS_ON)
1298 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1301 TEST_P(TDMClient, ClientVblankWaitSetEnableFakeDpmsOff)
1303 tdm_output_dpms dpms = (tdm_output_dpms)TDM_UT_INVALID_VALUE;
1306 ASSERT_EQ(PrepareClient(), true);
1307 ASSERT_EQ(PrepareOutput(), true);
1308 ASSERT_EQ(PrepareVblank(), true);
1310 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_OFF), true);
1311 while (dpms != TDM_OUTPUT_DPMS_OFF)
1312 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1314 ASSERT_EQ(tdm_client_vblank_set_enable_fake(vblank, 1), TDM_ERROR_NONE);
1317 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1320 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1322 ASSERT_EQ(_tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true);
1323 while (dpms != TDM_OUTPUT_DPMS_ON)
1324 ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE);
1327 /* tdm_client_vblank_wait */
1328 TEST_P(TDMClient, ClientVblankIsWaiting)
1331 unsigned int waiting;
1333 ASSERT_EQ(PrepareClient(), true);
1334 ASSERT_EQ(PrepareOutput(), true);
1335 ASSERT_EQ(PrepareVblank(), true);
1338 ASSERT_EQ(tdm_client_vblank_wait(vblank, 1, _tc_tdm_client_vblank_cb2, &done), TDM_ERROR_NONE);
1340 waiting = tdm_client_vblank_is_waiting(vblank);
1341 ASSERT_EQ(waiting, 1);
1343 start = tdm_helper_get_time();
1345 ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE);
1346 end = tdm_helper_get_time();
1348 /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */
1349 ASSERT_LT((end - start), (vrefresh_interval + vrefresh_interval));
1351 waiting = tdm_client_vblank_is_waiting(vblank);
1352 ASSERT_EQ(waiting, 0);
1355 /* tdm_client_vblank_wait */
1356 TEST_P(TDMClient, ClientVblankIsWaitingNullObject)
1358 unsigned int waiting = tdm_client_vblank_is_waiting(NULL);
1359 ASSERT_EQ(waiting, 0);
1362 TEST_P(TDMClient, ClientCreateVOutput)
1365 const char name[TDM_NAME_LEN] = "Virtual Output";
1367 ASSERT_EQ(PrepareClient(), true);
1369 voutput = tdm_client_create_voutput(client, name, &ret);
1370 ASSERT_EQ(ret, TDM_ERROR_NONE);
1371 ASSERT_NE(voutput, NULL);
1373 tdm_client_voutput_destroy(voutput);
1376 class TDMVirtualOutput : public ::testing::Test
1379 TDMVirtualOutput() {};
1380 ~TDMVirtualOutput() {};
1382 static void SetUpTestCase();
1383 static void TearDownTestCase();
1384 static bool PrepareVOutput(void);
1387 static tdm_client *client;
1388 static tdm_client_voutput *voutput;
1389 const int MODE_COUNT = 1;
1392 static pid_t server_pid;
1394 /* 0: read, 1: write */
1395 static int pipe_parent[2];
1396 static int pipe_child[2];
1398 static void ServerFork(void);
1399 static void ServerKill(void);
1402 pid_t TDMVirtualOutput::server_pid = -1;
1403 int TDMVirtualOutput::pipe_parent[2] = {-1, -1};
1404 int TDMVirtualOutput::pipe_child[2] = {-1, -1};
1405 tdm_client* TDMVirtualOutput::client = nullptr;
1406 tdm_client_voutput* TDMVirtualOutput::voutput = nullptr;
1408 void TDMVirtualOutput::ServerKill(void)
1410 if (pipe_child[0] >= 0)
1411 close(pipe_child[0]);
1412 if (pipe_child[1] >= 0) {
1413 if (server_pid > 0) {
1414 bool ret = _tc_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_TERMINATE_SERVER);
1416 if (waitpid(server_pid, NULL, 0) == server_pid)
1417 TDM_INFO("*** server terminated ***");
1419 TDM_ERR("*** failed to terminate server ***");
1421 if (kill(server_pid, 9) < 0)
1422 TDM_ERR("*** failed to kill server ***");
1425 close(pipe_child[1]);
1428 if (pipe_parent[0] >= 0)
1429 close(pipe_parent[0]);
1430 if (pipe_parent[1] >= 0)
1431 close(pipe_parent[1]);
1434 pipe_parent[0] = pipe_parent[1] = -1;
1435 pipe_child[0] = pipe_child[1] = -1;
1438 void TDMVirtualOutput::ServerFork(void)
1443 server_pid = _tc_tdm_client_server_fork(pipe_parent, pipe_child);
1444 ASSERT_GT(server_pid, 0);
1447 void TDMVirtualOutput::SetUpTestCase(void)
1449 setenv("XDG_RUNTIME_DIR", "/run", 1);
1450 setenv("TBM_DISPLAY_SERVER", "1", 1);
1452 if (server_pid == -1)
1455 ASSERT_EQ(PrepareVOutput(), true);
1458 void TDMVirtualOutput::TearDownTestCase(void)
1461 tdm_client_voutput_destroy(voutput);
1464 tdm_client_destroy(client);
1468 unsetenv("XDG_RUNTIME_DIR");
1469 unsetenv("TBM_DISPLAY_SERVER");
1472 bool TDMVirtualOutput::PrepareVOutput(void)
1475 const char name[TDM_NAME_LEN] = "Virtual Output";
1477 client = tdm_client_create(&ret);
1478 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
1479 TDM_UT_RETURN_FALSE_IF_FAIL(client != NULL);
1481 voutput = tdm_client_create_voutput(client, name, &ret);
1482 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
1483 TDM_UT_RETURN_FALSE_IF_FAIL(voutput != NULL);
1487 TEST_F(TDMVirtualOutput, SetAvailableModes)
1490 tdm_client_output_mode modes[this->MODE_COUNT];
1491 int i, count = this->MODE_COUNT;
1493 for (i = 0; i < count; i++)
1495 modes[i].mmHeight = 1234;
1496 modes[i].mmWidth = 1234;
1497 modes[i].mode_count = 0;
1498 modes[i].prop_count = 0;
1499 modes[i].subpixel = 0;
1500 snprintf(modes[i].name, TDM_NAME_LEN, "TestModeSetting");
1503 ret = tdm_client_voutput_set_available_modes(this->voutput, modes, count);
1504 ASSERT_EQ(ret, TDM_ERROR_NONE);
1507 TEST_F(TDMVirtualOutput, FailTestSetAvailableModes)
1510 tdm_client_output_mode modes[this->MODE_COUNT];
1511 int count = this->MODE_COUNT;
1513 ret = tdm_client_voutput_set_available_modes(NULL, modes, count);
1514 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1516 ret = tdm_client_voutput_set_available_modes(this->voutput, NULL, count);
1517 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1519 ret = tdm_client_voutput_set_available_modes(this->voutput, modes, 0);
1520 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1523 TEST_F(TDMVirtualOutput, SetPhysicalSize)
1526 int mmWidth = 1234, mmHeight = 1234;
1528 ret = tdm_client_voutput_set_physical_size(this->voutput, mmWidth, mmHeight);
1529 ASSERT_EQ(ret, TDM_ERROR_NONE);
1532 TEST_F(TDMVirtualOutput, FailTestSetPhysicalSize)
1535 int invalid_mmWidth = -1, invalid_mmHeight = -1;
1537 ret = tdm_client_voutput_set_physical_size(this->voutput, invalid_mmWidth, invalid_mmHeight);
1538 ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1541 TEST_F(TDMVirtualOutput, GetClientOutput)
1544 tdm_client_output *output;
1546 output = tdm_client_voutput_get_client_output(this->voutput, &ret);
1547 ASSERT_EQ(ret, TDM_ERROR_NONE);
1548 ASSERT_NE(output, NULL);
1552 TEST_F(TDMVirtualOutput, FailTestGetClientOutput)
1557 TEST_F(TDMVirtualOutput, SetBufferQueue)
1562 TEST_F(TDMVirtualOutput, FailTestSetBufferQueue)
1569 #ifdef TDM_UT_TEST_WITH_PARAMS
1570 INSTANTIATE_TEST_CASE_P(TDMClientParams,
1572 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
1574 INSTANTIATE_TEST_CASE_P(TDMClientParams,
1576 Values(TDM_DEFAULT_MODULE));