1 /**************************************************************************
3 * Copyright 2016 Samsung Electronics co., Ltd. All Rights Reserved.
5 * Contact: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 **************************************************************************/
29 #include "gtest/gtest.h"
31 #include "tbm_stubs.h"
32 #include "stub_pthread.h"
33 #include "stub_stdlib.h"
34 #include "stub_unistd.h"
36 #include "stub_tdm_display.h"
37 #include "stub_tdm_pp.h"
38 #include "stub_tdm_capture.h"
39 #include "stub_tdm_vblank.h"
41 #include "tdm_thread.c"
43 static void _init_test()
45 keep_private_thread = NULL;
51 stub_tdm_display_init();
59 TEST(tdm_thread_init, error_mutex_is_not_locked)
62 tdm_error expected_error = TDM_ERROR_OPERATION_FAILED;
63 tdm_private_loop private_loop;
64 tdm_private_thread private_thread;
68 keep_private_thread = &private_thread;
70 error = tdm_thread_init(&private_loop);
72 ASSERT_EQ(error, expected_error);
75 TEST(tdm_thread_init, error_dpy_is_null)
78 tdm_error expected_error = TDM_ERROR_OPERATION_FAILED;
79 tdm_private_loop private_loop;
83 memset(&private_loop, 0, sizeof(tdm_private_loop));
87 error = tdm_thread_init(&private_loop);
89 ASSERT_EQ(error, expected_error);
92 TEST(tdm_thread_init, error_dpy_private_loop_is_null)
95 tdm_error expected_error = TDM_ERROR_OPERATION_FAILED;
96 tdm_private_loop private_loop;
97 tdm_private_display private_display;
101 memset(&private_loop, 0, sizeof(tdm_private_loop));
102 memset(&private_display, 0, sizeof(tdm_private_display));
104 tdm_mutex_locked = 1;
105 private_loop.dpy = &private_display;
107 error = tdm_thread_init(&private_loop);
109 ASSERT_EQ(error, expected_error);
112 TEST(tdm_thread_init, success_private_thread_is_not_null)
115 tdm_error expected_error = TDM_ERROR_NONE;
116 tdm_private_loop private_loop;
117 tdm_private_display private_display;
118 tdm_private_loop dpy_private_loop;
119 tdm_private_thread private_thread;
123 memset(&private_loop, 0, sizeof(tdm_private_loop));
124 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
125 memset(&private_display, 0, sizeof(tdm_private_display));
127 tdm_mutex_locked = 1;
128 private_loop.dpy = &private_display;
129 private_display.private_loop = &dpy_private_loop;
130 private_loop.private_thread = &private_thread;
132 error = tdm_thread_init(&private_loop);
134 ASSERT_EQ(error, expected_error);
137 TEST(tdm_thread_init, success_getenv_return_null)
140 tdm_error expected_error = TDM_ERROR_NONE;
141 tdm_private_loop private_loop;
142 tdm_private_display private_display;
143 tdm_private_loop dpy_private_loop;
147 memset(&private_loop, 0, sizeof(tdm_private_loop));
148 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
149 memset(&private_display, 0, sizeof(tdm_private_display));
151 tdm_mutex_locked = 1;
152 private_loop.dpy = &private_display;
153 private_display.private_loop = &dpy_private_loop;
155 stub_getenv_name = "TDM_THREAD";
156 stub_getenv_return_value = NULL;
158 error = tdm_thread_init(&private_loop);
160 ASSERT_EQ(error, expected_error);
163 TEST(tdm_thread_init, success_getenv_return_0)
166 tdm_error expected_error = TDM_ERROR_NONE;
167 tdm_private_loop private_loop;
168 tdm_private_display private_display;
169 tdm_private_loop dpy_private_loop;
173 memset(&private_loop, 0, sizeof(tdm_private_loop));
174 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
175 memset(&private_display, 0, sizeof(tdm_private_display));
177 tdm_mutex_locked = 1;
178 private_loop.dpy = &private_display;
179 private_display.private_loop = &dpy_private_loop;
181 stub_getenv_name = "TDM_THREAD";
182 stub_getenv_return_value = "0";
184 error = tdm_thread_init(&private_loop);
186 ASSERT_EQ(error, expected_error);
189 TEST(tdm_thread_init, error_calloc_return_null)
192 tdm_error expected_error = TDM_ERROR_OUT_OF_MEMORY;
193 tdm_private_loop private_loop;
194 tdm_private_display private_display;
195 tdm_private_loop dpy_private_loop;
199 memset(&private_loop, 0, sizeof(tdm_private_loop));
200 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
201 memset(&private_display, 0, sizeof(tdm_private_display));
203 tdm_mutex_locked = 1;
204 private_loop.dpy = &private_display;
205 private_display.private_loop = &dpy_private_loop;
207 stub_getenv_name = "TDM_THREAD";
208 stub_getenv_return_value = "1";
211 error = tdm_thread_init(&private_loop);
213 ASSERT_EQ(error, expected_error);
216 TEST(tdm_thread_init, error_pipe_return_error)
219 tdm_error expected_error = TDM_ERROR_OPERATION_FAILED;
220 tdm_private_loop private_loop;
221 tdm_private_display private_display;
222 tdm_private_loop dpy_private_loop;
226 memset(&private_loop, 0, sizeof(tdm_private_loop));
227 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
228 memset(&private_display, 0, sizeof(tdm_private_display));
230 tdm_mutex_locked = 1;
231 private_loop.dpy = &private_display;
232 private_display.private_loop = &dpy_private_loop;
234 stub_getenv_name = "TDM_THREAD";
235 stub_getenv_return_value = "1";
239 error = tdm_thread_init(&private_loop);
241 ASSERT_EQ(error, expected_error);
244 TEST(tdm_thread_init, success_init)
247 tdm_error expected_error = TDM_ERROR_NONE;
248 tdm_private_loop private_loop;
249 tdm_private_display private_display;
250 tdm_private_loop dpy_private_loop;
254 memset(&private_loop, 0, sizeof(tdm_private_loop));
255 memset(&dpy_private_loop, 0, sizeof(tdm_private_loop));
256 memset(&private_display, 0, sizeof(tdm_private_display));
258 tdm_mutex_locked = 1;
259 private_loop.dpy = &private_display;
260 private_display.private_loop = &dpy_private_loop;
262 stub_getenv_name = "TDM_THREAD";
263 stub_getenv_return_value = "1";
264 stub_syscall_return_value = 10;
266 error = tdm_thread_init(&private_loop);
268 ASSERT_EQ(error, expected_error);
269 ASSERT_TRUE(keep_private_thread != NULL);
270 ASSERT_TRUE(keep_private_thread->private_loop == &private_loop);
271 ASSERT_TRUE(private_loop.private_thread != NULL);
272 ASSERT_EQ(private_loop.private_thread->display_tid, stub_syscall_return_value);
273 free(private_loop.private_thread);
276 /* tdm_thread_deinit */
278 TEST(tdm_thread_deinit, error_mutex_is_not_locked)
280 tdm_private_loop private_loop;
284 memset(&private_loop, 0, sizeof(tdm_private_loop));
286 private_loop.private_thread = calloc(1, sizeof(tdm_private_thread));
288 keep_private_thread = private_loop.private_thread;
290 tdm_thread_deinit(&private_loop);
292 ASSERT_TRUE(keep_private_thread != NULL);
295 TEST(tdm_thread_deinit, error_private_thread_is_null)
297 tdm_private_loop private_loop;
301 memset(&private_loop, 0, sizeof(tdm_private_loop));
303 keep_private_thread = calloc(1, sizeof(tdm_private_thread));
305 tdm_thread_deinit(&private_loop);
307 ASSERT_TRUE(keep_private_thread != NULL);
310 TEST(tdm_thread_deinit, success_deinit)
312 tdm_private_loop private_loop;
316 memset(&private_loop, 0, sizeof(tdm_private_loop));
318 tdm_mutex_locked = 1;
320 private_loop.private_thread = calloc(1, sizeof(tdm_private_thread));
322 private_loop.private_thread->pipe[0] = 1;
323 private_loop.private_thread->pipe[1] = 2;
325 keep_private_thread = private_loop.private_thread;
327 tdm_thread_deinit(&private_loop);
329 ASSERT_TRUE(keep_private_thread == NULL);
330 ASSERT_EQ(FREE_CALLED, 1);
331 ASSERT_EQ(stub_unistd_closed_fds[1], 1);
332 ASSERT_EQ(stub_unistd_closed_fds[2], 1);
333 ASSERT_TRUE(private_loop.private_thread == NULL);
336 /* tdm_thread_get_fd */
338 TEST(tdm_thread_get_fd, error_mutex_is_not_locked)
341 int expected_ret = TDM_ERROR_OPERATION_FAILED;
342 tdm_private_loop private_loop;
343 tdm_private_thread private_thread;
347 keep_private_thread = &private_thread;
349 ret = tdm_thread_get_fd(&private_loop);
351 ASSERT_EQ(ret, expected_ret);
354 TEST(tdm_thread_get_fd, error_private_loop_is_null)
357 int expected_ret = -1;
361 tdm_mutex_locked = 1;
363 ret = tdm_thread_get_fd(NULL);
365 ASSERT_EQ(ret, expected_ret);
368 TEST(tdm_thread_get_fd, error_private_thread_is_null)
371 int expected_ret = -1;
372 tdm_private_loop private_loop;
376 memset(&private_loop, 0, sizeof(tdm_private_loop));
378 ret = tdm_thread_get_fd(&private_loop);
380 ASSERT_EQ(ret, expected_ret);
383 TEST(tdm_thread_get_fd, success_get_fd)
387 tdm_private_loop private_loop;
388 tdm_private_thread private_thread;
392 memset(&private_loop, 0, sizeof(tdm_private_loop));
393 private_loop.private_thread = &private_thread;
394 private_thread.pipe[0] = 15;
396 expected_ret = private_thread.pipe[0];
398 ret = tdm_thread_get_fd(&private_loop);
400 ASSERT_EQ(ret, expected_ret);
403 /* tdm_thread_send_cb */
405 TEST(tdm_thread_send_cb, error_mutex_is_not_locked)
408 tdm_error expected_ret = TDM_ERROR_OPERATION_FAILED;
409 tdm_private_loop private_loop;
410 tdm_thread_cb_base base;
411 tdm_private_thread private_thread;
415 keep_private_thread = &private_thread;
417 ret = tdm_thread_send_cb(&private_loop, &base);
419 ASSERT_EQ(ret, expected_ret);
422 TEST(tdm_thread_send_cb, error_base_is_null)
425 tdm_error expected_ret = TDM_ERROR_INVALID_PARAMETER;
426 tdm_private_loop private_loop;
430 ret = tdm_thread_send_cb(&private_loop, NULL);
432 ASSERT_EQ(ret, expected_ret);
435 TEST(tdm_thread_send_cb, error_private_loop_is_null)
438 tdm_error expected_ret = TDM_ERROR_INVALID_PARAMETER;
439 tdm_thread_cb_base base;
443 ret = tdm_thread_send_cb(NULL, &base);
445 ASSERT_EQ(ret, expected_ret);
448 TEST(tdm_thread_send_cb, error_private_thread_is_null)
451 tdm_error expected_ret = TDM_ERROR_INVALID_PARAMETER;
452 tdm_private_loop private_loop;
453 tdm_thread_cb_base base;
457 memset(&private_loop, 0, sizeof(tdm_private_loop));
459 ret = tdm_thread_send_cb(&private_loop, &base);
461 ASSERT_EQ(ret, expected_ret);
464 TEST(tdm_thread_send_cb, error_write_error)
467 tdm_error expected_ret = TDM_ERROR_OPERATION_FAILED;
468 tdm_private_loop private_loop;
469 tdm_thread_cb_base base;
470 tdm_private_thread private_thread;
474 memset(&private_loop, 0, sizeof(tdm_private_loop));
475 private_loop.private_thread = &private_thread;
478 stub_write_error = 1;
480 ret = tdm_thread_send_cb(&private_loop, &base);
482 ASSERT_EQ(ret, expected_ret);
485 TEST(tdm_thread_send_cb, success_send_cb)
488 tdm_error expected_ret = TDM_ERROR_NONE;
489 tdm_private_loop private_loop;
490 tdm_thread_cb_base base;
491 tdm_private_thread private_thread;
495 memset(&private_loop, 0, sizeof(tdm_private_loop));
496 private_loop.private_thread = &private_thread;
499 ret = tdm_thread_send_cb(&private_loop, &base);
501 ASSERT_EQ(ret, expected_ret);
504 /* tdm_thread_handle_cb */
506 TEST(tdm_thread_handle_cb, error_private_loop_is_null)
509 tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
511 error = tdm_thread_handle_cb(NULL);
513 ASSERT_EQ(error, expected_error);
516 TEST(tdm_thread_handle_cb, error_private_thread_is_null)
519 tdm_error expected_error = TDM_ERROR_INVALID_PARAMETER;
520 tdm_private_loop private_loop;
524 memset(&private_loop, 0, sizeof(tdm_private_loop));
526 error = tdm_thread_handle_cb(&private_loop);
528 ASSERT_EQ(error, expected_error);
531 TEST(tdm_thread_handle_cb, success_read_0_bytes)
534 tdm_error expected_error = TDM_ERROR_NONE;
535 tdm_private_loop private_loop;
536 tdm_private_thread private_thread;
540 memset(&private_loop, 0, sizeof(tdm_private_loop));
541 private_loop.private_thread = &private_thread;
543 error = tdm_thread_handle_cb(&private_loop);
545 ASSERT_EQ(error, expected_error);
548 TEST(tdm_thread_handle_cb, error_partial_reading)
551 tdm_error expected_error = TDM_ERROR_OPERATION_FAILED;
552 tdm_private_loop private_loop;
553 tdm_private_thread private_thread;
554 tdm_thread_cb_base base;
558 memset(&private_loop, 0, sizeof(tdm_private_loop));
559 private_loop.private_thread = &private_thread;
561 stub_read_buf = (void *)&base;
562 base.length = sizeof(tdm_thread_cb_base);
564 stub_read_returned_size = sizeof(tdm_thread_cb_base) - 1;
566 error = tdm_thread_handle_cb(&private_loop);
568 ASSERT_EQ(error, expected_error);
571 TEST(tdm_thread_handle_cb, success_case_thread_cb_output_commit)
574 tdm_error expected_error = TDM_ERROR_NONE;
575 tdm_private_loop private_loop;
576 tdm_private_thread private_thread;
577 tdm_thread_cb_output_commit cb_output_commit;
581 memset(&private_loop, 0, sizeof(tdm_private_loop));
582 private_loop.private_thread = &private_thread;
584 stub_read_buf = (void *)&cb_output_commit;
585 cb_output_commit.base.type = TDM_THREAD_CB_OUTPUT_COMMIT;
586 cb_output_commit.base.length = sizeof(tdm_thread_cb_output_commit);
588 stub_read_returned_size = sizeof(tdm_thread_cb_output_commit);
590 error = tdm_thread_handle_cb(&private_loop);
592 ASSERT_EQ(error, expected_error);
593 ASSERT_EQ(stub_tdm_output_cb_commit_called, 1);
596 TEST(tdm_thread_handle_cb, success_case_thread_cb_output_vblank)
599 tdm_error expected_error = TDM_ERROR_NONE;
600 tdm_private_loop private_loop;
601 tdm_private_thread private_thread;
602 tdm_thread_cb_output_vblank cb_output_vblank;
606 memset(&private_loop, 0, sizeof(tdm_private_loop));
607 private_loop.private_thread = &private_thread;
609 stub_read_buf = (void *)&cb_output_vblank;
610 cb_output_vblank.base.type = TDM_THREAD_CB_OUTPUT_VBLANK;
611 cb_output_vblank.base.length = sizeof(tdm_thread_cb_output_vblank);
613 stub_read_returned_size = sizeof(tdm_thread_cb_output_vblank);
615 error = tdm_thread_handle_cb(&private_loop);
617 ASSERT_EQ(error, expected_error);
618 ASSERT_EQ(stub_tdm_output_cb_vblank_called, 1);
621 TEST(tdm_thread_handle_cb, success_case_thread_cb_output_status)
624 tdm_error expected_error = TDM_ERROR_NONE;
625 tdm_private_loop private_loop;
626 tdm_private_thread private_thread;
627 tdm_thread_cb_output_status cb_output_status;
631 memset(&private_loop, 0, sizeof(tdm_private_loop));
632 private_loop.private_thread = &private_thread;
634 stub_read_buf = (void *)&cb_output_status;
635 cb_output_status.base.type = TDM_THREAD_CB_OUTPUT_STATUS;
636 cb_output_status.base.length = sizeof(tdm_thread_cb_output_status);
638 stub_read_returned_size = sizeof(tdm_thread_cb_output_status);
640 error = tdm_thread_handle_cb(&private_loop);
642 ASSERT_EQ(error, expected_error);
643 ASSERT_EQ(stub_tdm_output_cb_status_called, 1);
646 TEST(tdm_thread_handle_cb, success_case_thread_cb_output_dpms)
649 tdm_error expected_error = TDM_ERROR_NONE;
650 tdm_private_loop private_loop;
651 tdm_private_thread private_thread;
652 tdm_thread_cb_output_dpms cb_output_dpms;
656 memset(&private_loop, 0, sizeof(tdm_private_loop));
657 private_loop.private_thread = &private_thread;
659 stub_read_buf = (void *)&cb_output_dpms;
660 cb_output_dpms.base.type = TDM_THREAD_CB_OUTPUT_DPMS;
661 cb_output_dpms.base.length = sizeof(tdm_thread_cb_output_dpms);
663 stub_read_returned_size = sizeof(tdm_thread_cb_output_dpms);
665 error = tdm_thread_handle_cb(&private_loop);
667 ASSERT_EQ(error, expected_error);
668 ASSERT_EQ(stub_tdm_output_cb_dpms_called, 1);
671 TEST(tdm_thread_handle_cb, success_case_thread_cb_pp_done)
674 tdm_error expected_error = TDM_ERROR_NONE;
675 tdm_private_loop private_loop;
676 tdm_private_thread private_thread;
677 tdm_thread_cb_pp_done cb_pp_done;
681 memset(&private_loop, 0, sizeof(tdm_private_loop));
682 private_loop.private_thread = &private_thread;
684 stub_read_buf = (void *)&cb_pp_done;
685 cb_pp_done.base.type = TDM_THREAD_CB_PP_DONE;
686 cb_pp_done.base.length = sizeof(tdm_thread_cb_pp_done);
688 stub_read_returned_size = sizeof(tdm_thread_cb_pp_done);
690 error = tdm_thread_handle_cb(&private_loop);
692 ASSERT_EQ(error, expected_error);
693 ASSERT_EQ(stub_tdm_pp_cb_done_called, 1);
696 TEST(tdm_thread_handle_cb, success_case_thread_cb_capture_done)
699 tdm_error expected_error = TDM_ERROR_NONE;
700 tdm_private_loop private_loop;
701 tdm_private_thread private_thread;
702 tdm_thread_cb_capture_done cb_capture_done;
706 memset(&private_loop, 0, sizeof(tdm_private_loop));
707 private_loop.private_thread = &private_thread;
709 stub_read_buf = (void *)&cb_capture_done;
710 cb_capture_done.base.type = TDM_THREAD_CB_CAPTURE_DONE;
711 cb_capture_done.base.length = sizeof(tdm_thread_cb_capture_done);
713 stub_read_returned_size = sizeof(tdm_thread_cb_capture_done);
715 error = tdm_thread_handle_cb(&private_loop);
717 ASSERT_EQ(error, expected_error);
718 ASSERT_EQ(stub_tdm_capture_cb_done_called, 1);
721 TEST(tdm_thread_handle_cb, success_case_thread_cb_vblank_sw)
724 tdm_error expected_error = TDM_ERROR_NONE;
725 tdm_private_loop private_loop;
726 tdm_private_thread private_thread;
727 tdm_thread_cb_vblank_sw cb_vblank_sw;
731 memset(&private_loop, 0, sizeof(tdm_private_loop));
732 private_loop.private_thread = &private_thread;
734 stub_read_buf = (void *)&cb_vblank_sw;
735 cb_vblank_sw.base.type = TDM_THREAD_CB_VBLANK_SW;
736 cb_vblank_sw.base.length = sizeof(tdm_thread_cb_vblank_sw);
738 stub_read_returned_size = sizeof(tdm_thread_cb_vblank_sw);
740 error = tdm_thread_handle_cb(&private_loop);
742 ASSERT_EQ(error, expected_error);
743 ASSERT_EQ(stub_tdm_vblank_cb_vblank_SW_called, 1);
746 /* tdm_thread_in_display_thread */
748 TEST(tdm_thread_in_display_thread, success_keep_private_thread_is_null)
751 int expected_ret = 1;
756 ret = tdm_thread_in_display_thread(tid);
758 ASSERT_EQ(ret, expected_ret);
761 TEST(tdm_thread_in_display_thread, success_in_display_thread)
764 int expected_ret = 1;
766 static tdm_private_thread private_thread;
770 private_thread.display_tid = tid;
771 keep_private_thread = &private_thread;
773 ret = tdm_thread_in_display_thread(tid);
775 ASSERT_EQ(ret, expected_ret);
778 TEST(tdm_thread_in_display_thread, success_no_in_display_thread)
781 int expected_ret = 0;
783 static tdm_private_thread private_thread;
787 private_thread.display_tid = tid + 1;
788 keep_private_thread = &private_thread;
790 ret = tdm_thread_in_display_thread(tid);
792 ASSERT_EQ(ret, expected_ret);
795 /* tdm_thread_is_running */
797 TEST(tdm_thread_is_running, success_no_is_running)
800 int expected_ret = 0;
804 ret = tdm_thread_is_running();
806 ASSERT_EQ(ret, expected_ret);
809 TEST(tdm_thread_is_running, success_is_running)
812 int expected_ret = 1;
813 static tdm_private_thread private_thread;
817 keep_private_thread = &private_thread;
819 ret = tdm_thread_is_running();
821 ASSERT_EQ(ret, expected_ret);