aboutsummaryrefslogtreecommitdiff
path: root/tests/signal.test
blob: 0c3479d132cc081fd9ed7375c96c8813418fb525 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
source [file dirname [info script]]/testing.tcl

needs cmd signal
needs cmd pid
testConstraint try [expr {[info commands try] ne ""}]

test signal-1.1 "catch/throw" {
	signal handle TERM
	set x 1
	set rc [catch -signal {
		signal throw -TERM
		incr x
	} result]
	signal default TERM
	list [info returncode $rc] $result $x
} {signal SIGTERM 1}

test signal-1.2 "catch/kill" {
	signal handle TERM
	set x 1
	set rc [catch -signal {
		kill -TERM [pid]
		incr x
	} result]
	signal default TERM
	list [info returncode $rc] $result $x
} {signal SIGTERM 1}

test signal-1.3 "catch/alarm" {
	signal handle ALRM
	set x 1
	set rc [catch -signal {
		alarm .2
		sleep 1
		incr x
	} result]
	signal default ALRM
	list [info returncode $rc] $result $x
} {signal SIGALRM 1}

test signal-1.4 "multiple signals before catch" {
	signal handle ALRM INT
	kill -INT [pid]
	alarm .2
	sleep 1
	set x 1
	set rc [catch -signal {
		# Doesn't not execute because signals already active
		incr x
	} result]
	signal default ALRM INT
	list [info returncode $rc] [lsort $result] $x
} {signal {SIGALRM SIGINT} 1}

test signal-1.5 "ignored signals" {
	signal handle INT
	signal ignore HUP

	set x 1
	catch -signal {
		# Send an ignored signal
		kill -HUP [pid]
		incr x
		# Now a caught signal
		kill -INT [pid]
		incr x
	} result
	signal default INT TERM
	list [lsort $result] $x
} {SIGINT 2}

test signal-1.6 "check ignored signals" {
	list [signal check SIGINT] [signal check]
} {{} SIGHUP}

test signal-1.7 "clearing ignored signals" {
	signal check -clear
	signal check
} {}

test signal-1.8 "try/signal" try {
	signal handle ALRM
	try -signal {
		alarm 0.8
		foreach i [range 10] {
			sleep 0.2
		}
		set msg ""
	} on signal {msg} {
		# Just set msg here
	} finally {
		alarm 0
	}
	signal default ALRM
	list [expr {$i in {2 3 4}}] $msg
} {1 SIGALRM}

test signal-1.9 {throw an ignored signal} {
	signal ignore SIGTERM
	signal throw SIGTERM
	signal check -clear SIGTERM
} {SIGTERM}

test signal-1.10 {throw with no signal} try {
	# With no arg, signal throw means signal throw SIGINT
	try -signal {
		signal throw
	} on signal msg {
	}
	set msg
} SIGINT

test signal-2.1 {bad signal} -body {
	signal handle NONEXISTENT
} -returnCodes error -result {unknown signal NONEXISTENT}

test signal-2.2 {bad signal} -body {
	signal handle 999999
} -returnCodes error -result {unknown signal 999999}

test signal-2.3 {signal by number} {
	signal handle 2
	signal default 2
} {}

test signal-2.4 {signal block} {
	signal block SIGINT
	signal handle SIGINT
	signal default SIGINT
} {}

test signal-2.5 {signal check invalid} -body {
	signal check NONEXISTENT
} -returnCodes error -result {unknown signal NONEXISTENT}

test signal-2.6 {signal check invalid num} -body {
	signal check 999999
} -returnCodes error -result {unknown signal 999999}

test signal-2.7 {signal throw invalid} -body {
	signal throw NONEXISTENT
} -returnCodes error -result {unknown signal NONEXISTENT}

test signal-2.8 {signal throw invalid num} -body {
	signal throw 999999
} -returnCodes error -result {unknown signal 999999}

test signal-2.9 {signal list} {
	expr {"SIGINT" in [signal default]}
} {1}

test alarm-1.1 {alarm usage} -body {
	alarm
} -returnCodes error -result {wrong # args: should be "alarm seconds"}

test alarm-1.2 {alarm usage} -body {
	alarm too many args
} -returnCodes error -result {wrong # args: should be "alarm seconds"}

test alarm-1.3 {alarm usage} -body {
	alarm badnum
} -returnCodes error -result {expected floating-point number but got "badnum"}

test alarm-1.4 {alarm seconds} {
	alarm 2
	alarm 0
} {}

test sleep-1.1 {sleep usage} -body {
	sleep
} -returnCodes error -result {wrong # args: should be "sleep seconds"}

test sleep-1.2 {sleep usage} -body {
	sleep too many args
} -returnCodes error -result {wrong # args: should be "sleep seconds"}

test sleep-1.3 {sleep usage} -body {
	sleep badnum
} -returnCodes error -result {expected floating-point number but got "badnum"}

test kill-1.1 {kill usage} -body {
	kill
} -returnCodes error -result {wrong # args: should be "kill ?SIG|-0? pid"}

test kill-1.2 {kill usage} -body {
	kill too many args
} -returnCodes error -result {wrong # args: should be "kill ?SIG|-0? pid"}

test kill-1.3 {kill bad signal} -body {
	kill NONEXISTENT [pid]
} -returnCodes error -result {unknown signal NONEXISTENT}

test kill-1.4 {kill -0} {
	kill -0 [pid]
} {}

test kill-1.5 {kill 0 pid} {
	kill 0 [pid]
} {}

test kill-1.6 {kill to invalid process} -body {
	kill 0 9999999
} -returnCodes error -result {kill: Failed to deliver signal}

testreport