diff options
author | Petri Latvala <petri.latvala@intel.com> | 2019-12-17 11:47:51 +0200 |
---|---|---|
committer | Petri Latvala <petri.latvala@intel.com> | 2020-01-03 12:28:05 +0200 |
commit | afdadaa5647fa14075260cbe98a8fe6bde890da4 (patch) | |
tree | 72350f8d32d79d5de7ac0a7057b88545d0fabd18 /runner | |
parent | 08ef14aaeb8aed8e1d267609272a997c527c8835 (diff) |
runner/resultgen: Extract finding begin/end lines for a subtest to a helper
v2: Use an enum to select a pattern string for asprintf (Arek)
Signed-off-by: Petri Latvala <petri.latvala@intel.com>
Cc: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Reviewed-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Diffstat (limited to 'runner')
-rw-r--r-- | runner/resultgen.c | 106 |
1 files changed, 58 insertions, 48 deletions
diff --git a/runner/resultgen.c b/runner/resultgen.c index 31bc0bb1c..e14a31b80 100644 --- a/runner/resultgen.c +++ b/runner/resultgen.c @@ -376,6 +376,61 @@ static void add_igt_version(struct json_object *testobj, } +enum subtest_find_pattern { + PATTERN_BEGIN, + PATTERN_RESULT, +}; + +static int find_subtest_idx_limited(struct matches matches, + const char *bufend, + const char *linekey, + enum subtest_find_pattern pattern, + const char *subtest_name, + int first, + int last) +{ + char *full_line; + int line_len; + int k; + + switch (pattern) { + case PATTERN_BEGIN: + line_len = asprintf(&full_line, "%s%s\n", linekey, subtest_name); + break; + case PATTERN_RESULT: + line_len = asprintf(&full_line, "%s%s: ", linekey, subtest_name); + break; + default: + assert(!"Unknown pattern"); + } + + if (line_len < 0) + return -1; + + for (k = first; k < last; k++) + if (matches.items[k].what == linekey && + !memcmp(matches.items[k].where, + full_line, + min(line_len, bufend - matches.items[k].where))) + break; + + free(full_line); + + if (k == last) + k = -1; + + return k; +} + +static int find_subtest_idx(struct matches matches, + const char *bufend, + const char *linekey, + enum subtest_find_pattern pattern, + const char *subtest_name) +{ + return find_subtest_idx_limited(matches, bufend, linekey, pattern, subtest_name, 0, matches.size); +} + static bool fill_from_output(int fd, const char *binary, const char *key, struct subtest_list *subtests, struct json_object *tests) @@ -439,44 +494,16 @@ static bool fill_from_output(int fd, const char *binary, const char *key, matches = find_matches(buf, bufend, needles); for (i = 0; i < subtests->size; i++) { - char *this_sub_begin, *this_sub_result; int begin_idx = -1, result_idx = -1; const char *resulttext; const char *beg, *end; double time; - int begin_len; - int result_len; generate_piglit_name(binary, subtests->subs[i].name, piglit_name, sizeof(piglit_name)); current_test = get_or_create_json_object(tests, piglit_name); - begin_len = asprintf(&this_sub_begin, "%s%s\n", STARTING_SUBTEST, subtests->subs[i].name); - result_len = asprintf(&this_sub_result, "%s%s: ", SUBTEST_RESULT, subtests->subs[i].name); - - if (begin_len < 0 || result_len < 0) { - fprintf(stderr, "Failure generating strings\n"); - return false; - } - - for (k = 0; k < matches.size; k++) { - if (matches.items[k].what == STARTING_SUBTEST && - !memcmp(matches.items[k].where, - this_sub_begin, - min(begin_len, bufend - matches.items[k].where))) { - beg = matches.items[k].where; - begin_idx = k; - } - if (matches.items[k].what == SUBTEST_RESULT && - !memcmp(matches.items[k].where, - this_sub_result, - min(result_len, bufend - matches.items[k].where))) { - end = matches.items[k].where; - result_idx = k; - } - } - - free(this_sub_begin); - free(this_sub_result); + begin_idx = find_subtest_idx(matches, bufend, STARTING_SUBTEST, PATTERN_BEGIN, subtests->subs[i].name); + result_idx = find_subtest_idx(matches, bufend, SUBTEST_RESULT, PATTERN_RESULT, subtests->subs[i].name); if (begin_idx < 0 && result_idx < 0) { /* No output at all */ @@ -562,31 +589,14 @@ static bool fill_from_output(int fd, const char *binary, const char *key, int dyn_result_idx = -1; char dynamic_name[256]; char dynamic_piglit_name[256]; - char *this_dyn_result; - int dyn_result_len; const char *dynbeg, *dynend; - int n; if (sscanf(matches.items[k].where + strlen(STARTING_DYNAMIC_SUBTEST), "%s", dynamic_name) != 1) { /* Cannot parse name, just ignore this one */ continue; } - dyn_result_len = asprintf(&this_dyn_result, "%s%s: ", DYNAMIC_SUBTEST_RESULT, dynamic_name); - if (dyn_result_len < 0) - continue; - - for (n = k + 1; n < result_idx; n++) { - if (matches.items[n].what == DYNAMIC_SUBTEST_RESULT && - !memcmp(matches.items[n].where, - this_dyn_result, - min(dyn_result_len, bufend - matches.items[n].where))) { - dyn_result_idx = n; - break; - } - } - - free(this_dyn_result); + dyn_result_idx = find_subtest_idx_limited(matches, end, DYNAMIC_SUBTEST_RESULT, PATTERN_RESULT, dynamic_name, k, result_idx); if (k == 0) dynbeg = beg; |