[igt-dev] [PATCH i-g-t 07/11] runner/resultgen: Make subtest result line finding more robust
Petri Latvala
petri.latvala at intel.com
Mon Dec 2 13:01:05 UTC 2019
On an assertion failure, the string "Subtest xyz failed" is
printed. Make sure we don't match that for SUBTEST_RESULT, or the
equivalent for dynamic subtests.
Parsing the results already explicitly searched for the proper result
line, the difference is when we delimit output up to "the next line of
interest".
Signed-off-by: Petri Latvala <petri.latvala at intel.com>
---
runner/resultgen.c | 41 +++++++++++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/runner/resultgen.c b/runner/resultgen.c
index b01e0a48..64b899ca 100644
--- a/runner/resultgen.c
+++ b/runner/resultgen.c
@@ -367,6 +367,39 @@ static struct matches find_matches(const char *buf, const char *bufend,
return ret;
}
+static bool valid_char_for_subtest_name(char x)
+{
+ return x == '-' || x == '_' || isalnum(x);
+}
+
+static bool is_subtest_result_line(const char *needle, const char *line, const char *bufend)
+{
+ line += strlen(needle);
+
+ /*
+ * At this point of the string we're expecting:
+ * - The subtest name (one or more of a-z, A-Z, 0-9, '-' and '_')
+ * - The characters ':' and ' '
+ *
+ * If we find all those, allow parsing this line as [dynamic]
+ * subtest result.
+ */
+
+ if (!valid_char_for_subtest_name(*line))
+ return false;
+
+ while (line < bufend && valid_char_for_subtest_name(*line))
+ line++;
+
+ if (line >= bufend || *line++ != ':')
+ return false;
+
+ if (line >= bufend || *line++ != ' ')
+ return false;
+
+ return true;
+}
+
static void free_matches(struct matches *matches)
{
free(matches->items);
@@ -598,9 +631,9 @@ static bool fill_from_output(int fd, const char *binary, const char *key,
struct json_object *current_test = NULL;
struct match_needle needles[] = {
{ STARTING_SUBTEST, NULL },
- { SUBTEST_RESULT, NULL },
+ { SUBTEST_RESULT, is_subtest_result_line },
{ STARTING_DYNAMIC_SUBTEST, NULL },
- { DYNAMIC_SUBTEST_RESULT, NULL },
+ { DYNAMIC_SUBTEST_RESULT, is_subtest_result_line },
{ NULL, NULL },
};
struct matches matches = {};
@@ -1119,9 +1152,9 @@ static bool stderr_contains_warnings(const char *beg, const char *end)
{
struct match_needle needles[] = {
{ STARTING_SUBTEST, NULL },
- { SUBTEST_RESULT, NULL },
+ { SUBTEST_RESULT, is_subtest_result_line },
{ STARTING_DYNAMIC_SUBTEST, NULL },
- { DYNAMIC_SUBTEST_RESULT, NULL },
+ { DYNAMIC_SUBTEST_RESULT, is_subtest_result_line },
{ NULL, NULL },
};
struct matches matches;
--
2.19.1
More information about the igt-dev
mailing list