From 0ffcacf325d5ce43d10f5440dd4d8c7989aaef17 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 5 May 2020 13:52:52 -0400 Subject: [PATCH] validate: Add including support in the structure file parser Adding proper error reporting support Part-of: --- validate/gst/validate/gst-validate-internal.h | 5 +- .../validate/gst-validate-override-registry.c | 2 +- validate/gst/validate/gst-validate-scenario.c | 146 +++++------- validate/gst/validate/gst-validate-utils.c | 219 ++++++++++++++---- validate/gst/validate/gst-validate-utils.h | 11 +- validate/gst/validate/validate.c | 14 +- validate/tests/check/validate/utilities.c | 2 +- 7 files changed, 250 insertions(+), 149 deletions(-) diff --git a/validate/gst/validate/gst-validate-internal.h b/validate/gst/validate/gst-validate-internal.h index 8fc4880494..15ffc3a5e1 100644 --- a/validate/gst/validate/gst-validate-internal.h +++ b/validate/gst/validate/gst-validate-internal.h @@ -49,7 +49,10 @@ void register_action_types (void); G_GNUC_INTERNAL gboolean _action_check_and_set_printed (GstValidateAction *action); G_GNUC_INTERNAL gboolean gst_validate_action_is_subaction (GstValidateAction *action); G_GNUC_INTERNAL gboolean gst_validate_scenario_check_and_set_needs_clock_sync (GList *structures, GstStructure **meta); -G_GNUC_INTERNAL void _priv_validate_override_registry_deinit (void); + +#define GST_VALIDATE_SCENARIO_SUFFIX ".scenario" +G_GNUC_INTERNAL gchar** gst_validate_scenario_get_include_paths(const gchar* relative_scenario); +G_GNUC_INTERNAL void _priv_validate_override_registry_deinit(void); G_GNUC_INTERNAL GstValidateReportingDetails gst_validate_runner_get_default_reporting_details (GstValidateRunner *runner); diff --git a/validate/gst/validate/gst-validate-override-registry.c b/validate/gst/validate/gst-validate-override-registry.c index e7aa09c8cc..9c9bca924e 100644 --- a/validate/gst/validate/gst-validate-override-registry.c +++ b/validate/gst/validate/gst-validate-override-registry.c @@ -360,7 +360,7 @@ _load_text_override_file (const gchar * filename) { gint ret = OK; GList *structs = - gst_validate_utils_structs_parse_from_filename (filename, NULL); + gst_validate_utils_structs_parse_from_filename (filename, NULL, NULL); if (structs) { GList *tmp; diff --git a/validate/gst/validate/gst-validate-scenario.c b/validate/gst/validate/gst-validate-scenario.c index 633f71ee14..80285e676c 100644 --- a/validate/gst/validate/gst-validate-scenario.c +++ b/validate/gst/validate/gst-validate-scenario.c @@ -60,7 +60,6 @@ #include #include -#define GST_VALIDATE_SCENARIO_SUFFIX ".scenario" #define GST_VALIDATE_SCENARIO_DIRECTORY "scenarios" #define DEFAULT_SEEK_TOLERANCE (1 * GST_MSECOND) /* tolerance seek interval @@ -397,7 +396,7 @@ gst_validate_action_get_type (void) static gboolean execute_next_action (GstValidateScenario * scenario); static gboolean gst_validate_scenario_load (GstValidateScenario * scenario, - const gchar * scenario_name, const gchar * relative_scenario); + const gchar * scenario_name); static GstValidateAction * _action_copy (GstValidateAction * act) @@ -707,7 +706,7 @@ gst_validate_action_get_clocktime (GstValidateScenario * scenario, _update_well_known_vars (scenario); strval = - gst_validate_replace_variables_in_string (scenario->priv->vars, + gst_validate_replace_variables_in_string (action, scenario->priv->vars, tmpvalue); if (!strval) return FALSE; @@ -3231,7 +3230,7 @@ gst_validate_action_default_prepare_func (GstValidateAction * action) GstValidateScenario *scenario = gst_validate_action_get_scenario (action); _update_well_known_vars (scenario); - gst_validate_structure_resolve_variables (action->structure, + gst_validate_structure_resolve_variables (action, action->structure, scenario->priv->vars); for (i = 0; type->parameters[i].name; i++) { if (type->parameters[i].types && @@ -3683,22 +3682,6 @@ gst_validate_scenario_load_structures (GstValidateScenario * scenario, gst_structure_get_int (structure, "max-dropped", &priv->max_dropped); scenario->description = gst_structure_copy (structure); - continue; - } else if (!g_strcmp0 (type, "include")) { - const gchar *location = gst_structure_get_string (structure, "location"); - - if (!location) { - GST_ERROR_OBJECT (scenario, - "Mandatory field 'location' not present in structure: %" - GST_PTR_FORMAT, structure); - goto failed; - } - - if (!gst_validate_scenario_load (scenario, location, origin_file)) { - GST_ERROR ("Failed including scenario %s", location); - goto failed; - } - continue; } else if (!(action_type = _find_action_type (type))) { if (gst_structure_has_field (structure, "optional-action-type")) { @@ -3765,26 +3748,12 @@ failed: goto done; } -static gboolean -_load_scenario_file (GstValidateScenario * scenario, - gchar * scenario_file, gboolean * is_config) +gchar ** +gst_validate_scenario_get_include_paths (const gchar * relative_scenario) { - return gst_validate_scenario_load_structures (scenario, - gst_validate_utils_structs_parse_from_filename (scenario_file, NULL), - is_config, scenario_file); -} - - -static gboolean -gst_validate_scenario_load (GstValidateScenario * scenario, - const gchar * scenario_name, const gchar * relative_scenario) -{ - gchar **scenarios = NULL; - guint i; - gboolean found_actions = FALSE, is_config, ret = TRUE; - gchar *scenarios_path = g_strdup (g_getenv ("GST_VALIDATE_SCENARIOS_PATH")); - + gint n; gchar **env_scenariodir; + gchar *scenarios_path = g_strdup (g_getenv ("GST_VALIDATE_SCENARIOS_PATH")); if (relative_scenario) { gchar *relative_dir = g_path_get_dirname (relative_scenario); @@ -3802,12 +3771,46 @@ gst_validate_scenario_load (GstValidateScenario * scenario, 0) : NULL; g_free (scenarios_path); + n = g_strv_length (env_scenariodir); + env_scenariodir = g_realloc_n (env_scenariodir, n + 3, sizeof (gchar *)); + env_scenariodir[n] = g_build_filename (g_get_user_data_dir (), + "gstreamer-" GST_API_VERSION, "validate", + GST_VALIDATE_SCENARIO_DIRECTORY, NULL); + env_scenariodir[n + 1] = + g_build_filename (GST_DATADIR, "gstreamer-" GST_API_VERSION, "validate", + GST_VALIDATE_SCENARIO_DIRECTORY, NULL); + env_scenariodir[n + 2] = NULL; + + return env_scenariodir; +} + +static gboolean +_load_scenario_file (GstValidateScenario * scenario, + gchar * scenario_file, gboolean * is_config) +{ + return gst_validate_scenario_load_structures (scenario, + gst_validate_utils_structs_parse_from_filename (scenario_file, + (GstValidateGetIncludePathsFunc) + gst_validate_scenario_get_include_paths, NULL), is_config, + scenario_file); +} + +static gboolean +gst_validate_scenario_load (GstValidateScenario * scenario, + const gchar * scenario_name) +{ + gchar **scenarios = NULL; + guint i; + gboolean found_actions = FALSE, is_config, ret = TRUE; + gchar **include_paths = gst_validate_scenario_get_include_paths (NULL); + if (!scenario_name) goto invalid_name; scenarios = g_strsplit (scenario_name, ":", -1); for (i = 0; scenarios[i]; i++) { + guint include_i; gchar *lfilename = NULL, *tldir = NULL, *scenario_file = NULL; /* First check if the scenario name is not a full path to the @@ -3827,46 +3830,17 @@ gst_validate_scenario_load (GstValidateScenario * scenario, lfilename = g_strdup_printf ("%s" GST_VALIDATE_SCENARIO_SUFFIX, scenarios[i]); - if (env_scenariodir) { - guint i; - - for (i = 0; env_scenariodir[i]; i++) { - tldir = g_build_filename (env_scenariodir[i], lfilename, NULL); - if ((ret = _load_scenario_file (scenario, tldir, &is_config))) { - scenario_file = tldir; - goto check_scenario; - } - g_free (tldir); + for (include_i = 0; include_paths[include_i]; include_i++) { + tldir = g_build_filename (include_paths[include_i], lfilename, NULL); + if ((ret = _load_scenario_file (scenario, tldir, &is_config))) { + scenario_file = tldir; + break; } - } - - tldir = g_build_filename ("data", "scenarios", lfilename, NULL); - - if ((ret = _load_scenario_file (scenario, tldir, &is_config))) { - scenario_file = tldir; - goto check_scenario; - } - - g_free (tldir); - - /* Try from local profiles */ - tldir = - g_build_filename (g_get_user_data_dir (), - "gstreamer-" GST_API_VERSION, "validate", - GST_VALIDATE_SCENARIO_DIRECTORY, lfilename, NULL); - - if (!(ret = _load_scenario_file (scenario, tldir, &is_config))) { g_free (tldir); - /* Try from system-wide profiles */ - tldir = g_build_filename (GST_DATADIR, "gstreamer-" GST_API_VERSION, - "validate", GST_VALIDATE_SCENARIO_DIRECTORY, lfilename, NULL); - - if (!(ret = _load_scenario_file (scenario, tldir, &is_config))) { - goto error; - } } - scenario_file = tldir; + if (!ret) + goto error; /* else check scenario */ check_scenario: @@ -3899,8 +3873,8 @@ gst_validate_scenario_load (GstValidateScenario * scenario, done: - if (env_scenariodir) - g_strfreev (env_scenariodir); + if (include_paths) + g_strfreev (include_paths); g_strfreev (scenarios); @@ -4248,7 +4222,7 @@ gst_validate_scenario_new (GstValidateRunner * } else { GST_LOG ("Creating scenario %s", scenario_name); - if (!gst_validate_scenario_load (scenario, scenario_name, NULL)) { + if (!gst_validate_scenario_load (scenario, scenario_name)) { g_object_unref (scenario); return NULL; @@ -4413,7 +4387,9 @@ _parse_scenario (GFile * f, GKeyFile * kf) if (g_str_has_suffix (path, GST_VALIDATE_SCENARIO_SUFFIX)) { GstStructure *meta = NULL; - GList *tmp, *structures = gst_validate_structs_parse_from_gfile (f); + GList *tmp, *structures = gst_validate_structs_parse_from_gfile (f, + (GstValidateGetIncludePathsFunc) + gst_validate_scenario_get_include_paths); gst_validate_scenario_check_and_set_needs_clock_sync (structures, &meta); for (tmp = structures; tmp; tmp = tmp->next) @@ -6044,20 +6020,6 @@ register_action_types (void) "setting the GST_DEBUG env variable", GST_VALIDATE_ACTION_TYPE_NONE); - REGISTER_ACTION_TYPE ("include", - NULL, /* This is handled directly when loading a scenario */ - ((GstValidateActionParameter []) - { - { - .name = "location", - .description = "The location of the sub scenario to include.", - .mandatory = TRUE, - .types = "string"}, - {NULL} - }), - "Include a sub scenario file.", - GST_VALIDATE_ACTION_TYPE_CONFIG); - REGISTER_ACTION_TYPE ("emit-signal", _execute_emit_signal, ((GstValidateActionParameter []) { diff --git a/validate/gst/validate/gst-validate-utils.c b/validate/gst/validate/gst-validate-utils.c index f299ceaea3..bf9a38884b 100644 --- a/validate/gst/validate/gst-validate-utils.c +++ b/validate/gst/validate/gst-validate-utils.c @@ -577,7 +577,8 @@ setup_quarks (void) /* Parse file that contains a list of GStructures */ #define GST_STRUCT_LINE_CONTINUATION_CHARS ",{\\[" static GList * -_file_get_structures (GFile * file, gchar ** err) +_file_get_structures (GFile * file, gchar ** err, + GstValidateGetIncludePathsFunc get_include_paths_func) { gsize size; @@ -587,23 +588,42 @@ _file_get_structures (GFile * file, gchar ** err) gint lineno = 1, current_lineno; GList *structures = NULL; GString *errstr = NULL; + gchar *red = NULL, *bold = NULL; + const gchar *endcolor = ""; if (err) errstr = g_string_new (NULL); - /* TODO Handle GCancellable */ - if (!g_file_load_contents (file, NULL, &content, &size, NULL, &error)) { - GST_WARNING ("Failed to load contents: %d %s", error->code, error->message); - g_free (content); - g_error_free (error); - return NULL; - } - if (g_strcmp0 (content, "") == 0) { - g_free (content); - return NULL; +#if GLIB_CHECK_VERSION(2,50,0) + if (g_log_writer_supports_color (fileno (stderr))) { + red = gst_debug_construct_term_color (GST_DEBUG_FG_RED); + bold = gst_debug_construct_term_color (GST_DEBUG_BOLD); + endcolor = "\033[0m"; + } else +#endif + { + red = g_strdup (""); + bold = g_strdup (""); } + filename = g_file_get_path (file); + /* TODO Handle GCancellable */ + if (!g_file_load_contents (file, NULL, &content, &size, NULL, &error)) { + if (errstr && !get_include_paths_func) + g_string_append_printf (errstr, + "\n%s%s:%s %sFailed to load content%s\n | %s", + bold, filename, endcolor, red, endcolor, error->message); + else + GST_WARNING ("Failed to load contents: %d %s", error->code, + error->message); + g_error_free (error); + goto failed; + } + if (g_strcmp0 (content, "") == 0) { + goto done; + } + tmp = content; while (*tmp) { GString *l, *debug_line; @@ -673,13 +693,11 @@ _file_get_structures (GFile * file, gchar ** err) structure = gst_structure_from_string (l->str, NULL); if (structure == NULL) { - GST_ERROR ("Could not parse structure at %s:%d-%d\n %s", filename, - current_lineno, lineno, debug_line->str); - if (errstr) { g_string_append_printf (errstr, - "\n%s:%d-%d: Invalid structure\n%s", - filename, current_lineno, lineno, debug_line->str); + "\n%s%s:%d-%d:%s %sInvalid structure%s\n%s", + bold, filename, current_lineno, lineno, endcolor, + red, endcolor, debug_line->str); if (strchr (debug_line->str, '\n')) g_string_append_printf (errstr, "\n > %s\n", l->str); @@ -691,12 +709,107 @@ _file_get_structures (GFile * file, gchar ** err) goto failed; } } else { - setup_quarks (); - gst_structure_id_set (structure, - lineno_quark, G_TYPE_INT, current_lineno, - filename_quark, G_TYPE_STRING, filename, - filename_quark, G_TYPE_STRING, debug_line->str, NULL); - structures = g_list_append (structures, structure); + if (gst_structure_has_name (structure, "include")) { + gchar *included_err = NULL; + const gchar *location = + gst_structure_get_string (structure, "location"); + + if (location == NULL) { + if (errstr) { + g_string_append_printf (errstr, + "\n%s%s:%d-%d:%s %sMissing field 'location' in `include` structure%s\n%s", + bold, filename, current_lineno, lineno, endcolor, + red, endcolor, debug_line->str); + + if (strchr (debug_line->str, '\n')) + g_string_append_printf (errstr, "\n > %s\n", l->str); + + g_string_append_c (errstr, '\n'); + } else { + g_string_free (l, TRUE); + g_string_free (debug_line, TRUE); + goto failed; + } + } else { + GFile *included = NULL; + GList *tmpstructures; + gchar **include_dirs = NULL; + + if (!get_include_paths_func + && g_str_has_suffix (location, GST_VALIDATE_SCENARIO_SUFFIX)) { + GST_INFO + ("Trying to include a scenario, take into account scenario include dir"); + + get_include_paths_func = (GstValidateGetIncludePathsFunc) + gst_validate_scenario_get_include_paths; + } + + if (get_include_paths_func) + include_dirs = get_include_paths_func (g_file_peek_path (file)); + + if (!include_dirs) { + GFile *dir = g_file_get_parent (file); + included = g_file_resolve_relative_path (dir, location); + + g_object_unref (dir); + } else { + gint i; + + for (i = 0; include_dirs[i]; i++) { + g_clear_object (&included); + included = + g_file_new_build_filename (include_dirs[i], location, NULL); + if (g_file_query_exists (included, NULL)) + break; + + /* We let the last attempt fail and report an error in the + * including code path */ + } + } + + GST_INFO ("%s including %s", g_file_peek_path (file), + g_file_peek_path (included)); + + tmpstructures = _file_get_structures (included, &included_err, + get_include_paths_func); + if (included_err) { + if (errstr) { + gchar *c; + + g_string_append_printf (errstr, + "\n%s%s:%d-%d:%s %sError including %s%s\n%s", + bold, filename, current_lineno, lineno, endcolor, + red, location, endcolor, debug_line->str); + + if (strchr (debug_line->str, '\n')) + g_string_append_printf (errstr, "\n > %s\n", l->str); + + for (c = included_err; *c != '\0' && *(c + 1) != '\0'; c++) { + g_string_append_c (errstr, *c); + if (*c == '\n') + g_string_append (errstr, " | "); + } + g_free (included_err); + } else { + g_free (included_err); + g_string_free (l, TRUE); + g_string_free (debug_line, TRUE); + g_object_unref (included); + goto failed; + } + } + g_object_unref (included); + structures = g_list_concat (structures, tmpstructures); + } + gst_structure_free (structure); + } else { + setup_quarks (); + gst_structure_id_set (structure, + lineno_quark, G_TYPE_INT, current_lineno, + filename_quark, G_TYPE_STRING, filename, + filename_quark, G_TYPE_STRING, debug_line->str, NULL); + structures = g_list_append (structures, structure); + } } g_string_free (l, TRUE); @@ -711,6 +824,8 @@ done: *err = g_string_free (errstr, errstr->len ? FALSE : TRUE); g_free (content); g_free (filename); + g_free (bold); + g_free (red); return structures; failed: @@ -722,23 +837,24 @@ failed: } static GList * -_get_structures (const gchar * scenario_file, gchar ** file_path, gchar ** err) +_get_structures (const gchar * structured_file, gchar ** file_path, + GstValidateGetIncludePathsFunc get_include_paths_func, gchar ** err) { GFile *file = NULL; GList *structs = NULL; - GST_DEBUG ("Trying to load %s", scenario_file); - if ((file = g_file_new_for_path (scenario_file)) == NULL) { - GST_WARNING ("%s wrong uri", scenario_file); + GST_DEBUG ("Trying to load %s", structured_file); + if ((file = g_file_new_for_path (structured_file)) == NULL) { + GST_WARNING ("%s wrong uri", structured_file); if (err) - *err = g_strdup_printf ("%s wrong uri", scenario_file); + *err = g_strdup_printf ("%s wrong uri", structured_file); return NULL; } if (file_path) *file_path = g_file_get_path (file); - structs = _file_get_structures (file, err); + structs = _file_get_structures (file, err, get_include_paths_func); g_object_unref (file); @@ -749,17 +865,19 @@ _get_structures (const gchar * scenario_file, gchar ** file_path, gchar ** err) * gst_validate_utils_structs_parse_from_filename: (skip): */ GList * -gst_validate_utils_structs_parse_from_filename (const gchar * scenario_file, - gchar ** file_path) +gst_validate_utils_structs_parse_from_filename (const gchar * structured_file, + GstValidateGetIncludePathsFunc get_include_paths_func, gchar ** file_path) { GList *res; gchar *err = NULL; - res = _get_structures (scenario_file, file_path, &err); + res = + _get_structures (structured_file, file_path, get_include_paths_func, + &err); if (err) gst_validate_abort ("Could not get structures from %s:\n%s\n", - scenario_file, err); + structured_file, err); return res; } @@ -768,15 +886,16 @@ gst_validate_utils_structs_parse_from_filename (const gchar * scenario_file, * gst_validate_structs_parse_from_gfile: (skip): */ GList * -gst_validate_structs_parse_from_gfile (GFile * scenario_file) +gst_validate_structs_parse_from_gfile (GFile * structured_file, + GstValidateGetIncludePathsFunc get_include_paths_func) { gchar *err = NULL; GList *res; - res = _file_get_structures (scenario_file, &err); + res = _file_get_structures (structured_file, &err, get_include_paths_func); if (err) gst_validate_abort ("Could not get structures from %s:\n%s\n", - g_file_get_uri (scenario_file), err); + g_file_get_uri (structured_file), err); return res; } @@ -1076,8 +1195,8 @@ gst_validate_element_matches_target (GstElement * element, GstStructure * s) } gchar * -gst_validate_replace_variables_in_string (GstStructure * local_vars, - const gchar * in_string) +gst_validate_replace_variables_in_string (gpointer source, + GstStructure * local_vars, const gchar * in_string) { gint varname_len; GMatchInfo *match_info = NULL; @@ -1111,8 +1230,8 @@ gst_validate_replace_variables_in_string (GstStructure * local_vars, var_value = gst_structure_get_string (global_vars, varname); if (!var_value) { - g_error - ("Trying to use undefined variable : %s (\nlocals: %s\nglobals: %s\n)", + gst_validate_error_structure (source, + "Trying to use undefined variable `%s`.\n Available vars:\n - locals%s\n - globals%s\n", varname, gst_structure_to_string (local_vars), gst_structure_to_string (global_vars)); @@ -1143,9 +1262,14 @@ gst_validate_replace_variables_in_string (GstStructure * local_vars, return string; } +typedef struct +{ + gpointer source; + GstStructure *local_vars; +} ReplaceData; + static gboolean -_structure_set_variables (GQuark field_id, GValue * value, - GstStructure * local_variables) +_structure_set_variables (GQuark field_id, GValue * value, ReplaceData * data) { gchar *str; @@ -1158,7 +1282,7 @@ _structure_set_variables (GQuark field_id, GValue * value, for (i = 0; i < gst_value_list_get_size (value); i++) _structure_set_variables (0, (GValue *) gst_value_list_get_value (value, - i), local_variables); + i), data); return TRUE; } @@ -1166,7 +1290,8 @@ _structure_set_variables (GQuark field_id, GValue * value, if (!G_VALUE_HOLDS_STRING (value)) return TRUE; - str = gst_validate_replace_variables_in_string (local_variables, + str = + gst_validate_replace_variables_in_string (data->source, data->local_vars, g_value_get_string (value)); if (str) { g_value_set_string (value, str); @@ -1177,11 +1302,13 @@ _structure_set_variables (GQuark field_id, GValue * value, } void -gst_validate_structure_resolve_variables (GstStructure * structure, - GstStructure * local_variables) +gst_validate_structure_resolve_variables (gpointer source, + GstStructure * structure, GstStructure * local_variables) { + ReplaceData d = { source ? source : structure, local_variables }; + gst_structure_filter_and_map_in_place (structure, - (GstStructureFilterMapFunc) _structure_set_variables, local_variables); + (GstStructureFilterMapFunc) _structure_set_variables, &d); } static gboolean diff --git a/validate/gst/validate/gst-validate-utils.h b/validate/gst/validate/gst-validate-utils.h index f1f158aa6b..b67f9107af 100644 --- a/validate/gst/validate/gst-validate-utils.h +++ b/validate/gst/validate/gst-validate-utils.h @@ -34,6 +34,8 @@ typedef int (*GstValidateParseVariableFunc) (const gchar *name, double *value, gpointer user_data); +typedef gchar** (*GstValidateGetIncludePathsFunc)(const gchar* includer_file); + GST_VALIDATE_API gdouble gst_validate_utils_parse_expression (const gchar *expr, GstValidateParseVariableFunc variable_func, @@ -50,11 +52,14 @@ gchar ** gst_validate_utils_get_strv (GstStructure *str, const gchar *fiel GST_VALIDATE_API GList * gst_validate_utils_structs_parse_from_filename (const gchar * scenario_file, + GstValidateGetIncludePathsFunc get_include_paths_func, gchar **file_path); GST_VALIDATE_API GstStructure * gst_validate_utils_test_file_get_meta (const gchar * testfile, gboolean use_fakesinks); + GST_VALIDATE_API -GList * gst_validate_structs_parse_from_gfile (GFile * scenario_file); +GList * gst_validate_structs_parse_from_gfile (GFile * scenario_file, + GstValidateGetIncludePathsFunc get_include_paths_func); GST_VALIDATE_API gboolean gst_validate_element_has_klass (GstElement * element, const gchar * klass); @@ -74,9 +79,9 @@ void gst_validate_spin_on_fault_signals (void); GST_VALIDATE_API gboolean gst_validate_element_matches_target (GstElement * element, GstStructure * s); -gchar * gst_validate_replace_variables_in_string (GstStructure * local_vars, const gchar * in_string); +gchar * gst_validate_replace_variables_in_string (gpointer incom, GstStructure * local_vars, const gchar * in_string); GST_VALIDATE_API -void gst_validate_structure_resolve_variables (GstStructure *structure, GstStructure *local_variables); +void gst_validate_structure_resolve_variables (gpointer source, GstStructure *structure, GstStructure *local_variables); void gst_validate_structure_set_variables_from_struct_file(GstStructure* vars, const gchar* struct_file); void gst_validate_set_globals(GstStructure* structure); GST_VALIDATE_API diff --git a/validate/gst/validate/validate.c b/validate/gst/validate/validate.c index 434275dcef..f74f3ae4b3 100644 --- a/validate/gst/validate/validate.c +++ b/validate/gst/validate/validate.c @@ -172,12 +172,12 @@ get_config_from_structures (GList * structures, GstStructure * local_vars, (GstStructureForeachFunc) _set_vars_func, local_vars); gst_structure_free (structure); } else { - gst_validate_structure_resolve_variables (structure, local_vars); + gst_validate_structure_resolve_variables (NULL, structure, local_vars); result = g_list_append (result, structure); } } else { if (!loaded_globals && gst_structure_has_name (structure, "set-globals")) { - gst_validate_structure_resolve_variables (structure, local_vars); + gst_validate_structure_resolve_variables (NULL, structure, local_vars); gst_validate_set_globals (structure); } gst_structure_free (structure); @@ -202,7 +202,8 @@ create_config (const gchar * config, const gchar * suffix) local_vars = gst_structure_new_empty ("vars"); structures = - gst_validate_utils_structs_parse_from_filename (config, &config_file); + gst_validate_utils_structs_parse_from_filename (config, NULL, + &config_file); if (!structures) { GstCaps *confs = NULL; @@ -344,6 +345,9 @@ gst_validate_get_config (const gchar * structname) for (i = 0; tmp[i] != NULL; i++) { GList *l; + if (tmp[i][0] == '\0') + continue; + l = create_config (tmp[i], structname); if (l) configs = g_list_concat (configs, l); @@ -553,7 +557,7 @@ gst_validate_setup_test_file (const gchar * testfile, gboolean use_fakesinks) gst_validate_set_globals (NULL); gst_validate_structure_set_variables_from_struct_file (NULL, testfile); testfile_structs = - gst_validate_utils_structs_parse_from_filename (testfile, NULL); + gst_validate_utils_structs_parse_from_filename (testfile, NULL, NULL); if (!testfile_structs) gst_validate_abort ("Could not load test file: %s", testfile); @@ -578,7 +582,7 @@ gst_validate_setup_test_file (const gchar * testfile, gboolean use_fakesinks) gst_validate_scenario_check_and_set_needs_clock_sync (testfile_structs, &res); gst_validate_set_test_file_globals (res, testfile, use_fakesinks); - gst_validate_structure_resolve_variables (res, NULL); + gst_validate_structure_resolve_variables (NULL, res, NULL); tool = gst_structure_get_string (res, "tool"); if (!tool) diff --git a/validate/tests/check/validate/utilities.c b/validate/tests/check/validate/utilities.c index 145350e6df..f1b6d19f2f 100644 --- a/validate/tests/check/validate/utilities.c +++ b/validate/tests/check/validate/utilities.c @@ -8,7 +8,7 @@ GST_START_TEST (test_resolve_variables) gst_structure_from_string ("vars, a=(string)1, b=(string)2", NULL); GstStructure *s2 = gst_structure_from_string ("test, n=\"$(a)/$(b)\"", NULL); - gst_validate_structure_resolve_variables (s2, s1); + gst_validate_structure_resolve_variables (NULL, s2, s1); fail_unless_equals_string (gst_structure_get_string (s2, "n"), "1/2"); gst_structure_free (s1); gst_structure_free (s2);