selftests/bpf: Extract parse_num_list into generic testing_helpers.c
Add testing_helpers.c, which will contain generic helpers for test runners and tests needing some common generic functionality, like parsing a set of numbers. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20200512192445.2351848-2-andriin@fb.com
This commit is contained in:
parent
fd9eef1a13
commit
cd49291ce1
|
@ -355,7 +355,8 @@ endef
|
|||
TRUNNER_TESTS_DIR := prog_tests
|
||||
TRUNNER_BPF_PROGS_DIR := progs
|
||||
TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \
|
||||
network_helpers.c flow_dissector_load.h
|
||||
network_helpers.c testing_helpers.c \
|
||||
flow_dissector_load.h
|
||||
TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \
|
||||
$(wildcard progs/btf_dump_test_case_*.c)
|
||||
TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
|
||||
|
|
|
@ -438,67 +438,6 @@ err:
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
int parse_num_list(const char *s, struct test_selector *sel)
|
||||
{
|
||||
int i, set_len = 0, new_len, num, start = 0, end = -1;
|
||||
bool *set = NULL, *tmp, parsing_end = false;
|
||||
char *next;
|
||||
|
||||
while (s[0]) {
|
||||
errno = 0;
|
||||
num = strtol(s, &next, 10);
|
||||
if (errno)
|
||||
return -errno;
|
||||
|
||||
if (parsing_end)
|
||||
end = num;
|
||||
else
|
||||
start = num;
|
||||
|
||||
if (!parsing_end && *next == '-') {
|
||||
s = next + 1;
|
||||
parsing_end = true;
|
||||
continue;
|
||||
} else if (*next == ',') {
|
||||
parsing_end = false;
|
||||
s = next + 1;
|
||||
end = num;
|
||||
} else if (*next == '\0') {
|
||||
parsing_end = false;
|
||||
s = next;
|
||||
end = num;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (start > end)
|
||||
return -EINVAL;
|
||||
|
||||
if (end + 1 > set_len) {
|
||||
new_len = end + 1;
|
||||
tmp = realloc(set, new_len);
|
||||
if (!tmp) {
|
||||
free(set);
|
||||
return -ENOMEM;
|
||||
}
|
||||
for (i = set_len; i < start; i++)
|
||||
tmp[i] = false;
|
||||
set = tmp;
|
||||
set_len = new_len;
|
||||
}
|
||||
for (i = start; i <= end; i++)
|
||||
set[i] = true;
|
||||
}
|
||||
|
||||
if (!set)
|
||||
return -EINVAL;
|
||||
|
||||
sel->num_set = set;
|
||||
sel->num_set_len = set_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int extra_prog_load_log_flags;
|
||||
|
||||
static error_t parse_arg(int key, char *arg, struct argp_state *state)
|
||||
|
@ -512,13 +451,15 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
|
|||
if (subtest_str) {
|
||||
*subtest_str = '\0';
|
||||
if (parse_num_list(subtest_str + 1,
|
||||
&env->subtest_selector)) {
|
||||
&env->subtest_selector.num_set,
|
||||
&env->subtest_selector.num_set_len)) {
|
||||
fprintf(stderr,
|
||||
"Failed to parse subtest numbers.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (parse_num_list(arg, &env->test_selector)) {
|
||||
if (parse_num_list(arg, &env->test_selector.num_set,
|
||||
&env->test_selector.num_set_len)) {
|
||||
fprintf(stderr, "Failed to parse test numbers.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ typedef __u16 __sum16;
|
|||
#include "bpf_util.h"
|
||||
#include <bpf/bpf_endian.h>
|
||||
#include "trace_helpers.h"
|
||||
#include "testing_helpers.h"
|
||||
#include "flow_dissector_load.h"
|
||||
|
||||
enum verbosity {
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
||||
/* Copyright (C) 2020 Facebook, Inc. */
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include "testing_helpers.h"
|
||||
|
||||
int parse_num_list(const char *s, bool **num_set, int *num_set_len)
|
||||
{
|
||||
int i, set_len = 0, new_len, num, start = 0, end = -1;
|
||||
bool *set = NULL, *tmp, parsing_end = false;
|
||||
char *next;
|
||||
|
||||
while (s[0]) {
|
||||
errno = 0;
|
||||
num = strtol(s, &next, 10);
|
||||
if (errno)
|
||||
return -errno;
|
||||
|
||||
if (parsing_end)
|
||||
end = num;
|
||||
else
|
||||
start = num;
|
||||
|
||||
if (!parsing_end && *next == '-') {
|
||||
s = next + 1;
|
||||
parsing_end = true;
|
||||
continue;
|
||||
} else if (*next == ',') {
|
||||
parsing_end = false;
|
||||
s = next + 1;
|
||||
end = num;
|
||||
} else if (*next == '\0') {
|
||||
parsing_end = false;
|
||||
s = next;
|
||||
end = num;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (start > end)
|
||||
return -EINVAL;
|
||||
|
||||
if (end + 1 > set_len) {
|
||||
new_len = end + 1;
|
||||
tmp = realloc(set, new_len);
|
||||
if (!tmp) {
|
||||
free(set);
|
||||
return -ENOMEM;
|
||||
}
|
||||
for (i = set_len; i < start; i++)
|
||||
tmp[i] = false;
|
||||
set = tmp;
|
||||
set_len = new_len;
|
||||
}
|
||||
for (i = start; i <= end; i++)
|
||||
set[i] = true;
|
||||
}
|
||||
|
||||
if (!set)
|
||||
return -EINVAL;
|
||||
|
||||
*num_set = set;
|
||||
*num_set_len = set_len;
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
||||
/* Copyright (C) 2020 Facebook, Inc. */
|
||||
#include <stdbool.h>
|
||||
|
||||
int parse_num_list(const char *s, bool **set, int *set_len);
|
Loading…
Reference in New Issue