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>