2005-09-15 23:51:24 +00:00
|
|
|
/* GStreamer
|
|
|
|
*
|
|
|
|
* unit test for GstPlugin
|
|
|
|
*
|
|
|
|
* Copyright 2004 Thomas Vander Stichele <thomas at apestaart dot org>
|
|
|
|
* Copyright 2005 David Schleef <ds@schleef.org>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include <gst/check/gstcheck.h>
|
|
|
|
|
gst/gstplugin.c: Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC again, which I broke two commits ago when ...
Original commit message from CVS:
* gst/gstplugin.c: (_gst_plugin_initialize):
Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC
again, which I broke two commits ago when changing the API
of gst_plugin_register_static(): the g_list_foreach() in
_gst_plugin_register_static still assumed the old function
signature and would therefore fail (re-fixes #510187).
* gst/gstplugin.c: (_num_static_plugins), (_static_plugins),
(_gst_plugin_register_static), (gst_plugin_register_static):
Revert the (technically correct) change to call g_thread_init() from
the pre-main() constructor. This will break programs which call
g_thread_init() without an if (!g_thread_supported()) guard in their
main function. We could just blame it on GLib or the application, but
it's probably best to just avoid this altogether and simply not use
any GLib functions here and use plain old malloc() with a simple
array to store the plugins to register later when gst_init() is
finally called (re-fixes #510187).
* tests/check/gst/gstplugin.c: (GST_GNUC_CONSTRUCTOR_DEFINED),
(GST_GNUC_CONSTRUCTOR_DEFINED), (plugin_init_counter),
(plugin1_init), (plugin2_init), (plugin3_init), (GST_START_TEST),
(GST_START_TEST), (gst_plugin_suite):
Dumb unit test to make sure the old GST_PLUGIN_DEFINE_STATIC still
works.
2008-01-20 15:04:33 +00:00
|
|
|
|
2005-09-15 23:51:24 +00:00
|
|
|
static gboolean
|
|
|
|
register_check_elements (GstPlugin * plugin)
|
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_START_TEST (test_register_static)
|
|
|
|
{
|
|
|
|
GstPlugin *plugin;
|
|
|
|
|
2008-01-17 22:17:15 +00:00
|
|
|
fail_unless (gst_plugin_register_static (GST_VERSION_MAJOR,
|
|
|
|
GST_VERSION_MINOR, "more-elements", "more-elements",
|
|
|
|
register_check_elements, VERSION, GST_LICENSE, PACKAGE,
|
|
|
|
GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN));
|
2005-09-15 23:51:24 +00:00
|
|
|
|
|
|
|
plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
|
|
|
|
|
|
|
|
gst_object_unref (plugin);
|
|
|
|
}
|
|
|
|
|
2005-09-16 00:37:51 +00:00
|
|
|
GST_END_TEST;
|
|
|
|
|
2005-09-18 06:59:25 +00:00
|
|
|
GST_START_TEST (test_registry)
|
|
|
|
{
|
|
|
|
GList *g;
|
|
|
|
GstRegistry *registry;
|
|
|
|
|
|
|
|
registry = gst_registry_get_default ();
|
|
|
|
|
|
|
|
for (g = registry->plugins; g; g = g->next) {
|
|
|
|
GstPlugin *plugin = GST_PLUGIN (g->data);
|
|
|
|
|
2005-09-23 11:41:30 +00:00
|
|
|
ASSERT_OBJECT_REFCOUNT (plugin, "plugin in registry", 1);
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d %s", GST_OBJECT_REFCOUNT_VALUE (plugin),
|
2005-09-18 06:59:25 +00:00
|
|
|
plugin->desc.name);
|
|
|
|
}
|
|
|
|
for (g = registry->features; g; g = g->next) {
|
|
|
|
GstPluginFeature *feature = GST_PLUGIN_FEATURE (g->data);
|
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (feature) != 1,
|
2005-09-18 06:59:25 +00:00
|
|
|
"Feature in registry should have refcount of 1");
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d %s", GST_OBJECT_REFCOUNT_VALUE (feature),
|
2011-05-24 16:17:24 +00:00
|
|
|
GST_OBJECT_NAME (feature));
|
2005-09-18 06:59:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2005-12-01 12:36:10 +00:00
|
|
|
GST_START_TEST (test_load_coreelements)
|
2005-09-15 23:51:24 +00:00
|
|
|
{
|
|
|
|
GstPlugin *unloaded_plugin;
|
|
|
|
GstPlugin *loaded_plugin;
|
|
|
|
|
2005-12-01 12:36:10 +00:00
|
|
|
unloaded_plugin = gst_default_registry_find_plugin ("coreelements");
|
|
|
|
fail_if (unloaded_plugin == NULL, "Failed to find coreelements plugin");
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin) != 2,
|
2005-09-15 23:51:24 +00:00
|
|
|
"Refcount of unloaded plugin in registry initially should be 2");
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin));
|
2005-09-15 23:51:24 +00:00
|
|
|
|
|
|
|
loaded_plugin = gst_plugin_load (unloaded_plugin);
|
|
|
|
fail_if (loaded_plugin == NULL, "Failed to load plugin");
|
|
|
|
|
2005-09-18 06:59:25 +00:00
|
|
|
if (loaded_plugin != unloaded_plugin) {
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (loaded_plugin) != 2,
|
2005-09-18 06:59:25 +00:00
|
|
|
"Refcount of loaded plugin in registry should be 2");
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (loaded_plugin));
|
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin) != 1,
|
2005-09-18 06:59:25 +00:00
|
|
|
"Refcount of replaced plugin should be 1");
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin));
|
2005-09-18 06:59:25 +00:00
|
|
|
}
|
2005-09-15 23:51:24 +00:00
|
|
|
|
|
|
|
gst_object_unref (unloaded_plugin);
|
|
|
|
gst_object_unref (loaded_plugin);
|
|
|
|
}
|
|
|
|
|
2005-09-16 00:37:51 +00:00
|
|
|
GST_END_TEST;
|
|
|
|
|
2005-09-15 23:51:24 +00:00
|
|
|
GST_START_TEST (test_registry_get_plugin_list)
|
|
|
|
{
|
|
|
|
GList *list;
|
|
|
|
GstPlugin *plugin;
|
|
|
|
|
2005-12-01 12:36:10 +00:00
|
|
|
plugin = gst_default_registry_find_plugin ("coreelements");
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
|
2005-09-15 23:51:24 +00:00
|
|
|
"Refcount of plugin in registry should be 2");
|
|
|
|
|
|
|
|
list = gst_registry_get_plugin_list (gst_registry_get_default ());
|
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 3,
|
2005-09-15 23:51:24 +00:00
|
|
|
"Refcount of plugin in registry+list should be 3");
|
|
|
|
|
|
|
|
gst_plugin_list_free (list);
|
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
|
2005-09-15 23:51:24 +00:00
|
|
|
"Refcount of plugin in after list free should be 2");
|
|
|
|
|
|
|
|
gst_object_unref (plugin);
|
|
|
|
}
|
|
|
|
|
2005-09-16 00:37:51 +00:00
|
|
|
GST_END_TEST;
|
|
|
|
|
2005-09-23 11:41:30 +00:00
|
|
|
GST_START_TEST (test_find_plugin)
|
|
|
|
{
|
|
|
|
GstPlugin *plugin;
|
|
|
|
|
|
|
|
plugin = gst_registry_find_plugin (gst_registry_get_default (),
|
2005-12-01 12:36:10 +00:00
|
|
|
"coreelements");
|
|
|
|
fail_if (plugin == NULL, "Failed to find coreelements plugin");
|
2005-09-23 11:41:30 +00:00
|
|
|
ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 2);
|
|
|
|
|
|
|
|
fail_unless_equals_string (plugin->desc.version, VERSION);
|
|
|
|
fail_unless_equals_string (plugin->desc.license, "LGPL");
|
|
|
|
fail_unless_equals_string (plugin->desc.source, "gstreamer");
|
2005-10-16 09:44:04 +00:00
|
|
|
fail_unless_equals_string (plugin->desc.package, GST_PACKAGE_NAME);
|
|
|
|
fail_unless_equals_string (plugin->desc.origin, GST_PACKAGE_ORIGIN);
|
2005-09-23 11:41:30 +00:00
|
|
|
|
|
|
|
gst_object_unref (plugin);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
|
2005-09-15 23:51:24 +00:00
|
|
|
GST_START_TEST (test_find_feature)
|
|
|
|
{
|
|
|
|
GstPluginFeature *feature;
|
|
|
|
|
|
|
|
feature = gst_registry_find_feature (gst_registry_get_default (),
|
|
|
|
"identity", GST_TYPE_ELEMENT_FACTORY);
|
|
|
|
fail_if (feature == NULL, "Failed to find identity element factory");
|
2005-12-01 12:36:10 +00:00
|
|
|
fail_if (strcmp (feature->plugin_name, "coreelements"),
|
|
|
|
"Expected identity to be from coreelements plugin");
|
2005-09-15 23:51:24 +00:00
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (feature) != 2,
|
2005-09-18 06:59:25 +00:00
|
|
|
"Refcount of feature should be 2");
|
2005-09-22 12:05:05 +00:00
|
|
|
GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (feature));
|
2005-09-15 23:51:24 +00:00
|
|
|
|
2005-09-18 06:59:25 +00:00
|
|
|
gst_object_unref (feature);
|
2005-09-15 23:51:24 +00:00
|
|
|
}
|
2005-09-16 00:37:51 +00:00
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2005-09-16 04:54:24 +00:00
|
|
|
GST_START_TEST (test_find_element)
|
|
|
|
{
|
|
|
|
GstElementFactory *element_factory;
|
|
|
|
|
|
|
|
element_factory = gst_element_factory_find ("identity");
|
|
|
|
fail_if (element_factory == NULL, "Failed to find identity element factory");
|
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (element_factory) != 2,
|
2005-09-18 06:59:25 +00:00
|
|
|
"Refcount of plugin in registry+feature should be 2");
|
2005-09-16 04:54:24 +00:00
|
|
|
|
2005-09-18 06:59:25 +00:00
|
|
|
gst_object_unref (element_factory);
|
2005-09-16 04:54:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
|
|
|
#if 0
|
2005-09-16 03:46:14 +00:00
|
|
|
guint8 *
|
|
|
|
peek (gpointer data, gint64 offset, guint size)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
suggest (gpointer data, guint probability, const GstCaps * caps)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_START_TEST (test_typefind)
|
|
|
|
{
|
|
|
|
GstPlugin *plugin;
|
|
|
|
GstPluginFeature *feature;
|
|
|
|
GstTypeFind typefind = {
|
|
|
|
peek,
|
|
|
|
suggest,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
GST_PADDING_INIT
|
|
|
|
};
|
|
|
|
|
|
|
|
plugin = gst_default_registry_find_plugin ("typefindfunctions");
|
|
|
|
fail_if (plugin == NULL, "Failed to find typefind functions");
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
|
2005-09-16 03:46:14 +00:00
|
|
|
"Refcount of plugin in registry should be 2");
|
|
|
|
fail_if (gst_plugin_is_loaded (plugin), "Expected plugin to be unloaded");
|
|
|
|
|
|
|
|
feature = gst_registry_find_feature (gst_registry_get_default (),
|
|
|
|
"audio/x-au", GST_TYPE_TYPE_FIND_FACTORY);
|
|
|
|
fail_if (feature == NULL, "Failed to find audio/x-aw typefind factory");
|
|
|
|
fail_if (feature->plugin != plugin,
|
2005-12-01 12:36:10 +00:00
|
|
|
"Expected identity to be from coreelements plugin");
|
2005-09-16 03:46:14 +00:00
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 3,
|
2005-09-16 03:46:14 +00:00
|
|
|
"Refcount of plugin in registry+feature should be 3");
|
|
|
|
|
|
|
|
gst_type_find_factory_call_function (GST_TYPE_FIND_FACTORY (feature),
|
|
|
|
&typefind);
|
|
|
|
|
|
|
|
gst_object_unref (feature->plugin);
|
|
|
|
|
2005-09-22 12:05:05 +00:00
|
|
|
fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 1,
|
2005-09-16 03:46:14 +00:00
|
|
|
"Refcount of plugin in after list free should be 1");
|
|
|
|
|
|
|
|
gst_object_unref (plugin);
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
2005-09-16 04:54:24 +00:00
|
|
|
#endif
|
2005-09-16 03:46:14 +00:00
|
|
|
|
2005-10-14 11:09:29 +00:00
|
|
|
GST_START_TEST (test_version_checks)
|
|
|
|
{
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO) == FALSE,
|
|
|
|
"Unexpected version check result");
|
|
|
|
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR + 1, GST_VERSION_MINOR, GST_VERSION_MICRO) == TRUE,
|
|
|
|
"Unexpected version check result");
|
|
|
|
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR + 1, GST_VERSION_MICRO) == TRUE,
|
|
|
|
"Unexpected version check result");
|
|
|
|
|
2009-09-11 17:24:18 +00:00
|
|
|
/* If the nano is set, then we expect that X.Y.Z-1.x >= X.Y.Z, so that a
|
|
|
|
* devel plugin is valid against an upcoming release */
|
|
|
|
if (GST_VERSION_NANO > 0) {
|
|
|
|
fail_unless (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO + 1) ==
|
|
|
|
TRUE, "Unexpected version check result");
|
|
|
|
} else {
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO + 1) ==
|
|
|
|
TRUE, "Unexpected version check result");
|
|
|
|
}
|
2005-10-14 11:09:29 +00:00
|
|
|
|
|
|
|
if (GST_VERSION_MAJOR > 0) {
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR - 1, GST_VERSION_MINOR,
|
|
|
|
GST_VERSION_MICRO) == FALSE, "Unexpected version check result");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GST_VERSION_MINOR > 0) {
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR - 1,
|
|
|
|
GST_VERSION_MICRO) == FALSE, "Unexpected version check result");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GST_VERSION_MICRO > 0) {
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("identity",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR,
|
|
|
|
GST_VERSION_MICRO - 1) == FALSE, "Unexpected version check result");
|
|
|
|
}
|
|
|
|
|
|
|
|
fail_if (gst_default_registry_check_feature_version ("entityid",
|
|
|
|
GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO) == TRUE,
|
|
|
|
"Unexpected version check result");
|
|
|
|
}
|
|
|
|
|
|
|
|
GST_END_TEST;
|
|
|
|
|
2008-02-29 13:59:24 +00:00
|
|
|
static Suite *
|
2005-09-16 00:37:51 +00:00
|
|
|
gst_plugin_suite (void)
|
2005-09-15 23:51:24 +00:00
|
|
|
{
|
|
|
|
Suite *s = suite_create ("GstPlugin");
|
|
|
|
TCase *tc_chain = tcase_create ("general");
|
|
|
|
|
|
|
|
/* turn off timeout */
|
|
|
|
tcase_set_timeout (tc_chain, 60);
|
|
|
|
|
|
|
|
suite_add_tcase (s, tc_chain);
|
gst/gstplugin.c: Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC again, which I broke two commits ago when ...
Original commit message from CVS:
* gst/gstplugin.c: (_gst_plugin_initialize):
Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC
again, which I broke two commits ago when changing the API
of gst_plugin_register_static(): the g_list_foreach() in
_gst_plugin_register_static still assumed the old function
signature and would therefore fail (re-fixes #510187).
* gst/gstplugin.c: (_num_static_plugins), (_static_plugins),
(_gst_plugin_register_static), (gst_plugin_register_static):
Revert the (technically correct) change to call g_thread_init() from
the pre-main() constructor. This will break programs which call
g_thread_init() without an if (!g_thread_supported()) guard in their
main function. We could just blame it on GLib or the application, but
it's probably best to just avoid this altogether and simply not use
any GLib functions here and use plain old malloc() with a simple
array to store the plugins to register later when gst_init() is
finally called (re-fixes #510187).
* tests/check/gst/gstplugin.c: (GST_GNUC_CONSTRUCTOR_DEFINED),
(GST_GNUC_CONSTRUCTOR_DEFINED), (plugin_init_counter),
(plugin1_init), (plugin2_init), (plugin3_init), (GST_START_TEST),
(GST_START_TEST), (gst_plugin_suite):
Dumb unit test to make sure the old GST_PLUGIN_DEFINE_STATIC still
works.
2008-01-20 15:04:33 +00:00
|
|
|
#ifdef GST_GNUC_CONSTRUCTOR_DEFINED
|
|
|
|
tcase_add_test (tc_chain, test_old_register_static);
|
|
|
|
#endif
|
2005-09-15 23:51:24 +00:00
|
|
|
tcase_add_test (tc_chain, test_register_static);
|
2005-09-18 06:59:25 +00:00
|
|
|
tcase_add_test (tc_chain, test_registry);
|
2005-12-01 12:36:10 +00:00
|
|
|
tcase_add_test (tc_chain, test_load_coreelements);
|
2005-09-15 23:51:24 +00:00
|
|
|
tcase_add_test (tc_chain, test_registry_get_plugin_list);
|
2005-09-23 11:41:30 +00:00
|
|
|
tcase_add_test (tc_chain, test_find_plugin);
|
2005-09-15 23:51:24 +00:00
|
|
|
tcase_add_test (tc_chain, test_find_feature);
|
2005-09-16 04:54:24 +00:00
|
|
|
tcase_add_test (tc_chain, test_find_element);
|
2005-10-14 11:09:29 +00:00
|
|
|
tcase_add_test (tc_chain, test_version_checks);
|
2005-09-16 04:54:24 +00:00
|
|
|
//tcase_add_test (tc_chain, test_typefind);
|
2005-09-15 23:51:24 +00:00
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2006-07-01 20:56:56 +00:00
|
|
|
GST_CHECK_MAIN (gst_plugin);
|