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 **************************************************************************/
32 #include "gtest/gtest.h"
33 #include "ut_common.h"
37 #include <sys/eventfd.h>
40 #include <semaphore.h>
41 #include <sys/signalfd.h>
43 #include <sys/prctl.h>
44 #include <sys/socket.h>
45 #include <sys/timerfd.h>
50 #include "tdm_client.h"
52 #include "tbm_surface.h"
54 #include "wayland-client.h"
57 class tdm_client_test_prepare
60 tdm_client_test_prepare()
62 /* we have to deal with a named semaphore to protect an access to tdm across several instances
64 semaphore = sem_open(semaphore_name.c_str(), O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR, 1);
65 if (semaphore == SEM_FAILED)
68 sem_unlink(semaphore_name.c_str());
71 std::cout << "can't create semaphore(1): " << semaphore_name << ", errno: " << errno << ".\n";
78 semaphore = sem_open(semaphore_name.c_str(), O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR, 1);
79 if (semaphore == SEM_FAILED)
81 std::cout << "can't create semaphore(2): " << semaphore_name << ", errno: " << errno << ".\n";
86 ~tdm_client_test_prepare()
89 sem_unlink(semaphore_name.c_str());
92 static sem_t *semaphore;
94 /* /dev/shm/sem.tdm-client-utests */
95 static const std::string semaphore_name;
98 sem_t *tdm_client_test_prepare::semaphore;
99 const std::string tdm_client_test_prepare::semaphore_name = "/tdm-client-utests";
101 /* global object is created before main() */
102 tdm_client_test_prepare dont_use_it;
104 /* real mess, sorry... */
105 class TDMClientTest : public ::testing::Test
108 TDMClientTest() : error(TDM_ERROR_NONE), server_pid(0),
109 dsp(nullptr), output(nullptr), layer(nullptr), buffer(nullptr), is_server_stopped(false)
112 start_server(); /* as a separate process */
113 wait_till_server_ready();
122 void send_request_to_server(int req)
127 send_request(ChangeDPMS);
135 /* to stop server by user demand */
136 void stop_server(void)
139 wait_till_serv_is_over();
141 /* TODO: maybe it makes a sense to use this approach in the dtor too */
150 void set_env_vars(void)
152 setenv("XDG_RUNTIME_DIR", "/run", 1);
153 setenv("TBM_DISPLAY_SERVER", "1", 1);
156 void unset_env_vars(void)
158 unsetenv("TBM_DISPLAY_SERVER");
159 unsetenv("XDG_RUNTIME_DIR");
162 void start_server(void)
164 cl_serv_lock_fd = eventfd(0, 0);
165 socketpair(AF_UNIX, SOCK_STREAM, 0, reinterpret_cast<int*>(&socks_pair));
171 close(socks_pair.server_socket);
175 close(socks_pair.client_socket);
177 wait_till_serv_resources_available();
181 void _stop_server(void)
183 if (is_server_stopped) return;
185 close(socks_pair.client_socket);
186 close(cl_serv_lock_fd);
187 kill(server_pid, SIGINT);
189 is_server_stopped = true;
192 void wait_till_server_ready(void)
196 if (read(cl_serv_lock_fd, &val, sizeof val) < 0)
197 std::cout << "error while trying to read from cl_serv_lock_fd eventfd object.\n";
200 void notify_server_ready(void)
206 if (write(cl_serv_lock_fd, &val, sizeof val) < 0)
207 std::cout << "error while trying to write to cl_serv_lock_fd evenfd object.\n";
210 void wait_till_serv_resources_available(void)
216 ret = sem_wait(tdm_client_test_prepare::semaphore);
217 if (ret < 0 && errno == EINTR)
224 void notify_serv_resources_available(void)
226 sem_post(tdm_client_test_prepare::semaphore);
228 sem_close(tdm_client_test_prepare::semaphore);
229 sem_unlink(tdm_client_test_prepare::semaphore_name.c_str());
232 void wait_till_serv_is_over(void)
234 wait_till_serv_resources_available();
235 sem_post(tdm_client_test_prepare::semaphore);
238 void send_request(int req)
242 count = send(socks_pair.client_socket, &req, sizeof req, 0);
244 if (count != sizeof req)
245 std::cout << "error while trying to send request to socks_pair.client_socket.\n";
248 void handle_client_request()
253 count = recv(socks_pair.server_socket, &req, sizeof req, 0);
255 if (count != sizeof req) {
256 std::cout << "error while trying to reserve data from socks_pair.server_socket.\n";
263 change_dpms_request_handler();
271 void run_server(void)
278 /* ask kernel to notify us about parent's die via SIGHUP signal */
279 prctl(PR_SET_PDEATHSIG, SIGHUP);
282 sigaddset(&mask, SIGINT);
283 sigaddset(&mask, SIGHUP);
285 sigprocmask(SIG_BLOCK, &mask, NULL);
287 signal_fd = signalfd(-1, &mask, 0);
290 tdm_display_get_fd(dsp, &tdm_fd);
292 std::memset(&work_fds, 0, sizeof work_fds);
294 work_fds[0].fd = signal_fd;
295 work_fds[0].events = POLLIN;
297 work_fds[1].fd = tdm_fd;
298 work_fds[1].events = POLLIN;
300 work_fds[2].fd = socks_pair.server_socket;
301 work_fds[2].events = POLLIN;
303 notify_server_ready();
309 ret = poll(work_fds, 3, -1);
310 if (ret < 0 && errno == EINTR) continue;
312 if (work_fds[0].revents == POLLIN)
318 if(work_fds[1].revents == POLLIN)
319 tdm_display_handle_events(dsp);
321 if(work_fds[2].revents == POLLIN)
322 handle_client_request();
326 void signal_hndl(void)
328 close(socks_pair.server_socket);
329 close(cl_serv_lock_fd);
332 notify_serv_resources_available();
336 void deinit_tdm(void);
338 void set_layer_geometry(int w, int h);
339 void set_image_on_screen(int w, int h);
341 void change_dpms_request_handler(void);
345 sockets_pair() : server_socket(0), client_socket(0) {}
356 sockets_pair socks_pair;
362 tbm_surface_h buffer;
364 bool is_server_stopped;
367 class TDMClientTestClient : public TDMClientTest
370 TDMClientTestClient() : TDMClientTest()
372 tdm_cl = tdm_client_create(nullptr);
374 ~TDMClientTestClient()
376 tdm_client_destroy(tdm_cl);
383 class TDMClientTestClientOutput : public TDMClientTestClient
386 TDMClientTestClientOutput() : TDMClientTestClient()
388 cl_output = tdm_client_get_output(tdm_cl, const_cast<char*>("primary"), nullptr);
390 ~TDMClientTestClientOutput()
395 tdm_client_output* cl_output;
398 class TDMClientTestVblank : public TDMClientTestClientOutput
401 TDMClientTestVblank() : TDMClientTestClientOutput()
403 cl_vblank = tdm_client_output_create_vblank(cl_output, nullptr);
405 ~TDMClientTestVblank()
407 tdm_client_vblank_destroy(cl_vblank);
411 tdm_client_vblank* cl_vblank;
414 typedef TDMClientTest TDMClientTestDeathTest;
415 typedef TDMClientTestClient TDMClientTestClientDeathTest;
416 typedef TDMClientTestClientOutput TDMClientTestClientOutputDeathTest;
417 typedef TDMClientTestVblank TDMClientTestVblankDeathTest;
420 void TDMClientTest::set_layer_geometry(int w, int h)
422 tdm_info_layer layer_info;
424 std::memset(&layer_info, 0, sizeof(tdm_info_layer));
426 layer_info.src_config.size.h = w;
427 layer_info.src_config.size.v = h;
428 layer_info.src_config.pos.x = 0;
429 layer_info.src_config.pos.y = 0;
430 layer_info.src_config.pos.w = w;
431 layer_info.src_config.pos.h = h;
432 layer_info.src_config.format = TBM_FORMAT_ARGB8888;
433 layer_info.dst_pos.x = 0;
434 layer_info.dst_pos.y = 0;
435 layer_info.dst_pos.w = w;
436 layer_info.dst_pos.h = h;
437 layer_info.transform = TDM_TRANSFORM_NORMAL;
439 tdm_layer_set_info(layer, &layer_info);
442 void TDMClientTest::set_image_on_screen(int w, int h)
444 tbm_surface_info_s tbm_surface_info;
446 /* to have a hw vblank we have to make at least one tdm_commit */
447 buffer = tbm_surface_create(w, h, TBM_FORMAT_ARGB8888);
449 std::memset(&tbm_surface_info, 0, sizeof(tbm_surface_info_s));
451 tbm_surface_map(buffer, TBM_SURF_OPTION_WRITE, &tbm_surface_info);
453 int *img = (int *)tbm_surface_info.planes[0].ptr;
455 for (uint32_t i = 0; i < tbm_surface_info.height; i++)
456 for (uint32_t j = 0; j < tbm_surface_info.planes[0].stride / 4; j++)
459 tbm_surface_unmap(buffer);
461 set_layer_geometry(w, h);
462 tdm_layer_set_buffer(layer, buffer);
463 tdm_output_commit(output, 0, nullptr, nullptr);
466 void TDMClientTest::init_tdm(void)
469 tdm_output_type tdm_output_type;
472 int output_modes_cnt = 0;
473 const tdm_output_mode* output_modes;
474 const tdm_output_mode* preferred_mode = NULL;
477 tdm_layer_capability tdm_layer_capability;
479 dsp = tdm_display_init(nullptr);
481 tdm_display_get_output_count(dsp, &outputs_cnt);
483 /* this part is hardware dependent, how to resolve this issue ? */
484 for (int i = 0; i < outputs_cnt; i++)
486 output = tdm_display_get_output(dsp, i, nullptr);
487 if (output == NULL) {
488 std::cout << "tdm_display_get_output faild, server's gonna be stopped.\n";
492 error = tdm_output_get_output_type(output, &tdm_output_type);
493 if (error != TDM_ERROR_NONE) {
494 std::cout << "tdm_output_get_output_type faild, server's gonna be stopped.\n";
499 /* we're not interesting about other outputs */
500 if (tdm_output_type != TDM_OUTPUT_TYPE_VIRTUAL &&
501 tdm_output_type != TDM_OUTPUT_TYPE_HDMIA)
505 /* get output's preferred mode to obtain width & height we'll use later to create surface */
506 tdm_output_get_available_modes(output, &output_modes, &output_modes_cnt);
508 /* look for output's preferred mode */
509 for (int i = 0; i < output_modes_cnt; i++)
511 if (output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED)
513 preferred_mode = &output_modes[i];
520 std::cout << "no preferred mode, server's gonna be stopped.\n";
526 tdm_output_set_mode(output, preferred_mode);
528 tdm_output_get_layer_count(output, &layers_cnt);
530 /* it supposed that output always has primary & graphic layer */
531 for (int i = 0; i < layers_cnt; i++)
533 layer = tdm_output_get_layer(output, i, nullptr);
534 tdm_layer_get_capabilities(layer, &tdm_layer_capability);
536 if ((tdm_layer_capability & TDM_LAYER_CAPABILITY_PRIMARY) &&
537 (tdm_layer_capability & TDM_LAYER_CAPABILITY_GRAPHIC))
541 tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_ON);
543 set_image_on_screen(preferred_mode->hdisplay, preferred_mode->vdisplay);
546 void TDMClientTest::deinit_tdm(void)
550 tdm_layer_unset_buffer(layer);
551 tdm_output_commit(output, 1, nullptr, nullptr);
555 tbm_surface_internal_unref(buffer);
558 tdm_display_deinit(dsp);
561 void TDMClientTest::change_dpms_request_handler(void)
563 std::cout << "tdm_output_set_dpms.\n";
564 tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF);
567 TEST_F(TDMClientTest, TdmClientCreateSuccessfulCheckClient)
569 tdm_client *tdm_cl = tdm_client_create(nullptr);
570 ASSERT_TRUE(nullptr != tdm_cl);
572 tdm_client_destroy(tdm_cl);
575 TEST_F(TDMClientTest, TdmClientCreateSuccessfulCheckError)
577 tdm_client* tdm_cl = tdm_client_create(&error);
578 ASSERT_TRUE(TDM_ERROR_NONE == error);
580 tdm_client_destroy(tdm_cl);
583 TEST_F(TDMClientTest, TdmClientCreateFailServerStoppedCheckError)
587 tdm_client_create(&error);
588 ASSERT_TRUE(TDM_ERROR_OPERATION_FAILED == error);
591 TEST_F(TDMClientTest, TdmClientCreateFailServerStopped)
595 tdm_client *tdm_cl = tdm_client_create(nullptr);
596 ASSERT_TRUE(nullptr == tdm_cl);
599 TEST_F(TDMClientTestDeathTest, TdmClientDestroySuccessful)
603 tdm_client_destroy(nullptr);
607 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
610 TEST_F(TDMClientTestDeathTest, TdmClientDestroySuccessfulServerStopped)
614 tdm_client *tdm_cl = tdm_client_create(nullptr);
618 tdm_client_destroy(tdm_cl);
622 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
625 TEST_F(TDMClientTestClient, TdmClientGetFdSuccessful)
629 tdm_client_get_fd(tdm_cl, &fd);
633 TEST_F(TDMClientTestClient, TdmClientGetFdSuccessfulCheckError)
637 error = tdm_client_get_fd(tdm_cl, &fd);
638 ASSERT_TRUE(TDM_ERROR_NONE == error);
641 TEST_F(TDMClientTestClient, TdmClientGetFdFailNullTdmClient)
645 error = tdm_client_get_fd(nullptr, &fd);
646 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
649 TEST_F(TDMClientTestClient, TdmClientGetFdFailNullFd)
651 error = tdm_client_get_fd(nullptr, nullptr);
652 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
655 TEST_F(TDMClientTestClient, TdmClientHandleEventsSuccessful)
662 std::memset(&work_fds, 0, sizeof work_fds);
663 std::memset(×_up, 0, sizeof times_up);
665 tdm_client_get_fd(tdm_cl, &work_fds[0].fd);
666 work_fds[0].events = POLLIN;
668 work_fds[1].fd = timerfd_create(CLOCK_MONOTONIC, 0);
669 work_fds[1].events = POLLIN;
671 times_up.it_value.tv_nsec = 100000000; /* 100ms */
672 timerfd_settime(work_fds[1].fd, 0, ×_up, nullptr);
678 ret = poll(work_fds, 2, -1);
679 if (ret < 0 && errno == EINTR) continue;
681 if (work_fds[0].revents == POLLIN)
683 tdm_client_handle_events(tdm_cl);
684 std::cout << "ha.\n";
687 if(work_fds[1].revents == POLLIN)
691 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
694 TEST_F(TDMClientTestClient, TdmClientHandleEventsFailNullTDMClient)
696 error = tdm_client_handle_events(nullptr);
697 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
700 TEST_F(TDMClientTestClient, TdmClientGetOutputSuccessful)
702 tdm_client_output* cl_output;
704 cl_output = tdm_client_get_output(tdm_cl, const_cast<char*>("primary"), nullptr);
705 ASSERT_TRUE(nullptr != cl_output);
708 TEST_F(TDMClientTestClient, TdmClientGetOutputSuccessfulCallTwice)
710 tdm_client_output* cl_output_1, *cl_output_2;
712 cl_output_1 = tdm_client_get_output(tdm_cl, const_cast<char*>("primary"), nullptr);
713 cl_output_2 = tdm_client_get_output(tdm_cl, const_cast<char*>("primary"), nullptr);
714 ASSERT_TRUE(cl_output_1 == cl_output_2);
717 TEST_F(TDMClientTestClient, TdmClientGetOutputSuccessfulCheckError)
719 tdm_client_get_output(tdm_cl, const_cast<char*>("primary"), &error);
720 ASSERT_TRUE(TDM_ERROR_NONE == error);
723 TEST_F(TDMClientTestClient, TdmClientGetOutputSuccessfulNullName)
725 tdm_client_output* cl_output;
727 cl_output = tdm_client_get_output(tdm_cl, nullptr, nullptr);
728 ASSERT_TRUE(nullptr != cl_output);
731 TEST_F(TDMClientTestClient, TdmClientGetOutputSuccessfulNullNameCheckError)
733 tdm_client_get_output(tdm_cl, nullptr, &error);
734 ASSERT_TRUE(TDM_ERROR_NONE == error);
737 TEST_F(TDMClientTestClient, TdmClientGetOutputFailNullTdmClient)
739 tdm_client_output* cl_output;
741 cl_output = tdm_client_get_output(nullptr, const_cast<char*>("primary"), nullptr);
742 ASSERT_TRUE(nullptr == cl_output);
745 TEST_F(TDMClientTestClient, TdmClientGetOutputFailNullTdmClientCheckError)
747 tdm_client_get_output(nullptr, const_cast<char*>("primary"), &error);
748 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
751 TEST_F(TDMClientTestClientOutput, TdmClientOutputAddChangeHandlerSuccessful)
753 static bool got_an_event = false;
756 /* is this function implemented fully? */
757 tdm_client_output_add_change_handler(cl_output, [] (tdm_client_output *output,
758 tdm_output_change_type type,
760 void *user_data) { got_an_event = true; }, nullptr);
762 /* force a requests flush */
763 wl_dsp = wl_display_connect("tdm-socket");
764 ASSERT_TRUE(nullptr != wl_dsp);
765 wl_display_flush(wl_dsp);
766 wl_display_roundtrip(wl_dsp);
767 wl_display_disconnect(wl_dsp);
769 send_request_to_server(TDMClientTest::ChangeDPMS);
770 tdm_client_handle_events(tdm_cl);
772 ASSERT_TRUE(true == got_an_event);
775 TEST_F(TDMClientTestClientOutput, TdmClientOutputAddChangeHandlerFailNullOutput)
777 error = tdm_client_output_add_change_handler(nullptr, [] (tdm_client_output *output,
778 tdm_output_change_type type,
780 void *user_data) {}, nullptr);
781 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
784 TEST_F(TDMClientTestClientOutput, TdmClientOutputAddChangeHandlerFailNullHandler)
786 error = tdm_client_output_add_change_handler(cl_output, nullptr, nullptr);
787 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
790 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientOutputRemoveChangeHandlerSuccessful)
794 auto func = [] (tdm_client_output *output, tdm_output_change_type type, tdm_value value,
797 tdm_client_output_add_change_handler(cl_output, func, nullptr);
799 tdm_client_output_remove_change_handler(cl_output, func, nullptr);
803 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
806 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientOutputRemoveChangeHandlerSuccessfulInvalidHandler)
810 auto func = [] (tdm_client_output *output, tdm_output_change_type type, tdm_value value,
813 tdm_client_output_remove_change_handler(cl_output, func, nullptr);
817 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
820 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientOutputRemoveChangeHandlerFailNullOutput)
824 auto func = [] (tdm_client_output *output, tdm_output_change_type type, tdm_value value,
827 tdm_client_output_remove_change_handler(nullptr, func, nullptr);
831 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
834 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientOutputRemoveChangeHandlerFailNullHandler)
838 tdm_client_output_remove_change_handler(cl_output, nullptr, nullptr);
842 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
845 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetRefreshRateSuccessful)
847 uint32_t refresh_rate;
849 error = tdm_client_output_get_refresh_rate(cl_output, &refresh_rate);
850 ASSERT_TRUE(TDM_ERROR_NONE == error);
853 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetRefreshRateFailNullOutput)
855 uint32_t refresh_rate;
857 error = tdm_client_output_get_refresh_rate(nullptr, &refresh_rate);
858 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
861 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetRefreshRateFailNullRefreshRate)
863 error = tdm_client_output_get_refresh_rate(cl_output, nullptr);
864 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
867 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetConnectionStatusSuccessful)
869 tdm_output_conn_status conn_status;
871 error = tdm_client_output_get_conn_status(cl_output, &conn_status);
872 ASSERT_TRUE(TDM_ERROR_NONE == error);
875 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetConnectionStatusFailNullOutput)
877 tdm_output_conn_status conn_status;
879 error = tdm_client_output_get_conn_status(nullptr, &conn_status);
880 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
883 TEST_F(TDMClientTestClientOutput, TTdmClientOutputGetConnectionStatusFailNullConnState)
885 error = tdm_client_output_get_conn_status(cl_output, nullptr);
886 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
889 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetDpmsSuccessful)
891 tdm_output_dpms dpms_val;
893 error = tdm_client_output_get_dpms(cl_output, &dpms_val);
894 ASSERT_TRUE(TDM_ERROR_NONE == error);
897 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetDpmsFailNullOutput)
899 tdm_output_dpms dpms_val;
901 error = tdm_client_output_get_dpms(nullptr, &dpms_val);
902 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
905 TEST_F(TDMClientTestClientOutput, TdmClientOutputGetDpmsFailNullDpmsArg)
907 error = tdm_client_output_get_dpms(cl_output, nullptr);
908 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
911 TEST_F(TDMClientTestClientOutput, TdmClientOutputCreateVblankSuccessful)
913 tdm_client_vblank* cl_vblank;
915 cl_vblank = tdm_client_output_create_vblank(cl_output, nullptr);
916 ASSERT_TRUE(nullptr != cl_vblank);
918 tdm_client_vblank_destroy(cl_vblank);
921 TEST_F(TDMClientTestClientOutput, TdmClientOutputCreateVblankSuccessfulCheckError)
923 tdm_client_vblank* cl_vblank;
925 cl_vblank = tdm_client_output_create_vblank(cl_output, &error);
926 ASSERT_TRUE(TDM_ERROR_NONE == error);
928 tdm_client_vblank_destroy(cl_vblank);
931 TEST_F(TDMClientTestClientOutput, TdmClientOutputCreateVblankFailNullOutput)
933 tdm_client_vblank* cl_vblank;
935 cl_vblank = tdm_client_output_create_vblank(nullptr, nullptr);
936 ASSERT_TRUE(nullptr == cl_vblank);
939 TEST_F(TDMClientTestClientOutput, TdmClientOutputCreateVblankFailNullOutputCheckError)
941 tdm_client_output_create_vblank(nullptr, &error);
942 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
945 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientDestroyVblankSuccessful)
949 tdm_client_vblank *cl_vblank = tdm_client_output_create_vblank(cl_output, nullptr);
951 tdm_client_vblank_destroy(cl_vblank);
954 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
957 TEST_F(TDMClientTestClientOutputDeathTest, TdmClientDestroyVblankFailNoClientVblankArg)
961 tdm_client_vblank_destroy(nullptr);
964 ::testing::ExitedWithCode(EXIT_SUCCESS), "");
967 TEST_F(TDMClientTestVblank, TdmClientVblankSetNameSuccessful)
969 error = tdm_client_vblank_set_name(cl_vblank, "wassup");
970 ASSERT_TRUE(TDM_ERROR_NONE == error);
973 TEST_F(TDMClientTestVblank, TdmClientVblankSetNameSuccessfulNoExplicitName)
975 error = tdm_client_vblank_set_name(cl_vblank, nullptr);
976 ASSERT_TRUE(TDM_ERROR_NONE == error);
979 TEST_F(TDMClientTestVblank, TdmClientVblankSetNameFailNullClientVblank)
981 error = tdm_client_vblank_set_name(nullptr, "wassup");
982 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
985 TEST_F(TDMClientTestVblank, TdmClientVblankSetSyncSuccessful)
987 error = tdm_client_vblank_set_sync(cl_vblank, 0);
988 ASSERT_TRUE(TDM_ERROR_NONE == error);
991 TEST_F(TDMClientTestVblank, TdmClientVblankSetSyncFailNullClientVblank)
993 error = tdm_client_vblank_set_sync(nullptr, 0);
994 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
997 TEST_F(TDMClientTestVblank, TdmClientVblankSetFpsSuccessful)
999 error = tdm_client_vblank_set_fps(cl_vblank, 60);
1000 ASSERT_TRUE(TDM_ERROR_NONE == error);
1003 TEST_F(TDMClientTestVblank, TdmClientVblankSetFpsSuccessfulSetTwice)
1005 tdm_client_vblank_set_fps(cl_vblank, 60);
1006 error = tdm_client_vblank_set_fps(cl_vblank, 60);
1007 ASSERT_TRUE(TDM_ERROR_NONE == error);
1010 TEST_F(TDMClientTestVblank, TdmClientVblankSetFpsFailNullClientVblank)
1012 error = tdm_client_vblank_set_fps(nullptr, 60);
1013 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1016 TEST_F(TDMClientTestVblank, TdmClientVblankSetFpsFailInvalidFpsArg)
1018 error = tdm_client_vblank_set_fps(cl_vblank, 0);
1019 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1022 TEST_F(TDMClientTestVblank, TdmClientVblankSetOffsetSuccessful)
1024 error = tdm_client_vblank_set_offset(cl_vblank, 10);
1025 ASSERT_TRUE(TDM_ERROR_NONE == error);
1028 TEST_F(TDMClientTestVblank, TdmClientVblankSetOffsetSuccessfulSetTwice)
1030 tdm_client_vblank_set_offset(cl_vblank, 10);
1031 error = tdm_client_vblank_set_offset(cl_vblank, 10);
1032 ASSERT_TRUE(TDM_ERROR_NONE == error);
1035 TEST_F(TDMClientTestVblank, TdmClientVblankSetOffsetFailNullClientVblank)
1037 error = tdm_client_vblank_set_offset(nullptr, 10);
1038 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1041 TEST_F(TDMClientTestVblank, TdmClientVblankSetFakeSuccessfulEnableFake)
1043 error = tdm_client_vblank_set_enable_fake(cl_vblank, 1);
1044 ASSERT_TRUE(TDM_ERROR_NONE == error);
1047 TEST_F(TDMClientTestVblank, TdmClientVblankSetFakeSuccessfulDisableFake)
1049 error = tdm_client_vblank_set_enable_fake(cl_vblank, 0);
1050 ASSERT_TRUE(TDM_ERROR_NONE == error);
1053 TEST_F(TDMClientTestVblank, TdmClientVblankSetFakeSuccessfulSetTwice)
1055 tdm_client_vblank_set_enable_fake(cl_vblank, 0);
1056 error = tdm_client_vblank_set_enable_fake(cl_vblank, 0);
1057 ASSERT_TRUE(TDM_ERROR_NONE == error);
1060 TEST_F(TDMClientTestVblank, TdmClientVblankSetFakeFailNullClientVblank)
1062 error = tdm_client_vblank_set_enable_fake(nullptr, 0);
1063 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1066 TEST_F(TDMClientTestVblank, TdmClientVblankWaitSuccessful)
1068 auto func = [](tdm_client_vblank *vblank, tdm_error error, unsigned int sequence,
1069 unsigned int tv_sec, unsigned int tv_usec, void *user_data) {};
1071 tdm_client_vblank_set_sync(cl_vblank, 0);
1072 tdm_client_vblank_set_enable_fake(cl_vblank, 1);
1074 error = tdm_client_vblank_wait(cl_vblank, 1, func, nullptr);
1075 ASSERT_TRUE(TDM_ERROR_NONE == error);
1078 TEST_F(TDMClientTestVblank, TdmClientVblankWaitFailNullClientVblank)
1080 auto func = [](tdm_client_vblank *vblank, tdm_error error, unsigned int sequence,
1081 unsigned int tv_sec, unsigned int tv_usec, void *user_data) {};
1083 error = tdm_client_vblank_wait(nullptr, 1, func, nullptr);
1084 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1087 TEST_F(TDMClientTestVblank, TdmClientVblankWaitFailNullHandler)
1089 error = tdm_client_vblank_wait(cl_vblank, 1, nullptr, nullptr);
1090 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1093 TEST_F(TDMClientTestVblank, TdmClientVblankWaitFailInvalidInterval)
1095 auto func = [](tdm_client_vblank *vblank, tdm_error error, unsigned int sequence,
1096 unsigned int tv_sec, unsigned int tv_usec, void *user_data) {};
1098 error = tdm_client_vblank_wait(cl_vblank, 0, func, nullptr);
1099 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1102 TEST_F(TDMClientTestVblank, TdmClientVblankWaitSequencySuccessful)
1104 auto func = [](tdm_client_vblank *vblank, tdm_error error, unsigned int sequence,
1105 unsigned int tv_sec, unsigned int tv_usec, void *user_data) {};
1107 tdm_client_vblank_set_sync(cl_vblank, 0);
1108 tdm_client_vblank_set_enable_fake(cl_vblank, 1);
1110 error = tdm_client_vblank_wait_seq(cl_vblank, 100, func, nullptr);
1111 ASSERT_TRUE(TDM_ERROR_NONE == error);
1114 TEST_F(TDMClientTestVblank, TdmClientVblankWaitSequencyFailNullClientVblank)
1116 auto func = [](tdm_client_vblank *vblank, tdm_error error, unsigned int sequence,
1117 unsigned int tv_sec, unsigned int tv_usec, void *user_data) {};
1119 error = tdm_client_vblank_wait_seq(nullptr, 1, func, nullptr);
1120 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);
1123 TEST_F(TDMClientTestVblank, TdmClientVblankWaitSequencyFailNullHandler)
1125 error = tdm_client_vblank_wait_seq(cl_vblank, 1, nullptr, nullptr);
1126 ASSERT_TRUE(TDM_ERROR_INVALID_PARAMETER == error);