| Index: LayoutTests/imported/web-platform-tests/server-side.md
|
| diff --git a/LayoutTests/imported/web-platform-tests/server-side.md b/LayoutTests/imported/web-platform-tests/server-side.md
|
| deleted file mode 100644
|
| index 46a9e8367c3cf4fa6a04c908143175b414f132dd..0000000000000000000000000000000000000000
|
| --- a/LayoutTests/imported/web-platform-tests/server-side.md
|
| +++ /dev/null
|
| @@ -1,234 +0,0 @@
|
| -# Writing Complex Tests #
|
| -
|
| -For many tests, writing one or more static HTML files is
|
| -sufficient. However there are a large class of tests for which this
|
| -approach is insufficient, including:
|
| -
|
| -* Tests that require cross-domain access
|
| -
|
| -* Tests that depend on setting specific headers or status codes
|
| -
|
| -* Tests that need to inspect the browser sent request
|
| -
|
| -* Tests that require state to be stored on the server
|
| -
|
| -* Tests that require precise timing of the response.
|
| -
|
| -To make writing such tests possible, we are using a number of
|
| -server-side components designed to make it easy to manipulate the
|
| -precise details of the response:
|
| -
|
| -* *wptserve*, a custom python HTTP server.
|
| -
|
| -* *pywebsocket*, an existing websockets server
|
| -
|
| -This document will concentrate on the features of wptserve available
|
| -to test authors.
|
| -
|
| -## Introduction to wptserve ##
|
| -
|
| -wptserve is a python-based web server. By default it serves static
|
| -files in the testsuite. For more sophisticated requirements, several
|
| -mechanisms are available to take control of the response. These are
|
| -outlined below.
|
| -
|
| -## Pipes ##
|
| -
|
| -Suitable for:
|
| -
|
| - * Cross domain requests
|
| - * Adding headers or status codes to static files
|
| - * Controlling the sending of static file bodies
|
| -
|
| -Pipes are designed to allow simple manipulation of the way that
|
| -static files are sent without requiring any custom code. They are also
|
| -useful for cross-origin tests because they can be used to activate a
|
| -substitution mechanism which can fill in details of ports and server
|
| -names in the setup on which the tests are being run.
|
| -
|
| -Pipes are indicated by adding a query string to a request for a static
|
| -resource, with the parameter name `pipe`. The value of the query
|
| -should be a `|` serperated list of pipe functions. For example to
|
| -return a `.html` file with the status code 410 and a Content-Type of
|
| -text/plain, one might use:
|
| -
|
| - /resources/example.html?pipe=status(410)|header(Content-Type,text/plain)
|
| -
|
| -There are a selection of pipe functions provided with wptserve and
|
| -more may be added if there are good use cases.
|
| -
|
| -### sub ###
|
| -
|
| -Used to subsitute variables from the server environment, or from the
|
| -request into the response. A typical use case is for testing
|
| -cross-domain since the exact domain name and ports of the servers are
|
| -generally unknown.
|
| -
|
| -Substitutions are marked in a file using a block delimited by `{{`
|
| -and `}}`. Inside the block the following variables are avalible:
|
| -
|
| -* `{{host}}` - the host name of the server exclusing any subdomain part.
|
| -* `{{domains[]}}` - the domain name of a particular subdomain
|
| - e.g. `{{domains[www]}}` for the `www` subdomain.
|
| -* `{{ports[][]}}` - The port number of servers, by protocol
|
| - e.g. `{{ports[http][1]}}` for the second (i.e. non-default) http
|
| - server.
|
| -* `{{headers[]}}` - The HTTP headers in the request
|
| - e.g. `{{headers[X-Test]}}` for a hypothetical `X-Test` header.
|
| -* `{{GET[]}}` - The query parameters for the request
|
| - e.g. `{{GET[id]}}` for an id parameter sent with the request.
|
| -
|
| -So, for example, to write a javascript file called `xhr.js` that does a
|
| -cross domain XHR test to a different subdomain and port, one would
|
| -write in the file:
|
| -
|
| - var server_url = "http://{{domains[www]}}:{{ports[http][1]}}/path/to/resource";
|
| - //Create the actual XHR and so on
|
| -
|
| -The file would then be included as:
|
| -
|
| - <script src="xhr.js?pipe=sub"></script>
|
| -
|
| -### status ###
|
| -
|
| -Used to set the HTTP status of the response, for example:
|
| -
|
| - example.js?pipe=status(410)
|
| -
|
| -### headers ###
|
| -
|
| -Used to add or replace http headers in the response. Takes two or
|
| -three arguments; the header name, the header value and whether to
|
| -append the header rather than replace an existing header (default:
|
| -False). So, for example, a request for:
|
| -
|
| - example.html?pipe=header(Content-Type,text/plain)
|
| -
|
| -causes example.html to be returned with a text/plain content type
|
| -whereas:
|
| -
|
| - example.html?pipe=header(Content-Type,text/plain,True)
|
| -
|
| -Will cause example.html to be returned with both text/html and
|
| -text/plain content-type headers.
|
| -
|
| -### slice ###
|
| -
|
| -Used to send only part of a response body. Takes the start and,
|
| -optionally, end bytes as arguments, although either can be null to
|
| -indicate the start or end of the file, respectively. So for example:
|
| -
|
| - example.txt?pipe=slice(10,20)
|
| -
|
| -Would result in a response with a body containing 10 bytes of
|
| -example.txt including byte 10 but excluding byte 20.
|
| -
|
| - example.txt?pipe=slice(10)
|
| -
|
| -Would cause all bytes from byte 10 of example.txt to be sent, but:
|
| -
|
| - example.txt?pipe=slice(null,20)
|
| -
|
| -Would send the first 20 bytes of example.txt.
|
| -
|
| -### trickle ###
|
| -
|
| -Used to send the body of a response in chunks with delays. Takes a
|
| -single argument that is a microsyntax consisting of colon-separated
|
| -commands. There are three types of commands:
|
| -
|
| -* Bare numbers represent a number of bytes to send
|
| -
|
| -* Numbers prefixed `d` indicate a delay in seconds
|
| -
|
| -* Numbers prefixed `r` must only appear at the end of the command, and
|
| - indicate that the preceding N items must be repeated until there is
|
| - no more content to send.
|
| -
|
| -In the absence of a repetition command, the entire remainder of the content is
|
| -sent at once when the command list is exhausted. So for example:
|
| -
|
| - example.txt?pipe=trickle(d1)
|
| -
|
| -causes a 1s delay before sending the entirety of example.txt.
|
| -
|
| - example.txt?pipe=trickle(100:d1)
|
| -
|
| -causes 100 bytes of example.txt to be sent, followed by a 1s delay,
|
| -and then the remainder of the file to be sent. On the other hand:
|
| -
|
| - example.txt?pipe=trickle(100:d1:r2)
|
| -
|
| -Will cause the file to be sent in 100 byte chunks separated by a 1s
|
| -delay until the whole content has been sent.
|
| -
|
| -## asis files ##
|
| -
|
| -Suitable for:
|
| -
|
| - * Static, HTTP-non-compliant responses
|
| -
|
| -asis files are simply files with the extension `.asis`. They are sent
|
| -byte for byte to the server without adding a HTTP status line,
|
| -headers, or anything else. This makes them suitable for testing
|
| -situations where the precise bytes on the wire are static, and control
|
| -over the timing is unnecessary, but the response does not conform to
|
| -HTTP requirements.
|
| -
|
| -## py files ##
|
| -
|
| -Suitable for:
|
| -
|
| - * All tests requiring dynamic responses
|
| - * Tests that need to store server side state.
|
| -
|
| -The most flexible mechanism for writing tests is to use `.py`
|
| -files. These are interpreted as code and are suitable for the same
|
| -kinds of tasks that one might achieve using cgi, PHP or a similar
|
| -technology. Unlike cgi or PHP, the file is not executed directly and
|
| -does not produce output by writing to `stdout`. Instead files must
|
| -contain (at least) a function named `main`, with the signature:
|
| -
|
| - def main(request, response):
|
| - pass
|
| -
|
| -Here `request` is a `Request` object that contains details of the
|
| -request, and `response` is a `Response` object that can be used to set
|
| -properties of the response. Full details of these objects is
|
| -provided in the [wptserve documentation](http://wptserve.readthedocs.org/en/latest/).
|
| -
|
| -In many cases tests will not need to work with the `response` object
|
| -directly. Instead they can set the status, headers and body simply by
|
| -returning values from the `main` function. If any value is returned,
|
| -it is interpreted as the response body. If two values are returned
|
| -they are interpreted as headers and body, and three values are
|
| -interpreted as status, headers, body. So, for example:
|
| -
|
| - def main(request, response):
|
| - return "TEST"
|
| -
|
| -creates a response with no non-default headers and the body
|
| -`TEST`. Headers can be added as follows:
|
| -
|
| - def main(request, response):
|
| - return ([("Content-Type", "text/plain"), ("X-Test", "test")],
|
| - "TEST")
|
| -
|
| -And a status code as:
|
| -
|
| - def main(request, response):
|
| - return (410,
|
| - [("Content-Type", "text/plain"), ("X-Test", "test")],
|
| - "TEST")
|
| -
|
| -A custom status string may be returned by using a tuple `code, string`
|
| -in place of the code alone.
|
| -
|
| -At the other end of the scale, some tests require precision over the
|
| -exact bytes sent over the wire and their timing. This can be achieved
|
| -using the `writer` property of the response, which exposes a
|
| -`ResponseWriter` object that allows wither writing specific parts of
|
| -the request or direct access to the underlying socket.
|
| -
|
| -For full documentation on the facilities available in `.py` files, see
|
| -the [wptserve documentation](http://wptserve.readthedocs.org/en/latest/).
|
|
|