mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-18 13:25:56 +00:00
buffer: Add more exhaustive test for gst_buffer_foreach_meta() meta removal
Existing test for iterating/removing buffer meta data was insufficient to detect linked list corruption when removing multiple items, and could also suffer from such corruption in attempting to count remaining items. Modified the one test and added several others to exercise multiple scenarios. Validates fix for issue #332.
This commit is contained in:
parent
6318e7c675
commit
ec5e781e6b
1 changed files with 178 additions and 3 deletions
|
@ -337,10 +337,98 @@ count_buffer_meta (GstBuffer * buffer)
|
|||
return ret;
|
||||
}
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_one)
|
||||
GST_START_TEST (test_meta_foreach_remove_one_of_one)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
||||
/* add some metadata */
|
||||
meta1 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta1 == NULL);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 1);
|
||||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta1);
|
||||
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_head_of_three)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1, *meta2, *meta3;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
||||
/* add some metadata */
|
||||
meta1 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta1 == NULL);
|
||||
meta2 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta2 == NULL);
|
||||
meta3 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta3 == NULL);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 3);
|
||||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta3);
|
||||
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta1);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_middle_of_three)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1, *meta2, *meta3;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
||||
/* add some metadata */
|
||||
meta1 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta1 == NULL);
|
||||
meta2 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta2 == NULL);
|
||||
meta3 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta3 == NULL);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 3);
|
||||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta2);
|
||||
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta1);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_tail_of_three)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1, *meta2, *meta3;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
@ -357,7 +445,89 @@ GST_START_TEST (test_meta_foreach_remove_one)
|
|||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_one, meta1);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 2);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta3);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
||||
static gboolean
|
||||
foreach_meta_remove_unpooled (GstBuffer * buffer, GstMeta ** meta,
|
||||
gpointer unused)
|
||||
{
|
||||
if (!GST_META_FLAG_IS_SET (*meta, GST_META_FLAG_POOLED)) {
|
||||
*meta = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_head_and_tail_of_three)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1, *meta2, *meta3;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
||||
/* add some metadata */
|
||||
meta1 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta1 == NULL);
|
||||
meta2 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta2 == NULL);
|
||||
GST_META_FLAG_SET (meta2, GST_META_FLAG_POOLED);
|
||||
meta3 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta3 == NULL);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 3);
|
||||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_unpooled, NULL);
|
||||
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
}
|
||||
|
||||
GST_END_TEST;
|
||||
|
||||
|
||||
GST_START_TEST (test_meta_foreach_remove_several)
|
||||
{
|
||||
GstBuffer *buffer;
|
||||
GstMetaTest *meta1, *meta2, *meta3, *meta4, *meta5;
|
||||
gpointer state = NULL;
|
||||
|
||||
buffer = gst_buffer_new_and_alloc (4);
|
||||
fail_if (buffer == NULL);
|
||||
|
||||
/* add some metadata */
|
||||
meta1 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta1 == NULL);
|
||||
meta2 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta2 == NULL);
|
||||
GST_META_FLAG_SET (meta2, GST_META_FLAG_POOLED);
|
||||
meta3 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta3 == NULL);
|
||||
meta4 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta4 == NULL);
|
||||
meta5 = GST_META_TEST_ADD (buffer);
|
||||
fail_if (meta5 == NULL);
|
||||
GST_META_FLAG_SET (meta5, GST_META_FLAG_POOLED);
|
||||
|
||||
fail_unless_equals_int (count_buffer_meta (buffer), 5);
|
||||
|
||||
gst_buffer_foreach_meta (buffer, foreach_meta_remove_unpooled, NULL);
|
||||
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta5);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == (GstMeta *) meta2);
|
||||
fail_unless (gst_buffer_iterate_meta (buffer, &state) == NULL);
|
||||
|
||||
/* clean up */
|
||||
gst_buffer_unref (buffer);
|
||||
|
@ -472,7 +642,12 @@ gst_buffermeta_suite (void)
|
|||
suite_add_tcase (s, tc_chain);
|
||||
tcase_add_test (tc_chain, test_meta_test);
|
||||
tcase_add_test (tc_chain, test_meta_locked);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_one);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_one_of_one);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_head_of_three);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_middle_of_three);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_tail_of_three);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_head_and_tail_of_three);
|
||||
tcase_add_test (tc_chain, test_meta_foreach_remove_several);
|
||||
tcase_add_test (tc_chain, test_meta_iterate);
|
||||
|
||||
return s;
|
||||
|
|
Loading…
Reference in a new issue