[PATCH v8 4/5] Implement testing framework for pidns

Dmitry V. Levin ldv at altlinux.org
Sat Aug 15 20:27:26 UTC 2020


On Sun, Aug 09, 2020 at 04:13:05PM +0200, Ákos Uzonyi wrote:
[...]
> --- a/tests/init.sh
> +++ b/tests/init.sh
> @@ -387,6 +387,37 @@ test_prog_set()
>  	test_pure_prog_set "$@" < "$srcdir/$NAME.in"
>  }
>  
> +test_pidns_run_strace()
> +{
> +	local parent_pid
> +
> +	check_prog tail
> +	check_prog cut
> +	check_prog grep
> +
> +	run_prog > /dev/null
> +	run_strace --pidns-translation -f $@ $args > "$EXP"
> +
> +	# filter out logs made by the parent or init process of the pidns test
> +	parent_pid="$(tail -n 2 $LOG | head -n 1 | cut -d' ' -f1)"
> +	init_pid="$(tail -n 1 $LOG | cut -d' ' -f1)"
> +	grep -E -v "^($parent_pid|$init_pid) " "$LOG" > "$OUT"
> +	match_diff "$OUT" "$EXP"
> +}

init_pid also has to be declared as local here.

> +
> +test_pidns()
> +{
> +	# ioctl(NS_GET_PARENT) is added in Linux 4.9
> +	require_min_kernel_version_or_skip 4.9

Is this check still needed given that check_ns_ioctl() already performs
a runtime check?

[...]
> +		if (read(strace_ids_pipe[0], pidns_strace_ids,
> +		    sizeof(pidns_strace_ids)) < 0)
> +			perror_msg_and_fail("read");

If this read call is expected to return sizeof(pidns_strace_ids),
should the return value be tested against that instead?

[...]
> +	if (write(strace_ids_pipe[1], pidns_strace_ids,
> +	    sizeof(pidns_strace_ids)) < 0)
> +		perror_msg_and_fail("write");

Likewise, if this write call is expected to return sizeof(pidns_strace_ids),
should the return value be tested against that instead?

> +static void
> +create_init_process(void)
> +{
> +	int child_pipe[2];
> +	if (pipe(child_pipe) < 0)
> +		perror_msg_and_fail("pipe");
> +
> +	pid_t pid = fork();
> +	if (pid < 0)
> +		perror_msg_and_fail("fork");
> +
> +	if (!pid) {
> +		close(child_pipe[1]);
> +		_exit(read(child_pipe[0], &child_pipe[1], sizeof(int)) == 0);
> +	}
> +
> +	close(child_pipe[0]);
> +}

If nothing is going to be written to child_pipe[1], then this read call is
expected to return 0, followed by _exit(1).  The choice of exit code seems
strange to me.

> +
> +void
> +check_ns_ioctl(void)
> +{
> +	int fd = open("/proc/self/ns/pid", O_RDONLY);
> +	if (fd < 0)
> +		perror_msg_and_fail("opening /proc/self/ns/pid");

What if /proc/self/ns/pid is not available, e.g. /proc is not mounted
or the kernel doesn't implement it?
I suggest to do perror_msg_and_skip instead, at least in case of ENOENT.


-- 
ldv


More information about the Strace-devel mailing list