3 .\" Manual for the test vector framework
5 .\" (c) 2024 Straylight/Edgeware
8 .\"----- Licensing notice ---------------------------------------------------
10 .\" This file is part of the mLib utilities library.
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.
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.
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,
27 .\"--------------------------------------------------------------------------
28 .so ../defs.man \" @@@PRE@@@
30 .\"--------------------------------------------------------------------------
31 .TH tvec 3mLib "11 March 2024" "Straylight/Edgeware" "mLib utilities library"
33 .\"--------------------------------------------------------------------------
35 tvec \- test vector framework
43 .\"--------------------------------------------------------------------------
46 .B "#include <mLib/tvec.h>"
49 .B "union tvec_misc {"
52 .B " unsigned long u;"
65 .B "union tvec_regval {"
67 .B " unsigned long u;"
70 .B " struct { char *p; size_t sz; } text;"
71 .B " struct { unsigned char *p; size_t sz; } bytes;"
73 .B " unsigned char *p; size_t sz;"
79 .B "struct tvec_reg {"
81 .B " union tvec_regval v;"
83 .B "#define TVRF_LIVE ..."
86 .B "struct tvec_regdef {"
87 .B " const char *name;"
88 .B " const struct tvec_regty *ty;"
91 .B " union tvec_misc arg;"
93 .B "#define TVRF_UNSET ..."
94 .B "#define TVRF_OPT ..."
95 .B "#define TVRF_ID ..."
96 .B "#define TVEC_ENDREGS ..."
98 .B "struct tvec_state;"
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 ,
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;"
112 .B "#define TVEC_ENDTESTS ..."
115 .B "struct tvec_config {"
116 .B " const struct tvec_test *tests;"
117 .B " unsigned nrout, nreg;"
120 .B "struct tvec_output;"
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 );
129 .BI "extern struct tvec_output *tvec_humanoutput(FILE *" fp );
130 .BI "extern struct tvec_output *tvec_tapoutput(FILE *" fp );
131 .BI "extern struct tvec_output *tvec_dfltoutput(FILE *" fp );
134 .\"--------------------------------------------------------------------------
139 header file provides definitions and declarations
140 for the core of mLib's
141 .IR "test vector framework" .
143 The test vector framework is rather large and complicated,
144 so the documentation for it is split into multiple manual pages.
145 This one provides a conceptual overview
146 and describes the essentials for using it to build simple tests.
148 .SS Conceptual overview
151 runs a collection of tests
152 and reports on the outcome.
156 involves exercising some functionality
157 and checking that it behaves properly.
162 the functionality behaved properly.
165 the functionality did not behave properly.
167 .IR "expected failure" :
168 the functionality behaved as expected,
169 but the expected behaviour is known to be incorrect.
172 for some reason, the test couldn't be performed.
174 Tests are gathered together into
176 Each test group has a name.
177 Like a individual tests, test groups also have outcomes:
178 they can pass, fail, or be skipped.
179 A test group cannot experience expected failure.
181 A session may also encounter
183 e.g., as a result of malformed input
184 or failures reported by system facilities.
186 A test session can either
187 be driven from data provided by an input file,
188 or it can be driven by the program alone.
189 The latter case is called
193 This manual page describes file-driven testing.
195 When it begins a session for file-directed testing,
196 the program provides a table of
197 .IR "test definitions" .
198 A test definition has a
201 .IR "test function" ,
203 .IR "test environment" ,
205 .IR "register definitions" .
206 Test environments are explained further below.
210 is a place which can store a single item of test data;
211 registers are the means
212 by which input test data is provided to a test function,
213 and by which a test function returns its results.
214 A test definition's register definitions
215 establish a collection of
218 Each active register has a
224 which are established by its register definition.
225 The register's name is used to refer to the register in the test data file,
226 and its index is used to refer to it
227 in the test function and test environments.
228 The register's type describes the acceptable values for the register,
229 and how they are to be compared,
230 read from the input file,
231 and dumped in diagnostic output.
232 New register types can be defined fairly easily: see
235 A register definition may describe an
240 input registers provide input data to the test function, while
241 output registers collect output data from the test function.
242 The data file provides values for both input and output registers:
243 the values for the input registers are passed to the test function;
244 the values for the output registers are
245 .I "reference outputs"
246 against which the test function's outputs are to be checked.
248 The test function is called with two vectors of registers,
249 one containing input values for the test function to read,
250 and another for output values that the test function should write;
253 provided by the test environment.
254 The test function's task is to exercise the functionality to be tested,
255 providing it the input data from its input registers,
256 and collecting the output in its output registers.
257 It is the responsibility of the test environment or the framework
258 to compare the output register values against reference values
259 provided in the input data.
261 The input file syntax is described in full below.
265 Comments begin with a semicolon character
267 and extend to the end of the line.
270 by headings in square brackets:
274 Each section contains a number of
276 separated by blank lines.
277 Each paragraph consists of one or more
287 When the framework encounters a section heading,
288 it finishes any test group currently in progress,
289 and searches for a test definition whose name matches the
291 name in the section heading.
293 it begins a new test group with the same name.
294 Each paragraph of assignments is used to provide
295 input and reference output values
299 name in an assignment must match the name of an active register;
302 is stored in the named register.
304 A test environment fits in between
305 the framework and the test function.
306 It can establish hook functions which are called
307 at various stages during the test group.
311 hook is called once at the start of the test group.
315 hook is called once at the end of the test group.