monitor: move to tools
[platform/core/uifw/libtdm.git] / utests / src / ut_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 "ut_tdm.h"
32
33 class TDMEventLoop : public TDMDisplay
34 {
35 public:
36         TDMEventLoop();
37         void SetUp(void);
38         void TearDown(void);
39 };
40
41 TDMEventLoop::TDMEventLoop()
42 {
43 }
44
45 void TDMEventLoop::SetUp(void)
46 {
47         TDMDisplay::SetUp();
48         tdm_display_lock(dpy);
49 }
50
51 void TDMEventLoop::TearDown(void)
52 {
53         tdm_display_unlock(dpy);
54         TDMDisplay::TearDown();
55 }
56
57 static tdm_error
58 _ut_tdm_event_loop_fd_cb(int fd, tdm_event_loop_mask mask, void *user_data)
59 {
60         bool *done = (bool*)user_data;
61         if (done)
62                 *done = true;
63         return TDM_ERROR_NONE;
64 }
65
66 TEST_P(TDMEventLoop, EventLoopAddFdHandler)
67 {
68         tdm_error ret;
69         int pipes[2];  /* 0: read, 1: write */
70         tdm_event_loop_source *source;
71         bool done;
72         int len;
73
74         ASSERT_EQ(pipe(pipes), 0);
75
76         done = false;
77         source = tdm_event_loop_add_fd_handler(dpy, pipes[0], TDM_EVENT_LOOP_READABLE,
78                                                                                    _ut_tdm_event_loop_fd_cb, &done, &ret);
79         ASSERT_EQ(ret, TDM_ERROR_NONE);
80         ASSERT_NE(source, NULL);
81
82         len = write(pipes[1], "hello", 5);
83         ASSERT_EQ(len, 5);
84
85 //TODO
86 //      while (!done)
87 //              ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
88
89         tdm_event_loop_source_remove(source);
90
91         close(pipes[0]);
92         close(pipes[1]);
93 }
94
95 TEST_P(TDMEventLoop, EventLoopAddFdHandlerNullObject)
96 {
97         tdm_error ret;
98         tdm_event_loop_source *source;
99         source = tdm_event_loop_add_fd_handler(NULL, 0, TDM_EVENT_LOOP_READABLE,
100                                                                                    _ut_tdm_event_loop_fd_cb, NULL, &ret);
101         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
102         ASSERT_EQ(source, NULL);
103 }
104
105 TEST_P(TDMEventLoop, EventLoopAddFdHandlerNullOther)
106 {
107         tdm_error ret;
108         tdm_event_loop_source *source;
109         source = tdm_event_loop_add_fd_handler(NULL, -1, TDM_EVENT_LOOP_READABLE, NULL, NULL, &ret);
110         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
111         ASSERT_EQ(source, NULL);
112 }
113
114 TEST_P(TDMEventLoop, EventLoopSourceFdUpdate)
115 {
116         tdm_error ret;
117         int pipes[2];  /* 0: read, 1: write */
118         tdm_event_loop_source *source;
119         bool done;
120         int len;
121
122         ASSERT_EQ(pipe(pipes), 0);
123
124         done = false;
125         source = tdm_event_loop_add_fd_handler(dpy, pipes[0], TDM_EVENT_LOOP_WRITABLE,
126                                                                                    _ut_tdm_event_loop_fd_cb, &done, &ret);
127         ASSERT_EQ(ret, TDM_ERROR_NONE);
128         ASSERT_NE(source, NULL);
129
130         ASSERT_EQ(tdm_event_loop_source_fd_update(source, TDM_EVENT_LOOP_READABLE), TDM_ERROR_NONE);
131
132         len = write(pipes[1], "hello", 5);
133         ASSERT_EQ(len, 5);
134
135 //TODO
136 //      while (!done)
137 //              ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
138
139         tdm_event_loop_source_remove(source);
140
141         close(pipes[0]);
142         close(pipes[1]);
143 }
144
145 TEST_P(TDMEventLoop, EventLoopSourceFdUpdateNullObject)
146 {
147         ASSERT_EQ(tdm_event_loop_source_fd_update(NULL, TDM_EVENT_LOOP_READABLE), TDM_ERROR_INVALID_PARAMETER);
148 }
149
150 static tdm_error
151 _ut_tdm_event_loop_timer_cb(void *user_data)
152 {
153         bool *done = (bool*)user_data;
154         if (done)
155                 *done = true;
156         return TDM_ERROR_NONE;
157 }
158
159 TEST_P(TDMEventLoop, EventLoopAddTimerHandler)
160 {
161         tdm_error ret;
162         tdm_event_loop_source *source;
163         source = tdm_event_loop_add_timer_handler(dpy, _ut_tdm_event_loop_timer_cb, NULL, &ret);
164         ASSERT_EQ(ret, TDM_ERROR_NONE);
165         ASSERT_NE(source, NULL);
166         tdm_event_loop_source_remove(source);
167 }
168
169 TEST_P(TDMEventLoop, EventLoopAddTimerHandlerNullObject)
170 {
171         tdm_error ret;
172         tdm_event_loop_source *source;
173         source = tdm_event_loop_add_timer_handler(NULL, _ut_tdm_event_loop_timer_cb, NULL, &ret);
174         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
175         ASSERT_EQ(source, NULL);
176 }
177
178
179 TEST_P(TDMEventLoop, EventLoopAddTimerHandlerNullOther)
180 {
181         tdm_error ret;
182         tdm_event_loop_source *source;
183         source = tdm_event_loop_add_timer_handler(dpy, NULL, NULL, &ret);
184         ASSERT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
185         ASSERT_EQ(source, NULL);
186 }
187
188 TEST_P(TDMEventLoop, EventLoopSourceTimerUpdate)
189 {
190         tdm_error ret;
191         tdm_event_loop_source *source;
192         source = tdm_event_loop_add_timer_handler(dpy, _ut_tdm_event_loop_timer_cb, NULL, &ret);
193         ASSERT_EQ(ret, TDM_ERROR_NONE);
194         ASSERT_NE(source, NULL);
195         ASSERT_EQ(tdm_event_loop_source_timer_update(source, 100), TDM_ERROR_NONE);
196 //TODO
197 //      while (!done)
198 //              ASSERT_EQ(ut_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
199         tdm_event_loop_source_remove(source);
200 }
201
202 TEST_P(TDMEventLoop, EventLoopSourceTimerUpdateNullObject)
203 {
204         ASSERT_EQ(tdm_event_loop_source_timer_update(NULL, 100), TDM_ERROR_INVALID_PARAMETER);
205 }
206
207 TEST_P(TDMEventLoop, EventLoopSourceRemoveNullObject)
208 {
209         tdm_event_loop_source_remove(NULL);
210 }
211
212 #ifdef TDM_UT_TEST_WITH_PARAMS
213 INSTANTIATE_TEST_CASE_P(TDMEventLoopParams,
214                                                 TDMEventLoop,
215                                                 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
216 #else
217 INSTANTIATE_TEST_CASE_P(TDMEventLoopParams,
218                                                 TDMEventLoop,
219                                                 Values(TDM_DEFAULT_MODULE));
220 #endif