ec03dbae6204340ca9e83a586395f3a0787a1517
[platform/core/uifw/libtdm.git] / utests / src / ut_tdm_buffer.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 /* LCOV_EXCL_START */
34
35 class TDMBuffer : public TDMDisplay
36 {
37 public:
38         tbm_surface_h buffer;
39         TDMBuffer();
40         void SetUp(void);
41         void TearDown(void);
42 };
43
44 TDMBuffer::TDMBuffer()
45 {
46         buffer = NULL;
47 }
48
49 void TDMBuffer::SetUp(void)
50 {
51         TDMDisplay::SetUp();
52
53         buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
54         ASSERT_NE(buffer, NULL);
55 }
56
57 void TDMBuffer::TearDown(void)
58 {
59         if (buffer) {
60                 tbm_surface_destroy(buffer);
61                 buffer = NULL;
62         }
63         TDMDisplay::TearDown();
64 }
65
66 bool
67 ut_tdm_buffer_create(int width, int height, tbm_format format, int flags, bool fill, int count, tbm_surface_h *buffers)
68 {
69         TDM_UT_GOTO_IF_FAIL(width > 0, failed);
70         TDM_UT_GOTO_IF_FAIL(height > 0, failed);
71
72         for (int b = 0; b < count; b++) {
73                 buffers[b] = tbm_surface_internal_create_with_flags(width, height, format, flags);
74                 TDM_UT_GOTO_IF_FAIL(buffers[b] != NULL, failed);
75                 if (fill)
76                         tdm_test_buffer_fill(buffers[b], PATTERN_SMPTE);
77
78                 TDM_INFO("creating buffer(%p) done: width(%d) height(%d), format(%c%c%c%c) flags(%x) fill(%d), count(%d)",
79                                  buffers[b], width, height, FOURCC_STR(format), flags, fill, count);
80         }
81
82         return true;
83 failed:
84         for (int b = 0; b < count; b++) {
85                 if (buffers[b]) {
86                         tbm_surface_destroy(buffers[b]);
87                         buffers[b] = NULL;
88                 }
89         }
90         return false;
91 }
92
93 TEST_P(TDMBuffer, BufferRefBackend)
94 {
95         ASSERT_EQ(tdm_buffer_ref_backend(buffer), buffer);
96         tdm_buffer_unref_backend(buffer);
97 }
98
99 TEST_P(TDMBuffer, BufferRefBackendNullOBject)
100 {
101         ASSERT_EQ(tdm_buffer_ref_backend(NULL), NULL);
102 }
103
104 TEST_P(TDMBuffer, BufferUnrefBackend)
105 {
106         tdm_buffer_unref_backend(buffer);
107 }
108
109 TEST_P(TDMBuffer, BufferUnrefBackendNullOBject)
110 {
111         tdm_buffer_unref_backend(NULL);
112 }
113
114 static void
115 _ut_tdm_buffer_destroy_cb(tbm_surface_h buffer, void *user_data)
116 {
117         bool *done = (bool*)user_data;
118         if (done)
119                 *done = true;
120 }
121
122 TEST_P(TDMBuffer, BufferAddDestroyHandler)
123 {
124         bool done = false;
125         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, &done), TDM_ERROR_NONE);
126         tbm_surface_destroy(buffer);
127         buffer = NULL;
128         ASSERT_EQ(done, true);
129 }
130
131 TEST_P(TDMBuffer, BufferAddDestroyHandlerTwice)
132 {
133         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, NULL), TDM_ERROR_NONE);
134         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, NULL), TDM_ERROR_BAD_REQUEST);
135 }
136
137 TEST_P(TDMBuffer, BufferAddDestroyHandlerNullObject)
138 {
139         ASSERT_EQ(tdm_buffer_add_destroy_handler(NULL, _ut_tdm_buffer_destroy_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
140 }
141
142 TEST_P(TDMBuffer, BufferAddDestroyHandlerNullOther)
143 {
144         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
145 }
146
147 TEST_P(TDMBuffer, BufferRemoveDestroyHandler)
148 {
149         bool done = false;
150         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, &done), TDM_ERROR_NONE);
151         tdm_buffer_remove_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, &done);
152         tbm_surface_destroy(buffer);
153         buffer = NULL;
154         ASSERT_EQ(done, false);
155 }
156
157 TEST_P(TDMBuffer, BufferRemoveDestroyHandlerDifferentData)
158 {
159         bool done = false;
160         ASSERT_EQ(tdm_buffer_add_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, &done), TDM_ERROR_NONE);
161         tdm_buffer_remove_destroy_handler(buffer, _ut_tdm_buffer_destroy_cb, NULL);
162         tbm_surface_destroy(buffer);
163         buffer = NULL;
164         ASSERT_EQ(done, true);
165 }
166
167 TEST_P(TDMBuffer, BufferRemoveDestroyHandlerNullObject)
168 {
169         tdm_buffer_remove_destroy_handler(NULL, _ut_tdm_buffer_destroy_cb, NULL);
170 }
171
172 TEST_P(TDMBuffer, BufferRemoveDestroyHandlerNullOther)
173 {
174         tdm_buffer_remove_destroy_handler(buffer, NULL, NULL);
175 }
176
177 static void
178 _ut_tdm_buffer_release_cb(tbm_surface_h buffer, void *user_data)
179 {
180         bool *done = (bool*)user_data;
181         if (done)
182                 *done = true;
183 }
184
185 TEST_P(TDMBuffer, BufferAddReleaseHandler)
186 {
187         bool done = false;
188         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, &done), TDM_ERROR_NONE);
189         tdm_buffer_ref_backend(buffer);
190         ASSERT_EQ(done, false);
191         tdm_buffer_unref_backend(buffer);
192         ASSERT_EQ(done, true);
193 }
194
195 TEST_P(TDMBuffer, BufferAddReleaseHandlerTwice)
196 {
197         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, NULL), TDM_ERROR_NONE);
198         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, NULL), TDM_ERROR_BAD_REQUEST);
199 }
200
201 TEST_P(TDMBuffer, BufferAddReleaseHandlerNullObject)
202 {
203         bool done = false;
204         ASSERT_EQ(tdm_buffer_add_release_handler(NULL, _ut_tdm_buffer_release_cb, &done), TDM_ERROR_INVALID_PARAMETER);
205         ASSERT_EQ(done, false);
206 }
207
208 TEST_P(TDMBuffer, BufferAddReleaseHandlerNullOther)
209 {
210         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
211 }
212
213 TEST_P(TDMBuffer, BufferRemoveReleaseHandler)
214 {
215         bool done = false;
216         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, &done), TDM_ERROR_NONE);
217         tdm_buffer_ref_backend(buffer);
218         ASSERT_EQ(done, false);
219         tdm_buffer_remove_release_handler(buffer, _ut_tdm_buffer_release_cb, &done);
220         tdm_buffer_unref_backend(buffer);
221         ASSERT_EQ(done, false);
222 }
223
224 TEST_P(TDMBuffer, BufferRemoveReleaseHandlerDifferentData)
225 {
226         bool done = false;
227         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, &done), TDM_ERROR_NONE);
228         tdm_buffer_ref_backend(buffer);
229         ASSERT_EQ(done, false);
230         tdm_buffer_remove_release_handler(buffer, _ut_tdm_buffer_release_cb, NULL);
231         tdm_buffer_unref_backend(buffer);
232         ASSERT_EQ(done, true);
233 }
234
235 static void
236 _ut_tdm_buffer_release_cb2(tbm_surface_h buffer, void *user_data)
237 {
238         bool *done = (bool*)user_data;
239         if (done)
240                 *done = true;
241         tdm_buffer_remove_release_handler(buffer, _ut_tdm_buffer_release_cb2, user_data);
242 }
243
244 TEST_P(TDMBuffer, BufferRemoveReleaseHandlerInHandler)
245 {
246         bool done = false;
247         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb2, &done), TDM_ERROR_NONE);
248         tdm_buffer_ref_backend(buffer);
249         ASSERT_EQ(done, false);
250         tdm_buffer_unref_backend(buffer);
251         ASSERT_EQ(done, true);
252
253         done = false;
254         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb2, &done), TDM_ERROR_NONE);
255         tdm_buffer_ref_backend(buffer);
256         ASSERT_EQ(done, false);
257         tdm_buffer_unref_backend(buffer);
258         ASSERT_EQ(done, true);
259
260         done = false;
261         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb2, &done), TDM_ERROR_NONE);
262         tdm_buffer_ref_backend(buffer);
263         ASSERT_EQ(done, false);
264         tdm_buffer_unref_backend(buffer);
265         ASSERT_EQ(done, true);
266 }
267
268 TEST_P(TDMBuffer, BufferRemoveReleaseHandlerNullObject)
269 {
270         bool done = false;
271         ASSERT_EQ(tdm_buffer_add_release_handler(buffer, _ut_tdm_buffer_release_cb, &done), TDM_ERROR_NONE);
272         tdm_buffer_ref_backend(buffer);
273         ASSERT_EQ(done, false);
274         tdm_buffer_remove_release_handler(NULL, _ut_tdm_buffer_release_cb, &done);
275         tdm_buffer_unref_backend(buffer);
276         ASSERT_EQ(done, true);
277 }
278
279 TEST_P(TDMBuffer, BufferRemoveReleaseHandlerNullOther)
280 {
281         tdm_buffer_remove_release_handler(buffer, NULL, NULL);
282 }
283
284 TEST_P(TDMBuffer, BufferRemoveReleaseHandlerNoAdd)
285 {
286         tdm_buffer_remove_release_handler(buffer, _ut_tdm_buffer_release_cb, NULL);
287 }
288
289 #ifdef TDM_UT_TEST_WITH_PARAMS
290 INSTANTIATE_TEST_CASE_P(TDMBufferParams,
291                                                 TDMBuffer,
292                                                 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
293 #else
294 INSTANTIATE_TEST_CASE_P(TDMBufferParams,
295                                                 TDMBuffer,
296                                                 Values(TDM_DEFAULT_MODULE));
297 #endif
298
299 /* LCOV_EXCL_END */