Annotation of embedaddon/curl/tests/FILEFORMAT.md, revision 1.1
1.1 ! misho 1: # curl test suite file format
! 2:
! 3: The curl test suite's file format is very simple and extensible, closely
! 4: resembling XML. All data for a single test case resides in a single ASCII
! 5: file. Labels mark the beginning and the end of all sections, and each label
! 6: must be written in its own line. Comments are either XML-style (enclosed with
! 7: `<!--` and `-->`) or shell script style (beginning with `#`) and must appear
! 8: on their own lines and not alongside actual test data. Most test data files
! 9: are syntactically valid XML, although a few files are not (lack of support for
! 10: character entities and the preservation of CR/LF characters at the end of
! 11: lines are the biggest differences).
! 12:
! 13: Each test case exists as a file matching the format `tests/data/testNUM`,
! 14: where NUM is considered the unique test number.
! 15:
! 16: The file begins with a 'testcase' tag, which encompasses the remainder of the
! 17: file.
! 18:
! 19: # `<testcase>`
! 20:
! 21: Each test is always within the testcase tag. Each test case is split up in
! 22: four main sections: `info`, `reply`, `client` and `verify`.
! 23:
! 24: - **info** provides information about the test case
! 25:
! 26: - **reply** is used for the server to know what to send as a reply for the
! 27: requests curl sends
! 28:
! 29: - **client** defines how the client should behave
! 30:
! 31: - **verify** defines how to verify that the data stored after a command has
! 32: been run ended up correctly
! 33:
! 34: Each main section has a number of available subsections that can be specified,
! 35: that will be checked/used if specified.
! 36:
! 37: ## `<info>`
! 38:
! 39: ### `<keywords>`
! 40: A newline-separated list of keywords describing what this test case uses and
! 41: tests. Try to use an already used keyword. These keywords will be used for
! 42: statistical/informational purposes and for choosing or skipping classes
! 43: of tests. "Keywords" must begin with an alphabetic character, "-", "["
! 44: or "{" and may actually consist of multiple words separated by spaces
! 45: which are treated together as a single identifier.
! 46:
! 47: ## `<reply>`
! 48:
! 49: ### `<data [nocheck="yes"] [sendzero="yes"] [base64="yes"] [hex="yes"]>`
! 50:
! 51: data to be sent to the client on its request and later verified that it
! 52: arrived safely. Set `nocheck="yes"` to prevent the test script from verifying
! 53: the arrival of this data.
! 54:
! 55: If the data contains `swsclose` anywhere within the start and end tag, and
! 56: this is a HTTP test, then the connection will be closed by the server after
! 57: this response is sent. If not, the connection will be kept persistent.
! 58:
! 59: If the data contains `swsbounce` anywhere within the start and end tag, the
! 60: HTTP server will detect if this is a second request using the same test and
! 61: part number and will then increase the part number with one. This is useful
! 62: for auth tests and similar.
! 63:
! 64: `sendzero=yes` means that the (FTP) server will "send" the data even if the
! 65: size is zero bytes. Used to verify curl's behaviour on zero bytes transfers.
! 66:
! 67: `base64=yes` means that the data provided in the test-file is a chunk of data
! 68: encoded with base64. It is the only way a test case can contain binary
! 69: data. (This attribute can in fact be used on any section, but it doesn't make
! 70: much sense for other sections than "data").
! 71:
! 72: `hex=yes` means that the data is a sequence of hex pairs. It will get decoded
! 73: and used as "raw" data.
! 74:
! 75: For FTP file listings, the `<data>` section will be used *only* if you make
! 76: sure that there has been a CWD done first to a directory named `test-[num]`
! 77: where [num] is the test case number. Otherwise the ftp server can't know from
! 78: which test file to load the list content.
! 79:
! 80: ### `<dataNUM>`
! 81:
! 82: Send back this contents instead of the <data> one. The num is set by:
! 83:
! 84: - The test number in the request line is >10000 and this is the remainder
! 85: of [test case number]%10000.
! 86: - The request was HTTP and included digest details, which adds 1000 to NUM
! 87: - If a HTTP request is NTLM type-1, it adds 1001 to num
! 88: - If a HTTP request is NTLM type-3, it adds 1002 to num
! 89: - If a HTTP request is Basic and num is already >=1000, it adds 1 to num
! 90: - If a HTTP request is Negotiate, num gets incremented by one for each
! 91: request with Negotiate authorization header on the same test case.
! 92:
! 93: Dynamically changing num in this way allows the test harness to be used to
! 94: test authentication negotiation where several different requests must be sent
! 95: to complete a transfer. The response to each request is found in its own data
! 96: section. Validating the entire negotiation sequence can be done by specifying
! 97: a datacheck section.
! 98:
! 99: ### `<connect>`
! 100: The connect section is used instead of the 'data' for all CONNECT
! 101: requests. The remainder of the rules for the data section then apply but with
! 102: a connect prefix.
! 103:
! 104: ### `<datacheck [mode="text"] [nonewline="yes"]>`
! 105: if the data is sent but this is what should be checked afterwards. If
! 106: `nonewline=yes` is set, runtests will cut off the trailing newline from the
! 107: data before comparing with the one actually received by the client.
! 108:
! 109: Use the `mode="text"` attribute if the output is in text mode on platforms
! 110: that have a text/binary difference.
! 111:
! 112: ### `<datacheckNUM [nonewline="yes"] [mode="text"]>`
! 113: The contents of numbered datacheck sections are appended to the non-numbered
! 114: one.
! 115:
! 116: ### `<size>`
! 117: number to return on a ftp SIZE command (set to -1 to make this command fail)
! 118:
! 119: ### `<mdtm>`
! 120: what to send back if the client sends a (FTP) MDTM command, set to -1 to
! 121: have it return that the file doesn't exist
! 122:
! 123: ### `<postcmd>`
! 124: special purpose server-command to control its behavior *after* the
! 125: reply is sent
! 126: For HTTP/HTTPS, these are supported:
! 127:
! 128: `wait [secs]` - Pause for the given time
! 129:
! 130: ### `<servercmd>`
! 131: Special-commands for the server.
! 132:
! 133: The first line of this file will always be set to `Testnum [number]` by the
! 134: test script, to allow servers to read that to know what test the client is
! 135: about to issue.
! 136:
! 137: #### For FTP/SMTP/POP/IMAP
! 138:
! 139: - `REPLY [command] [return value] [response string]` - Changes how the server
! 140: responds to the [command]. [response string] is evaluated as a perl string,
! 141: so it can contain embedded \r\n, for example. There's a special [command]
! 142: named "welcome" (without quotes) which is the string sent immediately on
! 143: connect as a welcome.
! 144: - `REPLYLF` (like above but sends the response terminated with LF-only and not
! 145: CRLF)
! 146: - `COUNT [command] [num]` - Do the `REPLY` change for `[command]` only `[num]`
! 147: times and then go back to the built-in approach
! 148: - `DELAY [command] [secs]` - Delay responding to this command for the given
! 149: time
! 150: - `RETRWEIRDO` - Enable the "weirdo" RETR case when multiple response lines
! 151: appear at once when a file is transferred
! 152: - `RETRNOSIZE` - Make sure the RETR response doesn't contain the size of the
! 153: file
! 154: - `NOSAVE` - Don't actually save what is received
! 155: - `SLOWDOWN` - Send FTP responses with 0.01 sec delay between each byte
! 156: - `PASVBADIP` - makes PASV send back an illegal IP in its 227 response
! 157: - `CAPA [capabilities]` - Enables support for and specifies a list of space
! 158: separated capabilities to return to the client for the IMAP `CAPABILITY`,
! 159: POP3 `CAPA` and SMTP `EHLO` commands
! 160: - `AUTH [mechanisms]` - Enables support for SASL authentication and specifies
! 161: a list of space separated mechanisms for IMAP, POP3 and SMTP
! 162:
! 163: #### For HTTP/HTTPS
! 164:
! 165: - `auth_required` if this is set and a POST/PUT is made without auth, the
! 166: server will NOT wait for the full request body to get sent
! 167: - `idle` - do nothing after receiving the request, just "sit idle"
! 168: - `stream` - continuously send data to the client, never-ending
! 169: - `writedelay: [secs]` delay this amount between reply packets
! 170: - `skip: [num]` - instructs the server to ignore reading this many bytes from
! 171: a PUT or POST request
! 172: - `rtp: part [num] channel [num] size [num]` - stream a fake RTP packet for
! 173: the given part on a chosen channel with the given payload size
! 174: - `connection-monitor` - When used, this will log `[DISCONNECT]` to the
! 175: `server.input` log when the connection is disconnected.
! 176: - `upgrade` - when an HTTP upgrade header is found, the server will upgrade to
! 177: http2
! 178: - `swsclose` - instruct server to close connection after response
! 179: - `no-expect` - don't read the request body if Expect: is present
! 180:
! 181: #### For TFTP
! 182: `writedelay: [secs]` delay this amount between reply packets (each packet
! 183: being 512 bytes payload)
! 184:
! 185: ## `<client>`
! 186:
! 187: ### `<server>`
! 188: What server(s) this test case requires/uses. Available servers:
! 189:
! 190: - `file`
! 191: - `ftp-ipv6`
! 192: - `ftp`
! 193: - `ftps`
! 194: - `http-ipv6`
! 195: - `http-proxy`
! 196: - `http-unix`
! 197: - `http/2`
! 198: - `http`
! 199: - `https`
! 200: - `httptls+srp-ipv6`
! 201: - `httptls+srp`
! 202: - `imap`
! 203: - `mqtt`
! 204: - `none`
! 205: - `pop3`
! 206: - `rtsp-ipv6`
! 207: - `rtsp`
! 208: - `scp`
! 209: - `sftp`
! 210: - `smtp`
! 211: - `socks4`
! 212: - `socks5`
! 213:
! 214: Give only one per line. This subsection is mandatory.
! 215:
! 216: ### `<features>`
! 217: A list of features that MUST be present in the client/library for this test to
! 218: be able to run. If a required feature is not present then the test will be
! 219: SKIPPED.
! 220:
! 221: Alternatively a feature can be prefixed with an exclamation mark to indicate a
! 222: feature is NOT required. If the feature is present then the test will be
! 223: SKIPPED.
! 224:
! 225: Features testable here are:
! 226:
! 227: - `alt-svc`
! 228: - `crypto`
! 229: - `debug`
! 230: - `getrlimit`
! 231: - `GnuTLS`
! 232: - `GSS-API`
! 233: - `http/2`
! 234: - `idn`
! 235: - `ipv6`
! 236: - `Kerberos`
! 237: - `large_file`
! 238: - `ld_preload`
! 239: - `libz`
! 240: - `manual`
! 241: - `Metalink`
! 242: - `NSS`
! 243: - `NTLM`
! 244: - `OpenSSL`
! 245: - `PSL`
! 246: - `socks`
! 247: - `SPNEGO`
! 248: - `SSL`
! 249: - `SSLpinning`
! 250: - `SSPI`
! 251: - `threaded-resolver`
! 252: - `TLS-SRP`
! 253: - `TrackMemory`
! 254: - `unittest`
! 255: - `unix-sockets`
! 256: - `win32`
! 257: - `WinSSL`
! 258:
! 259: as well as each protocol that curl supports. A protocol only needs to be
! 260: specified if it is different from the server (useful when the server
! 261: is `none`).
! 262:
! 263: ### `<killserver>`
! 264: Using the same syntax as in `<server>` but when mentioned here these servers
! 265: are explicitly KILLED when this test case is completed. Only use this if there
! 266: is no other alternatives. Using this of course requires subsequent tests to
! 267: restart servers.
! 268:
! 269: ### `<precheck>`
! 270: A command line that if set gets run by the test script before the test. If an
! 271: output is displayed by the command or if the return code is non-zero, the test
! 272: will be skipped and the (single-line) output will be displayed as reason for
! 273: not running the test. Variables are substituted as in the `<command>`
! 274: section.
! 275:
! 276: ### `<postcheck>`
! 277: A command line that if set gets run by the test script after the test. If
! 278: the command exists with a non-zero status code, the test will be considered
! 279: to have failed. Variables are substituted as in the `<command>` section.
! 280:
! 281: ### `<tool>`
! 282: Name of tool to invoke instead of "curl". This tool must be built and exist
! 283: either in the libtest/ directory (if the tool name starts with 'lib') or in
! 284: the unit/ directory (if the tool name starts with 'unit').
! 285:
! 286: ### `<name>`
! 287: Brief test case description, shown when the test runs.
! 288:
! 289: ### `<setenv>`
! 290: variable1=contents1
! 291: variable2=contents2
! 292:
! 293: Set the given environment variables to the specified value before the actual
! 294: command is run. They are cleared again after the command has been run.
! 295: Variables are first substituted as in the `<command>` section.
! 296: ### `<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl"]>`
! 297: Command line to run. There's a bunch of %variables that get replaced
! 298: accordingly.
! 299:
! 300: Note that the URL that gets passed to the server actually controls what data
! 301: that is returned. The last slash in the URL must be followed by a number. That
! 302: number (N) will be used by the test-server to load test case N and return the
! 303: data that is defined within the `<reply><data></data></reply>` section.
! 304:
! 305: If there's no test number found above, the HTTP test server will use the
! 306: number following the last dot in the given hostname (made so that a CONNECT
! 307: can still pass on test number) so that "foo.bar.123" gets treated as test case
! 308: 123. Alternatively, if an IPv6 address is provided to CONNECT, the last
! 309: hexadecimal group in the address will be used as the test number! For example
! 310: the address "[1234::ff]" would be treated as test case 255.
! 311:
! 312: Set `type="perl"` to write the test case as a perl script. It implies that
! 313: there's no memory debugging and valgrind gets shut off for this test.
! 314:
! 315: Set `option="no-output"` to prevent the test script to slap on the `--output`
! 316: argument that directs the output to a file. The `--output` is also not added
! 317: if the verify/stdout section is used.
! 318:
! 319: Set `option="force-output"` to make use of `--output` even when the test is
! 320: otherwise written to verify stdout.
! 321:
! 322: Set `option="no-include"` to prevent the test script to slap on the
! 323: `--include` argument.
! 324:
! 325: Set `option="binary-trace"` to use `--trace` instead of `--trace-ascii` for
! 326: tracing. Suitable for binary-oriented protocols such as MQTT.
! 327:
! 328: Set `timeout="secs"` to override default server logs advisor read lock
! 329: timeout. This timeout is used by the test harness, once that the command has
! 330: completed execution, to wait for the test server to write out server side log
! 331: files and remove the lock that advised not to read them. The "secs" parameter
! 332: is the not negative integer number of seconds for the timeout. This `timeout`
! 333: attribute is documented for completeness sake, but is deep test harness stuff
! 334: and only needed for very singular and specific test cases. Avoid using it.
! 335:
! 336: Set `delay="secs"` to introduce a time delay once that the command has
! 337: completed execution and before the `<postcheck>` section runs. The "secs"
! 338: parameter is the not negative integer number of seconds for the delay. This
! 339: 'delay' attribute is intended for very specific test cases, and normally not
! 340: needed.
! 341:
! 342: Available substitute variables include:
! 343:
! 344: - `%CLIENT6IP` - IPv6 address of the client running curl
! 345: - `%CLIENTIP` - IPv4 address of the client running curl
! 346: - `%CURL` - Path to the curl executable
! 347: - `%FILE_PWD` - Current directory, on windows prefixed with a slash
! 348: - `%FTP2PORT` - Port number of the FTP server 2
! 349: - `%FTP6PORT` - IPv6 port number of the FTP server
! 350: - `%FTPPORT` - Port number of the FTP server
! 351: - `%FTPSPORT` - Port number of the FTPS server
! 352: - `%FTPTIME2` - Timeout in seconds that should be just sufficient to receive a response from the test FTP server
! 353: - `%FTPTIME3` - Even longer than %FTPTIME2
! 354: - `%GOPHER6PORT` - IPv6 port number of the Gopher server
! 355: - `%GOPHERPORT` - Port number of the Gopher server
! 356: - `%HOST6IP` - IPv6 address of the host running this test
! 357: - `%HOSTIP` - IPv4 address of the host running this test
! 358: - `%HTTP6PORT` - IPv6 port number of the HTTP server
! 359: - `%HTTPPORT` - Port number of the HTTP server
! 360: - `%HTTPSPORT` - Port number of the HTTPS server
! 361: - `%HTTPTLS6PORT` - IPv6 port number of the HTTP TLS server
! 362: - `%HTTPTLSPORT` - Port number of the HTTP TLS server
! 363: - `%HTTPUNIXPATH` - Path to the Unix socket of the HTTP server
! 364: - `%IMAP6PORT` - IPv6 port number of the IMAP server
! 365: - `%IMAPPORT` - Port number of the IMAP server
! 366: - `%MQTTPORT` - Port number of the MQTT server
! 367: - `%NEGTELNETPORT` - Port number of the telnet server
! 368: - `%NOLISTENPORT` - Port number where no service is listening
! 369: - `%POP36PORT` - IPv6 port number of the POP3 server
! 370: - `%POP3PORT` - Port number of the POP3 server
! 371: - `%POSIX_PWD` - Current directory somewhat mingw friendly
! 372: - `%PROXYPORT` - Port number of the HTTP proxy
! 373: - `%PWD` - Current directory
! 374: - `%RTSP6PORT` - IPv6 port number of the RTSP server
! 375: - `%RTSPPORT` - Port number of the RTSP server
! 376: - `%SMBPORT` - Port number of the SMB server
! 377: - `%SMBSPORT` - Port number of the SMBS server
! 378: - `%SMTP6PORT` - IPv6 port number of the SMTP server
! 379: - `%SMTPPORT` - Port number of the SMTP server
! 380: - `%SOCKSPORT` - Port number of the SOCKS4/5 server
! 381: - `%SRCDIR` - Full path to the source dir
! 382: - `%SSHPORT` - Port number of the SCP/SFTP server
! 383: - `%SSHSRVMD5` - MD5 of SSH server's public key
! 384: - `%TFTP6PORT` - IPv6 port number of the TFTP server
! 385: - `%TFTPPORT` - Port number of the TFTP server
! 386: - `%USER` - Login ID of the user running the test
! 387:
! 388: ### `<file name="log/filename">`
! 389: This creates the named file with this content before the test case is run,
! 390: which is useful if the test case needs a file to act on. Variables are
! 391: substituted on the contents of the file as in the `<command>` section.
! 392:
! 393: ### `<stdin [nonewline="yes"]>`
! 394: Pass this given data on stdin to the tool.
! 395:
! 396: If 'nonewline' is set, we will cut off the trailing newline of this given data
! 397: before comparing with the one actually received by the client
! 398:
! 399: ## `<verify>`
! 400: ### `<errorcode>`
! 401: numerical error code curl is supposed to return. Specify a list of accepted
! 402: error codes by separating multiple numbers with comma. See test 237 for an
! 403: example.
! 404:
! 405: ### `<strip>`
! 406: One regex per line that is removed from the protocol dumps before the
! 407: comparison is made. This is very useful to remove dependencies on dynamically
! 408: changing protocol data such as port numbers or user-agent strings.
! 409:
! 410: ### `<strippart>`
! 411: One perl op per line that operates on the protocol dump. This is pretty
! 412: advanced. Example: `s/^EPRT .*/EPRT stripped/`.
! 413:
! 414: ### `<protocol [nonewline="yes"]>`
! 415:
! 416: the protocol dump curl should transmit, if 'nonewline' is set, we will cut off
! 417: the trailing newline of this given data before comparing with the one actually
! 418: sent by the client Variables are substituted as in the `<command>` section.
! 419: The `<strip>` and `<strippart>` rules are applied before comparisons are made.
! 420:
! 421: ### `<proxy [nonewline="yes"]>`
! 422:
! 423: The protocol dump curl should transmit to a HTTP proxy (when the http-proxy
! 424: server is used), if 'nonewline' is set, we will cut off the trailing newline
! 425: of this given data before comparing with the one actually sent by the client
! 426: Variables are substituted as in the `<command>` section. The `<strip>` and
! 427: `<strippart>` rules are applied before comparisons are made.
! 428:
! 429: ### `<stdout [mode="text"] [nonewline="yes"]>`
! 430: This verifies that this data was passed to stdout. Variables are
! 431: substituted as in the `<command>` section.
! 432:
! 433: Use the mode="text" attribute if the output is in text mode on platforms that
! 434: have a text/binary difference.
! 435:
! 436: If 'nonewline' is set, we will cut off the trailing newline of this given data
! 437: before comparing with the one actually received by the client
! 438:
! 439: ### `<file name="log/filename" [mode="text"]>`
! 440: The file's contents must be identical to this after the test is complete. Use
! 441: the mode="text" attribute if the output is in text mode on platforms that have
! 442: a text/binary difference. Variables are substituted as in the `<command>`
! 443: section.
! 444:
! 445: ### `<file1>`
! 446: 1 to 4 can be appended to 'file' to compare more files.
! 447:
! 448: ### `<file2>`
! 449:
! 450: ### `<file3>`
! 451:
! 452: ### `<file4>`
! 453:
! 454: ### `<stripfile>`
! 455: One perl op per line that operates on the output file or stdout before being
! 456: compared with what is stored in the test file. This is pretty
! 457: advanced. Example: "s/^EPRT .*/EPRT stripped/"
! 458:
! 459: ### `<stripfile1>`
! 460: 1 to 4 can be appended to 'stripfile' to strip the corresponding <fileN>
! 461: content
! 462:
! 463: ### `<stripfile2>`
! 464:
! 465: ### `<stripfile3>`
! 466:
! 467: ### `<stripfile4>`
! 468:
! 469: ### `<upload>`
! 470: the contents of the upload data curl should have sent
! 471:
! 472: ### `<valgrind>`
! 473: disable - disables the valgrind log check for this test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>