tests
Folders and files
Name | Name | Last commit date | ||
---|---|---|---|---|
parent directory.. | ||||
Testuite for Icecream ===================== In this directory are tests for Icecream. These tests run Icecream binaries and test them in practice in a testing setup. This makes these tests a bit slower than unit tests, but it allows testing functionality that would be hard or impossible to test using unit tests. How to run the tests: ===================== The tests do not conflict with system Icecream, so it is possible to compile and test while system Icecream is active. Since Icecream hardcodes locations of some binaries, it is necessary to install Icecream for the tests (really install, no $DESTDIR). It is however not necessary to do a system install, simply install somewhere. If you want to test also remote builds (recommended), it is necessary for the install to have the capability to chroot. This is most easily done by giving the CAP_SYS_CHROOT Linux capability to the iceccd binary (which is done is triggered to be done automatically by "make test" using sudo). An example of building Icecream and testing it: ./configure --prefix=$HOME/iceinstall make test The 'make test' step roughly performs: make make install sudo /sbin/setcap cap_sys_chroot+ep ${prefix}/sbin/iceccd cd tests ./test.sh ${prefix} ${builddir}/tests/results --builddir=${builddir}/tests This will build and install Icecream into $HOME/iceinstall prefix and all logs and temporary files will be in ${builddir}/tests/results. It is also possible to use 'filecap' from cap-ng instead of 'setcap', but 'filecap' does not report failures. Note that the limitations (real install needed in a helper location, chroot capability) mean that these tests are not suitable to be run as a part of building binary packages, they are meant to be run by developers. If a test fails, all relevant files should be in the log and temporary directory passed to test.sh . The {daemon}.log files contain logs relevant only to the last run test, files {daemon}_all.log include complete logs (up to but not including the failed test, if any). Exit status of test.sh is 0 for all tests passing, 1 for all tests passing but some being skipped and 2 for errors. If you want to use icemon for the tests, use 'ICECC_SCHEDULER=localhost:8767 icemon'. Note that icemon needs to be built with recent (Feb 2014) libicecc library for this to work. Valgrind: ========= It is possible to pass --valgrind to test.sh in order to test (almost) everything with Valgrind. Valgrind may be also automatically invoked using: make test VALGRIND=1 Note that in order to be able to chroot, it is necessary to give the capability to the actual Valgrind binary instead of iceccd (this is because this binary is what actually runs as the process): sudo /sbin/setcap cap_sys_chroot+ep /usr/lib/valgrind/memcheck-x86-linux Do not forget to reset it back when done: sudo /sbin/setcap -r /usr/lib/valgrind/memcheck-x86-linux Adding new tests: ================= The test.sh script is hopefully straightforward and commented enough. If you want to test handling of specific flags, see the run_ice function. If you want more complex/specific tests, you can also check logs using the various check_log_* functions. Common log messages: (icecc.log) "Have to use host 127.0.0.1:" - will be built remotely (one one of the remote hosts) (icecc.log) "Have to use host 127.0.0.1:10246" - will be built remotely on remoteice1 (icecc.log) "Have to use host 127.0.0.1:10247" - will be built remotely on remoteice1 (icecc.log) "building myself, but telling localhost" - job could be built remotely, but the scheduler selected the local daemon for the build (icecc.log) "<building_local>" - the job is forced to be built locally (cannot be built remotely) Internals: ========== For most tests, there is a new scheduler run and three daemons, one (localice) that serves as the "local" daemon that icecc uses, and two more (remoteice1/2) that serve as "remote" daemons that which remote jobs will be distributed. In order not to interfere with system Icecream, they all use different ports and a special socket is used for communication with localice daemon. All daemons are set with 2 jobs max, in order to have reliable results when testing paralellism. ICECC_PREFERRED_HOST is used when forcing whether a job should be built locally or remotely. The localice daemon also has ICECC_TEST_REMOTEBUILD=1 to avoid building locally when it in fact should forward to "remote" daemons even though they are technically local.