@@@ fltfmt mess
[mLib] / test / tvec.3.in
CommitLineData
c4ccbbf9
MW
1.\" -*-nroff-*-
2.\"
3.\" Manual for the test vector framework
4.\"
5.\" (c) 2024 Straylight/Edgeware
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
10.\" This file is part of the mLib utilities library.
11.\"
12.\" mLib is free software: you can redistribute it and/or modify it under
13.\" the terms of the GNU Library General Public License as published by
14.\" the Free Software Foundation; either version 2 of the License, or (at
15.\" your option) any later version.
16.\"
17.\" mLib is distributed in the hope that it will be useful, but WITHOUT
18.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
20.\" License for more details.
21.\"
22.\" You should have received a copy of the GNU Library General Public
23.\" License along with mLib. If not, write to the Free Software
24.\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
25.\" USA.
26.
27.\"--------------------------------------------------------------------------
28.so ../defs.man \" @@@PRE@@@
29.
30.\"--------------------------------------------------------------------------
31.TH tvec 3mLib "11 March 2024" "Straylight/Edgeware" "mLib utilities library"
c4ccbbf9
MW
32.\" @tvec_begin
33.\" @tvec_end
34.\" @tvec_read
35.\" @tvec_humanoutput
36.\" @tvec_tapoutput
37.\" @tvec_dfltoutput
38.
39.\"--------------------------------------------------------------------------
b1a20bee
MW
40.SH NAME
41tvec \- test vector framework
42.
43.\"--------------------------------------------------------------------------
c4ccbbf9
MW
44.SH SYNOPSIS
45.nf
46.B "#include <mLib/tvec.h>"
47.PP
48.ta 2n
49.B "union tvec_misc {"
50.B " const void *p;"
51.B " long i;"
52.B " unsigned long u;"
53.B " double f;"
54.B "};"
55.B "enum {"
56.B " TVMISC_PTR,"
57.B " TVMISC_INT,"
58.B " TVMISC_UINT,"
59.B " TVMISC_FLT,"
60.B " ...,"
61.B " TVMISC_LIMIT,"
62.B "};"
63.PP
64.ta 2n +2n
65.B "union tvec_regval {"
66.B " long i;"
67.B " unsigned long u;"
68.B " void *p;"
69.B " double f;"
70.B " struct { char *p; size_t sz; } text;"
71.B " struct { unsigned char *p; size_t sz; } bytes;"
72.B " struct {"
73.B " unsigned char *p; size_t sz;"
74.B " size_t a, m;"
75.B " size_t off;"
76.B " } buf;"
77.B " TVEC_REGSLOTS"
78.B "};"
79.B "struct tvec_reg {"
80.B " unsigned f;"
81.B " union tvec_regval v;"
82.B "};"
83.B "#define TVRF_LIVE ..."
84.PP
85.ta 2n
86.B "struct tvec_regdef {"
87.B " const char *name;"
88.B " const struct tvec_regty *ty;"
89.B " unsigned i;"
90.B " unsigned f;"
91.B " union tvec_misc arg;"
92.B "};"
93.B "#define TVRF_UNSET ..."
94.B "#define TVRF_OPT ..."
95.B "#define TVRF_ID ..."
96.B "#define TVEC_ENDREGS ..."
97.PP
98.B "struct tvec_state;"
99.PP
100.B "struct tvec_env;"
101.ta \w'\fBtypedef void tvec_testfn('u
102.BI "typedef void tvec_testfn(const struct tvec_reg *" in ,
103.BI " struct tvec_reg *" out ,
104.BI " void *" ctx );
105.ta 2n
106.B "struct tvec_test {"
107.B " const char *name;"
108.B " const struct tvec_regdef *regs;"
109.B " const struct tvec_env *env;"
110.B " tvec_testfn *fn;"
111.B "};"
112.B "#define TVEC_ENDTESTS ..."
113.PP
114.ta 2n
115.B "struct tvec_config {"
116.B " const struct tvec_test *tests;"
117.B " unsigned nrout, nreg;"
118.B " size_t regsz;"
119.B "};"
120.B "struct tvec_output;"
121.PP
122.ta \w'\fBvoid tvec_begin('u
123.BI "void tvec_begin(struct tvec_state *" tv_out ,
124.BI " const struct tvec_config *" config ,
125.BI " struct tvec_output *" o );
126.BI "int tvec_end(struct tvec_state *" tv );
127.BI "int tvec_read(struct tvec_state *" tv ", const char *" infile ", FILE *" fp );
128.PP
129.BI "extern struct tvec_output *tvec_humanoutput(FILE *" fp );
5c0f2e08 130.BI "extern struct tvec_output *tvec_machineoutput(FILE *" fp );
c4ccbbf9
MW
131.BI "extern struct tvec_output *tvec_tapoutput(FILE *" fp );
132.BI "extern struct tvec_output *tvec_dfltoutput(FILE *" fp );
133.fi
134.
135.\"--------------------------------------------------------------------------
136.SH DESCRIPTION
137.
138The
139.B <mLib/tvec.h>
140header file provides definitions and declarations
141for the core of mLib's
142.IR "test vector framework" .
143.PP
144The test vector framework is rather large and complicated,
145so the documentation for it is split into multiple manual pages.
146This one provides a conceptual overview
147and describes the essentials for using it to build simple tests.
148.
149.SS Conceptual overview
150A
151.I "test session"
152runs a collection of tests
153and reports on the outcome.
154.PP
155A
156.I test
157involves exercising some functionality
158and checking that it behaves properly.
159A test can have four
160.IR outcomes .
161It can
162.IR pass :
163the functionality behaved properly.
164It can
165.IR fail :
166the functionality did not behave properly.
167It can experience an
168.IR "expected failure" :
169the functionality behaved as expected,
170but the expected behaviour is known to be incorrect.
171Or it can be
172.IR skipped :
173for some reason, the test couldn't be performed.
174.PP
175Tests are gathered together into
176.IR "test groups" .
177Each test group has a name.
178Like a individual tests, test groups also have outcomes:
179they can pass, fail, or be skipped.
180A test group cannot experience expected failure.
181.PP
182A session may also encounter
183.IR errors ,
184e.g., as a result of malformed input
185or failures reported by system facilities.
186.PP
187A test session can either
188be driven from data provided by an input file,
189or it can be driven by the program alone.
190The latter case is called
191.I "ad-hoc testing",
192and is described in
193.BR tvec-adhoc (3).
194This manual page describes file-driven testing.
195.PP
196When it begins a session for file-directed testing,
197the program provides a table of
198.IR "test definitions" .
199A test definition has a
200.IR name ,
201and also specifies a
202.IR "test function" ,
203a
204.IR "test environment" ,
205and a table of
206.IR "register definitions" .
207Test environments are explained further below.
208.PP
209A
210.I register
211is a place which can store a single item of test data;
212registers are the means
213by which input test data is provided to a test function,
214and by which a test function returns its results.
215A test definition's register definitions
216establish a collection of
217.I active
218registers.
219Each active register has a
220.IR name ,
221an
222.IR index ,
223and a
224.IR type ,
225which are established by its register definition.
226The register's name is used to refer to the register in the test data file,
227and its index is used to refer to it
228in the test function and test environments.
229The register's type describes the acceptable values for the register,
230and how they are to be compared,
231read from the input file,
232and dumped in diagnostic output.
233New register types can be defined fairly easily: see
234.BR tvec_tyimpl (3)
235for the details.
236A register definition may describe an
237.I input
238register or an
239.I output
240register:
241input registers provide input data to the test function, while
242output registers collect output data from the test function.
243The data file provides values for both input and output registers:
244the values for the input registers are passed to the test function;
245the values for the output registers are
246.I "reference outputs"
247against which the test function's outputs are to be checked.
248.PP
249The test function is called with two vectors of registers,
b1a20bee
MW
250one containing input values for the test function to read
251and also reference output values,
c4ccbbf9
MW
252and another for output values that the test function should write;
253and a
254.I context
255provided by the test environment.
256The test function's task is to exercise the functionality to be tested,
257providing it the input data from its input registers,
258and collecting the output in its output registers.
259It is the responsibility of the test environment or the framework
260to compare the output register values against reference values
261provided in the input data.
262.PP
263The input file syntax is described in full below.
264In overview, it is a
265.BR .ini -style
266file.
267Comments begin with a semicolon character
268.RB ` ; ',
269and extend to the end of the line.
270It is divided into
271.I sections
272by headings in square brackets:
273.IP
274.BR [ test ]
275.PP
276Each section contains a number of
277.I paragraphs
278separated by blank lines.
279Each paragraph consists of one or more
280.I assignments
281of the form
282.IP
283.IB reg " = " value
284.PP
285or
286.IP
287.IB reg ": " value
288.PP
289When the framework encounters a section heading,
290it finishes any test group currently in progress,
291and searches for a test definition whose name matches the
292.I test
293name in the section heading.
294If it finds a match,
295it begins a new test group with the same name.
296Each paragraph of assignments is used to provide
297input and reference output values
298for a single test.
299The
300.I reg
b1a20bee
MW
301name in an assignment must match the name
302of an active register or a
303.I "special variable" ;
c4ccbbf9
MW
304the corresponding
305.I value
b1a20bee
MW
306is stored in the named register or variable.
307.PP
308A register which has been assigned a value is said to be
309.IR live ;
310otherwise, it is
311.IR dead .
312By default, every active register must be live for a test to proceed;
313but a register definition can mark its register as
314.I optional
315or
316.IR may-be-unset .
317An optional register need not be assigned a value explicitly;
318instead, the register is left dead.
319A may-be-unset register must be mentioned,
320but a distinctive syntax
321.IP
322.IB reg " *"
323.PP
324(with no colon or equals sign)
325says that the register should be left dead.
326Optional registers are suitable for cases where
327there is an obvious default value
328which would otherwise be mentioned frequently in input files.
329May-be-unset registers are mostly useful as outputs,
330where the output is not always set,
331e.g., in error cases,
332but where omitting a value in the usual case is likely a mistake.
c4ccbbf9 333.PP
6e683a79
MW
334A test environment fits in between
335the framework and the test function.
336It can establish hook functions which are called
b1a20bee
MW
337at various points throughout a test group
338(at the start and and, and before and after each test).
339It can define special variables
340which can be set from the input file using assignments.
341And, finally, it can take on the responsibility
342of running the test function.
343The registers will have been set up already,
344based on the assignments in the input file,
345but the environment can modify them.
346It must also check the test function's output
347against the reference values,
348though there are functions provided for doing this.
349The environment can choose to run the test function once,
350multiple times, or, indeed, not at all.
351When it calls the test function, it can provide a context pointer,
352with whatever additional information might be useful:
353this usually involves coordination
354between the environment and the test function.
355It is the test environment's responsibility
356to check the outputs returned by the test function
357and to report on mismatches,
358but there are functions provided by the framework
359to do the heavy lifting.
360.PP
361The following are examples of what test environments can do.
6e683a79 362.hP \*o
b1a20bee
MW
363It can fill in default values for optional dead registers.
364For example, if a function returnns error codes,
365then you can save reptition in the input file
366by marking the error-code output register optional
367and letting it default to the `success' value in a test environment.
368.hP \*o
369It can run the test function mulitple times.
370For example, a test of functions like
371.BR strcmp (3)
372might run the test twice,
373first with its operands as supplied by the input file,
374and then again with the operands swapped
375and the opposite expected result.
376A test for bignum addition could verify commutativity
377by checking both that
378.IR x "\ + \ " y "\ =\ " z
379and that
380.IR y "\ + \ " x "\ =\ " z \fR.
381Similarly, a subtraction test could check both that
382.IR x "\ \- \ " y "\ =\ " z
383and that
384.IR y "\ \- \ " x "\ =\ \-" z \fR.
6e683a79
MW
385.hP \*o
386The
b1a20bee
MW
387.BR tvec-remote (3),
388.BR tvec-timeout (3),
389and
390.BR tvec-bench (3)
391extensions all slot in as test environments.
392Sadly,
393.BR tvec-bench (3)
394requires support from the output protocol
395in order to format benchmark results properly;
396apart from that,
397these three facilities are pure extensions