-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ci: make "-m" option available to test_progs.
This is necessary for older versions, or the tests will fail for not having traffic monitor landed. Signed-off-by: Kui-Feng Lee <[email protected]>
- Loading branch information
1 parent
44c3dad
commit 15083c0
Showing
1 changed file
with
203 additions
and
0 deletions.
There are no files selected for viewing
203 changes: 203 additions & 0 deletions
203
ci/diffs/0002-selftests-bpf-Add-the-traffic-monitor-option-to-test.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,203 @@ | ||
From d1303b03da0b05b6fdfc273835f8f2b71e30525b Mon Sep 17 00:00:00 2001 | ||
From: Kui-Feng Lee <[email protected]> | ||
Date: Fri, 26 Jul 2024 13:28:22 -0700 | ||
Subject: [PATCH bpf-next v9 2/6] selftests/bpf: Add the traffic monitor option | ||
to test_progs. | ||
|
||
Add option '-m' to test_progs to accept names and patterns of test cases. | ||
This option will be used later to enable traffic monitor that capture | ||
network packets generated by test cases. | ||
|
||
Acked-by: Stanislav Fomichev <[email protected]> | ||
Signed-off-by: Kui-Feng Lee <[email protected]> | ||
--- | ||
tools/testing/selftests/bpf/test_progs.c | 86 +++++++++++++++++------- | ||
tools/testing/selftests/bpf/test_progs.h | 2 + | ||
2 files changed, 64 insertions(+), 24 deletions(-) | ||
|
||
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c | ||
index 60fafa2f1ed7..f8ed1a16a884 100644 | ||
--- a/tools/testing/selftests/bpf/test_progs.c | ||
+++ b/tools/testing/selftests/bpf/test_progs.c | ||
@@ -155,6 +155,7 @@ struct prog_test_def { | ||
void (*run_serial_test)(void); | ||
bool should_run; | ||
bool need_cgroup_cleanup; | ||
+ bool should_tmon; | ||
}; | ||
|
||
/* Override C runtime library's usleep() implementation to ensure nanosleep() | ||
@@ -192,46 +193,59 @@ static bool should_run(struct test_selector *sel, int num, const char *name) | ||
return num < sel->num_set_len && sel->num_set[num]; | ||
} | ||
|
||
-static bool should_run_subtest(struct test_selector *sel, | ||
- struct test_selector *subtest_sel, | ||
- int subtest_num, | ||
- const char *test_name, | ||
- const char *subtest_name) | ||
+static bool match_subtest(struct test_filter_set *filter, | ||
+ const char *test_name, | ||
+ const char *subtest_name) | ||
{ | ||
int i, j; | ||
|
||
- for (i = 0; i < sel->blacklist.cnt; i++) { | ||
- if (glob_match(test_name, sel->blacklist.tests[i].name)) { | ||
- if (!sel->blacklist.tests[i].subtest_cnt) | ||
- return false; | ||
- | ||
- for (j = 0; j < sel->blacklist.tests[i].subtest_cnt; j++) { | ||
- if (glob_match(subtest_name, | ||
- sel->blacklist.tests[i].subtests[j])) | ||
- return false; | ||
- } | ||
- } | ||
- } | ||
- | ||
- for (i = 0; i < sel->whitelist.cnt; i++) { | ||
- if (glob_match(test_name, sel->whitelist.tests[i].name)) { | ||
- if (!sel->whitelist.tests[i].subtest_cnt) | ||
+ for (i = 0; i < filter->cnt; i++) { | ||
+ if (glob_match(test_name, filter->tests[i].name)) { | ||
+ if (!filter->tests[i].subtest_cnt) | ||
return true; | ||
|
||
- for (j = 0; j < sel->whitelist.tests[i].subtest_cnt; j++) { | ||
+ for (j = 0; j < filter->tests[i].subtest_cnt; j++) { | ||
if (glob_match(subtest_name, | ||
- sel->whitelist.tests[i].subtests[j])) | ||
+ filter->tests[i].subtests[j])) | ||
return true; | ||
} | ||
} | ||
} | ||
|
||
+ return false; | ||
+} | ||
+ | ||
+static bool should_run_subtest(struct test_selector *sel, | ||
+ struct test_selector *subtest_sel, | ||
+ int subtest_num, | ||
+ const char *test_name, | ||
+ const char *subtest_name) | ||
+{ | ||
+ if (match_subtest(&sel->blacklist, test_name, subtest_name)) | ||
+ return false; | ||
+ | ||
+ if (match_subtest(&sel->whitelist, test_name, subtest_name)) | ||
+ return true; | ||
+ | ||
if (!sel->whitelist.cnt && !subtest_sel->num_set) | ||
return true; | ||
|
||
return subtest_num < subtest_sel->num_set_len && subtest_sel->num_set[subtest_num]; | ||
} | ||
|
||
+static bool should_tmon(struct test_selector *sel, const char *name) | ||
+{ | ||
+ int i; | ||
+ | ||
+ for (i = 0; i < sel->whitelist.cnt; i++) { | ||
+ if (glob_match(name, sel->whitelist.tests[i].name) && | ||
+ !sel->whitelist.tests[i].subtest_cnt) | ||
+ return true; | ||
+ } | ||
+ | ||
+ return false; | ||
+} | ||
+ | ||
static char *test_result(bool failed, bool skipped) | ||
{ | ||
return failed ? "FAIL" : (skipped ? "SKIP" : "OK"); | ||
@@ -488,6 +502,10 @@ bool test__start_subtest(const char *subtest_name) | ||
return false; | ||
} | ||
|
||
+ subtest_state->should_tmon = match_subtest(&env.tmon_selector.whitelist, | ||
+ test->test_name, | ||
+ subtest_name); | ||
+ | ||
env.subtest_state = subtest_state; | ||
stdio_hijack_init(&subtest_state->log_buf, &subtest_state->log_cnt); | ||
|
||
@@ -667,7 +685,8 @@ enum ARG_KEYS { | ||
ARG_TEST_NAME_GLOB_DENYLIST = 'd', | ||
ARG_NUM_WORKERS = 'j', | ||
ARG_DEBUG = -1, | ||
- ARG_JSON_SUMMARY = 'J' | ||
+ ARG_JSON_SUMMARY = 'J', | ||
+ ARG_TRAFFIC_MONITOR = 'm', | ||
}; | ||
|
||
static const struct argp_option opts[] = { | ||
@@ -694,6 +713,10 @@ static const struct argp_option opts[] = { | ||
{ "debug", ARG_DEBUG, NULL, 0, | ||
"print extra debug information for test_progs." }, | ||
{ "json-summary", ARG_JSON_SUMMARY, "FILE", 0, "Write report in json format to this file."}, | ||
+#ifdef TRAFFIC_MONITOR | ||
+ { "traffic-monitor", ARG_TRAFFIC_MONITOR, "NAMES", 0, | ||
+ "Monitor network traffic of tests with name matching the pattern (supports '*' wildcard)." }, | ||
+#endif | ||
{}, | ||
}; | ||
|
||
@@ -905,6 +928,18 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state) | ||
break; | ||
case ARGP_KEY_END: | ||
break; | ||
+#ifdef TRAFFIC_MONITOR | ||
+ case ARG_TRAFFIC_MONITOR: | ||
+ if (arg[0] == '@') | ||
+ err = parse_test_list_file(arg + 1, | ||
+ &env->tmon_selector.whitelist, | ||
+ true); | ||
+ else | ||
+ err = parse_test_list(arg, | ||
+ &env->tmon_selector.whitelist, | ||
+ true); | ||
+ break; | ||
+#endif | ||
default: | ||
return ARGP_ERR_UNKNOWN; | ||
} | ||
@@ -1736,6 +1771,8 @@ int main(int argc, char **argv) | ||
test->test_num, test->test_name, test->test_name, test->test_name); | ||
exit(EXIT_ERR_SETUP_INFRA); | ||
} | ||
+ if (test->should_run) | ||
+ test->should_tmon = should_tmon(&env.tmon_selector, test->test_name); | ||
} | ||
|
||
/* ignore workers if we are just listing */ | ||
@@ -1820,6 +1857,7 @@ int main(int argc, char **argv) | ||
|
||
free_test_selector(&env.test_selector); | ||
free_test_selector(&env.subtest_selector); | ||
+ free_test_selector(&env.tmon_selector); | ||
free_test_states(); | ||
|
||
if (env.succ_cnt + env.fail_cnt + env.skip_cnt == 0) | ||
diff --git a/tools/testing/selftests/bpf/test_progs.h b/tools/testing/selftests/bpf/test_progs.h | ||
index cb9d6d46826b..966011eb7ec8 100644 | ||
--- a/tools/testing/selftests/bpf/test_progs.h | ||
+++ b/tools/testing/selftests/bpf/test_progs.h | ||
@@ -74,6 +74,7 @@ struct subtest_state { | ||
int error_cnt; | ||
bool skipped; | ||
bool filtered; | ||
+ bool should_tmon; | ||
|
||
FILE *stdout_saved; | ||
}; | ||
@@ -98,6 +99,7 @@ struct test_state { | ||
struct test_env { | ||
struct test_selector test_selector; | ||
struct test_selector subtest_selector; | ||
+ struct test_selector tmon_selector; | ||
bool verifier_stats; | ||
bool debug; | ||
enum verbosity verbosity; | ||
-- | ||
2.34.1 | ||
|