monitor: move to tools
[platform/core/uifw/libtdm.git] / utests / src / ut_tdm_helper.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 TDMHelper : public TDMOutput
34 {
35 public:
36         TDMHelper();
37         void SetUp(void);
38         void TearDown(void);
39 };
40
41 TDMHelper::TDMHelper()
42 {
43 }
44
45 void TDMHelper::SetUp(void)
46 {
47         TDMOutput::SetUp();
48 }
49
50 void TDMHelper::TearDown(void)
51 {
52         TDMOutput::TearDown();
53 }
54
55 TEST_P(TDMHelper, HelperGetTime)
56 {
57         ASSERT_GT(tdm_helper_get_time(), 0.0);
58 }
59
60 TEST_P(TDMHelper, HelperDumpBufferXR24)
61 {
62         tbm_surface_h buffer;
63
64         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
65         ASSERT_NE(buffer, NULL);
66
67         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
68
69         char filename[256];
70         snprintf(filename, sizeof filename, "%s.png", typeid(*this).name());
71         tdm_helper_dump_buffer(buffer, (const char*)filename);
72
73         tbm_surface_destroy(buffer);
74 }
75
76 TEST_P(TDMHelper, HelperDumpBufferAR24)
77 {
78         tbm_surface_h buffer;
79
80         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
81         ASSERT_NE(buffer, NULL);
82
83         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
84
85         char filename[256];
86         snprintf(filename, sizeof filename, "%s.png", typeid(*this).name());
87         tdm_helper_dump_buffer(buffer, (const char*)filename);
88
89         tbm_surface_destroy(buffer);
90 }
91
92 TEST_P(TDMHelper, HelperDumpBufferNullObject)
93 {
94         char filename[256];
95         tdm_helper_dump_buffer(NULL, (const char*)filename);
96 }
97
98 TEST_P(TDMHelper, HelperDumpBufferNullOther)
99 {
100         tbm_surface_h buffer = (tbm_surface_h)TDM_UT_INVALID_VALUE;
101         tdm_helper_dump_buffer(buffer, NULL);
102 }
103
104 TEST_P(TDMHelper, HelperClearBufferPos)
105 {
106         tbm_surface_h buffer;
107         tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
108
109         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
110         ASSERT_NE(buffer, NULL);
111
112         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
113
114         tdm_helper_clear_buffer_pos(buffer, &pos);
115
116         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
117
118         tbm_surface_destroy(buffer);
119 }
120
121 TEST_P(TDMHelper, HelperClearBufferColor)
122 {
123         tbm_surface_h buffer;
124         tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
125         unsigned int color = 0xffffff00;
126
127         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
128         ASSERT_NE(buffer, NULL);
129
130         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
131
132         tdm_helper_clear_buffer_color(buffer, &pos, color);
133
134         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
135
136         tbm_surface_destroy(buffer);
137 }
138
139 TEST_P(TDMHelper, HelperClearBufferARGB)
140 {
141         tbm_surface_h buffer;
142
143         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
144         ASSERT_NE(buffer, NULL);
145
146         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
147
148         tdm_helper_clear_buffer(buffer);
149
150         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
151
152         tbm_surface_destroy(buffer);
153 }
154
155 TEST_P(TDMHelper, HelperClearBufferXRGB)
156 {
157         tbm_surface_h buffer;
158
159         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
160         ASSERT_NE(buffer, NULL);
161
162         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
163
164         tdm_helper_clear_buffer(buffer);
165
166         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
167
168         tbm_surface_destroy(buffer);
169 }
170
171 TEST_P(TDMHelper, HelperClearBufferYUV420)
172 {
173         tbm_surface_h buffer;
174
175         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
176         ASSERT_NE(buffer, NULL);
177
178         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
179
180         tdm_helper_clear_buffer(buffer);
181
182         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
183
184         tbm_surface_destroy(buffer);
185 }
186
187 TEST_P(TDMHelper, HelperClearBufferNV12)
188 {
189         tbm_surface_h buffer;
190
191         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV12);
192         ASSERT_NE(buffer, NULL);
193
194         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
195
196         tdm_helper_clear_buffer(buffer);
197
198         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
199
200         tbm_surface_destroy(buffer);
201 }
202
203 TEST_P(TDMHelper, HelperClearBufferNV21)
204 {
205         tbm_surface_h buffer;
206
207         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV21);
208         ASSERT_NE(buffer, NULL);
209
210         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
211
212         tdm_helper_clear_buffer(buffer);
213
214         tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
215
216         tbm_surface_destroy(buffer);
217 }
218
219 TEST_P(TDMHelper, HelperGetBufferFullSize)
220 {
221         tbm_surface_h buffer;
222         int w = TDM_UT_INVALID_VALUE, h = TDM_UT_INVALID_VALUE;
223
224         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
225         ASSERT_NE(buffer, NULL);
226
227         tdm_helper_get_buffer_full_size(buffer, &w, &h);
228         ASSERT_NE(w, TDM_UT_INVALID_VALUE);
229         ASSERT_GE(w, tbm_surface_get_width(buffer));
230         ASSERT_NE(h, TDM_UT_INVALID_VALUE);
231         ASSERT_GE(h, tbm_surface_get_height(buffer));
232
233         tbm_surface_destroy(buffer);
234 }
235
236 TEST_P(TDMHelper, HelperConvertBufferRotate0)
237 {
238         tbm_surface_h buffer, temp;
239         tdm_pos sp, dp;
240
241         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
242         ASSERT_NE(buffer, NULL);
243         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
244
245         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
246         ASSERT_NE(temp, NULL);
247
248         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
249         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
250
251         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_NONE);
252
253         tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
254
255         tbm_surface_destroy(buffer);
256         tbm_surface_destroy(temp);
257 }
258
259 TEST_P(TDMHelper, HelperConvertBufferRotate0Flip)
260 {
261         tbm_surface_h buffer, temp;
262         tdm_pos sp, dp;
263
264         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
265         ASSERT_NE(buffer, NULL);
266         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
267
268         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
269         ASSERT_NE(temp, NULL);
270
271         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
272         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
273
274         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_FLIPPED, 0), TDM_ERROR_NONE);
275
276         tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
277
278         tbm_surface_destroy(buffer);
279         tbm_surface_destroy(temp);
280 }
281
282 TEST_P(TDMHelper, HelperConvertBufferRotate90)
283 {
284         tbm_surface_h buffer, temp;
285         tdm_pos sp, dp;
286
287         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
288         ASSERT_NE(buffer, NULL);
289         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
290
291         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
292         ASSERT_NE(temp, NULL);
293
294         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
295         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
296
297         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_90, 0), TDM_ERROR_NONE);
298
299         tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
300
301         tbm_surface_destroy(buffer);
302         tbm_surface_destroy(temp);
303 }
304
305 TEST_P(TDMHelper, HelperConvertBufferRotate180)
306 {
307         tbm_surface_h buffer, temp;
308         tdm_pos sp, dp;
309
310         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
311         ASSERT_NE(buffer, NULL);
312         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
313
314         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
315         ASSERT_NE(temp, NULL);
316
317         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
318         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
319
320         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_180, 0), TDM_ERROR_NONE);
321
322         tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
323
324         tbm_surface_destroy(buffer);
325         tbm_surface_destroy(temp);
326 }
327
328 TEST_P(TDMHelper, HelperConvertBufferRotate270)
329 {
330         tbm_surface_h buffer, temp;
331         tdm_pos sp, dp;
332
333         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
334         ASSERT_NE(buffer, NULL);
335         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
336
337         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
338         ASSERT_NE(temp, NULL);
339
340         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
341         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
342
343         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_270, 0), TDM_ERROR_NONE);
344
345         tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
346
347         tbm_surface_destroy(buffer);
348         tbm_surface_destroy(temp);
349 }
350
351 TEST_P(TDMHelper, HelperConvertBufferYUV420)
352 {
353         tbm_surface_h buffer, temp;
354         tdm_pos sp, dp;
355
356         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
357         ASSERT_NE(buffer, NULL);
358         tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
359
360         temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_YUV420);
361         ASSERT_NE(temp, NULL);
362
363         sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
364         dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
365
366         ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_OPERATION_FAILED);
367
368         tbm_surface_destroy(buffer);
369         tbm_surface_destroy(temp);
370 }
371
372 TEST_P(TDMHelper, HelperGetFD)
373 {
374         int fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD");
375         ASSERT_GE(fd, 0);
376         close(fd);
377         fd = tdm_helper_get_fd("BLURBLUR");
378         ASSERT_EQ(fd, -1);
379 }
380
381 TEST_P(TDMHelper, HelperSetFD)
382 {
383         tdm_helper_set_fd("TDM_DRM_MASTER_FD", -1);
384         tdm_helper_set_fd("BLURBLUR", -1);
385 }
386
387 TEST_P(TDMHelper, HelperDumpStart)
388 {
389         char path[256];
390         int count = 0;
391         snprintf(path, sizeof path, "blurblur");
392         tdm_helper_dump_start(path, &count);
393         tdm_helper_dump_stop();
394 }
395
396 static void
397 _ut_tdm_helper_capture_cb(tbm_surface_h buffer, void *user_data)
398 {
399 }
400
401 TEST_P(TDMHelper, HelperCaptureOutput)
402 {
403         tdm_error ret;
404         tdm_output *output;
405
406         for (int o = 0; o < output_count; o++) {
407                 tbm_surface_h dump;
408
409                 output = tdm_display_get_output(dpy, o, &ret);
410                 ASSERT_EQ(ret, TDM_ERROR_NONE);
411                 ASSERT_NE(output, NULL);
412
413                 if (!ut_tdm_output_is_connected(output))
414                         continue;
415
416                 ASSERT_EQ(ut_tdm_output_prepare(dpy, output, true), true);
417
418                 dump = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
419                 ASSERT_NE(dump, NULL);
420
421                 ASSERT_EQ(tdm_helper_capture_output(output, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
422                                                                                         _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_NONE);
423
424                 tdm_helper_dump_buffer_str(dump, NULL, (char*)typeid(*this).name());
425
426                 tbm_surface_destroy(dump);
427         }
428 }
429
430
431 TEST_P(TDMHelper, HelperCaptureOutputNullObject)
432 {
433         tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
434
435         ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
436                                                                                 _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
437 }
438
439 TEST_P(TDMHelper, HelperCaptureOutputNullOther)
440 {
441         for (int o = 0; o < output_count; o++) {
442                 tdm_error ret;
443                 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
444                 ASSERT_EQ(ret, TDM_ERROR_NONE);
445                 ASSERT_NE(output, NULL);
446                 tdm_helper_output_commit_per_vblank_enabled(output);
447         }
448
449         tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
450
451         ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
452                                                                                 _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
453 }
454
455 TEST_P(TDMHelper, HelperGetDisplayInformation)
456 {
457         char reply[8192];
458         int len = sizeof reply;
459
460         for (int o = 0; o < output_count; o++) {
461                 tdm_error ret;
462                 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
463                 ASSERT_EQ(ret, TDM_ERROR_NONE);
464                 ASSERT_NE(output, NULL);
465                 if (!ut_tdm_output_is_connected(output))
466                         continue;
467                 ASSERT_EQ(ut_tdm_output_prepare(dpy, output, true), true);
468         }
469
470         tdm_helper_get_display_information(dpy, reply, &len);
471         TDM_INFO("%s", reply);
472 }
473
474 TEST_P(TDMHelper, HelperGetDisplayInformationNullObject)
475 {
476         char reply[8192];
477         int len = sizeof reply;
478
479         tdm_helper_get_display_information(NULL, reply, &len);
480 }
481
482 TEST_P(TDMHelper, HelperGetDisplayInformationNullOther)
483 {
484         tdm_helper_get_display_information(dpy, NULL, NULL);
485 }
486
487 TEST_P(TDMHelper, HelperCommitPerVblankEnabled)
488 {
489         ASSERT_EQ(tdm_helper_commit_per_vblank_enabled(dpy), 0);
490 }
491
492 TEST_P(TDMHelper, HelperCommitPerVblankEnabledNullOBject)
493 {
494         ASSERT_EQ(tdm_helper_commit_per_vblank_enabled(NULL), 0);
495 }
496
497 TEST_P(TDMHelper, HelperOutputCommitPerVblankEnabledNullObject)
498 {
499         ASSERT_EQ(tdm_helper_output_commit_per_vblank_enabled(NULL), -1);
500 }
501
502 #ifdef TDM_UT_TEST_WITH_PARAMS
503 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
504                                                 TDMHelper,
505                                                 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
506 #else
507 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
508                                                 TDMHelper,
509                                                 Values(TDM_DEFAULT_MODULE));
510 #endif