Skip to content

Commit 1b1a1e0

Browse files
committed
[UT][WATERMARK] add gvawatermark property and lifecycle unit tests
Add GStreamer Check tests for gvawatermarkimpl and gvawatermark (bin) covering element instantiation, default property values (device, obb, displ-avgfps, displ-cfg), set/get round-trips, NULL<->READY state transitions, and bin-to-impl property forwarding. Not tested: READY->PAUSED->PLAYING transitions (require negotiated caps), dynamic property changes during PLAYING state, property change notifications. Signed-off-by: Walid <walid.aly@intel.com>
1 parent bcf1d8f commit 1b1a1e0

File tree

3 files changed

+334
-0
lines changed

3 files changed

+334
-0
lines changed

tests/unit_tests/check/elements/watermark/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
# ==============================================================================
66

77
add_subdirectory(test_watermark)
8+
add_subdirectory(test_properties)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# ==============================================================================
2+
# Copyright (C) 2026 Intel Corporation
3+
#
4+
# SPDX-License-Identifier: MIT
5+
# ==============================================================================
6+
7+
set(TARGET_NAME "test_gvawatermark_properties")
8+
9+
file(GLOB MAIN_SRC
10+
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
11+
)
12+
13+
file(GLOB MAIN_HEADERS
14+
${CMAKE_CURRENT_SOURCE_DIR}/*.h
15+
)
16+
17+
add_executable(${TARGET_NAME} ${MAIN_SRC} ${MAIN_HEADERS})
18+
target_link_libraries(${TARGET_NAME}
19+
PRIVATE
20+
test_common
21+
test_utils
22+
)
23+
24+
add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME} WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2026 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
******************************************************************************/
6+
7+
#include "test_common.h"
8+
#include "test_utils.h"
9+
10+
/* ---------- element names under test ---------- */
11+
constexpr char impl_name[] = "gvawatermarkimpl";
12+
constexpr char bin_name[] = "gvawatermark";
13+
14+
/* ========================================================================= */
15+
/* Element instantiation tests */
16+
/* ========================================================================= */
17+
18+
GST_START_TEST(test_watermarkimpl_instantiation) {
19+
g_print("Starting test: test_watermarkimpl_instantiation\n");
20+
GstElement *element = gst_element_factory_make(impl_name, NULL);
21+
ck_assert_msg(element != NULL, "Failed to create element '%s'", impl_name);
22+
ck_assert(GST_IS_ELEMENT(element));
23+
gst_object_unref(element);
24+
}
25+
GST_END_TEST;
26+
27+
GST_START_TEST(test_watermark_bin_instantiation) {
28+
g_print("Starting test: test_watermark_bin_instantiation\n");
29+
GstElement *element = gst_element_factory_make(bin_name, NULL);
30+
ck_assert_msg(element != NULL, "Failed to create element '%s'", bin_name);
31+
ck_assert(GST_IS_ELEMENT(element));
32+
ck_assert(GST_IS_BIN(element));
33+
gst_object_unref(element);
34+
}
35+
GST_END_TEST;
36+
37+
/* ========================================================================= */
38+
/* Default property value tests */
39+
/* ========================================================================= */
40+
41+
GST_START_TEST(test_default_device_property) {
42+
g_print("Starting test: test_default_device_property\n");
43+
GstElement *element = gst_check_setup_element(impl_name);
44+
ck_assert(element != NULL);
45+
46+
gchar *device = NULL;
47+
g_object_get(G_OBJECT(element), "device", &device, NULL);
48+
ck_assert_msg(device == NULL, "Expected default device to be NULL, got '%s'", device);
49+
g_free(device);
50+
51+
gst_check_teardown_element(element);
52+
}
53+
GST_END_TEST;
54+
55+
GST_START_TEST(test_default_obb_property) {
56+
g_print("Starting test: test_default_obb_property\n");
57+
GstElement *element = gst_check_setup_element(impl_name);
58+
ck_assert(element != NULL);
59+
60+
gboolean obb = TRUE;
61+
g_object_get(G_OBJECT(element), "obb", &obb, NULL);
62+
ck_assert_msg(obb == FALSE, "Expected default obb to be FALSE");
63+
64+
gst_check_teardown_element(element);
65+
}
66+
GST_END_TEST;
67+
68+
GST_START_TEST(test_default_displ_avgfps_property) {
69+
g_print("Starting test: test_default_displ_avgfps_property\n");
70+
GstElement *element = gst_check_setup_element(impl_name);
71+
ck_assert(element != NULL);
72+
73+
gboolean displ_avgfps = TRUE;
74+
g_object_get(G_OBJECT(element), "displ-avgfps", &displ_avgfps, NULL);
75+
ck_assert_msg(displ_avgfps == FALSE, "Expected default displ-avgfps to be FALSE");
76+
77+
gst_check_teardown_element(element);
78+
}
79+
GST_END_TEST;
80+
81+
GST_START_TEST(test_default_displ_cfg_property) {
82+
g_print("Starting test: test_default_displ_cfg_property\n");
83+
GstElement *element = gst_check_setup_element(impl_name);
84+
ck_assert(element != NULL);
85+
86+
gchar *displ_cfg = NULL;
87+
g_object_get(G_OBJECT(element), "displ-cfg", &displ_cfg, NULL);
88+
ck_assert_msg(displ_cfg == NULL, "Expected default displ-cfg to be NULL, got '%s'", displ_cfg);
89+
g_free(displ_cfg);
90+
91+
gst_check_teardown_element(element);
92+
}
93+
GST_END_TEST;
94+
95+
/* ========================================================================= */
96+
/* Property set/get round-trip tests */
97+
/* ========================================================================= */
98+
99+
GST_START_TEST(test_set_get_device_cpu) {
100+
g_print("Starting test: test_set_get_device_cpu\n");
101+
GValue prop_value = G_VALUE_INIT;
102+
g_value_init(&prop_value, G_TYPE_STRING);
103+
g_value_set_string(&prop_value, "CPU");
104+
105+
check_property_value_updated_correctly(impl_name, "device", prop_value);
106+
g_value_unset(&prop_value);
107+
}
108+
GST_END_TEST;
109+
110+
GST_START_TEST(test_set_get_device_gpu) {
111+
g_print("Starting test: test_set_get_device_gpu\n");
112+
GValue prop_value = G_VALUE_INIT;
113+
g_value_init(&prop_value, G_TYPE_STRING);
114+
g_value_set_string(&prop_value, "GPU");
115+
116+
check_property_value_updated_correctly(impl_name, "device", prop_value);
117+
g_value_unset(&prop_value);
118+
}
119+
GST_END_TEST;
120+
121+
GST_START_TEST(test_set_get_obb_true) {
122+
g_print("Starting test: test_set_get_obb_true\n");
123+
GValue prop_value = G_VALUE_INIT;
124+
g_value_init(&prop_value, G_TYPE_BOOLEAN);
125+
g_value_set_boolean(&prop_value, TRUE);
126+
127+
check_property_value_updated_correctly(impl_name, "obb", prop_value);
128+
g_value_unset(&prop_value);
129+
}
130+
GST_END_TEST;
131+
132+
GST_START_TEST(test_set_get_displ_avgfps_true) {
133+
g_print("Starting test: test_set_get_displ_avgfps_true\n");
134+
GValue prop_value = G_VALUE_INIT;
135+
g_value_init(&prop_value, G_TYPE_BOOLEAN);
136+
g_value_set_boolean(&prop_value, TRUE);
137+
138+
check_property_value_updated_correctly(impl_name, "displ-avgfps", prop_value);
139+
g_value_unset(&prop_value);
140+
}
141+
GST_END_TEST;
142+
143+
GST_START_TEST(test_set_get_displ_cfg) {
144+
g_print("Starting test: test_set_get_displ_cfg\n");
145+
GValue prop_value = G_VALUE_INIT;
146+
g_value_init(&prop_value, G_TYPE_STRING);
147+
g_value_set_string(&prop_value, "show-labels=false,thickness=3");
148+
149+
check_property_value_updated_correctly(impl_name, "displ-cfg", prop_value);
150+
g_value_unset(&prop_value);
151+
}
152+
GST_END_TEST;
153+
154+
GST_START_TEST(test_set_get_displ_cfg_full) {
155+
g_print("Starting test: test_set_get_displ_cfg_full\n");
156+
GValue prop_value = G_VALUE_INIT;
157+
g_value_init(&prop_value, G_TYPE_STRING);
158+
g_value_set_string(&prop_value, "show-labels=true,font-scale=1.0,thickness=5,color-idx=2,font-type=simplex");
159+
160+
check_property_value_updated_correctly(impl_name, "displ-cfg", prop_value);
161+
g_value_unset(&prop_value);
162+
}
163+
GST_END_TEST;
164+
165+
/* ========================================================================= */
166+
/* State transition tests */
167+
/* ========================================================================= */
168+
169+
GST_START_TEST(test_watermarkimpl_state_null_to_ready) {
170+
g_print("Starting test: test_watermarkimpl_state_null_to_ready\n");
171+
GstElement *element = gst_element_factory_make(impl_name, NULL);
172+
ck_assert(element != NULL);
173+
174+
GstStateChangeReturn ret = gst_element_set_state(element, GST_STATE_READY);
175+
ck_assert_msg(ret != GST_STATE_CHANGE_FAILURE, "Failed to transition to READY state");
176+
177+
ret = gst_element_set_state(element, GST_STATE_NULL);
178+
ck_assert_msg(ret != GST_STATE_CHANGE_FAILURE, "Failed to transition back to NULL state");
179+
180+
gst_object_unref(element);
181+
}
182+
GST_END_TEST;
183+
184+
GST_START_TEST(test_watermark_bin_state_null_to_ready) {
185+
g_print("Starting test: test_watermark_bin_state_null_to_ready\n");
186+
GstElement *element = gst_element_factory_make(bin_name, NULL);
187+
ck_assert(element != NULL);
188+
189+
GstStateChangeReturn ret = gst_element_set_state(element, GST_STATE_READY);
190+
ck_assert_msg(ret != GST_STATE_CHANGE_FAILURE, "Failed to transition bin to READY state");
191+
192+
ret = gst_element_set_state(element, GST_STATE_NULL);
193+
ck_assert_msg(ret != GST_STATE_CHANGE_FAILURE, "Failed to transition bin back to NULL state");
194+
195+
gst_object_unref(element);
196+
}
197+
GST_END_TEST;
198+
199+
/* ========================================================================= */
200+
/* Bin wrapper property forwarding tests */
201+
/* ========================================================================= */
202+
203+
GST_START_TEST(test_bin_set_get_device) {
204+
g_print("Starting test: test_bin_set_get_device\n");
205+
GstElement *element = gst_element_factory_make(bin_name, NULL);
206+
ck_assert(element != NULL);
207+
208+
g_object_set(G_OBJECT(element), "device", "CPU", NULL);
209+
gchar *device = NULL;
210+
g_object_get(G_OBJECT(element), "device", &device, NULL);
211+
ck_assert_str_eq(device, "CPU");
212+
g_free(device);
213+
214+
gst_object_unref(element);
215+
}
216+
GST_END_TEST;
217+
218+
GST_START_TEST(test_bin_set_get_obb) {
219+
g_print("Starting test: test_bin_set_get_obb\n");
220+
GstElement *element = gst_element_factory_make(bin_name, NULL);
221+
ck_assert(element != NULL);
222+
223+
g_object_set(G_OBJECT(element), "obb", TRUE, NULL);
224+
gboolean obb = FALSE;
225+
g_object_get(G_OBJECT(element), "obb", &obb, NULL);
226+
ck_assert(obb == TRUE);
227+
228+
gst_object_unref(element);
229+
}
230+
GST_END_TEST;
231+
232+
GST_START_TEST(test_bin_set_get_displ_avgfps) {
233+
g_print("Starting test: test_bin_set_get_displ_avgfps\n");
234+
GstElement *element = gst_element_factory_make(bin_name, NULL);
235+
ck_assert(element != NULL);
236+
237+
g_object_set(G_OBJECT(element), "displ-avgfps", TRUE, NULL);
238+
gboolean displ_avgfps = FALSE;
239+
g_object_get(G_OBJECT(element), "displ-avgfps", &displ_avgfps, NULL);
240+
ck_assert(displ_avgfps == TRUE);
241+
242+
gst_object_unref(element);
243+
}
244+
GST_END_TEST;
245+
246+
GST_START_TEST(test_bin_set_get_displ_cfg) {
247+
g_print("Starting test: test_bin_set_get_displ_cfg\n");
248+
GstElement *element = gst_element_factory_make(bin_name, NULL);
249+
ck_assert(element != NULL);
250+
251+
g_object_set(G_OBJECT(element), "displ-cfg", "show-labels=false", NULL);
252+
gchar *displ_cfg = NULL;
253+
g_object_get(G_OBJECT(element), "displ-cfg", &displ_cfg, NULL);
254+
ck_assert_str_eq(displ_cfg, "show-labels=false");
255+
g_free(displ_cfg);
256+
257+
gst_object_unref(element);
258+
}
259+
GST_END_TEST;
260+
261+
/* ========================================================================= */
262+
/* Suite setup */
263+
/* ========================================================================= */
264+
265+
static Suite *watermark_properties_testing_suite(void) {
266+
Suite *s = suite_create("watermark_properties_testing");
267+
268+
/* instantiation */
269+
TCase *tc_instantiation = tcase_create("instantiation");
270+
suite_add_tcase(s, tc_instantiation);
271+
tcase_add_test(tc_instantiation, test_watermarkimpl_instantiation);
272+
tcase_add_test(tc_instantiation, test_watermark_bin_instantiation);
273+
274+
/* default property values */
275+
TCase *tc_defaults = tcase_create("default_properties");
276+
suite_add_tcase(s, tc_defaults);
277+
tcase_add_test(tc_defaults, test_default_device_property);
278+
tcase_add_test(tc_defaults, test_default_obb_property);
279+
tcase_add_test(tc_defaults, test_default_displ_avgfps_property);
280+
tcase_add_test(tc_defaults, test_default_displ_cfg_property);
281+
282+
/* property set/get round-trip */
283+
TCase *tc_setget = tcase_create("property_set_get");
284+
suite_add_tcase(s, tc_setget);
285+
tcase_add_test(tc_setget, test_set_get_device_cpu);
286+
tcase_add_test(tc_setget, test_set_get_device_gpu);
287+
tcase_add_test(tc_setget, test_set_get_obb_true);
288+
tcase_add_test(tc_setget, test_set_get_displ_avgfps_true);
289+
tcase_add_test(tc_setget, test_set_get_displ_cfg);
290+
tcase_add_test(tc_setget, test_set_get_displ_cfg_full);
291+
292+
/* state transitions */
293+
TCase *tc_states = tcase_create("state_transitions");
294+
suite_add_tcase(s, tc_states);
295+
tcase_add_test(tc_states, test_watermarkimpl_state_null_to_ready);
296+
tcase_add_test(tc_states, test_watermark_bin_state_null_to_ready);
297+
298+
/* bin property forwarding */
299+
TCase *tc_bin = tcase_create("bin_property_forwarding");
300+
suite_add_tcase(s, tc_bin);
301+
tcase_add_test(tc_bin, test_bin_set_get_device);
302+
tcase_add_test(tc_bin, test_bin_set_get_obb);
303+
tcase_add_test(tc_bin, test_bin_set_get_displ_avgfps);
304+
tcase_add_test(tc_bin, test_bin_set_get_displ_cfg);
305+
306+
return s;
307+
}
308+
309+
GST_CHECK_MAIN(watermark_properties_testing);

0 commit comments

Comments
 (0)