]> granicus.if.org Git - strace/blob - tests/detach-stopped.test
Add copyright headers
[strace] / tests / detach-stopped.test
1 #!/bin/sh
2 #
3 # Ensure that strace can detach from stopped processes.
4 #
5 # Copyright (c) 2013-2015 Dmitry V. Levin <ldv@altlinux.org>
6 # Copyright (c) 2014-2017 The strace developers.
7 # All rights reserved.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 # 1. Redistributions of source code must retain the above copyright
13 #    notice, this list of conditions and the following disclaimer.
14 # 2. Redistributions in binary form must reproduce the above copyright
15 #    notice, this list of conditions and the following disclaimer in the
16 #    documentation and/or other materials provided with the distribution.
17 # 3. The name of the author may not be used to endorse or promote products
18 #    derived from this software without specific prior written permission.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 . "${srcdir=.}/init.sh"
32
33 run_prog_skip_if_failed \
34         kill -0 $$
35
36 check_prog sleep
37
38 $STRACE -d -enone / > /dev/null 2> "$LOG"
39 if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
40         skip_ "PTRACE_SEIZE doesn't work"
41 fi
42
43 set -e
44
45 > "$LOG"
46 ../set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
47
48 while ! [ -s "$LOG" ]; do
49         kill -0 $! 2> /dev/null ||
50                 fail_ 'set_ptracer_any sleep failed'
51         $SLEEP_A_BIT
52 done
53
54 tracee_pid=$!
55 kill -STOP $tracee_pid
56
57 cleanup()
58 {
59         set +e
60         kill $tracee_pid
61         kill -CONT $tracee_pid
62         wait $tracee_pid 2> /dev/null
63         return 0
64 }
65
66 > "$LOG"
67 $STRACE -p $tracee_pid 2> "$LOG" &
68
69 while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
70         kill -0 $! 2> /dev/null || {
71                 cleanup
72                 dump_log_and_fail_with "$STRACE -p failed to attach"
73         }
74         $SLEEP_A_BIT
75 done
76
77 while ! grep -F -e '--- stopped by ' "$LOG" > /dev/null; do
78         kill -0 $! 2> /dev/null || {
79                 cleanup
80                 dump_log_and_fail_with "$STRACE -p missed stop notifications"
81         }
82         $SLEEP_A_BIT
83 done
84
85 kill -INT $!
86 wait $!
87
88 grep -F "Process $tracee_pid detached" "$LOG" > /dev/null || {
89         cleanup
90         dump_log_and_fail_with "$STRACE -p failed to detach"
91 }
92
93 if [ -f /proc/self/status ]; then
94         $SLEEP_A_BIT
95         test -d /proc/$tracee_pid || {
96                 cleanup
97                 dump_log_and_fail_with 'tracee died after detach'
98         }
99         grep_pid_status "$tracee_pid" '^State:.*T (stopped)' > /dev/null || {
100                 grep_pid_status "$tracee_pid" '^State:'
101                 cleanup
102                 dump_log_and_fail_with 'tracee is not group-stopped after detach'
103         }
104 fi
105
106 cleanup
107 exit 0