
The library is normally tested using several tools, which are described below.

Each commit must pass at least the behaviour and stress tests successfully,
invasive commits must be tested with the ones that are most likely affected by
it, and releases must be checked with all the tests.

In any case, remember that testing is not a replacement for careful code
inspection.


Behaviour tests:
  Check how the library behaves in different situations, from basic ones to
  weird crash scenarios, using fault injection. They can be found in the
  behaviour/ directory.

Stress test:
  It's a randomized stress test that performs different transactions and
  checks the result was the one expected. Can also run with randomized fault
  injection both in libjio's predetermined points and in POSIX functions. It
  can be found in the stress/ directory.

Performance tests:
  Check the performance of simple operations like streaming and randomized
  writes. Not the most interesting tests, but can be useful for profiling.

Valgrind:
  Run the other tests under valgrind and see there are no libjio-related
  issues. Performance tests are the easier ones, sadly behaviour and stress
  tests are more painful because Python makes valgrind emit lots of warnings,
  but it's definitely worth the effort and should be done frequently.

Code coverage:
  Use gcov and lcov to check that the behaviour and stress tests cover most of
  the code. Currently, it's over 90%, and it shouldn't go down. However, this
  test shouldn't be given more relevance that the one it deserves, since it's
  mostly useful to see if we're missing some real scenario in the other tests.

Profiling:
  Use kcachegrind and prof (the Linux Kernel tool) to check for suspicious
  bottlenecks.

Static checkers:
  Build using sparse (make CC=cgcc) and clang (make CC=ccc), and run cppcheck.

Portability:
  Build in some different architectures. At least Linux and some BSD must
  be checked before releases.


