diff options
author | Sahil Siddiq <icegambit91@gmail.com> | 2023-03-20 11:10:58 +0530 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2023-04-03 19:13:29 +0000 |
commit | 628b7eb7449e9557b409386cac85950f404ed0aa (patch) | |
tree | 3bb3138ba720f58705f828dd0f7d32c2675b0594 | |
parent | 94d59946736548741fcf75d175c2ee7c318c390a (diff) | |
download | strace-628b7eb7449e9557b409386cac85950f404ed0aa.tar.gz |
tests: check -l/--syscall-limit options
These tests check the correctness of -l/--syscall-limit options
when used with --trace, --trace-path and --status options.
* tests/options-syntax.test: Check for invalid -l/--syscall-limit
arguments.
* tests/strace--syscall-limit.c: New file.
* tests/strace--syscall-limit-path.c: Likewise.
* tests/strace--syscall-limit-status.c: Likewise.
* tests/strace--syscall-limit.test: New test.
* tests/.gitignore: Add strace--syscall-limit,
strace--syscall-limit-path, and strace--syscall-limit-status.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add strace--syscall-limit.test.
* tests/gen_tests.in (strace--syscall-limit-path,
strace--syscall-limit-status): New entries.
Signed-off-by: Sahil Siddiq <icegambit91@gmail.com>
Co-authored-by: Dmitry V. Levin <ldv@strace.io>
-rw-r--r-- | tests/.gitignore | 3 | ||||
-rw-r--r-- | tests/Makefile.am | 4 | ||||
-rw-r--r-- | tests/gen_tests.in | 2 | ||||
-rwxr-xr-x | tests/options-syntax.test | 4 | ||||
-rw-r--r-- | tests/strace--syscall-limit-path.c | 11 | ||||
-rw-r--r-- | tests/strace--syscall-limit-status.c | 11 | ||||
-rw-r--r-- | tests/strace--syscall-limit.c | 107 | ||||
-rwxr-xr-x | tests/strace--syscall-limit.test | 33 |
8 files changed, 175 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 5935c39d9..f5c8e4496 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1020,6 +1020,9 @@ strace--strings-in-hex-all strace--strings-in-hex-non-ascii strace--strings-in-hex-non-ascii-chars strace--strings-in-hex-none +strace--syscall-limit +strace--syscall-limit-path +strace--syscall-limit-status strace-Y-0123456789 strace-n strace-no-x diff --git a/tests/Makefile.am b/tests/Makefile.am index 70153a5b1..2f1c90795 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -379,6 +379,9 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \ status-successful-threads \ status-unfinished-threads \ strace--decode-pids-comm \ + strace--syscall-limit \ + strace--syscall-limit-path \ + strace--syscall-limit-status \ strace-Y-0123456789 \ strace-p-Y-p2 \ strace-p1-Y-p \ @@ -606,6 +609,7 @@ MISC_TESTS = \ status-none-threads.test \ status-successful-threads.test \ status-unfinished-threads.test \ + strace--syscall-limit.test \ strace--tips.test \ strace--tips-full.test \ strace-C.test \ diff --git a/tests/gen_tests.in b/tests/gen_tests.in index eceac8d60..74d9984c9 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -1006,6 +1006,8 @@ strace--strings-in-hex-all --trace=chdir --strings-in-hex=all --columns=18 strace--strings-in-hex-non-ascii --trace=chdir --strings-in-hex=non-ascii --columns=12 strace--strings-in-hex-non-ascii-chars --trace=chdir --strings-in-hex=non-ascii-chars --columns=12 strace--strings-in-hex-none --trace=chdir --strings-in-hex=none --columns=12 +strace--syscall-limit-path +strace--syscall-limit.test --trace=all --trace-path=invalid.dir +strace--syscall-limit-status +strace--syscall-limit.test --status=failed strace--syscall-times +strace-T_upper.test --syscall-times strace--syscall-times-ms +strace-T_upper.test --syscall-times=ms strace--syscall-times-ns +strace-T_upper.test --syscall-times=ns diff --git a/tests/options-syntax.test b/tests/options-syntax.test index c76c161d9..f6fcd95f5 100755 --- a/tests/options-syntax.test +++ b/tests/options-syntax.test @@ -186,6 +186,10 @@ check_h "must have PROG [ARGS] or -p PID" --strings-in-hex=non-ascii check_h "invalid --strings-in-hex argument: 'al'" --strings-in-hex=al check_h "invalid --strings-in-hex argument: 'alll'" --strings-in-hex=alll check_h "invalid --strings-in-hex argument: 'ascii'" --strings-in-hex=ascii +check_h "invalid -l argument: '-5'" -l -5 +check_h "invalid --syscall-limit argument: '0'" --syscall-limit=0 +check_h "must have PROG [ARGS] or -p PID" -l2 +check_h "must have PROG [ARGS] or -p PID" --syscall-limit 5 check_h "must have PROG [ARGS] or -p PID" --quiet=all check_h "must have PROG [ARGS] or -p PID" --quiet=none check_h "must have PROG [ARGS] or -p PID" --quiet=\!attach diff --git a/tests/strace--syscall-limit-path.c b/tests/strace--syscall-limit-path.c new file mode 100644 index 000000000..8c4c3a7b9 --- /dev/null +++ b/tests/strace--syscall-limit-path.c @@ -0,0 +1,11 @@ +/* + * Test -l/--syscall-limit with --trace-path option. + * + * Copyright (c) 2023 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#define PRINT_VALID 0 +#include "strace--syscall-limit.c" diff --git a/tests/strace--syscall-limit-status.c b/tests/strace--syscall-limit-status.c new file mode 100644 index 000000000..9cd77a3be --- /dev/null +++ b/tests/strace--syscall-limit-status.c @@ -0,0 +1,11 @@ +/* + * Test -l/--syscall-limit with --status option. + * + * Copyright (c) 2023 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#define PRINT_VALID 0 +#include "strace--syscall-limit.c" diff --git a/tests/strace--syscall-limit.c b/tests/strace--syscall-limit.c new file mode 100644 index 000000000..590ba6623 --- /dev/null +++ b/tests/strace--syscall-limit.c @@ -0,0 +1,107 @@ +/* + * Test -l/--syscall-limit options. + * + * Copyright (c) 2023 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "tests.h" + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> + +#ifndef PRINT_VALID +# define PRINT_VALID 1 +#endif + +static int +write_status(const char *name, int value) +{ + FILE *fp = fopen(name, "w"); + if (!fp) + perror_msg_and_fail("fopen: %s", name); + if (fprintf(fp, "%d\n", value) <= 0) + perror_msg_and_fail("fprintf: %s", name); + if (fclose(fp)) + perror_msg_and_fail("fclose: %s", name); + fflush(stdout); + return value; +} + +static const char valid_path[] = "."; +static const char invalid_path[] = "invalid.dir"; + +static void +test_chdir(int pid, bool print) +{ + if (chdir(valid_path)) + perror_msg_and_fail("chdir: %s", valid_path); + + if (print) { +#if PRINT_VALID + printf("%-5u chdir(\"%s\") = 0\n", pid, valid_path); +#else + if (chdir(invalid_path) == 0) + error_msg_and_fail("chdir: %s", invalid_path); + printf("%-5u chdir(\"%s\") = %s\n", pid, invalid_path, sprintrc(-1)); +#endif + } else { + if (chdir(invalid_path) == 0) + error_msg_and_fail("chdir: %s", invalid_path); + } +} + +static void +test_rmdir(int pid, bool print) +{ + if (rmdir(invalid_path) == 0) + error_msg_and_fail("rmdir: %s", invalid_path); + if (print) + printf("%-5u rmdir(\"%s\") = %s\n", pid, invalid_path, sprintrc(-1)); +} + +int +main(void) +{ + int pid = getpid(); + + test_chdir(pid, /* print */ true); + + fflush(stdout); + pid_t child = fork(); + if (child < 0) + perror_msg_and_fail("fork"); + + if (child == 0) { + int pid = getpid(); + + test_rmdir(pid, /* print */ true); + test_chdir(pid, /* print */ true); + + /* the tracer is expected to detach at this point */ + + test_rmdir(pid, /* print */ false); + + exit(0); + } + + int status; + while ((waitpid(child, &status, 0)) != child) { + if (errno == EINTR) + continue; + perror_msg_and_fail("waitpid: %d", child); + } + + /* the tracer is expected to detach at this point */ + + test_chdir(pid, /* print */ false); + + return write_status("parent_status", + WIFEXITED(status) ? WEXITSTATUS(status) : 1); +} diff --git a/tests/strace--syscall-limit.test b/tests/strace--syscall-limit.test new file mode 100755 index 000000000..410c24a3d --- /dev/null +++ b/tests/strace--syscall-limit.test @@ -0,0 +1,33 @@ +#!/bin/sh -e +# +# Check -l/--syscall-limit option. +# +# Copyright (c) 2016-2023 The strace developers. +# All rights reserved. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +. "${srcdir=.}/init.sh" + +prog_args="../$NAME" +set -- --syscall-limit=3 --trace='chdir,rmdir' "$@" + +run_prog > /dev/null +echo 0 > exp_status +match_diff exp_status parent_status 'parent_status does not match expectations' +rm parent_status + +run_strace --signal='!SIGCHLD,SIGCONT' --quiet=path-resolution,personality \ + -f -a9 "$@" $prog_args > "$EXP" + +# Do not wait forever, stop waiting +# if the file won't appear after 10 iterations. +attempt=1 +while [ "$attempt" -le 10 ] && [ ! -s 'parent_status' ]; do + $SLEEP_A_BIT + attempt=$((attempt + 1)) +done + +match_diff "$LOG" "$EXP" +match_diff exp_status parent_status 'parent_status does not match expectations' +rm parent_status exp_status |