selftests: Add test plan API to kselftest.h and adjust callers
The test plan for TAP needs to be declared immediately after the header. This adds the test plan API to kselftest.h and updates all callers to declare their expected test counts. Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
f41c322f17
commit
5821ba9695
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#include "../kselftest.h"
|
#include "../kselftest.h"
|
||||||
|
|
||||||
|
#define COUNT_ISN_BPS 4
|
||||||
|
#define COUNT_WPS 4
|
||||||
|
|
||||||
/* Breakpoint access modes */
|
/* Breakpoint access modes */
|
||||||
enum {
|
enum {
|
||||||
|
@ -220,7 +222,7 @@ static void trigger_tests(void)
|
||||||
if (!local && !global)
|
if (!local && !global)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < COUNT_ISN_BPS; i++) {
|
||||||
dummy_funcs[i]();
|
dummy_funcs[i]();
|
||||||
check_trapped();
|
check_trapped();
|
||||||
}
|
}
|
||||||
|
@ -292,7 +294,7 @@ static void launch_instruction_breakpoints(char *buf, int local, int global)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < COUNT_ISN_BPS; i++) {
|
||||||
set_breakpoint_addr(dummy_funcs[i], i);
|
set_breakpoint_addr(dummy_funcs[i], i);
|
||||||
toggle_breakpoint(i, BP_X, 1, local, global, 1);
|
toggle_breakpoint(i, BP_X, 1, local, global, 1);
|
||||||
ptrace(PTRACE_CONT, child_pid, NULL, 0);
|
ptrace(PTRACE_CONT, child_pid, NULL, 0);
|
||||||
|
@ -314,7 +316,7 @@ static void launch_watchpoints(char *buf, int mode, int len,
|
||||||
else
|
else
|
||||||
mode_str = "read";
|
mode_str = "read";
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < COUNT_WPS; i++) {
|
||||||
set_breakpoint_addr(&dummy_var[i], i);
|
set_breakpoint_addr(&dummy_var[i], i);
|
||||||
toggle_breakpoint(i, mode, len, local, global, 1);
|
toggle_breakpoint(i, mode, len, local, global, 1);
|
||||||
ptrace(PTRACE_CONT, child_pid, NULL, 0);
|
ptrace(PTRACE_CONT, child_pid, NULL, 0);
|
||||||
|
@ -330,8 +332,15 @@ static void launch_watchpoints(char *buf, int mode, int len,
|
||||||
static void launch_tests(void)
|
static void launch_tests(void)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
unsigned int tests = 0;
|
||||||
int len, local, global, i;
|
int len, local, global, i;
|
||||||
|
|
||||||
|
tests += 3 * COUNT_ISN_BPS;
|
||||||
|
tests += sizeof(long) / 2 * 3 * COUNT_WPS;
|
||||||
|
tests += sizeof(long) / 2 * 3 * COUNT_WPS;
|
||||||
|
tests += 2;
|
||||||
|
ksft_set_plan(tests);
|
||||||
|
|
||||||
/* Instruction breakpoints */
|
/* Instruction breakpoints */
|
||||||
for (local = 0; local < 2; local++) {
|
for (local = 0; local < 2; local++) {
|
||||||
for (global = 0; global < 2; global++) {
|
for (global = 0; global < 2; global++) {
|
||||||
|
|
|
@ -118,7 +118,7 @@ static bool set_watchpoint(pid_t pid, int size, int wp)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool run_test(int wr_size, int wp_size, int wr, int wp)
|
static bool arun_test(int wr_size, int wp_size, int wr, int wp)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
siginfo_t siginfo;
|
siginfo_t siginfo;
|
||||||
|
@ -214,6 +214,7 @@ int main(int argc, char **argv)
|
||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(213);
|
||||||
|
|
||||||
act.sa_handler = sigalrm;
|
act.sa_handler = sigalrm;
|
||||||
sigemptyset(&act.sa_mask);
|
sigemptyset(&act.sa_mask);
|
||||||
|
|
|
@ -173,6 +173,7 @@ int main(int argc, char **argv)
|
||||||
int opt;
|
int opt;
|
||||||
bool do_suspend = true;
|
bool do_suspend = true;
|
||||||
bool succeeded = true;
|
bool succeeded = true;
|
||||||
|
unsigned int tests = 0;
|
||||||
cpu_set_t available_cpus;
|
cpu_set_t available_cpus;
|
||||||
int err;
|
int err;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
@ -191,6 +192,13 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
|
||||||
|
if (!CPU_ISSET(cpu, &available_cpus))
|
||||||
|
continue;
|
||||||
|
tests++;
|
||||||
|
}
|
||||||
|
ksft_set_plan(tests);
|
||||||
|
|
||||||
if (do_suspend)
|
if (do_suspend)
|
||||||
suspend();
|
suspend();
|
||||||
|
|
||||||
|
|
|
@ -430,8 +430,6 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *tmp1, *tmp2, *our_path;
|
char *tmp1, *tmp2, *our_path;
|
||||||
|
|
||||||
ksft_print_header();
|
|
||||||
|
|
||||||
/* Find our path */
|
/* Find our path */
|
||||||
tmp1 = strdup(argv[0]);
|
tmp1 = strdup(argv[0]);
|
||||||
if (!tmp1)
|
if (!tmp1)
|
||||||
|
@ -445,6 +443,8 @@ int main(int argc, char **argv)
|
||||||
mpid = getpid();
|
mpid = getpid();
|
||||||
|
|
||||||
if (fork_wait()) {
|
if (fork_wait()) {
|
||||||
|
ksft_print_header();
|
||||||
|
ksft_set_plan(12);
|
||||||
ksft_print_msg("[RUN]\t+++ Tests with uid == 0 +++\n");
|
ksft_print_msg("[RUN]\t+++ Tests with uid == 0 +++\n");
|
||||||
return do_tests(0, our_path);
|
return do_tests(0, our_path);
|
||||||
}
|
}
|
||||||
|
@ -452,6 +452,8 @@ int main(int argc, char **argv)
|
||||||
ksft_print_msg("==================================================\n");
|
ksft_print_msg("==================================================\n");
|
||||||
|
|
||||||
if (fork_wait()) {
|
if (fork_wait()) {
|
||||||
|
ksft_print_header();
|
||||||
|
ksft_set_plan(9);
|
||||||
ksft_print_msg("[RUN]\t+++ Tests with uid != 0 +++\n");
|
ksft_print_msg("[RUN]\t+++ Tests with uid != 0 +++\n");
|
||||||
return do_tests(1, our_path);
|
return do_tests(1, our_path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,6 +395,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Test requeue functionality\n", basename(argv[0]));
|
ksft_print_msg("%s: Test requeue functionality\n", basename(argv[0]));
|
||||||
ksft_print_msg(
|
ksft_print_msg(
|
||||||
"\tArguments: broadcast=%d locked=%d owner=%d timeout=%ldns\n",
|
"\tArguments: broadcast=%d locked=%d owner=%d timeout=%ldns\n",
|
||||||
|
|
|
@ -79,6 +79,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Detect mismatched requeue_pi operations\n",
|
ksft_print_msg("%s: Detect mismatched requeue_pi operations\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Test signal handling during requeue_pi\n",
|
ksft_print_msg("%s: Test signal handling during requeue_pi\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
ksft_print_msg("\tArguments: <none>\n");
|
ksft_print_msg("\tArguments: <none>\n");
|
||||||
|
|
|
@ -98,6 +98,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg(
|
ksft_print_msg(
|
||||||
"%s: Test the futex value of private file mappings in FUTEX_WAIT\n",
|
"%s: Test the futex value of private file mappings in FUTEX_WAIT\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
|
|
|
@ -69,6 +69,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Block on a futex and wait for timeout\n",
|
ksft_print_msg("%s: Block on a futex and wait for timeout\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns);
|
ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns);
|
||||||
|
|
|
@ -100,6 +100,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Test the uninitialized futex value in FUTEX_WAIT\n",
|
ksft_print_msg("%s: Test the uninitialized futex value in FUTEX_WAIT\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(1);
|
||||||
ksft_print_msg("%s: Test the unexpected futex value in FUTEX_WAIT\n",
|
ksft_print_msg("%s: Test the unexpected futex value in FUTEX_WAIT\n",
|
||||||
basename(argv[0]));
|
basename(argv[0]));
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct ksft_count {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ksft_count ksft_cnt;
|
static struct ksft_count ksft_cnt;
|
||||||
|
static unsigned int ksft_plan;
|
||||||
|
|
||||||
static inline int ksft_test_num(void)
|
static inline int ksft_test_num(void)
|
||||||
{
|
{
|
||||||
|
@ -61,13 +62,21 @@ static inline void ksft_print_header(void)
|
||||||
printf("TAP version 13\n");
|
printf("TAP version 13\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ksft_set_plan(unsigned int plan)
|
||||||
|
{
|
||||||
|
ksft_plan = plan;
|
||||||
|
printf("1..%d\n", ksft_plan);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void ksft_print_cnts(void)
|
static inline void ksft_print_cnts(void)
|
||||||
{
|
{
|
||||||
|
if (ksft_plan != ksft_test_num())
|
||||||
|
printf("# Planned tests != run tests (%u != %u)\n",
|
||||||
|
ksft_plan, ksft_test_num());
|
||||||
printf("# Pass %d Fail %d Xfail %d Xpass %d Skip %d Error %d\n",
|
printf("# Pass %d Fail %d Xfail %d Xpass %d Skip %d Error %d\n",
|
||||||
ksft_cnt.ksft_pass, ksft_cnt.ksft_fail,
|
ksft_cnt.ksft_pass, ksft_cnt.ksft_fail,
|
||||||
ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass,
|
ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass,
|
||||||
ksft_cnt.ksft_xskip, ksft_cnt.ksft_error);
|
ksft_cnt.ksft_xskip, ksft_cnt.ksft_error);
|
||||||
printf("1..%d\n", ksft_test_num());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ksft_print_msg(const char *msg, ...)
|
static inline void ksft_print_msg(const char *msg, ...)
|
||||||
|
@ -172,7 +181,7 @@ static inline int ksft_exit_skip(const char *msg, ...)
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args, msg);
|
va_start(args, msg);
|
||||||
printf("not ok %d # SKIP ", ksft_test_num());
|
printf("not ok %d # SKIP ", 1 + ksft_test_num());
|
||||||
vprintf(msg, args);
|
vprintf(msg, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -304,6 +304,7 @@ static int test_membarrier_query(void)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(13);
|
||||||
|
|
||||||
test_membarrier_query();
|
test_membarrier_query();
|
||||||
test_membarrier();
|
test_membarrier();
|
||||||
|
|
|
@ -371,6 +371,7 @@ static int test_pidfd_send_signal_syscall_support(void)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(4);
|
||||||
|
|
||||||
test_pidfd_send_signal_syscall_support();
|
test_pidfd_send_signal_syscall_support();
|
||||||
test_pidfd_send_signal_simple_success();
|
test_pidfd_send_signal_simple_success();
|
||||||
|
|
|
@ -109,6 +109,7 @@ int main(void)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(3);
|
||||||
|
|
||||||
sigemptyset(&act.sa_mask);
|
sigemptyset(&act.sa_mask);
|
||||||
act.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
act.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
||||||
|
|
|
@ -86,6 +86,7 @@ int main(void)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
|
ksft_set_plan(3 + 7);
|
||||||
|
|
||||||
sync_api_supported();
|
sync_api_supported();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue