• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-or-later
3# Copyright (c) 2008 FUJITSU LIMITED
4# Copyright (c) 2021 Joerg Vehlow <joerg.vehlow@aox-tech.de>
5# Copyright (c) 2021 Petr Vorel <pvorel@suse.cz>
6#
7# Author: Li Zefan <lizf@cn.fujitsu.com>
8#
9# Process event connector is a netlink connector that reports process events
10# to userspace. It sends events such as fork, exec, id change and exit.
11
12TST_OPTS="n:"
13TST_SETUP=setup
14TST_TESTFUNC=test
15TST_PARSE_ARGS=parse_args
16TST_USAGE=usage
17TST_NEEDS_ROOT=1
18TST_NEEDS_TMPDIR=1
19TST_TEST_DATA="fork exec exit uid gid"
20
21. tst_test.sh
22
23num_events=10
24
25usage()
26{
27	cat << EOF
28usage: $0 [-n <nevents>]
29
30OPTIONS
31-n      The number of evetns to generate per test (default 10)
32EOF
33}
34
35parse_args()
36{
37	case $1 in
38	n) num_events=$2;;
39	esac
40}
41
42# Find a free file handle
43free_fd()
44{
45	local fd
46
47	for fd in $(seq 200); do
48		# Sapwn a new sh, because redirecting to a non existing file handle
49		# will trigger a syntax error.
50		sh -c ": 2>/dev/null >&$fd || : 2>/dev/null <&$fd" 2>/dev/null
51		if [ $? -ne 0 ]; then
52			echo $fd
53			return
54		fi
55	done
56}
57
58setup()
59{
60	if ! grep -q cn_proc /proc/net/connector; then
61		tst_brk TCONF "Process Event Connector is not supported or kernel < 2.6.26"
62	fi
63
64	tst_res TINFO "Test process events connector"
65}
66
67test()
68{
69	local event=$2
70	local expected_events lis_rc pid fd_act failed act_nevents exp act
71
72	tst_res TINFO "Testing $2 event (nevents=$num_events)"
73
74	pec_listener >lis_$event.log 2>lis_$event.err &
75	pid=$!
76	# wait for pec_listener to start listening
77	tst_sleep 100ms
78
79	ROD event_generator -n $num_events -e $event \>gen_$event.log 2\>gen_$event.err
80
81	kill -s INT $pid 2> /dev/null
82	wait $pid
83	lis_rc=$?
84
85	if [ ! -s gen_$event.log ]; then
86		tst_brk TBROK "failed to generate process events: $(cat gen_$event.err)"
87	fi
88
89	if [ $lis_rc -ne 0 ]; then
90		tst_brk TBROK "failed to execute the listener: $(cat lis_$event.err)"
91	fi
92
93	# The listener writes the same messages as the generator, but it can
94	# also see more events (e.g. for testing exit, a fork is generated).
95	# So: The events generated by the generator have to be in the same order
96	# as the events printed by the listener, but my interleaved with other
97	# messages. To correctly compare them, we have to open both logs
98	# and iterate over both of them at the same time, skipping messages
99	# in the listener log, that are not of interest.
100	# Because some messages may be multiple times in the listener log,
101	# we have to open it only once!
102	# This however does not check, if the listener sees more messages,
103	# than expected.
104
105	fd_act=$(free_fd)
106	[ -z "$fd_act" ] && tst_brk TBROK "No free filehandle found"
107	eval "exec ${fd_act}<lis_$event.log"
108
109	failed=0
110	act_nevents=0
111	while read -r exp; do
112		local found=0
113		act_nevents=$((act_nevents + 1))
114		while read -r act; do
115			if [ "$exp" = "$act" ]; then
116				found=1
117				break
118			fi
119		done <&${fd_act}
120		if [ $found -ne 1 ]; then
121			failed=1
122			tst_res TFAIL "Event was not detected by the event listener: $exp"
123			break
124		fi
125	done <gen_$event.log
126
127	eval "exec ${fd_act}<&-"
128
129	if [ $failed -eq 0 ]; then
130		if [ $act_nevents -ne $num_events ]; then
131			tst_res TBROK "Expected $num_events, but $act_nevents generated"
132		else
133			tst_res TPASS "All events detected"
134		fi
135	else
136		# TFAIL message is already printed in the loop above
137		cat lis_$event.log
138	fi
139}
140
141tst_run
142