Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[tesh] cleanups now that it works with IPC::Run
[simgrid.git] / tools / tesh / README
1 This is the TESH tool. It constitutes a testing shell, ie a sort of shell
2 specialized to run tests. The list of actions to take is parsed from files
3 files called testsuite.
4
5 Testsuites syntax
6 -----------------
7 Here is the syntax of these files:
8
9 The kind of each line is given by the first char (the second char should be
10 blank and is ignored):
11
12  `$' command to run in foreground
13  `&' command to run in background
14  `<' input to pass to the command
15  `>' output expected from the command
16  `!' metacommand, which can be one of:
17      `timeout' <integer>|no
18      `expect signal' <signal name>
19      `expect return' <integer>
20      `output' <ignore|display>
21      `setenv <key>=<val>'
22  `p' a string to print
23  `P' a string to print at the CRITICAL level (ease logging grepping)
24
25 If the expected output do not match what the command spits, TESH will produce
26 an error showing the diff (see OUTPUT below).
27
28 Command line arguments
29 ----------------------
30 Tesh accepts several command line arguments:
31   --cd some/directory : ask tesh to switch the working directory before
32                         launching the tests
33   --setenv var=value  : set a specific environment variable
34   --cfg arg           : add parameter --cfg=arg to each command line
35   --enable-coverage   : ignore output lines starting with "profiling:"
36
37 IO orders
38 ---------
39
40 The < and > lines add IO to the command defined in the current block (blocks
41 are separated by blank lines). It is possible to place these lines either after
42 the command or before. The difference between the two following chunks is
43 mainly cosmetic in your testsuites, TESH don't care. (cf IO-orders.tesh)
44
45  $ cat
46  < TOTO
47  > TOTO
48
49  > TOTO
50  $ cat
51  < TOTO
52
53 Nevertheless, it is possible to have several commands in the same block, but
54 none of them can have any output. It may seem a bit restrictive, as one could
55 say that a command gets all the IO until the next command, but I'm afraid of
56 errors such as the following:
57
58  $ cd toto
59  > TOTO
60  $ mkfile file
61
62 TOTO will be passed to the cd command, where the user clearly want to pass it
63 to the mkfile built-in command (see below).
64
65 Stream redirection
66 ------------------
67 Stream redirections (">", "<" and "|" constructs in sh) are not
68 implemented yet in tesh. This is a bit restrictive, but well, patch
69 welcome...
70
71 The situation in which it is mainly problematic is to create a
72 temporary file. The solution is to use the "mkfile" built-in command,
73 as in the following example:
74 $ mkfile myFile
75 > some content
76 > to the file
77
78 This will create a file called myFile (first argument of the mkfile
79 command). Its content will be all the input provided to the command.
80
81 RETURN CODE
82 -----------
83
84 TESH spits an appropriate error message when the child do not return 0 as
85 return code (cf. catch-return.tesh), and returns code+40 itself.
86
87 It is also possible to specify that a given command must return another
88 value. For this, use the "expect return" metacommand, which takes an integer as
89 argument. The change only apply to the next command (cf. set-return.tesh).
90
91 SIGNALS
92 -------
93
94 TESH detects when the child is killed by a signal (like on segfaults), and
95 spits an appropriate error message (cf. catch-signal.tesh).
96
97 It is also possible to specify that a given command must raise a given
98 signal. For this, use the "expect signal" metacommand. It takes the signal name
99 as argument. The change only apply to the next command (cf. set-signal.tesh).
100
101 TIMEOUTS
102 --------
103
104 By default, all commands are given 5 seconds to execute
105 (cf. catch-timeout.tesh). You can change this with the "timeout", which
106 takes an integer as argument. The change only apply to the next command
107 (cf. set-timeout.tesh). If you pass "no" as argument, the command
108 cannot timeout.
109
110 OUTPUT
111 ------
112
113 By default, the commands output is matched against the one expected,
114 and an error is raised on discrepancy. Metacommands to change this:
115  "output ignore"  -> output completely discarded
116  "output display" -> output displayed (but not verified)
117  "output sort"    -> sorts the display before verifying it (see below)
118
119 SORTING OUTPUT
120 --------------
121 Sorting the output seems to be a strange idea, but it is mandatory in
122 SimGrid since the processes run out of order at any scheduling point
123 (ie, every processes ready to run at simulated time t run in
124 parallel). To ensure that the simulator outputs still match, we have
125 to sort the output back before comparing it.
126
127 We expect the simulators to run with that log formatting argument:
128    -log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n
129 Then, tesh sorts string on the 19 first chars only, and is stable when
130 line beginnings are equal. This should ensure that:
131  (1) tesh is effective (no false positive, no false negative)
132  (2) scheduling points are separated from each other
133  (3) at each scheduling point, processes are separated from each other
134  (4) the order of what a given process says at a given scheduling
135      point is preserved.
136
137 This is of course very SimGrid oriented, breaking the generality of
138 tesh, but who cares, actually?
139
140 If you want to change the length of the prefix used for the sort,
141 simply specify it after the output sort directive, like this:
142
143 ! output sort 22
144
145 ENVIRONMENT
146 -----------
147 You can add some content to the tested processes environment with the
148 setenv metacommand. It works as expected. For example:
149   "setenv PATH=/bin"