mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-25 04:27:54 +00:00
btrfs-progs: tests: enhance README
Add more information about variables, fine tuning, wording, test templates, etc. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
2b1be545db
commit
a7c19b1532
143
tests/README.md
143
tests/README.md
@ -41,16 +41,16 @@ where `MASK` is a glob expression that will execute only tests
|
|||||||
that match the MASK. Here the test number comes handy:
|
that match the MASK. Here the test number comes handy:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ make TEST=001\* test-fsck
|
$ make TEST=001\* test-fsck # in tests/
|
||||||
$ TEST=001\* ./fsck-tests.sh
|
$ TEST=001\* ./fsck-tests.sh # in the top directory
|
||||||
```
|
```
|
||||||
|
|
||||||
will run the first test in fsck-tests subdirectory. If the test directories
|
will run the first test in fsck-tests subdirectory. If the test directories
|
||||||
follow a good naming scheme, it's possible to select a subset eg. like the
|
follow a good naming scheme, it's possible to select a subset eg. like the
|
||||||
convert tests for ext[234] filesystems.
|
convert tests for ext[234] filesystems using mask 'TEST='*ext[234]*'.
|
||||||
|
|
||||||
|
|
||||||
## Test structure
|
## Test directory structure
|
||||||
|
|
||||||
*tests/fsck-tests/*
|
*tests/fsck-tests/*
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ convert tests for ext[234] filesystems.
|
|||||||
|
|
||||||
* tests for command line interface, option coverage, weird option combinations that should not work
|
* tests for command line interface, option coverage, weird option combinations that should not work
|
||||||
* not necessary to do any functional testing, could be rather lightweight
|
* not necessary to do any functional testing, could be rather lightweight
|
||||||
* functional tests should go to to other test dirs
|
* functional tests should go to other test directories
|
||||||
* the driver script will only execute `./test.sh` in the test directory
|
* the driver script will only execute `./test.sh` in the test directory
|
||||||
|
|
||||||
*tests/misc-tests/*
|
*tests/misc-tests/*
|
||||||
@ -101,15 +101,28 @@ checking or catch failures at runtime. This can be done by setting the
|
|||||||
`INSTRUMENT` environment variable:
|
`INSTRUMENT` environment variable:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
INSTRUMENT=valgrind ./fuzz-tests.sh # in tests/
|
|
||||||
make INSTRUMENT=valgrind test-fuzz # in the top directory
|
make INSTRUMENT=valgrind test-fuzz # in the top directory
|
||||||
|
INSTRUMENT=valgrind ./fuzz-tests.sh # in tests/
|
||||||
```
|
```
|
||||||
|
|
||||||
The variable is prepended to the command *unquoted*, all sorts of shell tricks
|
The variable is prepended to the command *unquoted*, all sorts of shell tricks
|
||||||
are possible.
|
are possible.
|
||||||
|
|
||||||
Note: instrumentation is not applied to privileged commands (anything that uses
|
Note: instrumentation is not applied to privileged commands (anything that uses
|
||||||
the root helper).
|
the root helper), with exception of all commands built from git that will
|
||||||
|
be instrumented even if run with the sudo helper.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
run_check $SUDO_HELPER mount /dev/sdx /mnt # no instrumentation
|
||||||
|
run_check $SUDO_HELPER "$TOP/btrfs" check /dev/sdx # with instrumentation
|
||||||
|
```
|
||||||
|
|
||||||
|
Instrumented commands: btrfs, btrfs-image, btrfs-convert, btrfs-tune, mkfs.btrfs,
|
||||||
|
btrfs-select-super, btrfs-find-root, btrfs-corrupt-block.
|
||||||
|
|
||||||
|
As mentioned above, instrumentation tools are like `valgrind` or potentially
|
||||||
|
`gdb` with some init script that will let the commands run until an exception
|
||||||
|
occurs, possibly allowing to continue interactively debugging.
|
||||||
|
|
||||||
### Verbosity, test tuning
|
### Verbosity, test tuning
|
||||||
|
|
||||||
@ -134,12 +147,25 @@ the root helper).
|
|||||||
|
|
||||||
Multiple values can be separated by `,`.
|
Multiple values can be separated by `,`.
|
||||||
|
|
||||||
|
For example, running all fsck tests with the `--mode=lowmem` option can be done
|
||||||
|
as
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ make TEST_ENABLE_OVERRIDE=true TEST_ARGS_CHECK=--mode=lowmem test-check
|
||||||
|
```
|
||||||
|
|
||||||
|
Specifically, fsck-tests that are known to be able to repair images in the
|
||||||
|
lowmem mode shoulde be marked using a file `.lowmem_repairable` in the test
|
||||||
|
directory. Then the fsck-tests with the 'mode=lowmem' will continue when image
|
||||||
|
repair is requested.
|
||||||
|
|
||||||
### Permissions
|
### Permissions
|
||||||
|
|
||||||
Some commands require root privileges (to mount/umount, access loop devices or
|
Some commands require root privileges (to mount/umount, access loop devices or
|
||||||
call privileged ioctls). It is assumed that `sudo` will work in some way (no
|
call privileged ioctls). It is assumed that `sudo` will work in some way (no
|
||||||
password, password asked and cached). Note that instrumentation is not applied
|
password, password asked and cached). Note that instrumentation is not applied
|
||||||
in this case, for safety reasons. You need to modify the test script instead.
|
in this case, for safety reasons or because the tools refuse to run under root.
|
||||||
|
You need to modify the test script instead.
|
||||||
|
|
||||||
### Cleanup
|
### Cleanup
|
||||||
|
|
||||||
@ -149,7 +175,9 @@ loop devices are kept. This should help to investigate the test failure but at
|
|||||||
least the mounts and loop devices need to be cleaned before the next run.
|
least the mounts and loop devices need to be cleaned before the next run.
|
||||||
|
|
||||||
This is partially done by the script `clean-tests.sh`, you may want to check
|
This is partially done by the script `clean-tests.sh`, you may want to check
|
||||||
the loop devices as they are managed on a per-test basis.
|
the loop devices as they are managed on a per-test basis, see the output of
|
||||||
|
command `losetup` and eventually delete all existing loop devices with `losetup
|
||||||
|
-D`.
|
||||||
|
|
||||||
### Prototyping tests, quick tests
|
### Prototyping tests, quick tests
|
||||||
|
|
||||||
@ -287,3 +315,100 @@ The tests assume write access to their directories.
|
|||||||
debugging
|
debugging
|
||||||
* this might change in the future so the tests cover as much as possible, but
|
* this might change in the future so the tests cover as much as possible, but
|
||||||
this would require to enhance all tests with a cleanup phase
|
this would require to enhance all tests with a cleanup phase
|
||||||
|
|
||||||
|
## Simple test template
|
||||||
|
|
||||||
|
The file `tests/common` provides shell functions to ease writing common things
|
||||||
|
like setting up the test devices, making or mounting a filesystem, setting up
|
||||||
|
loop devices.
|
||||||
|
|
||||||
|
|
||||||
|
```shell
|
||||||
|
#!/bin/bash
|
||||||
|
# Simple test to create a new filesystem and test that it can be mounted
|
||||||
|
|
||||||
|
source "$TEST_TOP/common"
|
||||||
|
|
||||||
|
setup_root_helper
|
||||||
|
prepare_test_dev
|
||||||
|
|
||||||
|
run_check_mkfs_test_dev
|
||||||
|
run_check_mount_test_dev
|
||||||
|
run_check $SUDO_HELPER dd if=/dev/zero of="$TEST_MNT"/file bs=1M count=1
|
||||||
|
run_check_umount_test_dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Each test should be briefly described, source the helpers like `run_check`. The
|
||||||
|
root helper is the `sudo` wrapper that can be used as `$SUDO_HELPER` variable.
|
||||||
|
The implicit variables for testing device is `$TEST_DEV` mounted at `$TEST_MNT`.
|
||||||
|
The mkfs and mount helpers take arguments that are then injected into the right
|
||||||
|
place in the respective command.
|
||||||
|
|
||||||
|
Besides the setup and cleanup code, the main test in this example is `dd` that
|
||||||
|
writes 1MiB to a file in the newly created filesystem.
|
||||||
|
|
||||||
|
## Multiple device test template
|
||||||
|
|
||||||
|
Tests that need more devices can utilize the loop devices, an example test of
|
||||||
|
the above:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# Create a new multi-device filesystem and test that it can be mounted
|
||||||
|
|
||||||
|
source "$TEST_TOP/common"
|
||||||
|
|
||||||
|
setup_root_helper
|
||||||
|
setup_loopdevs 4
|
||||||
|
prepare_loopdevs
|
||||||
|
TEST_DEV=${loopdevs[1]}
|
||||||
|
|
||||||
|
run_check $SUDO_HELPER "$TOP/mkfs.btrfs" -f -d raid1 -m raid1 "${loopdevs[@]}"
|
||||||
|
run_check_mount_test_dev
|
||||||
|
run_check $SUDO_HELPER dd if=/dev/zero of="$TEST_MNT"/file bs=1M count=1
|
||||||
|
run_check_umount_test_dev
|
||||||
|
|
||||||
|
cleanup_loopdevs
|
||||||
|
```
|
||||||
|
|
||||||
|
## A 'btrfs check' test template
|
||||||
|
|
||||||
|
The easiest way to test an image is to put it to the test directory, without
|
||||||
|
the `test.sh` script. All images found are simply processed by the shell
|
||||||
|
function `check_image` with default parameters.
|
||||||
|
|
||||||
|
Any tweaks to the 'check' subcommand can be done by redefining the function:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
source "$TEST_TOP/common"
|
||||||
|
|
||||||
|
check_image() {
|
||||||
|
run_check "$TOP/btrfs" check --readonly "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
check_all_images
|
||||||
|
```
|
||||||
|
|
||||||
|
The images can be stored in various formats, see section 'Test images'.
|
||||||
|
|
||||||
|
|
||||||
|
## Misc hints
|
||||||
|
|
||||||
|
There are several helpers in `tests/common`, it's recommended to read through
|
||||||
|
that file or other tests to get the idea how easy writing a test really is.
|
||||||
|
|
||||||
|
* result
|
||||||
|
* `_fail` - a failure condition has been found
|
||||||
|
* `_not_run` - some prerequisite condition is not met, eg. missing kernel functionality
|
||||||
|
* messages
|
||||||
|
* `_log` - message printed to the result file (eg.
|
||||||
|
`tests/mkfs-tests-results.txt`), and not printed to the terminal
|
||||||
|
* `_log_stdout` - dtto but it is printed to the terminal
|
||||||
|
* execution helpers
|
||||||
|
* `run_check` - should be used for basically all commadns, the command and arguments
|
||||||
|
are stored to the results log for debugging and the return value is checked so there
|
||||||
|
are no silent failures even for the "unimportant" commands
|
||||||
|
* `run_check_stdout` - like the above but the output can be processed further, eg. filtering
|
||||||
|
out some data or looking for some specific string
|
||||||
|
* `run_mayfail` - the command is allowed to fail in a non-fatal way (eg. no segfault),
|
||||||
|
there's also the `run_mayfail_stdout` variant
|
||||||
|
* `run_mustfail` - expected failure, note that the first argument is mandatory message describing unexpected pass condition
|
||||||
|
Loading…
Reference in New Issue
Block a user