| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- Regression test suite for cairo.
- How to use cairo's test suite
- =============================
- Using this test should be as simple as running:
- make test
- assuming that the cairo distribution in the directory above has been
- configured and built. The test suite here goes through some effort to
- run against the locally compiled library rather than any installed
- version, but those efforts may fall short depending on the level of your
- libtool madness.
- The results of the test suite run are summarized in an index.html
- file, which, when viewed in a web browser makes it quite easy to
- visually see any failed renderings alongside the corresponding
- reference image, (and a diff image as well).
- The test suite needs to be run before any code is committed and before
- any release. See below for hints and rules governing the use of the suite.
- The test suite is built as a single binary, which allows you to choose
- individual or categories of tests to run. For example, if you want to
- run all text related tests you can use:
- ./cairo-test-suite text
- Or if you want to check the current status of known failures:
- ./cairo-test-suite XFAIL
- Or to run a subset of tests, use the -k option to run only the tests
- that include the given keyword:
- ./cairo-test-suite -k downscale
- The binary also permits controlling which backend is used via the
- CAIRO_TEST_TARGET environment variable, so for instance:
- CAIRO_TEST_TARGET=gl ./cairo-test-suite -k blur
- This binary should be backwards-compatible with all library versions,
- allowing you to compare current versus past behaviour for any test.
- Tailoring tests running
- -----------------------
- There are some mechanisms to limit the tests run during "make test".
- These come very handy when doing development, but should not be used
- to circumvent the "pass" requirements listed below.
- make's TARGETS environment variable can be used to limit the backends when
- running the tests. It should contain a (space-, comma-separated) list of
- backends. CAIRO_TESTS environment variable, which is a comma-, space-seperated
- lists, can be used to limit the tests run.
- For example:
- CAIRO_TESTS="zero-alpha" make test TARGETS=image,ps
- make's FORMAT variable can also be used to limit the content formats when
- running the tests. It should contain a (space-, comma-separated) list of
- content formats to test.
- For example:
- CAIRO_TESTS="zero-alpha" make test TARGETS=image,ps FORMAT="rgb,rgba"
- Another very handy mechanism when trying to fix bugs is:
- make retest
- This will re-run the test suite, but only on tests that failed on the
- last run. So this is a much faster way of checking if changes actually
- fix bugs rather than running the entire test suite again.
- The test suite first compares the output from the current run against the
- previous in order to skip more expensive image comparisons . If you think
- this is interfering with the results, you can clear the cached results using:
- make clean-caches
- Running tests under modified environments or tools
- -------------------------------------------------
- To run tests under a tool like gdb, one can use the run target and
- the TOOL variable. For example:
- CAIRO_TESTS=user-font make run TOOL=gdb TARGETS=pdf
- If you want to run under valgrind, there is a specific target for that
- that also sets a bunch of useful valgrind options. Try:
- CAIRO_TESTS=user-font make check-valgrind
- You can run tests under a modified environment you can use the ENV
- make variable. However, that environment will also affect the libtool
- wrapper of the tests. To only affect the actual test binaries, pass
- such environment as TOOL:
- CAIRO_TESTS=user-font make run TOOL="LD_PRELOAD=/path/to/something.so"
- Getting the elusive zero failures
- ---------------------------------
- It's generally been very difficult to achieve a test run with zero
- failures. The difficulties stem from the various versions of the many
- libraries that the test suite depends on, (it depends on a lot more
- than cairo itself), as well as fonts and other system-specific
- settings. If your system differs significantly from the system on
- which the reference images were generated, then you will likely see
- the test suite reporting "failures", (even if cairo is working just
- fine).
- We are constantly working to reduce the number of variables that need
- to be tweaked to get a clean run, (for example, by bundling fonts with
- the test suite itself), and also working to more carefully document
- the software configuration used to generate the reference images.
- Here are some of the relevant details:
- * Your system must have a copy of the DejaVu font, the sha1sum of
- the version used are listed in [...]. These are
- "DejaVu Sans" (DejaVuSans.ttf) [1cd336329f45f241002ded61893d91e3acd04436];
- "DejaVu Sans Mono" (DejaVuSansMono.ttf) [0458c0f0fb57f3eb8ced62f26fe7c5ed4e6a9a68];
- "DejaVu Serif" (DejaVuSerif.ttf) [93502d0d0445d1fe1c9f51e51b3e0169266346ce];
- [the DejaVu fonts can be installed from the ttf-dejavu 2.33-2 Debian package]
- and also
- "Nimbus Sans L" (n019003l.pfb)
- [which can be found in the gsfonts Debian package].
- * Currently, you must be using a build of cairo using freetype
- (cairo-ft) as the default font backend. Otherwise all tests
- involving text are likely to fail.
- * To test the pdf backend, you will want the very latest version of
- poppler as made available via git:
- git clone git://anongit.freedesktop.org/git/poppler/poppler
- As of this writing, no released version of poppler contains all
- the fixes you will need to avoid false negatives from the test
- suite.
- * To test the ps backend, you will need ghostscript version 9.04.
- * Testing the xlib backend is problematic since many X server
- drivers have bugs that are exercised by the test suite. (Or, if
- not actual bugs, differ slightly in their output in such a way
- that the test suite will report errors.) This can be quite handy
- if you want to debug an X server driver, but since most people
- don't want to do that, another option is to run against a headless
- X server that uses only software for all rendering. One such X
- server is Xvfb which can be started like this:
- Xvfb -screen 0 1680x1024x24 -ac -nolisten tcp :2
- after which the test suite can be run against it like so:
- DISPLAY=:2 make test
- We have been using Xvfb for testing cairo releases and ensuring
- that all tests behave as expected with this X server.
- What if I can't make my system match?
- -------------------------------------
- For one reason or another, you may be unable to get a clean run of the
- test suite even if cairo is working properly, (for example, you might
- be on a system without freetype). In this case, it's still useful to
- be able to determine if code changes you make to cairo result in any
- regressions to the test suite. But it's hard to notice regressions if
- there are many failures both before and after your changes.
- For this scenario, you can capture the output of a run of the test
- suite before your changes, and then use the CAIRO_REF_DIR environment
- variable to use that output as the reference images for a run after
- your changes. The process looks like this:
- # Before code change there may be failures we don't care about
- make test
- # Let's save those output images
- mkdir /some/directory/
- cp -r test/output /some/directory/
- # hack, hack, hack
- # Now to see if nothing changed:
- CAIRO_REF_DIR=/some/directory/ make test
- Best practices for cairo developers
- ===================================
- If we all follow the guidelines below, then both the test suite and
- cairo itself will stay much healthier, and we'll all have a lot more
- fun hacking on cairo.
- Before committing
- -----------------
- All tests should return a result of PASS or XFAIL. The XFAIL results
- indicate known bugs. The final message should be one of the following:
- All XX tests behaved as expected (YY expected failures)
- All XX tests passed
- If any tests have a status of FAIL, then the new code has caused a
- regression error which should be fixed before the code is committed.
- When a new bug is found
- -----------------------
- A new test case should be added by imitating the style of an existing
- test. This means adding the following files:
- new-bug.c
- reference/new-bug.ref.png
- reference/new-bug.xfail.png
- Where new-bug.c is a minimal program to demonstrate the bug, following
- the style of existing tests. The new-bug.ref.png image should contain
- the desired result of new-bug.c if the bug were fixed while
- new-bug.xfail.png contains the current results of the test.
- Makefile.sources should be edited by adding new-bug.c to test_sources.
- And last but not least, don't forget to "git add" the new files.
- When a new feature is added
- ---------------------------
- It's important for the regression suite to keep pace with development
- of the library. So a new test should be added for each new feature.
- The work involved is similar the work described above for new bugs.
- The only distinction is that the test is expected to pass so it
- should not need a new-bug.xfail.png file.
- While working on a test
- -----------------------
- Before a bugfix or feature is ready, it may be useful to compare
- output from different builds. For convenience, you can set
- CAIRO_REF_DIR to point at a previous test directory, relative
- to the current test directory, and any previous output will be
- used by preference as reference images.
- When a bug is fixed
- -------------------
- The fix should be verified by running the test suite which should
- result in an "unexpected pass" for the test of interest. Rejoice as
- appropriate, then remove the relevant xfail.png file from git.
- Before releasing
- ----------------
- All tests should return a result of PASS for all supported (those enabled by
- default) backends, meaning all known bugs are fixed, resulting in the happy
- message:
- All XX tests passed
- Some notes on limitations in poppler
- ====================================
- One of the difficulties of our current test infrastructure is that we
- rely on external tools to convert cairo's vector output (PDF,
- PostScript, and SVG), into an image that can be used for the image
- comparison. This means that any bugs in that conversion tool will
- result in false negatives in the test suite.
- We've identified several such bugs in the poppler library which is
- used to convert PDF to an image. This is particularly discouraging
- because 1) poppler is free software that will be used by *many* cairo
- users, and 2) poppler calls into cairo for its rendering so it should
- be able to do a 100% faithful conversion.
- So we have an interest in ensuring that these poppler bugs get fixed
- sooner rather than later. As such, we're trying to be good citizens by
- reporting all such poppler bugs that we identify to the poppler
- bugzilla. Here's a tracking bug explaining the situation:
- Poppler does not yet handle everything in the cairo test suite
- https://bugs.freedesktop.org/show_bug.cgi?id=12143
- Here's the rule: If a cairo-pdf test reports a failure, but viewing
- the resulting PDF file with acroread suggests that the PDF itself is
- correct, then there's likely a bug in poppler. In this case, we can
- simply report the poppler bug, (making it block 12143 above), post the
- PDF result from the test suite, and list the bug in this file. Once
- we've done this, we can capture poppler's buggy output as a
- pdf-specific reference image (as reference/*.xfail.png) so that the
- test suite will regard the test as passing, (and we'll ensure there
- is no regression).
- Once the poppler bug gets fixed, the test suite will start reporting a
- false negative again, and this will be easy to fix by simply removing
- the pdf-specific reference image.
- Here are the reported poppler bugs and the tests they affect:
- Poppler doesn't correctly handle gradients with transparency
- https://bugs.freedesktop.org/show_bug.cgi?id=12144
- --------------------------------------------------
- fill-alpha-pattern
- gradient-alpha
- gradient-constant-alpha
- linear-gradient
- linear-gradient-reflect
- radial-gradient
- trap-clip
- Poppler should paint images with CAIRO_EXTEND_PAD
- https://bugs.freedesktop.org/show_bug.cgi?id=14578
- --------------------------------------------------
- paint-source-alpha
- paint-with-alpha
- rotate-image-surface-paint
- scale-source-surface-paint
- Incorrect clipping of group object (regression?)
- https://bugs.freedesktop.org/show_bug.cgi?id=14580
- --------------------------------------------------
- push-group
- spurious horizontal stripes in color gradients
- https://bugs.freedesktop.org/show_bug.cgi?id=10942
- --------------------------------------------------
- smask
- smask-fill
- smask-image-mask
- smask-mask
- smask-paint
- smask-stroke
- smask-text
- Ghostscript does not correctly render small miters
- http://bugs.ghostscript.com/show_bug.cgi?id=690098
- --------------------------------------------------
- miter-precision
|