summaryrefslogtreecommitdiff
path: root/runner
diff options
context:
space:
mode:
authorPetri Latvala <petri.latvala@intel.com>2019-12-17 11:47:51 +0200
committerPetri Latvala <petri.latvala@intel.com>2020-01-03 12:28:05 +0200
commitafdadaa5647fa14075260cbe98a8fe6bde890da4 (patch)
tree72350f8d32d79d5de7ac0a7057b88545d0fabd18 /runner
parent08ef14aaeb8aed8e1d267609272a997c527c8835 (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.c106
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;