|
| 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