|
Szabolcs Nagy |
cfa23c |
libc-test is developed as part of the musl project
|
|
Szabolcs Nagy |
cfa23c |
http://www.musl-libc.org/
|
|
nsz |
7308b3 |
|
|
Szabolcs Nagy |
cfa23c |
configuring:
|
|
Szabolcs Nagy |
cfa23c |
edit config.mak
|
|
Szabolcs Nagy |
cfa23c |
build and run tests:
|
|
nsz |
7308b3 |
make
|
|
Szabolcs Nagy |
cfa23c |
clean up:
|
|
Szabolcs Nagy |
cfa23c |
make clean
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
make builds all test binaries and runs them to create
|
|
Szabolcs Nagy |
cfa23c |
a REPORT file that contains all build and runtime errors
|
|
Szabolcs Nagy |
cfa23c |
(this means that make does not stop at build failures)
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
contributing tests:
|
|
nsz |
7308b3 |
|
|
Szabolcs Nagy |
f9c2d6 |
design goals:
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
- tests should be easy to run and build even a single test in isolation
|
|
Szabolcs Nagy |
f9c2d6 |
(so test should be self contained if possible)
|
|
Szabolcs Nagy |
f9c2d6 |
- failure of one test should not interfere with others
|
|
Szabolcs Nagy |
f9c2d6 |
(build failure, crash or unexpected results are all failures)
|
|
Szabolcs Nagy |
cfa23c |
- test output should point to the cause of the failure
|
|
Szabolcs Nagy |
f9c2d6 |
- test results should be robust
|
|
Szabolcs Nagy |
f9c2d6 |
- the test system should have minimal dependency
|
|
Szabolcs Nagy |
f9c2d6 |
(libc, posix sh, gnu make)
|
|
Szabolcs Nagy |
f9c2d6 |
- the test system should run on all archs and libcs
|
|
Szabolcs Nagy |
f9c2d6 |
- tests should leave the system in a clean state
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
conventions:
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
each test is in a separate file at a path like src/directory/file.c with
|
|
Szabolcs Nagy |
cfa23c |
its own main
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
the test should return 0 on success and non-0 on failure, on failure it
|
|
Szabolcs Nagy |
cfa23c |
should print error messages to standard out if possible, on success no
|
|
Szabolcs Nagy |
cfa23c |
message should be printed
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
to help with the above test protocol use t_error function for printing
|
|
Szabolcs Nagy |
cfa23c |
errors and return t_status from main, see src/common/test.h
|
|
Szabolcs Nagy |
cfa23c |
(t_error allows standard printf formatting, outputs at most 512bytes
|
|
Szabolcs Nagy |
cfa23c |
in a single write call to fd 1, so there is no buffering, long outputs
|
|
Szabolcs Nagy |
cfa23c |
are truncated, it sets the global t_status to 1)
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
it is common to do many similar checks in a test, in such cases macros
|
|
Szabolcs Nagy |
cfa23c |
may be used to simplify the code like
|
|
Szabolcs Nagy |
cfa23c |
#define T1(a,b) (check(a,b) || (t_error("check(%s,%s) failed\n", a, b),0))
|
|
Szabolcs Nagy |
cfa23c |
#define T2(f,w) (result=(f), result==(w) || (t_error("%s failed: got %s, want %s\n", #f, result, w),0))
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
directories:
|
|
Szabolcs Nagy |
cfa23c |
|
|
Szabolcs Nagy |
cfa23c |
src/api: interface tests, build time include header tests
|
|
Szabolcs Nagy |
cfa23c |
src/common: common utilities compiled into libtest.a
|
|
Szabolcs Nagy |
cfa23c |
src/functional: functional tests aiming for large coverage of libc
|
|
Szabolcs Nagy |
cfa23c |
src/math: tests for each math function with input-output test vectors
|
|
Szabolcs Nagy |
cfa23c |
src/regression: regression tests aiming for testing particular bugs
|
|
nsz |
7308b3 |
|
|
Szabolcs Nagy |
cfa23c |
initial set of functional tests are derived from the libc-testsuit of
|
|
Szabolcs Nagy |
cfa23c |
Rich Felker, regression tests should contain reference of the bug
|
|
Szabolcs Nagy |
cfa23c |
(musl commit hash, glibc bug tracker url, etc)
|
|
nsz |
7308b3 |
|
|
Szabolcs Nagy |
cfa23c |
build system:
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
the targets src/directory/all and src/directory/clean build and clean
|
|
Szabolcs Nagy |
cfa23c |
only the specified directory, each directory has its own Makefile that
|
|
Szabolcs Nagy |
cfa23c |
invokes the top level make with src/directory/foo for the foo target,
|
|
Szabolcs Nagy |
cfa23c |
so it is possible to work only under a specific test directory
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
the build and runtime errors of each target are accumulated into a
|
|
Szabolcs Nagy |
cfa23c |
target.err file and in the end they are concatenated into a REPORT
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
each .c file in src/functional and src/regression are built into a
|
|
Szabolcs Nagy |
cfa23c |
dynamic linked and a static linked executable test binary by default,
|
|
Szabolcs Nagy |
cfa23c |
this behaviour can be changed by a similarly named .mk file changing
|
|
Szabolcs Nagy |
cfa23c |
make variables and specifying additional rules:
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
$(N) is the name of the binary target (the file name without the .c)
|
|
Szabolcs Nagy |
cfa23c |
$(N)-static is the name of the static binary target
|
|
Szabolcs Nagy |
cfa23c |
$(D) is the directory
|
|
Szabolcs Nagy |
cfa23c |
$(N).CFLAGS are added to the CFLAGS at compilation
|
|
Szabolcs Nagy |
cfa23c |
$(N).LDFLAGS are added to the LDFLAGS at linking
|
|
Szabolcs Nagy |
cfa23c |
$(N).LDLIBS are added to the LDLIBS at linking
|
|
Szabolcs Nagy |
cfa23c |
$(N).BINS are the targets (if empty no binaries are built)
|
|
Szabolcs Nagy |
cfa23c |
$(N).LIBS are the non-executable targets (shared objects may use it)
|
|
Szabolcs Nagy |
f9c2d6 |
|
|
Szabolcs Nagy |
cfa23c |
if a binary is linked together from several .o files then they
|
|
Szabolcs Nagy |
cfa23c |
have to be specified as prerequisits for the binary targets and
|
|
Szabolcs Nagy |
cfa23c |
added to the $(N).LDLIBS as well
|
|
nsz |
7308b3 |
|
|
Szabolcs Nagy |
cfa23c |
if a binary depends on a file at runtime (eg. a .so opened by dlopen)
|
|
Szabolcs Nagy |
cfa23c |
then the $(N).err target should depend on that file
|