README: document Fedora, RHEL, and CentOS dependencies
[xfstests-dev.git] / README
1 _______________________
2 BUILDING THE FSQA SUITE
3 _______________________
4
5 Building Linux:
6         - cd into the xfstests directory
7         - install prerequisite packages
8           For example, for Ubuntu:
9                 "sudo apt-get install xfslibs-dev uuid-dev libtool-bin e2fsprogs
10                  automake gcc libuuid1 quota attr libattr1-dev make
11                  libacl1-dev libaio-dev xfsprogs libgdbm-dev gawk fio dbench
12                  uuid-runtime"
13           For Fedora, RHEL, or CentOS:
14                 "yum install acl attr awk bc dbench dump e2fsprogs fio gawk
15                  indent lvm2 psmisc quota sed xfsdump xfsprogs
16                  libacl-devel libattr-devel libaio-devel libuuid-devel
17                  openssl-devel xfsprogs-devel btrfs-progs-devel"
18                 (Older distributions may require xfsprogs-qa-devel as well.)
19                 (Note that for RHEL and CentOS, you may need the EPEL repo.)
20         - run make
21         - run make install
22         - create fsgqa test user ("sudo useradd fsgqa")
23         - create 123456-fsgqa test user ("sudo useradd 123456-fsgqa")
24         
25 Building IRIX:
26         - cd into the xfstests directory 
27         - set the ROOT and TOOLROOT env variables for IRIX appropriately
28         - run ./make_irix
29
30 ______________________
31 USING THE FSQA SUITE
32 ______________________
33
34 Preparing system for tests (IRIX and Linux):
35
36     - compile XFS into your kernel or load XFS modules
37     - install administrative tools specific to the filesystem you wish to test
38     - If you wish to run the udf components of the suite install
39       mkfs_udf and udf_db for IRIX and mkudffs for Linux. Also download and 
40       build the Philips UDF Verification Software from 
41       http://www.extra.research.philips.com/udf/, then copy the udf_test 
42       binary to xfstests/src/. If you wish to disable UDF verification test
43       set the environment variable DISABLE_UDF_TEST to 1.
44         
45     
46     - create one or two partitions to use for testing
47         - one TEST partition
48             - format as XFS, mount & optionally populate with 
49               NON-IMPORTANT stuff
50         - one SCRATCH partition (optional)
51             - leave empty and expect this partition to be clobbered
52               by some tests.  If this is not provided, many tests will
53               not be run.
54               (SCRATCH and TEST must be two DIFFERENT partitions)
55               OR
56         - for btrfs only: some btrfs test cases will need 3 or more independent
57               SCRATCH disks which should be set using SCRATCH_DEV_POOL (for eg:
58               SCRATCH_DEV_POOL="/dev/sda /dev/sdb /dev/sdc") with which
59               SCRATCH_DEV should be unused by the tester, and for the legacy
60               support SCRATCH_DEV will be set to the first disk of the
61               SCRATCH_DEV_POOL by xfstests script.
62               
63     - setup your environment
64         Quick start:
65         - copy config.local.example to config.local and edit as needed
66         Or:
67         - setenv TEST_DEV "device containing TEST PARTITION"
68         - setenv TEST_DIR "mount point of TEST PARTITION"   
69         - optionally:
70              - setenv SCRATCH_DEV "device containing SCRATCH PARTITION" OR
71                (btrfs only) setenv SCRATCH_DEV_POOL "to 3 or more SCRATCH disks for
72                testing btrfs raid concepts"
73              - setenv SCRATCH_MNT "mount point for SCRATCH PARTITION"
74              - setenv TAPE_DEV "tape device for testing xfsdump"
75              - setenv RMT_TAPE_DEV "remote tape device for testing xfsdump"
76              - setenv RMT_IRIXTAPE_DEV "remote IRIX tape device for testing xfsdump"
77              - setenv SCRATCH_LOGDEV "device for scratch-fs external log"
78              - setenv SCRATCH_RTDEV "device for scratch-fs realtime data"
79              - setenv TEST_LOGDEV "device for test-fs external log"
80              - setenv TEST_RTDEV "device for test-fs realtime data"
81              - if TEST_LOGDEV and/or TEST_RTDEV, these will always be used.
82              - if SCRATCH_LOGDEV and/or SCRATCH_RTDEV, the USE_EXTERNAL
83                environment variable set to "yes" will enable their use.
84              - setenv DIFF_LENGTH "number of diff lines to print from a failed test",
85                by default 10, set to 0 to print the full diff
86              - setenv FSTYP "the filesystem you want to test", the filesystem
87                type is devised from the TEST_DEV device, but you may want to
88                override it; if unset, the default is 'xfs'
89              - setenv FSSTRESS_AVOID and/or FSX_AVOID, which contain options
90                added to the end of fsstresss and fsx invocations, respectively,
91                in case you wish to exclude certain operational modes from these
92                tests.
93              - set TEST_XFS_REPAIR_REBUILD=1 to have _check_xfs_filesystem
94                run xfs_repair -n to check the filesystem; xfs_repair to rebuild
95                metadata indexes; and xfs_repair -n (a third time) to check the
96                results of the rebuilding.
97
98         - or add a case to the switch in common/config assigning
99           these variables based on the hostname of your test
100           machine
101         - or add these variables to a file called local.config and keep that
102           file in your workarea.
103
104     - if testing xfsdump, make sure the tape devices have a
105       tape which can be overwritten.
106           
107     - make sure $TEST_DEV is a mounted XFS partition
108     - make sure that $SCRATCH_DEV or $SCRATCH_DEV_POOL contains nothing useful
109     
110 Running tests:
111
112     - cd xfstests
113     - By default the tests suite will run xfs tests:
114     - ./check '*/001' '*/002' '*/003'
115     - ./check '*/06?'
116     - You can explicitly specify NFS/CIFS/UDF, otherwise the filesystem type will
117       be autodetected from $TEST_DEV:
118       ./check -nfs [test(s)]
119     - Groups of tests maybe ran by: ./check -g [group(s)]
120       See the 'group' file for details on groups
121     - for udf tests: ./check -udf [test(s)]
122       Running all the udf tests: ./check -udf -g udf
123     - for running nfs tests: ./check -nfs [test(s)]
124     - for running cifs/smb3 tests: ./check -cifs [test(s)]
125     - To randomize test order: ./check -r [test(s)]
126
127     
128     The check script tests the return value of each script, and
129     compares the output against the expected output. If the output
130     is not as expected, a diff will be output and an .out.bad file
131     will be produced for the failing test.
132     
133     Unexpected console messages, crashes and hangs may be considered
134     to be failures but are not necessarily detected by the QA system.
135
136 __________________________ 
137 ADDING TO THE FSQA SUITE
138 __________________________
139
140
141 Creating new tests scripts:
142
143     Use the "new" script.
144
145 Test script environment:
146
147     When developing a new test script keep the following things in
148     mind.  All of the environment variables and shell procedures are
149     available to the script once the "common/rc" file has been
150     sourced.
151
152      1. The tests are run from an arbitrary directory.  If you want to
153         do operations on an XFS filesystem (good idea, eh?), then do
154         one of the following:
155
156         (a) Create directories and files at will in the directory
157             $TEST_DIR ... this is within an XFS filesystem and world
158             writeable.  You should cleanup when your test is done,
159             e.g. use a _cleanup shell procedure in the trap ... see
160             001 for an example.  If you need to know, the $TEST_DIR
161             directory is within the filesystem on the block device
162             $TEST_DEV.
163
164         (b) mkfs a new XFS filesystem on $SCRATCH_DEV, and mount this
165             on $SCRATCH_MNT. Call the the _require_scratch function 
166             on startup if you require use of the scratch partition.
167             _require_scratch does some checks on $SCRATCH_DEV & 
168             $SCRATCH_MNT and makes sure they're unmounted. You should 
169             cleanup when your test is done, and in particular unmount 
170             $SCRATCH_MNT.
171             Tests can make use of $SCRATCH_LOGDEV and $SCRATCH_RTDEV
172             for testing external log and realtime volumes - however,
173             these tests need to simply "pass" (e.g. cat $seq.out; exit
174             - or default to an internal log) in the common case where
175             these variables are not set.
176
177      2. You can safely create temporary files that are not part of the
178         filesystem tests (e.g. to catch output, prepare lists of things
179         to do, etc.) in files named $tmp.<anything>.  The standard test
180         script framework created by "new" will initialize $tmp and
181         cleanup on exit.
182
183      3. By default, tests are run as the same uid as the person
184         executing the control script "check" that runs the test scripts.
185
186      4. Some other useful shell procedures:
187
188         _get_fqdn               - echo the host's fully qualified
189                                   domain name
190
191         _get_pids_by_name       - one argument is a process name, and
192                                   return all of the matching pids on
193                                   standard output
194
195         _within_tolerance       - fancy numerical "close enough is good
196                                   enough" filter for deterministic
197                                   output ... see comments in
198                                   common/filter for an explanation
199
200         _filter_date            - turn ctime(3) format dates into the
201                                   string DATE for deterministic
202                                   output
203
204         _cat_passwd,            - dump the content of the password
205         _cat_group                or group file (both the local file
206                                   and the content of the NIS database
207                                   if it is likely to be present)
208
209      5. General recommendations, usage conventions, etc.:
210         - When the content of the password or group file is
211           required, get it using the _cat_passwd and _cat_group
212           functions, to ensure NIS information is included if NIS
213           is active.
214         - When calling getfacl in a test, pass the "-n" argument so
215           that numeric rather than symbolic identifiers are used in
216           the output.
217         - When creating a new test, it is possible to enter a custom name
218           for the file. Filenames are in form NNN-custom-name, where NNN
219           is automatically added by the ./new script as an unique ID,
220           and "custom-name" is the optional string entered into a prompt
221           in the ./new script. It can contain only alphanumeric characters
222           and dash. Note the "NNN-" part is added automatically.
223
224 Verified output:
225
226     Each test script has a name, e.g. 007, and an associated
227     verified output, e.g. 007.out.
228
229     It is important that the verified output is deterministic, and
230     part of the job of the test script is to filter the output to
231     make this so.  Examples of the sort of things that need filtering:
232
233     - dates
234     - pids
235     - hostnames
236     - filesystem names
237     - timezones
238     - variable directory contents
239     - imprecise numbers, especially sizes and times
240
241 Pass/failure:
242
243     The script "check" may be used to run one or more tests.
244
245     Test number $seq is deemed to "pass" when:
246     (a) no "core" file is created,
247     (b) the file $seq.notrun is not created,
248     (c) the exit status is 0, and
249     (d) the output matches the verified output.
250
251     In the "not run" case (b), the $seq.notrun file should contain a
252     short one-line summary of why the test was not run.  The standard
253     output is not checked, so this can be used for a more verbose
254     explanation and to provide feedback when the QA test is run
255     interactively.
256
257
258     To force a non-zero exit status use:
259         status=1
260         exit
261
262     Note that:
263         exit 1
264     won't have the desired effect because of the way the exit trap
265     works.
266
267     The recent pass/fail history is maintained in the file "check.log".
268     The elapsed time for the most recent pass for each test is kept
269     in "check.time".