From: Stephen Morris Date: Fri, 24 Nov 2017 12:55:52 +0000 (+0000) Subject: [rt46602] Expanded system tests README X-Git-Tag: v9.13.0~158^2~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af005cdbcf236f10a0766c0f25666d697527389e;p=thirdparty%2Fbind9.git [rt46602] Expanded system tests README Add more information on running the tests, together with a section on how the tests are organised, aimed at new developers. --- diff --git a/bin/tests/system/README b/bin/tests/system/README index b7211b2e23e..a6604b37bf5 100644 --- a/bin/tests/system/README +++ b/bin/tests/system/README @@ -4,66 +4,502 @@ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -This is a simple test environment for running bind9 system tests +Introduction +=== +This directory holds a simple test environment for running bind9 system tests involving multiple name servers. -There are multiple test suites, each in a separate subdirectory and -involving a different DNS setup. They are: - - dnssec/ DNSSEC tests - forward/ Forwarding tests - glue/ Glue handling tests - limits/ Tests of handling of large data (close to server limits) - notify/ More NOTIFY tests - nsupdate/ Dynamic update and IXFR tests - resolver/ Regression tests for resolver bugs that have been fixed - (not a complete resolver test suite) - rrl/ query rate limiting - rpz/ Tests of response policy zone (RPZ) rewriting - rpzrecurse/ Another set of RPZ tests to check recursion behavior - stub/ Tests of stub zone functionality - unknown/ Unknown type and class tests - upforwd/ Update forwarding tests - views/ Tests of the "views" statement - xfer/ Zone transfer tests - xferquota/ Zone transfer quota tests - -Typically each test suite sets up 2-5 name servers and then performs -one or more tests against them. Within the test suite subdirectory, -each name server has a separate subdirectory containing its -configuration data. By convention, these subdirectories are named -"ns1", "ns2", etc. - -The tests are completely self-contained and do not require access to -the real DNS. Generally, one of the test servers (ns1) is set up as a -root name server and is listed in the hints file of the others. - -To enable all servers to run on the same machine, they bind to -separate virtual IP address on the loopback interface. ns1 runs on -10.53.0.1, ns2 on 10.53.0.2, etc. Before running any tests, you must -set up these addresses by running "ifconfig.sh up" as root. - -Mac OS X: -If you wish to make the interfaces survive across reboots -copy org.isc.bind.system and org.isc.bind.system to -/Library/LaunchDaemons then run -"launchctl load /Library/LaunchDaemons/org.isc.bind.system.plist" as -root. - -The servers use port 5300 instead of the usual port 53, so they can be -run without root privileges once the interfaces have been set up. - -The tests can be run individually like this: - - sh run.sh xfer - sh run.sh notify - etc. - -To run all the tests, just type "make test". - -When running system tests, named can be run under -Valgrind. The output from Valgrind are sent to per-process files that -can be reviewed after the test has completed. To enable this, set the -USE_VALGRIND environment variable to "helgrind" to run the Helgrind -tool, or any other value to run the Memcheck tool. To use "helgrind" -effectively, build BIND with --disable-atomic. +With the exception of "common" (which holds configuration information common to +multiple tests) and "win32" (which holds files needed to run the tests in a +Windows environment), each directory holds a set of scripts and configuration +files to test different parts of BIND. The directories are named for the +aspect of BIND they test, for example: + + dnssec/ DNSSEC tests + forward/ Forwarding tests + glue/ Glue handling tests + +etc. + +Typically each set of tests sets up 2-5 name servers and then performs one or +more tests against them. Within the test subdirectory, each name server has a +separate subdirectory containing its configuration data. These subdirectories +are named "nsN" or "ansN" (where N is a number between 1 and 8, e.g. ns1, ans2 +etc.) + +The tests are completely self-contained and do not require access to the real +DNS. Generally, one of the test servers (usually ns1) is set up as a root name +server and is listed in the hints file of the others. + + +Preparing to Run the Tests +=== +To enable all servers to run on the same machine, they bind to separate virtual +IP addresses on the loopback interface. ns1 runs on 10.53.0.1, ns2 on +10.53.0.2, etc. Before running any tests, you must set up these addresses by +running the command + + sh ifconfig.sh up + +as root. The interfaces can be removed by executing the command: + + sh ifconfig.sh down + +... also as root. + +The servers use unprivileged ports (above 1024) instead of the usual port 53, +so they can be run without root privileges once the interfaces have been set +up. + + +Note for MacOS Users +--- +If you wish to make the interfaces survive across reboots, copy +org.isc.bind.system and org.isc.bind.system.plist to /Library/LaunchDaemons +then run + + launchctl load /Library/LaunchDaemons/org.isc.bind.system.plist + +... as root. + + +Running the Tests +=== +The tests can be run individually using the following command: + + sh run.sh [flags] + +e.g. + + sh run.sh [flags] notify + +Optional flags are: + + -p Sets the range of ports used by the test. If not + specified, the test will use ports 5300 to 5309. + -n Noclean - do not remove the output files if the test + completes successfully. By default, files created by the + test are deleted if it passes; they are not deleted if the + test fails. + -k Keep servers running after the test completes. Each test + usually starts a number of nameservers, either instances + of the "named" being tested, or custom servers (written in + Python or Perl) that feature test-specific behavior. The + servers are automatically started before the test is run + and stopped after it ends. This flag leaves them running + at the end of the test. + -d Arguments to the "date" command used to produce the + start and end time of the tests. For example, the + switch + + -d "+%Y-%m-%d:%h:%M:%s" + + would cause the "S" and "E" messages (see below) to have the + date looking like "2017-11-23:16:06:32" instead of the + default "Thu, 23 Nov 2017 16:06:32 +0000". + +To run all the system tests, type either: + + sh runall.sh [numproc] + +or + + make [-j numproc] test + +When running all the tests, the output is sent to the file systests.output +(in the bin/tests/system) directory. + +The "numproc" option specifies the maximum number of tests that can run +simultaneously. The default is 1, which means that all the test run +sequentially. If greater than 1, up to "numproc" tests will run simultaneously. +(Each will use a unique set of ports, so there is no danger of them interfering +with one another.) + +Parallel running will reduce the total time taken to run the BIND system tests, +but will mean that the output from all the tests will be mixed up with one +another in the systests.output file. However, if you need to investigate the +output from a test, there is a simple way of extracting the information. +Before discussing this though, the format of the test messages needs to be +understood. + +All output from the system tests is in the form of lines with the following +structure: + + :: [()] + +e.g. + + I:catz:checking that dom1.example is not served by master (1) + +The meanings of the fields are as follows: + + +This indicates the type of message. This is one of: + + S Start of the test + A Start of test (retained for backwards compatibility) + T Start of test (retained for backwards compatibility) + E End of the test + I Information. A test will typically output many of these messages + during its run, indicating test progress. Note that such a message + may be of the form "I:testname:failed", indicating that a sub-test + has failed. + R Result. Each test will reult in one such message, which is of the + form: + + R:: + + where is one of: + + PASS The test passed + FAIL The test failed + SKIPPED The test was not run, usually because some + prerequisites required to run the test are missing. + UNTESTED The test was not run for some other reason, e.g. + a prerequiste is available but is not compatible with + the platform on which the test is run. + + +This is the name of the test from which the message emanated, which is also +the name of the subdirectory holding the test files. + + +This is text output by the test during its execution. + +() +If present, this will correlate with a file created by the test. The tests +execute commands and route the output of each command to a file. The name +of this file depends on the command and the test, but will usually be of +the form: + + .out. + +e.g. nsupdate.out.test28, dig.out.q3. This aids diagnosis of problems by +allowing the output that caused the problem to be identified. + +Returning to the problem of extracting information about a single test from +systests.output, the solution is fairly easy: run the command: + + grep '::' systests.output + +e.g. + + grep ':catz:' systests.output + +(note the colons before and after the test name). This will list all the +messages produced by the test in the order they were output. + + +Re-running the Tests +=== +If there is a requirement to re-run a test (or the entire test suite), the +files produced by the tests should be deleted first. + +Deletion of files produced by an individual test can be done with the +command: + + (cd testname ; sh clean.sh) + +Deletion of the files produced by the set of tests (e.g. after the execution +of "runall.sh") can be deleted by the command: + + make testclean + +(Note that the Makefile has two other targets for cleaning up files: "clean" +will delete all the files produced by the tests, as well as the object and +executable files used by the tests. "distclean" does all the work of "clean" +as well as deleting configuration files produced by "configure".) + + +Developer Notes +=== +This section is intended for developers writing new tests. + +Overview +--- +As noted above, each test suite is in a separate directory. To interact with +the test framework, the directories contain the following standard files: + +prereq.sh Run at the beginning to determine whether the test can be run at + all; if not, we see a result of R:SKIPPED or R:UNTESTED. This file + is optional: if not present, the test is assumed to have all its + prerequisties met. + +setup.sh Run after prereq.sh, this sets up the preconditions for the tests. + Although optional, virtually all tests will require such a file to + set up the ports they should use for the test. + +tests.sh Runs the actual tests. + +clean.sh Run at the end to clean up temporary files, but only if the test + was completed successfully and its running was not inhibited by the + "-n" switch being passed to "run.sh". Otherwise the temporary files + are left in place for inspection. + +ns These subdirectories contain test name servers that can be queried + or can interact with each other. the value of N indicates the + address the server listens on: for example, ns2 listens on + 10.53.0.2, and ns4 on 10.53.0.4. All test servers use an + unprivileged port, so they don't need to run as root. These servers + log at the highest debug level and the log is captured in the file + "named.run". + +ans Like ns[X], but these are simple mock name servers implemented in + Perl or Python. They are generally programmed to misbehave in ways + named would not so as to exercise named's ability to interoperate + with badly behaved name servers. + + +Port Usage +--- +In order for the tests to run in parallel, each test requires a unique set of +ports. These are specified by the "-p" option passed to "run.sh". This option +is then passed to each of the test control scripts listed above. + +The convention used in the system tests is that the number passed is the start +of a range of 10 ports. The test is free to use the ports as required, +although present usage is that the lowest port is used as the query port and +the highest is used as the control port. This is reinforced by the script +getopts.sh: if used to parse the "-p" option (see below), the script sets the +following shell variables: + + port Number to be used for the query port. + controlport Number to be used as the RNDC control port. + aport1 - aport8 Eight port numbers that the test can use as needed. + +When running tests in paralel (i.e. giving a value of "numproc" greater than 1 +in the "make" or "runall.sh" commands listed above), it is guaranteed that each +test will get a set of unique port numbers. + +In addition, the "getopts.sh" script also defines the following symbols: + + portlow Lowest port number in the range. + porthigh Highest port number in the range. + + +Writing a Test +--- +The test framework requires up to four shell scripts (as well as a number of +nameserver instances) to run. Certain expectations are put on each script: + + +General +--- +Each of the four scripts will be invoked with the command + + sh