--- layout: page title: Server Features order: 12 --- ## Advanced Testing Features Certain test scenarios require more than just static HTML generation. This is supported through the [wptserve](https://github.com/w3c/wptserve) server. Several scenarios in particular are common: ### Tests Involving Multiple Origins In the test environment, five subdomains are available: `www`, `www1`, `www2`, `天気の良い日`, and `élève`; there is also `nonexistent-origin` which is guaranteed not to resolve. In addition, the HTTP server listens on two ports, and the WebSockets server on one. These subdomains and ports must be used for cross-origin tests. Tests must not hardcode the hostname of the server that they expect to be running on or the port numbers, as these are not guaranteed by the test environment. Instead they can get this information in one of two ways: * From script, using the `location` API. * By using a textual substitution feature of the server. In order for the latter to work, a file must either have a name of the form `{name}.sub.{ext}` e.g. `example-test.sub.html` or be referenced through a URL containing `pipe=sub` in the query string e.g. `example-test.html?pipe=sub`. The substitution syntax uses `{% raw %}{{ }}{% endraw %}` to delimit items for substitution. For example to substitute in the host name on which the tests are running, one would write: `{% raw %}{{host}}{% endraw %}`. As well as the host, one can get full domains, including subdomains using the `domains` dictionary. For example, `{% raw %}{{domains[www]}}{% endraw %}` or `{% raw %}{{domains[élève]}}{% endraw %}` would be replaced by the full qualified domain name of the respective subdomains. Ports are also available on a per-protocol basis. For example, `{% raw %}{{ports[ws][0]}}{% endraw %}` is replaced with the first (and only) WebSockets port, while `{% raw %}{{ports[http][1]}}{% endraw %}` is replaced with the second HTTP port. The request URL itself can be used as part of the substitution using the `location` dictionary, which has entries matching the `window.location` API. For example, `{% raw %}{{location[host]}}{% endraw %}`is replaced by `hostname:port` for the current request, matching `location.host`. ### Tests Requiring Special Headers For tests requiring that a certain HTTP header is set to some static value, a file with the same path as the test file except for an an additional `.headers` suffix may be created. For example for `/example/test.html`, the headers file would be `/example/test.html.headers`. This file consists of lines of the form header-name: header-value For example Content-Type: text/html; charset=big5 To apply the same headers to all files in a directory use a `__dir__.headers` file. This will only apply to the immediate directory and not subdirectories. Headers files may be used in combination with substitutions by naming the file e.g. `test.html.sub.headers`. ### Tests Requiring Full Control Over The HTTP Response For full control over the request and response the server provides the ability to write `.asis` files; these are served as literal HTTP responses. It also provides the ability to write Python scripts that have access to request data and can manipulate the content and timing of the response. For details see the [wptserve documentation](https://wptserve.readthedocs.org).