1# ast nmake interrupt handler tests
2
3INCLUDE test.def
4
5EXIT_USR1=$(( 256 + $(kill -l USR1) ))
6
7TEST 01 'SIGALRM'
8
9	EXEC	--silent
10		INPUT Makefile $'all : a
11a :
12	sleep 11
13FREQ = 2s
14COUNT = 0
15.INIT : .INTERRUPT.INIT
16.INTERRUPT.INIT : .MAKE .VIRTUAL .FORCE
17	alarm $(FREQ)
18.INTERRUPT.ALRM : .MAKE .VIRTUAL .FORCE .REPEAT
19	let COUNT = COUNT + 1
20	print $(<) $(COUNT)
21	alarm $(FREQ)'
22		OUTPUT - $'.INTERRUPT.ALRM 1
23.INTERRUPT.ALRM 2
24.INTERRUPT.ALRM 3
25.INTERRUPT.ALRM 4
26.INTERRUPT.ALRM 5'
27
28	EXEC	--silent FREQ=3s
29		OUTPUT - $'.INTERRUPT.ALRM 1
30.INTERRUPT.ALRM 2
31.INTERRUPT.ALRM 3'
32
33	EXEC	--silent FREQ=5s
34		OUTPUT - $'.INTERRUPT.ALRM 1
35.INTERRUPT.ALRM 2'
36
37TEST 02 'obsolete generic interrupt'
38
39	DO	trap - USR1 USR2 # coshell jobs ignore these
40
41	EXEC	--silent --nojobs STATUS=continue
42		INPUT Makefile $'.INTERRUPT : .MAKE .VIRTUAL .FORCE .REPEAT
43	print $(<:T=M=) : caught signal $(.INTERRUPT)
44	.INTERRUPT := $(STATUS)
45all : USR1 USR2
46USR1 USR2 :
47	kill -$(<) $(.SYSCALL getpid)
48	sleep 2
49.INIT : init
50.DONE : done
51init done : .MAKE .VIRTUAL .FORCE
52	print $(<)'
53		OUTPUT - $'init
54all : USR1 : .INTERRUPT : caught signal USR1
55all : USR2 : .INTERRUPT : caught signal USR2
56done'
57
58	EXEC	--silent --nojobs STATUS=exit
59		OUTPUT - $'init
60all : USR1 : .INTERRUPT : caught signal USR1
61done'
62		EXIT 3
63
64	EXEC	--silent --nojobs STATUS=signal
65		DIAGNOSTICS
66		EXIT $EXIT_USR1
67
68TEST 03 'generic interrupt function'
69
70	EXEC	--silent --nojobs STATUS=continue
71		INPUT Makefile $'.INTERRUPT : .FUNCTION
72	print $(<:T=M=) : caught signal $(%)
73	return $(STATUS)
74all : USR1 USR2
75USR1 USR2 :
76	kill -$(<) $(.SYSCALL getpid)
77	sleep 1
78.INIT : init
79.DONE : done
80init done : .MAKE .VIRTUAL .FORCE
81	print $(<)'
82		OUTPUT - $'init
83all : USR1 : .INTERRUPT : caught signal USR1
84all : USR2 : .INTERRUPT : caught signal USR2
85done'
86
87	EXEC	--silent --nojobs STATUS=exit
88		OUTPUT - $'init
89all : USR1 : .INTERRUPT : caught signal USR1
90done'
91		EXIT 3
92
93	EXEC	--silent --nojobs STATUS=signal
94		DIAGNOSTICS
95		EXIT $EXIT_USR1
96
97TEST 04 'obsolete specific interrupt'
98
99	EXEC	--silent --nojobs STATUS=continue
100		INPUT Makefile $'.INTERRUPT.USR1 .INTERRUPT.USR2 : .MAKE .VIRTUAL .FORCE .REPEAT
101	print $(<:T=M=) : caught signal $(.INTERRUPT)
102	.INTERRUPT := $(STATUS)
103all : USR1 USR2
104USR1 USR2 :
105	kill -$(<) $(.SYSCALL getpid)
106	sleep 1
107.INIT : init
108.DONE : done
109init done : .MAKE .VIRTUAL .FORCE
110	print $(<)'
111		OUTPUT - $'init
112all : USR1 : .INTERRUPT.USR1 : caught signal USR1
113all : USR2 : .INTERRUPT.USR2 : caught signal USR2
114done'
115
116	EXEC	--silent --nojobs STATUS=exit
117		OUTPUT - $'init
118all : USR1 : .INTERRUPT.USR1 : caught signal USR1
119done'
120		EXIT 3
121
122	EXEC	--silent --nojobs STATUS=signal
123		DIAGNOSTICS
124		EXIT $EXIT_USR1
125
126TEST 05 'specific interrupt function'
127
128	EXEC	--silent --nojobs STATUS=continue
129		INPUT Makefile $'.INTERRUPT.USR1 .INTERRUPT.USR2 : .FUNCTION
130	print $(<:T=M=) : caught signal $(%)
131	return $(STATUS)
132all : USR1 USR2
133USR1 USR2 :
134	kill -$(<) $(.SYSCALL getpid)
135	sleep 1
136.INIT : init
137.DONE : done
138init done : .MAKE .VIRTUAL .FORCE
139	print $(<)'
140		OUTPUT - $'init
141all : USR1 : .INTERRUPT.USR1 : caught signal USR1
142all : USR2 : .INTERRUPT.USR2 : caught signal USR2
143done'
144
145	EXEC	--silent --nojobs STATUS=exit
146		OUTPUT - $'init
147all : USR1 : .INTERRUPT.USR1 : caught signal USR1
148done'
149		EXIT 3
150
151	EXEC	--silent --nojobs STATUS=signal
152		DIAGNOSTICS
153		EXIT $EXIT_USR1
154
155TEST 06 'multiple interrupts'
156
157	EXEC	-n
158		INPUT Makefile $'reap.check = 3s
159reset.check = 5m
160.GET : .FUNCTION
161	local I ID
162	ID := $(%:O=1)
163	for I $(%:O>1)
164		if "$(I:A=.EXISTS|.FAILED)"
165			print -u2 $(ID) done $(I)
166		else
167			eval
168			.NOTIFY.$(ID) : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER
169				print -u2 $(ID) done $$(<<)
170			end
171			$(I) : .NOTIFY.$(ID)
172			run $(I)
173		end
174	end
175.REAP : .MAKE .VIRTUAL .FORCE .REPEAT
176	wait -
177	if $(.OUTSTANDING) > 0
178		alarm $(reap.check) .REAP
179	end
180.MAKERUN : .DO.REAP
181.DO.REAP : .MAKE .VIRTUAL .FORCE .REPEAT
182	alarm $(reap.check) .REAP
183.MAKEINIT : .DO.RESET
184.DO.RESET : .MAKE .VIRTUAL .FORCE .REPEAT
185	reset
186	alarm $(reset.check) .DO.RESET
187test : test-1 test-2
188test-1 : .MAKE
189	get 1 x
190	get 2 x y
191	get 3 x y z
192test-2 : .MAKE
193	get 4 x
194	get 5 y
195	get 6 z
196x :
197	sleep 5
198	echo $(<) >&2
199y :
200	sleep 10
201	echo $(<) >&2
202z :
203	sleep 15
204	echo $(<) >&2'
205		OUTPUT - $'+ sleep 5
206+ echo x >&2
207+ sleep 10
208+ echo y >&2
209+ sleep 15
210+ echo z >&2'
211		ERROR - $'1 done x
2122 done x
2132 done y
2143 done x
2153 done y
2163 done z
2174 done x
2185 done y
2196 done z'
220
221	EXEC	--
222		OUTPUT -
223		ERROR - $'+ sleep 5
224+ echo x
225+ 1>& 2
226x
2271 done x
2282 done x
2293 done x
230+ sleep 10
231+ echo y
232+ 1>& 2
233y
2342 done y
2353 done y
2364 done x
2375 done y
238+ sleep 15
239+ echo z
240+ 1>& 2
241z
2423 done z
2436 done z'
244
245TEST 07 'continue after caught interrupt'
246
247	EXEC
248		INPUT Makefile $'CONTINUE = 1
249.INTERRUPT.TERM : .MAKE
250	CONTINUE = 0
251	print interrupt
252.INIT .DONE : .MAKE
253	print $(<)
254action : .MAKE kill
255	print init
256	while CONTINUE
257	end
258	print done
259kill :
260	set +x; { sleep 1; kill -TERM $(.SYSCALL getpid); } >/dev/null 2>&1 &'
261		OUTPUT - $'.INIT
262init
263interrupt
264done
265.DONE'
266