package version up to 1.18.0
[platform/core/uifw/libtdm.git] / haltests / src / tc_tdm_event_loop.cpp
1 /**************************************************************************
2  *
3  * Copyright 2016 Samsung Electronics co., Ltd. All Rights Reserved.
4  *
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  *
9  * Permission is hereby granted, free of charge, to any person obtaining a
10  * copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sub license, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice (including the
18  * next paragraph) shall be included in all copies or substantial portions
19  * of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28  *
29 **************************************************************************/
30
31 #include "tc_tdm.h"
32
33 /* LCOV_EXCL_START */
34
35 class TDMEventLoop : public TDMDisplay
36 {
37 public:
38         TDMEventLoop();
39         void SetUp(void);
40         void TearDown(void);
41 };
42
43 TDMEventLoop::TDMEventLoop()
44 {
45 }
46
47 void TDMEventLoop::SetUp(void)
48 {
49         TDMDisplay::SetUp();
50         tdm_display_lock(dpy);
51 }
52
53 void TDMEventLoop::TearDown(void)
54 {
55         tdm_display_unlock(dpy);
56         TDMDisplay::TearDown();
57 }
58
59 static tdm_error
60 _tc_tdm_event_loop_fd_cb(int fd, tdm_event_loop_mask mask, void *user_data)
61 {
62         bool *done = (bool*)user_data;
63         if (done)
64                 *done = true;
65         return TDM_ERROR_NONE;
66 }
67
68 TEST_P(TDMEventLoop, EventLoopAddFdHandler)
69 {
70         tdm_error ret;
71         int pipes[2];  /* 0: read, 1: write */
72         tdm_event_loop_source *source;
73         bool done;
74         int len;
75
76         ASSERT_EQ(pipe(pipes), 0);
77
78         done = false;
79         source = tdm_event_loop_add_fd_handler(dpy, pipes[0], TDM_EVENT_LOOP_READABLE,
80                                                                                    _tc_tdm_event_loop_fd_cb, &done, &ret);
81         ASSERT_EQ(ret, TDM_ERROR_NONE);
82         ASSERT_NE(source, NULL);
83
84         len = write(pipes[1], "hello", 5);
85         ASSERT_EQ(len, 5);
86
87 //TODO
88 //      while (!done)
89 //              ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
90
91         tdm_event_loop_source_remove(source);
92
93         close(pipes[0]);
94         close(pipes[1]);
95 }
96
97 TEST_P(TDMEventLoop, EventLoopAddFdHandlerNullObject)
98 {
99         tdm_error ret;
100         tdm_event_loop_source *source;
101         source = tdm_event_loop_add_fd_handler(NULL, 0, TDM_EVENT_LOOP_READABLE,
102                                                                                    _tc_tdm_event_loop_fd_cb, NULL, &ret);
103         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
104         ASSERT_EQ(source, NULL);
105 }
106
107 TEST_P(TDMEventLoop, EventLoopAddFdHandlerNullOther)
108 {
109         tdm_error ret;
110         tdm_event_loop_source *source;
111         source = tdm_event_loop_add_fd_handler(NULL, -1, TDM_EVENT_LOOP_READABLE, NULL, NULL, &ret);
112         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
113         ASSERT_EQ(source, NULL);
114 }
115
116 TEST_P(TDMEventLoop, EventLoopSourceFdUpdate)
117 {
118         tdm_error ret;
119         int pipes[2];  /* 0: read, 1: write */
120         tdm_event_loop_source *source;
121         bool done;
122         int len;
123
124         ASSERT_EQ(pipe(pipes), 0);
125
126         done = false;
127         source = tdm_event_loop_add_fd_handler(dpy, pipes[0], TDM_EVENT_LOOP_WRITABLE,
128                                                                                    _tc_tdm_event_loop_fd_cb, &done, &ret);
129         ASSERT_EQ(ret, TDM_ERROR_NONE);
130         ASSERT_NE(source, NULL);
131
132         ASSERT_EQ(tdm_event_loop_source_fd_update(source, TDM_EVENT_LOOP_READABLE), TDM_ERROR_NONE);
133
134         len = write(pipes[1], "hello", 5);
135         ASSERT_EQ(len, 5);
136
137 //TODO
138 //      while (!done)
139 //              ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
140
141         tdm_event_loop_source_remove(source);
142
143         close(pipes[0]);
144         close(pipes[1]);
145 }
146
147 TEST_P(TDMEventLoop, EventLoopSourceFdUpdateNullObject)
148 {
149         ASSERT_EQ(tdm_event_loop_source_fd_update(NULL, TDM_EVENT_LOOP_READABLE), TDM_ERROR_INVALID_PARAMETER);
150 }
151
152 static tdm_error
153 _tc_tdm_event_loop_timer_cb(void *user_data)
154 {
155         bool *done = (bool*)user_data;
156         if (done)
157                 *done = true;
158         return TDM_ERROR_NONE;
159 }
160
161 TEST_P(TDMEventLoop, EventLoopAddTimerHandler)
162 {
163         tdm_error ret;
164         tdm_event_loop_source *source;
165         source = tdm_event_loop_add_timer_handler(dpy, _tc_tdm_event_loop_timer_cb, NULL, &ret);
166         ASSERT_EQ(ret, TDM_ERROR_NONE);
167         ASSERT_NE(source, NULL);
168         tdm_event_loop_source_remove(source);
169 }
170
171 TEST_P(TDMEventLoop, EventLoopAddTimerHandlerNullObject)
172 {
173         tdm_error ret;
174         tdm_event_loop_source *source;
175         source = tdm_event_loop_add_timer_handler(NULL, _tc_tdm_event_loop_timer_cb, NULL, &ret);
176         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
177         ASSERT_EQ(source, NULL);
178 }
179
180
181 TEST_P(TDMEventLoop, EventLoopAddTimerHandlerNullOther)
182 {
183         tdm_error ret;
184         tdm_event_loop_source *source;
185         source = tdm_event_loop_add_timer_handler(dpy, NULL, NULL, &ret);
186         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
187         ASSERT_EQ(source, NULL);
188 }
189
190 TEST_P(TDMEventLoop, EventLoopSourceTimerUpdate)
191 {
192         tdm_error ret;
193         tdm_event_loop_source *source;
194         source = tdm_event_loop_add_timer_handler(dpy, _tc_tdm_event_loop_timer_cb, NULL, &ret);
195         ASSERT_EQ(ret, TDM_ERROR_NONE);
196         ASSERT_NE(source, NULL);
197         ASSERT_EQ(tdm_event_loop_source_timer_update(source, 100), TDM_ERROR_NONE);
198 //TODO
199 //      while (!done)
200 //              ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
201         tdm_event_loop_source_remove(source);
202 }
203
204 TEST_P(TDMEventLoop, EventLoopSourceTimerUpdateNullObject)
205 {
206         ASSERT_EQ(tdm_event_loop_source_timer_update(NULL, 100), TDM_ERROR_INVALID_PARAMETER);
207 }
208
209 TEST_P(TDMEventLoop, EventLoopSourceRemoveNullObject)
210 {
211         tdm_event_loop_source_remove(NULL);
212 }
213
214 #ifdef TDM_UT_TEST_WITH_PARAMS
215 INSTANTIATE_TEST_CASE_P(TDMEventLoopParams,
216                                                 TDMEventLoop,
217                                                 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
218 #else
219 INSTANTIATE_TEST_CASE_P(TDMEventLoopParams,
220                                                 TDMEventLoop,
221                                                 Values(TDM_DEFAULT_MODULE));
222 #endif
223
224 /* LCOV_EXCL_END */