1#!/usr/bin/env perl
2
3#
4#  A driver program to test DBUG features - runs tests (shell commands)
5#  from the end of file to invoke tests.c, which does the real dbug work.
6#
7
8use Test::More;
9
10$exe=$0;
11
12die unless $exe =~ s/(tests)-t(\.exe)?$/$1$2 /;
13
14# load tests
15@tests=();
16while (<DATA>) {
17  if (/^% \.\/tests /) {
18    push @tests, [ $' ]
19  } elsif (/^#/) {
20    next;
21  } else {
22    push @{$tests[$#tests]}, $_
23  }
24}
25
26plan skip_all => "because dbug is disabled" if system $exe;
27
28plan tests => scalar(@tests);
29
30for (@tests) {
31  $t=$exe . shift @$_;
32  chomp($t);
33  open F, '-|',  $t or die "open($t|): $!";
34  local $";
35  $out=join($", <F>); close(F);
36  # special cases are handled here:
37  $out =~ s/Memory: 0x[0-9A-Fa-f]+/Memory: 0x####/g if $t =~ /dump/;
38  # compare ("\n" at the beginning makes better output in case of errors)
39  is("\n$out","\n@$_", $t);
40}
41
42__DATA__
43% ./tests -#d
44func2: info: s=ok
45=> execute
46=> evaluate: ON
47=> evaluate_if: OFF
48main: explain: dbug explained: d
49func2: info: s=ok
50% ./tests d,ret3
51=> evaluate: OFF
52=> evaluate_if: OFF
53#
54## Testing negative lists
55#
56% ./tests d:-d,ret3
57func2: info: s=ko
58=> execute
59=> evaluate: ON
60=> evaluate_if: OFF
61main: explain: dbug explained: d:-d,ret3
62func2: info: s=ko
63% ./tests t:-d,ret3
64>main
65| >func1
66| | >func2
67| | | >func3
68| | | <func3
69| | <func2
70| <func1
71=> evaluate: OFF
72=> evaluate_if: OFF
73| >func2
74| | >func3
75| | <func3
76| <func2
77<main
78% ./tests t:d,info:-d,ret3
79>main
80| >func1
81| | >func2
82| | | >func3
83| | | <func3
84| | | info: s=ko
85| | <func2
86| <func1
87=> evaluate: OFF
88=> evaluate_if: OFF
89| >func2
90| | >func3
91| | <func3
92| | info: s=ko
93| <func2
94<main
95% ./tests t:d,info:-d,ret3:-f,func2
96>main
97| >func1
98| | | >func3
99| | | <func3
100| <func1
101=> evaluate: OFF
102=> evaluate_if: OFF
103| | >func3
104| | <func3
105<main
106% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate
107=> evaluate: ON
108=> evaluate_if: OFF
109% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate_if
110=> evaluate: OFF
111=> evaluate_if: ON
112% ./tests t:d:-d,ret3:-f,func2 d,evaluate_if
113=> evaluate: OFF
114=> evaluate_if: ON
115% ./tests t:d:-d,ret3:-f,func2
116>main
117| >func1
118| | | >func3
119| | | <func3
120| <func1
121=> execute
122=> evaluate: ON
123=> evaluate_if: OFF
124| explain: dbug explained: d:-d,ret3:f:-f,func2:t
125| | >func3
126| | <func3
127<main
128#
129## Adding incremental settings to the brew
130#
131% ./tests t:d:-d,ret3:-f,func2 +d,evaluate_if
132>main
133| >func1
134| | | >func3
135| | | <func3
136| <func1
137=> evaluate: OFF
138=> evaluate_if: ON
139| | >func3
140| | <func3
141<main
142#
143## DBUG_DUMP
144#
145% ./tests t:d:-d,ret3:f:-f,func2 +d,dump
146>main
147| >func1
148| | | >func3
149| | | <func3
150| <func1
151| dump: Memory: 0x####  Bytes: (27)
15264 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
15374
154=> evaluate: OFF
155=> evaluate_if: OFF
156| | >func3
157| | <func3
158<main
159% ./tests t:d:-d,ret3:f:-f,func2 +d,dump
160>main
161| >func1
162| | | >func3
163| | | <func3
164| <func1
165| dump: Memory: 0x####  Bytes: (27)
16664 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
16774
168=> evaluate: OFF
169=> evaluate_if: OFF
170| | >func3
171| | <func3
172<main
173% ./tests t:d:-d,ret3:f:-f,func2:+d,dump
174>main
175| >func1
176| | | >func3
177| | | <func3
178| <func1
179| dump: Memory: 0x####  Bytes: (27)
18064 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
18174
182=> evaluate: OFF
183=> evaluate_if: OFF
184| | >func3
185| | <func3
186<main
187% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain
188>main
189| >func1
190| | | >func3
191| | | <func3
192| <func1
193| dump: Memory: 0x####  Bytes: (35)
19464 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
19566 2C 66 75 6E 63 32 3A 74
196=> evaluate: OFF
197=> evaluate_if: OFF
198| explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:t
199| | >func3
200| | <func3
201<main
202% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain:P
203dbug: >main
204dbug-tests: | >func1
205dbug-tests: | | | >func3
206dbug-tests: | | | <func3
207dbug-tests: | <func1
208dbug-tests: | dump: Memory: 0x####  Bytes: (37)
20964 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
21066 2C 66 75 6E 63 32 3A 50 3A 74
211=> evaluate: OFF
212=> evaluate_if: OFF
213dbug-tests: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:P:t
214dbug-tests: | | >func3
215dbug-tests: | | <func3
216dbug-tests: <main
217% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain:P:F
218dbug:        tests.c: >main
219dbug-tests:        tests.c: | >func1
220dbug-tests:        tests.c: | | | >func3
221dbug-tests:        tests.c: | | | <func3
222dbug-tests:        tests.c: | <func1
223dbug-tests:        tests.c: | dump: Memory: 0x####  Bytes: (39)
22464 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
22566 2C 66 75 6E 63 32 3A 46 3A 50 3A 74
226=> evaluate: OFF
227=> evaluate_if: OFF
228dbug-tests:        tests.c: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:F:P:t
229dbug-tests:        tests.c: | | >func3
230dbug-tests:        tests.c: | | <func3
231dbug-tests:        tests.c: <main
232#
233## DBUG_EXPLAIN, DBUG_PUSH, DBUG_POP, DBUG_SET
234#
235% ./tests t:d:-d,ret3:f:-f,func2
236>main
237| >func1
238| | | >func3
239| | | <func3
240| <func1
241=> execute
242=> evaluate: ON
243=> evaluate_if: OFF
244| explain: dbug explained: d:-d,ret3:f:-f,func2:t
245| | >func3
246| | <func3
247<main
248% ./tests t:d:-d,ret3
249>main
250| >func1
251| | >func2
252| | | >func3
253| | | <func3
254| | | info: s=ko
255| | <func2
256| <func1
257=> execute
258=> evaluate: ON
259=> evaluate_if: OFF
260| explain: dbug explained: d:-d,ret3:t
261| >func2
262| | >func3
263| | <func3
264| | info: s=ko
265| <func2
266<main
267% ./tests d,info:-d,ret3:d,push
268func2: info: s=ko
269=> evaluate: OFF
270=> evaluate_if: OFF
271| >func2
272| | >func3
273| | <func3
274| | info: s=ko
275| <func2
276<main
277% ./tests d,info:-d,ret3:d,push,explain
278func2: info: s=ko
279=> evaluate: OFF
280=> evaluate_if: OFF
281| explain: dbug explained: d,info,push,explain:-d,ret3:t
282| >func2
283| | >func3
284| | <func3
285| | info: s=ko
286| <func2
287<main
288% ./tests d,info:-d,ret3:d,explain
289func2: info: s=ko
290=> evaluate: OFF
291=> evaluate_if: OFF
292main: explain: dbug explained: d,info,explain:-d,ret3
293func2: info: s=ko
294% ./tests d,info:-d,ret3:d,explain,pop
295func2: info: s=ko
296=> evaluate: OFF
297=> evaluate_if: OFF
298% ./tests d,info:-d,ret3:d,explain t:d,pop
299>main
300| >func1
301| | >func2
302| | | >func3
303| | | <func3
304| | <func2
305| <func1
306=> evaluate: OFF
307=> evaluate_if: OFF
308main: explain: dbug explained: d,info,explain:-d,ret3
309func2: info: s=ko
310% ./tests d,info:-d,ret3:d,explain,pop +t
311>main
312| >func1
313| | >func2
314| | | >func3
315| | | <func3
316| | | info: s=ko
317| | <func2
318| <func1
319=> evaluate: OFF
320=> evaluate_if: OFF
321main: explain: dbug explained: d,info,explain,pop:-d,ret3
322func2: info: s=ko
323% ./tests d,info:-d,ret3:d,explain,set
324func2: info: s=ko
325=> evaluate: OFF
326=> evaluate_if: OFF
327       tests.c: main: explain: dbug explained: d,info,explain,set:-d,ret3:F
328       tests.c: func2: info: s=ko
329% ./tests d,info:-d,ret3:d,explain,set:t
330>main
331| >func1
332| | >func2
333| | | >func3
334| | | <func3
335| | | info: s=ko
336| | <func2
337| <func1
338=> evaluate: OFF
339=> evaluate_if: OFF
340       tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
341       tests.c: | >func2
342       tests.c: | | >func3
343       tests.c: | | <func3
344       tests.c: | | info: s=ko
345       tests.c: | <func2
346       tests.c: <main
347% ./tests t d,info:-d,ret3:d,explain,set:t
348>main
349| >func1
350| | >func2
351| | | >func3
352| | | <func3
353| | | info: s=ko
354| | <func2
355| <func1
356=> evaluate: OFF
357=> evaluate_if: OFF
358       tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
359       tests.c: | >func2
360       tests.c: | | >func3
361       tests.c: | | <func3
362       tests.c: | | info: s=ko
363       tests.c: | <func2
364       tests.c: <main
365% ./tests t d,info:-d,ret3:d,explain,set,pop
366func2: info: s=ko
367=> evaluate: OFF
368=> evaluate_if: OFF
369| >func2
370| | >func3
371| | <func3
372| <func2
373<main
374% ./tests t:f,func2
375| | >func2
376| | <func2
377=> evaluate: OFF
378=> evaluate_if: OFF
379| >func2
380| <func2
381#
382## Testing SUBDIR rules
383#
384% ./tests t:-f,func2/:d
385>main
386| >func1
387| <func1
388=> execute
389=> evaluate: ON
390=> evaluate_if: OFF
391| explain: dbug explained: d:f:-f,func2/:t
392<main
393% ./tests t:f,func1/:d
394| >func1
395| | >func2
396| | | >func3
397| | | <func3
398| | | info: s=ok
399| | <func2
400| <func1
401=> evaluate: OFF
402=> evaluate_if: OFF
403% ./tests t:f,main/:d,pop
404>main
405| >func1
406| | >func2
407| | | >func3
408| | | <func3
409| | <func2
410| <func1
411=> evaluate: OFF
412=> evaluate_if: OFF
413% ./tests f,main/:d,push
414=> evaluate: OFF
415=> evaluate_if: OFF
416| >func2
417| | >func3
418| | <func3
419| <func2
420<main
421#
422## Testing FixTraceFlags() - when we need to traverse the call stack
423# (these tests fail with FixTraceFlags() disabled)
424#
425# delete the INCLUDE rule up the stack
426% ./tests t:f,func1/ --push1=t:f,func3/
427| >func1
428| | >func2
429| | | >func3
430| | | <func3
431| | <func2
432=> push1
433=> evaluate: OFF
434=> evaluate_if: OFF
435| | >func3
436| | <func3
437# delete the EXCLUDE rule up the stack
438% ./tests t:-f,func1/ --push1=t
439>main
440=> push1
441| <func1
442=> evaluate: OFF
443=> evaluate_if: OFF
444| >func2
445| | >func3
446| | <func3
447| <func2
448<main
449# add the INCLUDE rule up the stack
450% ./tests t:f,func3 --push1=t:f,main/
451| | | >func3
452| | | <func3
453=> push1
454| <func1
455=> evaluate: OFF
456=> evaluate_if: OFF
457| >func2
458| | >func3
459| | <func3
460| <func2
461<main
462# add the EXCLUDE rule up the stack
463% ./tests t --push1=t:-f,main/
464>main
465| >func1
466| | >func2
467| | | >func3
468| | | <func3
469| | <func2
470=> push1
471=> evaluate: OFF
472=> evaluate_if: OFF
473# change the defaults
474% ./tests t:f,func3 --push1=t
475| | | >func3
476| | | <func3
477=> push1
478| <func1
479=> evaluate: OFF
480=> evaluate_if: OFF
481| >func2
482| | >func3
483| | <func3
484| <func2
485<main
486# repeated keyword
487% ./tests d:-d,info,info
488=> execute
489=> evaluate: ON
490=> evaluate_if: OFF
491main: explain: dbug explained: d:-d,info
492% ./tests d:-d,info/,info
493=> execute
494=> evaluate: ON
495=> evaluate_if: OFF
496main: explain: dbug explained: d:-d,info/
497