check/Makefile.am: don't valgrind the controller test - it's leaking - Stefan, HELP

Original commit message from CVS:

* check/Makefile.am:
don't valgrind the controller test - it's leaking - Stefan, HELP
* gst/check/gstcheck.c: (gst_check_message_error),
(gst_check_chain_func), (gst_check_setup_element),
(gst_check_teardown_element), (gst_check_setup_src_pad),
(gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
(gst_check_teardown_sink_pad):
* gst/check/gstcheck.h:
add a bunch of methods to set up elements, and src and sink pads
* check/elements/fakesrc.c: (setup_fakesrc), (cleanup_fakesrc):
* check/elements/identity.c: (setup_identity), (cleanup_identity),
(GST_START_TEST):
use them
* gst/gstmessage.c:
* gst/gsttag.h:
whitespace/doc fixes
This commit is contained in:
Thomas Vander Stichele 2005-08-21 10:39:39 +00:00
parent feb446c5d4
commit 744193f884
15 changed files with 373 additions and 268 deletions

View file

@ -1,3 +1,22 @@
2005-08-21 Thomas Vander Stichele <thomas at apestaart dot org>
* check/Makefile.am:
don't valgrind the controller test - it's leaking - Stefan, HELP
* gst/check/gstcheck.c: (gst_check_message_error),
(gst_check_chain_func), (gst_check_setup_element),
(gst_check_teardown_element), (gst_check_setup_src_pad),
(gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
(gst_check_teardown_sink_pad):
* gst/check/gstcheck.h:
add a bunch of methods to set up elements, and src and sink pads
* check/elements/fakesrc.c: (setup_fakesrc), (cleanup_fakesrc):
* check/elements/identity.c: (setup_identity), (cleanup_identity),
(GST_START_TEST):
use them
* gst/gstmessage.c:
* gst/gsttag.h:
whitespace/doc fixes
2005-08-20 Thomas Vander Stichele <thomas at apestaart dot org> 2005-08-20 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gstelement.h: * gst/gstelement.h:

View file

@ -78,6 +78,7 @@ gst_libs_controller_LDADD = $(GST_OBJ_LIBS) \
# valgrind testing # valgrind testing
# these just need valgrind fixing, period # these just need valgrind fixing, period
TESTS_TO_FIX = \ TESTS_TO_FIX = \
gst-libs/controller \
pipelines/cleanup \ pipelines/cleanup \
pipelines/simple_launch_lines pipelines/simple_launch_lines

View file

@ -24,22 +24,15 @@
#include <gst/check/gstcheck.h> #include <gst/check/gstcheck.h>
GList *buffers = NULL;
gboolean have_eos = FALSE; gboolean have_eos = FALSE;
GstPad *mysinkpad;
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY); GST_STATIC_CAPS_ANY);
GstFlowReturn
chain_func (GstPad * pad, GstBuffer * buffer)
{
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
gboolean gboolean
event_func (GstPad * pad, GstEvent * event) event_func (GstPad * pad, GstEvent * event)
{ {
@ -60,52 +53,20 @@ event_func (GstPad * pad, GstEvent * event)
GstElement * GstElement *
setup_fakesrc () setup_fakesrc ()
{ {
GstElement *src; GstElement *fakesrc;
GstPad *srcpad, *sinkpad;
src = gst_element_factory_make ("fakesrc", "src"); GST_DEBUG ("setup_fakesrc");
fail_if (src == NULL, "Could not create a fakesrc"); fakesrc = gst_check_setup_element ("fakesrc");
mysinkpad = gst_check_setup_sink_pad (fakesrc, &sinktemplate, NULL);
sinkpad = gst_pad_set_event_function (mysinkpad, event_func);
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate), return fakesrc;
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
srcpad = gst_element_get_pad (src, "src");
fail_if (srcpad == NULL, "Could not get source pad from fakesrc");
gst_pad_set_caps (sinkpad, NULL);
gst_pad_set_chain_function (sinkpad, chain_func);
gst_pad_set_event_function (sinkpad, event_func);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and sink pads");
return src;
} }
void void
cleanup_fakesrc (GstElement * src) cleanup_fakesrc (GstElement * fakesrc)
{ {
GstPad *srcpad, *sinkpad; gst_check_teardown_sink_pad (fakesrc);
gst_check_teardown_element (fakesrc);
fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
"could not set to null");
srcpad = gst_element_get_pad (src, "src");
sinkpad = gst_pad_get_peer (srcpad);
ASSERT_OBJECT_REFCOUNT (src, "src", 1);
gst_object_unref (src);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
gst_object_unref (srcpad);
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
gst_object_unref (sinkpad);
} }
GST_START_TEST (test_num_buffers) GST_START_TEST (test_num_buffers)

View file

@ -42,15 +42,6 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY); GST_STATIC_CAPS_ANY);
GstFlowReturn
chain_func (GstPad * pad, GstBuffer * buffer)
{
GST_DEBUG ("chain_func: received buffer %p", buffer);
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
gboolean gboolean
event_func (GstPad * pad, GstEvent * event) event_func (GstPad * pad, GstEvent * event)
{ {
@ -72,90 +63,25 @@ GstElement *
setup_identity () setup_identity ()
{ {
GstElement *identity; GstElement *identity;
GstPad *srcpad, *sinkpad;
GST_DEBUG ("setup_identity"); GST_DEBUG ("setup_identity");
identity = gst_element_factory_make ("identity", "identity"); identity = gst_check_setup_element ("identity");
fail_if (identity == NULL, "Could not create a identity"); mysrcpad = gst_check_setup_src_pad (identity, &srctemplate, NULL);
mysinkpad = gst_check_setup_sink_pad (identity, &sinktemplate, NULL);
/* sending pad */
mysrcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
"src");
fail_if (mysrcpad == NULL, "Could not create a mysrcpad");
ASSERT_OBJECT_REFCOUNT (mysrcpad, "mysrcpad", 1);
sinkpad = gst_element_get_pad (identity, "sink");
fail_if (sinkpad == NULL, "Could not get source pad from identity");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_set_caps (mysrcpad, NULL);
fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and identity sink pads");
gst_object_unref (sinkpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
/* receiving pad */
mysinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
"sink");
fail_if (mysinkpad == NULL, "Could not create a mysinkpad");
srcpad = gst_element_get_pad (identity, "src");
fail_if (srcpad == NULL, "Could not get source pad from identity");
gst_pad_set_caps (mysinkpad, NULL);
gst_pad_set_chain_function (mysinkpad, chain_func);
gst_pad_set_event_function (mysinkpad, event_func); gst_pad_set_event_function (mysinkpad, event_func);
fail_unless (gst_pad_link (srcpad, mysinkpad) == GST_PAD_LINK_OK,
"Could not link identity source and mysink pads");
gst_object_unref (srcpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
return identity; return identity;
} }
void void
cleanup_identity (GstElement * identity) cleanup_identity (GstElement * identity)
{ {
GstPad *srcpad, *sinkpad;
GST_DEBUG ("cleanup_identity"); GST_DEBUG ("cleanup_identity");
fail_unless (gst_element_set_state (identity, GST_STATE_NULL) == gst_check_teardown_src_pad (identity);
GST_STATE_SUCCESS, "could not set to null"); gst_check_teardown_sink_pad (identity);
ASSERT_OBJECT_REFCOUNT (identity, "identity", 1); gst_check_teardown_element (identity);
/* clean up floating src pad */
sinkpad = gst_element_get_pad (identity, "sink");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_unlink (mysrcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (mysrcpad, "srcpad", 1);
gst_object_unref (mysrcpad);
mysrcpad = NULL;
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
/* one more ref is held by identity itself */
/* clean up floating sink pad */
srcpad = gst_element_get_pad (identity, "src");
gst_pad_unlink (srcpad, mysinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
/* one more ref is held by identity itself */
ASSERT_OBJECT_REFCOUNT (mysinkpad, "mysinkpad", 1);
gst_object_unref (mysinkpad);
mysinkpad = NULL;
ASSERT_OBJECT_REFCOUNT (identity, "identity", 1);
gst_object_unref (identity);
} }
GST_START_TEST (test_one_buffer) GST_START_TEST (test_one_buffer)

2
common

@ -1 +1 @@
Subproject commit 4cc6f465857331531a09aff0a23dc0b133e7f669 Subproject commit 2827052513b1aa41f4a2414c163cfd0f4790b43c

View file

@ -102,3 +102,134 @@ gst_check_message_error (GstMessage * message, GstMessageType type,
g_error_free (error); g_error_free (error);
g_free (debug); g_free (debug);
} }
/* helper functions */
GstFlowReturn
gst_check_chain_func (GstPad * pad, GstBuffer * buffer)
{
GST_DEBUG ("chain_func: received buffer %p", buffer);
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
/* setup an element for a filter test with mysrcpad and mysinkpad */
GstElement *
gst_check_setup_element (const gchar * factory)
{
GstElement *element;
GST_DEBUG ("setup_element");
element = gst_element_factory_make (factory, factory);
fail_if (element == NULL, "Could not create a %s", factory);
ASSERT_OBJECT_REFCOUNT (element, factory, 1);
return element;
}
void
gst_check_teardown_element (GstElement * element)
{
GST_DEBUG ("teardown_element");
fail_unless (gst_element_set_state (element, GST_STATE_NULL) ==
GST_STATE_SUCCESS, "could not set to null");
ASSERT_OBJECT_REFCOUNT (element, "element", 1);
gst_object_unref (element);
}
GstPad *
gst_check_setup_src_pad (GstElement * element,
GstStaticPadTemplate * srctemplate, GstCaps * caps)
{
GstPad *srcpad, *sinkpad;
/* sending pad */
srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (srctemplate),
"src");
fail_if (srcpad == NULL, "Could not create a srcpad");
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
sinkpad = gst_element_get_pad (element, "sink");
fail_if (sinkpad == NULL, "Could not get sink pad from %s",
GST_ELEMENT_NAME (element));
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_set_caps (srcpad, caps);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and %s sink pads", GST_ELEMENT_NAME (element));
gst_object_unref (sinkpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
return srcpad;
}
void
gst_check_teardown_src_pad (GstElement * element)
{
GstPad *srcpad, *sinkpad;
/* clean up floating src pad */
sinkpad = gst_element_get_pad (element, "sink");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
srcpad = gst_pad_get_peer (sinkpad);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
/* one more ref is held by element itself */
/* pad refs held by both creator and this function (through _get_peer) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
gst_object_unref (srcpad);
}
GstPad *
gst_check_setup_sink_pad (GstElement * element, GstStaticPadTemplate * template,
GstCaps * caps)
{
GstPad *srcpad, *sinkpad;
/* receiving pad */
sinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (template),
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
srcpad = gst_element_get_pad (element, "src");
fail_if (srcpad == NULL, "Could not get source pad from %s",
GST_ELEMENT_NAME (element));
gst_pad_set_caps (sinkpad, caps);
gst_pad_set_chain_function (sinkpad, gst_check_chain_func);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link %s source and sink pads", GST_ELEMENT_NAME (element));
gst_object_unref (srcpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
return sinkpad;
}
void
gst_check_teardown_sink_pad (GstElement * element)
{
GstPad *srcpad, *sinkpad;
/* clean up floating sink pad */
srcpad = gst_element_get_pad (element, "src");
sinkpad = gst_pad_get_peer (srcpad);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get_pad) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
/* one more ref is held by element itself */
/* pad refs held by both creator and this function (through _get_peer) */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
gst_object_unref (sinkpad);
}

View file

@ -43,10 +43,25 @@ extern gboolean _gst_check_threads_running;
extern gboolean _gst_check_raised_critical; extern gboolean _gst_check_raised_critical;
extern gboolean _gst_check_expecting_log; extern gboolean _gst_check_expecting_log;
/* global variables used in test methods */
GList * buffers;
void gst_check_init (int *argc, char **argv[]); void gst_check_init (int *argc, char **argv[]);
GstFlowReturn gst_check_chain_func (GstPad *pad, GstBuffer *buffer);
void gst_check_message_error (GstMessage *message, GstMessageType type, GQuark domain, gint code); void gst_check_message_error (GstMessage *message, GstMessageType type, GQuark domain, gint code);
GstElement * gst_check_setup_element (const gchar *factory);
void gst_check_teardown_element (GstElement *element);
GstPad * gst_check_setup_src_pad (GstElement *element,
GstStaticPadTemplate *template, GstCaps *caps);
void gst_check_teardown_src_pad (GstElement *element);
GstPad * gst_check_setup_sink_pad (GstElement *element,
GstStaticPadTemplate *template, GstCaps *caps);
void gst_check_teardown_sink_pad (GstElement *element);
#define fail_unless_message_error(msg, domain, code) \ #define fail_unless_message_error(msg, domain, code) \
gst_check_message_error (msg, GST_MESSAGE_ERROR, \ gst_check_message_error (msg, GST_MESSAGE_ERROR, \
GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code) GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code)
@ -71,6 +86,15 @@ G_STMT_START { \
"'" #a "' (%d) is not equal to '" #b"' (%d)", first, second); \ "'" #a "' (%d) is not equal to '" #b"' (%d)", first, second); \
} G_STMT_END; } G_STMT_END;
#define fail_unless_equals_string(a, b) \
G_STMT_START { \
gchar * first = a; \
gchar * second = b; \
fail_unless(strcmp (first, second) == 0, \
"'" #a "' (%s) is not equal to '" #b"' (%s)", first, second); \
} G_STMT_END;
/*** /***
* thread test macros and variables * thread test macros and variables
*/ */
@ -179,7 +203,7 @@ G_STMT_START { \
int rc; \ int rc; \
rc = GST_OBJECT_REFCOUNT_VALUE (object); \ rc = GST_OBJECT_REFCOUNT_VALUE (object); \
fail_unless (rc == value, \ fail_unless (rc == value, \
name " refcount is %d instead of %d", rc, value);\ "%s refcount is %d instead of %d", name, rc, value); \
} G_STMT_END } G_STMT_END
#define ASSERT_CAPS_REFCOUNT(caps, name, value) \ #define ASSERT_CAPS_REFCOUNT(caps, name, value) \

View file

@ -438,7 +438,7 @@ gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list)
} }
/** /**
* gst_message_parse_tag: * gst_message_parse_state_changed:
* @message: A valid #GstMessage of type GST_MESSAGE_STATE_CHANGED. * @message: A valid #GstMessage of type GST_MESSAGE_STATE_CHANGED.
* *
* Extracts the old and new states from the GstMessage. * Extracts the old and new states from the GstMessage.

View file

@ -102,3 +102,134 @@ gst_check_message_error (GstMessage * message, GstMessageType type,
g_error_free (error); g_error_free (error);
g_free (debug); g_free (debug);
} }
/* helper functions */
GstFlowReturn
gst_check_chain_func (GstPad * pad, GstBuffer * buffer)
{
GST_DEBUG ("chain_func: received buffer %p", buffer);
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
/* setup an element for a filter test with mysrcpad and mysinkpad */
GstElement *
gst_check_setup_element (const gchar * factory)
{
GstElement *element;
GST_DEBUG ("setup_element");
element = gst_element_factory_make (factory, factory);
fail_if (element == NULL, "Could not create a %s", factory);
ASSERT_OBJECT_REFCOUNT (element, factory, 1);
return element;
}
void
gst_check_teardown_element (GstElement * element)
{
GST_DEBUG ("teardown_element");
fail_unless (gst_element_set_state (element, GST_STATE_NULL) ==
GST_STATE_SUCCESS, "could not set to null");
ASSERT_OBJECT_REFCOUNT (element, "element", 1);
gst_object_unref (element);
}
GstPad *
gst_check_setup_src_pad (GstElement * element,
GstStaticPadTemplate * srctemplate, GstCaps * caps)
{
GstPad *srcpad, *sinkpad;
/* sending pad */
srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (srctemplate),
"src");
fail_if (srcpad == NULL, "Could not create a srcpad");
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
sinkpad = gst_element_get_pad (element, "sink");
fail_if (sinkpad == NULL, "Could not get sink pad from %s",
GST_ELEMENT_NAME (element));
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_set_caps (srcpad, caps);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and %s sink pads", GST_ELEMENT_NAME (element));
gst_object_unref (sinkpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
return srcpad;
}
void
gst_check_teardown_src_pad (GstElement * element)
{
GstPad *srcpad, *sinkpad;
/* clean up floating src pad */
sinkpad = gst_element_get_pad (element, "sink");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
srcpad = gst_pad_get_peer (sinkpad);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
/* one more ref is held by element itself */
/* pad refs held by both creator and this function (through _get_peer) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
gst_object_unref (srcpad);
}
GstPad *
gst_check_setup_sink_pad (GstElement * element, GstStaticPadTemplate * template,
GstCaps * caps)
{
GstPad *srcpad, *sinkpad;
/* receiving pad */
sinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (template),
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
srcpad = gst_element_get_pad (element, "src");
fail_if (srcpad == NULL, "Could not get source pad from %s",
GST_ELEMENT_NAME (element));
gst_pad_set_caps (sinkpad, caps);
gst_pad_set_chain_function (sinkpad, gst_check_chain_func);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link %s source and sink pads", GST_ELEMENT_NAME (element));
gst_object_unref (srcpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
return sinkpad;
}
void
gst_check_teardown_sink_pad (GstElement * element)
{
GstPad *srcpad, *sinkpad;
/* clean up floating sink pad */
srcpad = gst_element_get_pad (element, "src");
sinkpad = gst_pad_get_peer (srcpad);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get_pad) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
/* one more ref is held by element itself */
/* pad refs held by both creator and this function (through _get_peer) */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
gst_object_unref (sinkpad);
}

View file

@ -43,10 +43,25 @@ extern gboolean _gst_check_threads_running;
extern gboolean _gst_check_raised_critical; extern gboolean _gst_check_raised_critical;
extern gboolean _gst_check_expecting_log; extern gboolean _gst_check_expecting_log;
/* global variables used in test methods */
GList * buffers;
void gst_check_init (int *argc, char **argv[]); void gst_check_init (int *argc, char **argv[]);
GstFlowReturn gst_check_chain_func (GstPad *pad, GstBuffer *buffer);
void gst_check_message_error (GstMessage *message, GstMessageType type, GQuark domain, gint code); void gst_check_message_error (GstMessage *message, GstMessageType type, GQuark domain, gint code);
GstElement * gst_check_setup_element (const gchar *factory);
void gst_check_teardown_element (GstElement *element);
GstPad * gst_check_setup_src_pad (GstElement *element,
GstStaticPadTemplate *template, GstCaps *caps);
void gst_check_teardown_src_pad (GstElement *element);
GstPad * gst_check_setup_sink_pad (GstElement *element,
GstStaticPadTemplate *template, GstCaps *caps);
void gst_check_teardown_sink_pad (GstElement *element);
#define fail_unless_message_error(msg, domain, code) \ #define fail_unless_message_error(msg, domain, code) \
gst_check_message_error (msg, GST_MESSAGE_ERROR, \ gst_check_message_error (msg, GST_MESSAGE_ERROR, \
GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code) GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code)
@ -71,6 +86,15 @@ G_STMT_START { \
"'" #a "' (%d) is not equal to '" #b"' (%d)", first, second); \ "'" #a "' (%d) is not equal to '" #b"' (%d)", first, second); \
} G_STMT_END; } G_STMT_END;
#define fail_unless_equals_string(a, b) \
G_STMT_START { \
gchar * first = a; \
gchar * second = b; \
fail_unless(strcmp (first, second) == 0, \
"'" #a "' (%s) is not equal to '" #b"' (%s)", first, second); \
} G_STMT_END;
/*** /***
* thread test macros and variables * thread test macros and variables
*/ */
@ -179,7 +203,7 @@ G_STMT_START { \
int rc; \ int rc; \
rc = GST_OBJECT_REFCOUNT_VALUE (object); \ rc = GST_OBJECT_REFCOUNT_VALUE (object); \
fail_unless (rc == value, \ fail_unless (rc == value, \
name " refcount is %d instead of %d", rc, value);\ "%s refcount is %d instead of %d", name, rc, value); \
} G_STMT_END } G_STMT_END
#define ASSERT_CAPS_REFCOUNT(caps, name, value) \ #define ASSERT_CAPS_REFCOUNT(caps, name, value) \

View file

@ -78,6 +78,7 @@ gst_libs_controller_LDADD = $(GST_OBJ_LIBS) \
# valgrind testing # valgrind testing
# these just need valgrind fixing, period # these just need valgrind fixing, period
TESTS_TO_FIX = \ TESTS_TO_FIX = \
gst-libs/controller \
pipelines/cleanup \ pipelines/cleanup \
pipelines/simple_launch_lines pipelines/simple_launch_lines

View file

@ -24,22 +24,15 @@
#include <gst/check/gstcheck.h> #include <gst/check/gstcheck.h>
GList *buffers = NULL;
gboolean have_eos = FALSE; gboolean have_eos = FALSE;
GstPad *mysinkpad;
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY); GST_STATIC_CAPS_ANY);
GstFlowReturn
chain_func (GstPad * pad, GstBuffer * buffer)
{
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
gboolean gboolean
event_func (GstPad * pad, GstEvent * event) event_func (GstPad * pad, GstEvent * event)
{ {
@ -60,52 +53,20 @@ event_func (GstPad * pad, GstEvent * event)
GstElement * GstElement *
setup_fakesrc () setup_fakesrc ()
{ {
GstElement *src; GstElement *fakesrc;
GstPad *srcpad, *sinkpad;
src = gst_element_factory_make ("fakesrc", "src"); GST_DEBUG ("setup_fakesrc");
fail_if (src == NULL, "Could not create a fakesrc"); fakesrc = gst_check_setup_element ("fakesrc");
mysinkpad = gst_check_setup_sink_pad (fakesrc, &sinktemplate, NULL);
sinkpad = gst_pad_set_event_function (mysinkpad, event_func);
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate), return fakesrc;
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
srcpad = gst_element_get_pad (src, "src");
fail_if (srcpad == NULL, "Could not get source pad from fakesrc");
gst_pad_set_caps (sinkpad, NULL);
gst_pad_set_chain_function (sinkpad, chain_func);
gst_pad_set_event_function (sinkpad, event_func);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and sink pads");
return src;
} }
void void
cleanup_fakesrc (GstElement * src) cleanup_fakesrc (GstElement * fakesrc)
{ {
GstPad *srcpad, *sinkpad; gst_check_teardown_sink_pad (fakesrc);
gst_check_teardown_element (fakesrc);
fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
"could not set to null");
srcpad = gst_element_get_pad (src, "src");
sinkpad = gst_pad_get_peer (srcpad);
ASSERT_OBJECT_REFCOUNT (src, "src", 1);
gst_object_unref (src);
gst_pad_unlink (srcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
gst_object_unref (srcpad);
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
gst_object_unref (sinkpad);
} }
GST_START_TEST (test_num_buffers) GST_START_TEST (test_num_buffers)

View file

@ -42,15 +42,6 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY); GST_STATIC_CAPS_ANY);
GstFlowReturn
chain_func (GstPad * pad, GstBuffer * buffer)
{
GST_DEBUG ("chain_func: received buffer %p", buffer);
buffers = g_list_append (buffers, buffer);
return GST_FLOW_OK;
}
gboolean gboolean
event_func (GstPad * pad, GstEvent * event) event_func (GstPad * pad, GstEvent * event)
{ {
@ -72,90 +63,25 @@ GstElement *
setup_identity () setup_identity ()
{ {
GstElement *identity; GstElement *identity;
GstPad *srcpad, *sinkpad;
GST_DEBUG ("setup_identity"); GST_DEBUG ("setup_identity");
identity = gst_element_factory_make ("identity", "identity"); identity = gst_check_setup_element ("identity");
fail_if (identity == NULL, "Could not create a identity"); mysrcpad = gst_check_setup_src_pad (identity, &srctemplate, NULL);
mysinkpad = gst_check_setup_sink_pad (identity, &sinktemplate, NULL);
/* sending pad */
mysrcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
"src");
fail_if (mysrcpad == NULL, "Could not create a mysrcpad");
ASSERT_OBJECT_REFCOUNT (mysrcpad, "mysrcpad", 1);
sinkpad = gst_element_get_pad (identity, "sink");
fail_if (sinkpad == NULL, "Could not get source pad from identity");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_set_caps (mysrcpad, NULL);
fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and identity sink pads");
gst_object_unref (sinkpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
/* receiving pad */
mysinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
"sink");
fail_if (mysinkpad == NULL, "Could not create a mysinkpad");
srcpad = gst_element_get_pad (identity, "src");
fail_if (srcpad == NULL, "Could not get source pad from identity");
gst_pad_set_caps (mysinkpad, NULL);
gst_pad_set_chain_function (mysinkpad, chain_func);
gst_pad_set_event_function (mysinkpad, event_func); gst_pad_set_event_function (mysinkpad, event_func);
fail_unless (gst_pad_link (srcpad, mysinkpad) == GST_PAD_LINK_OK,
"Could not link identity source and mysink pads");
gst_object_unref (srcpad); /* because we got it higher up */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
return identity; return identity;
} }
void void
cleanup_identity (GstElement * identity) cleanup_identity (GstElement * identity)
{ {
GstPad *srcpad, *sinkpad;
GST_DEBUG ("cleanup_identity"); GST_DEBUG ("cleanup_identity");
fail_unless (gst_element_set_state (identity, GST_STATE_NULL) == gst_check_teardown_src_pad (identity);
GST_STATE_SUCCESS, "could not set to null"); gst_check_teardown_sink_pad (identity);
ASSERT_OBJECT_REFCOUNT (identity, "identity", 1); gst_check_teardown_element (identity);
/* clean up floating src pad */
sinkpad = gst_element_get_pad (identity, "sink");
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_pad_unlink (mysrcpad, sinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (mysrcpad, "srcpad", 1);
gst_object_unref (mysrcpad);
mysrcpad = NULL;
ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
gst_object_unref (sinkpad);
/* one more ref is held by identity itself */
/* clean up floating sink pad */
srcpad = gst_element_get_pad (identity, "src");
gst_pad_unlink (srcpad, mysinkpad);
/* pad refs held by both creator and this function (through _get) */
ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
gst_object_unref (srcpad);
/* one more ref is held by identity itself */
ASSERT_OBJECT_REFCOUNT (mysinkpad, "mysinkpad", 1);
gst_object_unref (mysinkpad);
mysinkpad = NULL;
ASSERT_OBJECT_REFCOUNT (identity, "identity", 1);
gst_object_unref (identity);
} }
GST_START_TEST (test_one_buffer) GST_START_TEST (test_one_buffer)