add test support

Most of the boilerplate and the states test has been copied from
gst-plugins-good.

https://bugzilla.gnome.org/show_bug.cgi?id=789094
This commit is contained in:
Guillaume Desmottes 2017-10-16 14:47:07 +02:00 committed by Sebastian Dröge
parent b3d63d613a
commit 4f91b6f873
12 changed files with 373 additions and 6 deletions

4
.gitignore vendored
View file

@ -43,3 +43,7 @@ tools/listcomponents
/m4/lt~obsolete.m4 /m4/lt~obsolete.m4
Makefile.in Makefile.in
Makefile Makefile
test-driver
*.log
*.trs

View file

@ -1,4 +1,4 @@
SUBDIRS = common omx tools config m4 SUBDIRS = common omx tools config m4 tests
if BUILD_EXAMPLES if BUILD_EXAMPLES
SUBDIRS += examples SUBDIRS += examples

View file

@ -1,9 +1,20 @@
if omx_target == 'rpi' if omx_target == 'rpi'
subdir ('rpi') sub = 'rpi'
elif omx_target == 'bellagio' elif omx_target == 'bellagio'
subdir ('bellagio') sub = 'bellagio'
elif omx_target == 'zynqultrascaleplus' elif omx_target == 'zynqultrascaleplus'
subdir ('zynqultrascaleplus') sub = 'zynqultrascaleplus'
elif omx_target == 'tizonia' elif omx_target == 'tizonia'
subdir ('tizonia') sub = 'tizonia'
else
# No config file defined for the 'generic' target
sub = ''
endif
if sub != ''
subdir (sub)
# Used by tests to load the proper conf file
omx_config_dir = join_paths (meson.current_source_dir(), sub)
else
omx_config_dir = ''
endif endif

View file

@ -12,7 +12,7 @@ AC_INIT(GStreamer OpenMAX Plug-ins, 1.13.0.1,
AG_GST_INIT AG_GST_INIT
dnl initialize automake dnl initialize automake
AM_INIT_AUTOMAKE([-Wno-portability 1.11 no-dist-gzip dist-xz tar-ustar]) AM_INIT_AUTOMAKE([-Wno-portability 1.11 no-dist-gzip dist-xz tar-ustar subdir-objects])
dnl define PACKAGE_VERSION_* variables dnl define PACKAGE_VERSION_* variables
AS_VERSION AS_VERSION
@ -411,6 +411,8 @@ config/zynqultrascaleplus/Makefile
examples/Makefile examples/Makefile
examples/egl/Makefile examples/egl/Makefile
m4/Makefile m4/Makefile
tests/Makefile
tests/check/Makefile
) )
AC_OUTPUT AC_OUTPUT

View file

@ -153,6 +153,11 @@ gstvideo_dep = dependency('gstreamer-video-1.0', version : gst_req,
gstgl_dep = dependency('gstreamer-gl-1.0', version : gst_req, gstgl_dep = dependency('gstreamer-gl-1.0', version : gst_req,
fallback : ['gst-plugins-bad', 'gstgl_dep'], required : false) fallback : ['gst-plugins-bad', 'gstgl_dep'], required : false)
if host_machine.system() != 'windows'
gstcheck_dep = dependency('gstreamer-check-1.0', version : gst_req,
fallback : ['gstreamer', 'gst_check_dep'])
endif
libm = cc.find_library('m', required : false) libm = cc.find_library('m', required : false)
glib_dep = dependency('glib-2.0', version : glib_req) glib_dep = dependency('glib-2.0', version : glib_req)
gio_dep = dependency('gio-2.0', version : glib_req) gio_dep = dependency('gio-2.0', version : glib_req)
@ -305,6 +310,7 @@ subdir('config')
subdir('examples') subdir('examples')
subdir('omx') subdir('omx')
subdir('tools') subdir('tools')
subdir('tests')
python3 = find_program('python3') python3 = find_program('python3')
run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")') run_command(python3, '-c', 'import shutil; shutil.copy("hooks/pre-commit.hook", ".git/hooks/pre-commit")')

9
tests/Makefile.am Normal file
View file

@ -0,0 +1,9 @@
if HAVE_GST_CHECK
SUBDIRS_CHECK = check
else
SUBDIRS_CHECK =
endif
SUBDIRS = $(SUBDIRS_CHECK)
DIST_SUBDIRS = check

2
tests/check/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
test-registry.*
orc

45
tests/check/Makefile.am Normal file
View file

@ -0,0 +1,45 @@
include $(top_srcdir)/common/check.mak
CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg
TEST_FILES_DIRECTORY = $(top_srcdir)/tests/files
REGISTRY_ENVIRONMENT = \
GST_REGISTRY_1_0=$(CHECK_REGISTRY)
if USE_OMX_TARGET_BELLAGIO
OMX_CONFIG_DIR = $(top_srcdir)/config/bellagio
endif
if USE_OMX_TARGET_RPI
OMX_CONFIG_DIR = $(top_srcdir)/config/rpi
endif
if USE_OMX_TARGET_ZYNQ_USCALE_PLUS
OMX_CONFIG_DIR = $(top_srcdir)/config/zynqultrascaleplus
endif
if USE_OMX_TARGET_TIZONIA
OMX_CONFIG_DIR = $(top_srcdir)/config/tizonia
endif
AM_TESTS_ENVIRONMENT += \
$(REGISTRY_ENVIRONMENT) \
GST_PLUGIN_SYSTEM_PATH_1_0= \
GST_PLUGIN_PATH_1_0=$(top_builddir)/omx:$(GSTPB_PLUGINS_DIR):$(GST_PLUGINS_DIR) \
GST_PLUGIN_LOADING_WHITELIST="gstreamer@$(GST_PLUGINS_DIR):gst-plugins-base@$(GSTPB_PLUGINS_DIR):gst-omx@$(top_builddir)" \
GST_STATE_IGNORE_ELEMENTS="" \
GST_OMX_CONFIG_DIR=$(OMX_CONFIG_DIR)
# the core dumps of some machines have PIDs appended
CLEANFILES = core.* test-registry.*
clean-local: clean-local-check
distclean-local: distclean-local-orc
check_PROGRAMS = \
generic/states
TESTS = $(check_PROGRAMS)
AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \
$(GST_OPTION_CFLAGS) $(GST_CFLAGS) -DGST_TEST_FILES_PATH="\"$(TEST_FILES_DIRECTORY)\"" \
-DGST_CHECK_TEST_ENVIRONMENT_BEACON="\"GST_PLUGIN_LOADING_WHITELIST\"" \
-UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS $(PTHREAD_CFLAGS)
LDADD = $(GST_OBJ_LIBS) $(GST_CHECK_LIBS) $(CHECK_LIBS)

3
tests/check/generic/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.dirstamp
index
states

View file

@ -0,0 +1,225 @@
/* GStreamer
*
* unit test for state changes on all elements
*
* Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot 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., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <unistd.h>
#include <gst/check/gstcheck.h>
static GList *elements = NULL;
static void
setup (void)
{
GList *features, *f;
GList *plugins, *p;
gchar **ignorelist = NULL;
const gchar *STATE_IGNORE_ELEMENTS = NULL;
GstRegistry *def;
GST_DEBUG ("getting elements for package %s", PACKAGE);
STATE_IGNORE_ELEMENTS = g_getenv ("GST_STATE_IGNORE_ELEMENTS");
if (!g_getenv ("GST_NO_STATE_IGNORE_ELEMENTS") && STATE_IGNORE_ELEMENTS) {
GST_DEBUG ("Will ignore element factories: '%s'", STATE_IGNORE_ELEMENTS);
ignorelist = g_strsplit (STATE_IGNORE_ELEMENTS, " ", 0);
}
def = gst_registry_get ();
plugins = gst_registry_get_plugin_list (def);
for (p = plugins; p; p = p->next) {
GstPlugin *plugin = p->data;
if (strcmp (gst_plugin_get_source (plugin), PACKAGE) != 0)
continue;
features =
gst_registry_get_feature_list_by_plugin (def,
gst_plugin_get_name (plugin));
for (f = features; f; f = f->next) {
GstPluginFeature *feature = f->data;
const gchar *name = gst_plugin_feature_get_name (feature);
gboolean ignore = FALSE;
if (!GST_IS_ELEMENT_FACTORY (feature))
continue;
if (ignorelist) {
gchar **s;
for (s = ignorelist; s && *s; ++s) {
if (g_str_has_prefix (name, *s)) {
GST_DEBUG ("ignoring element %s", name);
ignore = TRUE;
}
}
if (ignore)
continue;
}
GST_DEBUG ("adding element %s", name);
elements = g_list_prepend (elements, (gpointer) g_strdup (name));
}
gst_plugin_feature_list_free (features);
}
gst_plugin_list_free (plugins);
g_strfreev (ignorelist);
}
static void
teardown (void)
{
GList *e;
for (e = elements; e; e = e->next) {
g_free (e->data);
}
g_list_free (elements);
elements = NULL;
}
GST_START_TEST (test_state_changes_up_and_down_seq)
{
GstElement *element;
GList *e;
for (e = elements; e; e = e->next) {
const gchar *name = e->data;
GST_INFO ("testing element %s", name);
element = gst_element_factory_make (name, name);
fail_if (element == NULL, "Could not make element from factory %s", name);
if (GST_IS_PIPELINE (element)) {
GST_DEBUG ("element %s is a pipeline", name);
}
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_NULL);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (element));
}
}
GST_END_TEST;
GST_START_TEST (test_state_changes_up_seq)
{
GstElement *element;
GList *e;
for (e = elements; e; e = e->next) {
const gchar *name = e->data;
GST_INFO ("testing element %s", name);
element = gst_element_factory_make (name, name);
fail_if (element == NULL, "Could not make element from factory %s", name);
if (GST_IS_PIPELINE (element)) {
GST_DEBUG ("element %s is a pipeline", name);
}
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (element));
}
}
GST_END_TEST;
GST_START_TEST (test_state_changes_down_seq)
{
GstElement *element;
GList *e;
for (e = elements; e; e = e->next) {
const gchar *name = e->data;
GST_INFO ("testing element %s", name);
element = gst_element_factory_make (name, name);
fail_if (element == NULL, "Could not make element from factory %s", name);
if (GST_IS_PIPELINE (element)) {
GST_DEBUG ("element %s is a pipeline", name);
}
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_PLAYING);
gst_element_set_state (element, GST_STATE_PAUSED);
gst_element_set_state (element, GST_STATE_READY);
gst_element_set_state (element, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (element));
}
}
GST_END_TEST;
static Suite *
states_suite (void)
{
Suite *s = suite_create ("states_omx");
TCase *tc_chain = tcase_create ("general");
suite_add_tcase (s, tc_chain);
tcase_add_checked_fixture (tc_chain, setup, teardown);
tcase_add_test (tc_chain, test_state_changes_up_and_down_seq);
tcase_add_test (tc_chain, test_state_changes_up_seq);
tcase_add_test (tc_chain, test_state_changes_down_seq);
return s;
}
GST_CHECK_MAIN (states);

56
tests/check/meson.build Normal file
View file

@ -0,0 +1,56 @@
# name, condition when to skip the test and extra dependencies
omx_tests = [
[ 'generic/states' ],
]
test_defines = [
'-UG_DISABLE_ASSERT',
'-UG_DISABLE_CAST_CHECKS',
'-DGST_CHECK_TEST_ENVIRONMENT_BEACON="GST_PLUGIN_LOADING_WHITELIST"',
]
pluginsdirs = []
if gst_dep.type_name() == 'pkgconfig'
pbase = dependency('gstreamer-plugins-base-' + api_version, required : false)
pluginsdirs = [gst_dep.get_pkgconfig_variable('pluginsdir'),
pbase.get_pkgconfig_variable('pluginsdir')]
endif
state_ignore_elements=''
# FIXME: check, also + PTHREAD_CFLAGS
test_deps = [gst_dep, gstbase_dep, glib_dep, gstcheck_dep]
# FIXME: add valgrind suppression common/gst.supp gst-plugins-good.supp
foreach t : omx_tests
fname = '@0@.c'.format(t.get(0))
test_name = t.get(0).underscorify()
extra_deps = [ ]
if t.length() == 3
extra_deps = t.get(2)
skip_test = t.get(1)
elif t.length() == 2
skip_test = t.get(1)
else
skip_test = false
endif
if not skip_test
env = environment()
env.set('GST_PLUGIN_SYSTEM_PATH_1_0', '')
env.set('GST_STATE_IGNORE_ELEMENTS', state_ignore_elements)
env.set('CK_DEFAULT_TIMEOUT', '20')
env.set('GST_PLUGIN_LOADING_WHITELIST', 'gstreamer', 'gst-plugins-base',
'gst-plugins-good', 'gst-omx@' + meson.build_root(), separator: ':')
env.set('GST_PLUGIN_PATH_1_0', [meson.build_root()] + pluginsdirs)
env.set('GSETTINGS_BACKEND', 'memory')
env.set('GST_OMX_CONFIG_DIR', omx_config_dir)
env.set('GST_REGISTRY', '@0@/@1@.registry'.format(meson.current_build_dir(), test_name))
exe = executable(test_name, fname,
include_directories : [configinc],
c_args : ['-DHAVE_CONFIG_H=1' ] + test_defines,
dependencies : [libm] + test_deps + extra_deps,
)
test(test_name, exe, env: env, timeout: 3 * 60)
endif
endforeach

4
tests/meson.build Normal file
View file

@ -0,0 +1,4 @@
# FIXME: make check work on windows
if host_machine.system() != 'windows'
subdir('check')
endif