monitor: move to tools
[platform/core/uifw/libtdm.git] / utests / src / ut_tdm.h
1 #ifndef _UT_TDM_H_
2 #define _UT_TDM_H_
3
4 #include <sys/epoll.h>
5 #include <sys/timerfd.h>
6 #include <limits.h>
7 #include <vector>
8 #include <list>
9 #include <climits>
10 #include <pthread.h>
11 #include <gtest/gtest.h>
12 #include <stdio.h>
13 #include <stdarg.h>
14 #include <poll.h>
15
16 extern "C" {
17 #include <tbm_bufmgr.h>
18 #include <tbm_drm_helper.h>
19 }
20
21 #include "tdm.h"
22 #include "tdm_helper.h"
23 #include "tdm_config.h"
24 #include "tdm_log.h"
25 #include "tdm_macro.h"
26 #include "buffers.h"
27
28 //#define TDM_UT_TEST_WITH_PARAMS
29
30 extern bool enable_porting_debug;
31
32 #undef TDM_DBG
33 #undef TDM_INFO
34 #undef TDM_WRN
35 #undef TDM_ERR
36 #define TDM_DBG(fmt, args...)  tdm_log_print(TDM_LOG_LEVEL_DBG, fmt, ##args)
37 #define TDM_INFO(fmt, args...) tdm_log_print(TDM_LOG_LEVEL_INFO, fmt, ##args)
38 #define TDM_WRN(fmt, args...)  tdm_log_print(TDM_LOG_LEVEL_WRN, fmt, ##args)
39 #define TDM_ERR(fmt, args...)  tdm_log_print(TDM_LOG_LEVEL_ERR, fmt, ##args)
40
41 #define TDM_UT_INFO(fmt, args...) tdm_log_printf(TDM_LOG_LEVEL_INFO, fmt, ##args)
42 #define TDM_UT_WRN(fmt, args...)  tdm_log_printf(TDM_LOG_LEVEL_WRN, fmt, ##args)
43 #define TDM_UT_ERR(fmt, args...)  tdm_log_printf(TDM_LOG_LEVEL_ERR, fmt, ##args)
44
45 #define TDM_UT_ENTRY() \
46     TDM_ERR("--------------------------------------------- %s", typeid(*this).name())
47
48 #define TDM_UT_CHECK_FLAG(FLAG) \
49         do {\
50                 if(!(FLAG)) \
51                         TDM_UT_WRN("[          ] not supported");\
52         } while(0)
53
54 #define TDM_UT_SKIP_FLAG(FLAG) \
55         do {\
56                 if(!(FLAG)) {\
57                         TDM_UT_WRN("[  SKIPPED ] not supported");\
58                         return;\
59                 }\
60         } while(0)
61
62 #define TDM_UT_RETURN_IF_FAIL(cond) \
63         do { \
64                 if (!(cond)) { \
65                         TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
66                         return; \
67                 } \
68         } while(0)
69 #define TDM_UT_RETURN_FALSE_IF_FAIL(cond) \
70         do { \
71                 if (!(cond)) { \
72                         TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
73                         return false; \
74                 } \
75         } while(0)
76 #define TDM_UT_RETURN_VAL_IF_FAIL(cond, val) \
77         do { \
78                 if (!(cond)) { \
79                         TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
80                         return val; \
81                 } \
82         } while(0)
83 #define TDM_UT_GOTO_IF_FAIL(cond, dst) \
84         do { \
85                 if (!(cond)) { \
86                         TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
87                         goto dst; \
88                 } \
89         } while(0)
90
91 #define TDM_UT_ASSERT_TRUE(cond, fmt, args...) \
92         do { \
93                 if (!(cond)) { \
94                         if (enable_porting_debug) \
95                                 TDM_UT_ERR(fmt, ##args); \
96                         GTEST_TEST_BOOLEAN_((cond), #cond, false, true, GTEST_FATAL_FAILURE_); \
97                 } \
98         } while(0)
99 #define TDM_UT_EXPECT_TRUE(cond, fmt, args...) \
100         do { \
101                 if (!(cond)) { \
102                         if (enable_porting_debug) \
103                                 TDM_UT_ERR(fmt, ##args); \
104                         GTEST_TEST_BOOLEAN_((cond), #cond, false, true, GTEST_NONFATAL_FAILURE_); \
105                 } \
106         } while(0)
107
108 #define TDM_UT_SIZE_ALIGN(value, base) (((value) + ((base) - 1)) & ~((base) - 1))
109
110 #define TDM_UT_DUMP_DIR          "/tmp/tdm_dump"
111 #define TDM_UT_INVALID_VALUE     -42
112 #define TDM_UT_BUFFER_SIZE       256
113 #define TDM_UT_VBLANK_NAME       "ut_tdm_vblank"
114
115 using ::testing::TestWithParam;
116 using ::testing::Bool;
117 using ::testing::Values;
118 using ::testing::Combine;
119
120 #ifdef TDM_UT_TEST_WITH_PARAMS
121 class TDMEnv : public TestWithParam< ::testing::tuple<bool, bool, const char*> >
122 {
123 public:
124         void SetUp(void);
125         void TearDown(void);
126 };
127 #else
128 class TDMEnv : public TestWithParam< ::testing::tuple<const char*> >
129 {
130 public:
131         void SetUp(void);
132         void TearDown(void);
133 };
134 #endif
135
136 class TDMDisplay : public TDMEnv
137 {
138 public:
139         tdm_display *dpy;
140         tbm_bufmgr bufmgr;
141
142         bool has_pp_cap;
143         bool has_capture_cap;
144
145         TDMDisplay();
146         void SetUp(void);
147         void TearDown(void);
148 };
149
150 class TDMOutput : public TDMDisplay
151 {
152 public:
153         bool has_outputs;
154         tdm_output **outputs;
155         int output_count;
156
157         bool done1, done2, done3;
158
159         TDMOutput();
160         void SetUp(void);
161         void TearDown(void);
162 };
163
164 #ifdef TIZEN_TEST_GCOV
165 extern "C" void __gcov_flush(void);
166 #endif
167
168 tdm_error ut_tdm_display_handle_events(tdm_display *dpy);
169 bool ut_tdm_display_has_pp_capability(tdm_display *dpy);
170 bool ut_tdm_display_has_capture_capability(tdm_display *dpy);
171
172 bool ut_tdm_buffer_create(int width, int height, tbm_format format, int flags, bool fill,
173                                                   int count, tbm_surface_h *buffers);
174
175 bool ut_tdm_output_is_async_dpms_enable(tdm_output *output);
176 bool ut_tdm_output_is_hwc_enable(tdm_output *output);
177 bool ut_tdm_output_is_aod_enable(tdm_output *output);
178 bool ut_tdm_output_is_connected(tdm_output *output);
179 bool ut_tdm_output_mode_setting(tdm_output *output);
180 bool ut_tdm_output_prepare(tdm_display *dpy, tdm_output *output, bool fill);
181 bool ut_tdm_output_prepare_all_output(tdm_display *dpy, tdm_output **outputs, int output_count, bool fill);
182 bool ut_tdm_output_unset(tdm_display *dpy, tdm_output *output);
183 double ut_tdm_output_get_vblank_interval_time(tdm_output *output);
184 tdm_layer *ut_tdm_output_get_primary_layer(tdm_output *output);
185
186 bool ut_tdm_layer_is_cursor_layer(tdm_layer *layer);
187 bool ut_tdm_layer_is_primary_layer(tdm_layer *layer);
188 bool ut_tdm_layer_is_video_layer(tdm_layer *layer);
189 bool ut_tdm_layer_support_scale(tdm_layer *layer);
190 bool ut_tdm_layer_support_no_crop(tdm_layer *layer);
191 bool ut_tdm_layer_prepare_buffer(tdm_layer *layer, tbm_surface_h *buffers, int buffer_count, bool fill);
192 bool ut_tdm_layer_prepare_buffer_queue(tdm_layer *layer, tbm_surface_queue_h *buffer_queue);
193 bool ut_tdm_layer_fill_info(tdm_layer *layer, tbm_surface_h buffer, tbm_surface_queue_h buffer_queue, tdm_info_layer *info);
194 bool ut_tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
195 bool ut_tdm_layer_set_buffer_with_pos(tdm_layer *layer, tbm_surface_h buffer, tdm_pos *pos);
196 unsigned int ut_tdm_layer_get_output_pipe(tdm_layer *layer);
197 tbm_format ut_tdm_layer_find_best_format(tdm_layer *layer);
198 bool ut_tdm_layer_is_avaiable(tdm_layer *layer);
199
200 bool ut_tdm_pp_fill_info(tbm_surface_h srcbuf, tbm_surface_h dstbuf, tdm_transform transform, tdm_info_pp *info);
201 bool ut_tdm_capture_fill_info(tdm_output *output, tbm_surface_h buffer, tdm_transform transform,
202                                                           tdm_capture_type type, int frequency, bool stretch, tdm_info_capture *info);
203
204 /******************************************************************************/
205 /** testing for checking backend's basic implementation                      **/
206 /******************************************************************************/
207 class TDMBackendEnv : public TDMEnv
208 {
209 public:
210         void SetUp(void);
211         void TearDown(void);
212 };
213
214 class TDMBackendBasic : public TDMBackendEnv
215 {
216 public:
217         tdm_display *dpy;
218
219         tdm_output **outputs;
220         int output_count;
221
222         tdm_layer **layers;
223         int layer_count;
224
225         tbm_surface_h buffers[3];
226
227         TDMBackendBasic();
228         void SetUp(void);
229         void TearDown(void);
230         void UnsetOutput(void);
231         void DestroyBuffers(void);
232 };
233
234 class TDMBackendDisplay : public TDMBackendBasic
235 {
236 public:
237         void SetUp(void) { TDMBackendBasic::SetUp(); }
238         void TearDown(void) { TDMBackendBasic::TearDown(); }
239 };
240
241 char ut_tdm_backend_getchar(void);
242
243 #define TDM_UT_ASK_YNR(fmt, ...) \
244         do { \
245                 if (enable_porting_debug) { \
246                         char ch; \
247                         do { \
248                                 printf(fmt" [Y]es, [n]o, [r]etry): ", ##__VA_ARGS__); \
249                                 ch = ut_tdm_backend_getchar(); \
250                         } while(ch != 'y' && ch != 'n' && ch != 'r'); \
251                         if (ch == 'n') \
252                                 GTEST_FATAL_FAILURE_("tc failed"); \
253                         if (ch == 'r') \
254                                 goto retry; \
255                 } \
256         } while (0)
257
258 #endif // _UT_TDM_H_