mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
validate-runner: Add code to parse GST_VALIDATE_REPORT_LEVEL.
+ Extend the tests. + [API] gst_validate_runner_get_default_reporting_level + [API] gst_validate_runner_get_reporting_level_for_name
This commit is contained in:
parent
6ed125bfb1
commit
1d7f15598f
3 changed files with 159 additions and 2 deletions
|
@ -21,6 +21,9 @@
|
|||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
@ -61,8 +64,18 @@ struct _GstValidateRunnerPrivate
|
|||
GMutex mutex;
|
||||
GList *reports;
|
||||
GstValidateReportingLevel default_level;
|
||||
|
||||
/* A list of PatternLevel */
|
||||
GList *report_pattern_levels;
|
||||
};
|
||||
|
||||
/* Describes the reporting level to apply to a name pattern */
|
||||
typedef struct _PatternLevel
|
||||
{
|
||||
GPatternSpec *pattern;
|
||||
GstValidateReportingLevel level;
|
||||
} PatternLevel;
|
||||
|
||||
#define GST_VALIDATE_RUNNER_LOCK(r) \
|
||||
G_STMT_START { \
|
||||
GST_LOG_OBJECT (r, "About to lock %p", &GST_VALIDATE_RUNNER_CAST(r)->priv->mutex); \
|
||||
|
@ -90,10 +103,94 @@ enum
|
|||
|
||||
static guint _signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static gboolean
|
||||
_parse_reporting_level (gchar * str, GstValidateReportingLevel * level)
|
||||
{
|
||||
if (!str)
|
||||
return FALSE;
|
||||
|
||||
/* works in place */
|
||||
g_strstrip (str);
|
||||
|
||||
if (g_ascii_isdigit (str[0])) {
|
||||
unsigned long l;
|
||||
char *endptr;
|
||||
l = strtoul (str, &endptr, 10);
|
||||
if (endptr > str && endptr[0] == 0) {
|
||||
*level = (GstValidateReportingLevel) l;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
} else if (g_ascii_strcasecmp (str, "none") == 0) {
|
||||
*level = GST_VALIDATE_REPORTING_LEVEL_NONE;
|
||||
} else if (g_ascii_strcasecmp (str, "synthetic") == 0) {
|
||||
*level = GST_VALIDATE_REPORTING_LEVEL_SYNTHETIC;
|
||||
} else if (g_ascii_strcasecmp (str, "subchain") == 0) {
|
||||
*level = GST_VALIDATE_REPORTING_LEVEL_SUBCHAIN;
|
||||
} else if (g_ascii_strcasecmp (str, "monitor") == 0) {
|
||||
*level = GST_VALIDATE_REPORTING_LEVEL_MONITOR;
|
||||
} else if (g_ascii_strcasecmp (str, "all") == 0) {
|
||||
*level = GST_VALIDATE_REPORTING_LEVEL_ALL;
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_free_report_pattern_level (PatternLevel * pattern_level)
|
||||
{
|
||||
g_pattern_spec_free (pattern_level->pattern);
|
||||
g_free (pattern_level);
|
||||
}
|
||||
|
||||
static void
|
||||
_set_reporting_level_for_name (GstValidateRunner * runner,
|
||||
const gchar * pattern, GstValidateReportingLevel level)
|
||||
{
|
||||
PatternLevel *pattern_level = g_malloc (sizeof (PatternLevel));
|
||||
GPatternSpec *pattern_spec = g_pattern_spec_new (pattern);
|
||||
|
||||
pattern_level->pattern = pattern_spec;
|
||||
pattern_level->level = level;
|
||||
|
||||
runner->priv->report_pattern_levels =
|
||||
g_list_append (runner->priv->report_pattern_levels, pattern_level);
|
||||
}
|
||||
|
||||
static void
|
||||
_set_report_levels_from_string (GstValidateRunner * self, const gchar * list)
|
||||
{
|
||||
gchar **split;
|
||||
gchar **walk;
|
||||
|
||||
g_assert (list);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "setting report levels from string [%s]", list);
|
||||
|
||||
split = g_strsplit (list, ",", 0);
|
||||
|
||||
for (walk = split; *walk; walk++) {
|
||||
if (strchr (*walk, ':')) {
|
||||
gchar **values = g_strsplit (*walk, ":", 2);
|
||||
|
||||
if (values[0] && values[1]) {
|
||||
GstValidateReportingLevel level;
|
||||
|
||||
if (_parse_reporting_level (values[1], &level))
|
||||
_set_reporting_level_for_name (self, values[0], level);
|
||||
}
|
||||
|
||||
g_strfreev (values);
|
||||
} else {
|
||||
GstValidateReportingLevel level;
|
||||
|
||||
if (_parse_reporting_level (*walk, &level))
|
||||
self->priv->default_level = level;
|
||||
}
|
||||
}
|
||||
|
||||
g_strfreev (split);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -113,6 +210,8 @@ gst_validate_runner_dispose (GObject * object)
|
|||
|
||||
g_list_free_full (runner->priv->reports,
|
||||
(GDestroyNotify) gst_validate_report_unref);
|
||||
g_list_free_full (runner->priv->report_pattern_levels,
|
||||
(GDestroyNotify) _free_report_pattern_level);
|
||||
|
||||
g_mutex_clear (&runner->priv->mutex);
|
||||
|
||||
|
@ -160,12 +259,40 @@ gst_validate_runner_new (void)
|
|||
return g_object_new (GST_TYPE_VALIDATE_RUNNER, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* gst_validate_runner_get_default_reporting_level:
|
||||
*
|
||||
* Returns: the default #GstValidateReportingLevel used to output a report.
|
||||
*/
|
||||
GstValidateReportingLevel
|
||||
gst_validate_runner_get_default_reporting_level (GstValidateRunner * runner)
|
||||
{
|
||||
return runner->priv->default_level;
|
||||
}
|
||||
|
||||
/*
|
||||
* gst_validate_runner_get_reporting_level_for_name:
|
||||
*
|
||||
* Returns: the #GstValidateReportingLevel that will be applied for a given name.
|
||||
* If no pattern was set for such a name, this function will return
|
||||
* #GST_VALIDATE_REPORTING_LEVEL_UNKNOWN, and reporting for that name will
|
||||
* default to the global reporting level.
|
||||
*/
|
||||
GstValidateReportingLevel
|
||||
gst_validate_runner_get_reporting_level_for_name (GstValidateRunner * runner,
|
||||
const gchar * name)
|
||||
{
|
||||
GList *tmp;
|
||||
|
||||
for (tmp = runner->priv->report_pattern_levels; tmp; tmp = tmp->next) {
|
||||
PatternLevel *pattern_level = (PatternLevel *) tmp->data;
|
||||
if (g_pattern_match_string (pattern_level->pattern, name))
|
||||
return pattern_level->level;
|
||||
}
|
||||
|
||||
return GST_VALIDATE_REPORTING_LEVEL_UNKNOWN;
|
||||
}
|
||||
|
||||
void
|
||||
gst_validate_runner_add_report (GstValidateRunner * runner,
|
||||
GstValidateReport * report)
|
||||
|
|
|
@ -80,6 +80,8 @@ GList * gst_validate_runner_get_reports (GstValidateRunner * runner);
|
|||
int gst_validate_runner_printf (GstValidateRunner * runner);
|
||||
|
||||
GstValidateReportingLevel gst_validate_runner_get_default_reporting_level (GstValidateRunner *runner);
|
||||
GstValidateReportingLevel gst_validate_runner_get_reporting_level_for_name (GstValidateRunner *runner,
|
||||
const gchar *name);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -25,9 +25,37 @@ GST_START_TEST (test_report_levels)
|
|||
{
|
||||
GstValidateRunner *runner;
|
||||
|
||||
fail_unless (g_setenv ("GST_VALIDATE_REPORT_LEVEL", "all", TRUE));
|
||||
runner = gst_validate_runner_new ();
|
||||
/* FIXME: for now the only interface to set the reporting level is through an
|
||||
* environment variable parsed at the time of the runner initialization,
|
||||
* we can simplify that if the runner exposes API for that at some point
|
||||
*/
|
||||
|
||||
/* Try to set the default reporting level to ALL, the code is supposed to
|
||||
* be case insensitive */
|
||||
fail_unless (g_setenv ("GST_VALIDATE_REPORT_LEVEL", "AlL", TRUE));
|
||||
runner = gst_validate_runner_new ();
|
||||
fail_unless (gst_validate_runner_get_default_reporting_level (runner) ==
|
||||
GST_VALIDATE_REPORTING_LEVEL_ALL);
|
||||
g_object_unref (runner);
|
||||
|
||||
/* Try to set the default reporting level to subchain, the code is supposed to
|
||||
* parse numbers as well */
|
||||
fail_unless (g_setenv ("GST_VALIDATE_REPORT_LEVEL", "2", TRUE));
|
||||
runner = gst_validate_runner_new ();
|
||||
fail_unless (gst_validate_runner_get_default_reporting_level (runner) ==
|
||||
GST_VALIDATE_REPORTING_LEVEL_SYNTHETIC);
|
||||
g_object_unref (runner);
|
||||
|
||||
/* Try to set the reporting level for an object */
|
||||
fail_unless (g_setenv ("GST_VALIDATE_REPORT_LEVEL",
|
||||
"synthetic,test_object:monitor,other_*:all", TRUE));
|
||||
runner = gst_validate_runner_new ();
|
||||
fail_unless (gst_validate_runner_get_reporting_level_for_name (runner,
|
||||
"test_object") == GST_VALIDATE_REPORTING_LEVEL_MONITOR);
|
||||
fail_unless (gst_validate_runner_get_reporting_level_for_name (runner,
|
||||
"other_test_object") == GST_VALIDATE_REPORTING_LEVEL_ALL);
|
||||
fail_unless (gst_validate_runner_get_reporting_level_for_name (runner,
|
||||
"dummy_test_object") == GST_VALIDATE_REPORTING_LEVEL_UNKNOWN);
|
||||
g_object_unref (runner);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue