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