#!/bin/sh # Checks tools/serve.py, the preview server that runs the built binary and # hands its output back over HTTP. The cases live beside this file, in # serve-split-check.py for how the CGI headers are told from the body and in # serve-handler-check.py for a request served on a free loopback port with a # stub in place of cgit. Nothing here touches a repository, so the fixtures # stay unbuilt. test_description='Check the preview server splits CGI output correctly' CGIT_TEST_NO_CREATE_REPOS=YesPlease . ./setup.sh # A version manager's shim may find its interpreters through HOME, which the # library has moved into the trash directory, so the interpreter is looked up # once under the account's own. -I keeps the user's site packages and PYTHON # variables out of the checks. PYTHON=$(HOME=$USER_HOME python3 -I -c 'import sys; print(sys.executable)' 2>/dev/null) # serve.py uses syntax that came with Python 3.8. test_lazy_prereq PYTHON ' test -n "$PYTHON" && "$PYTHON" -I -c "import sys; sys.exit(sys.version_info < (3, 8))" ' test_have_prereq PYTHON || { skip_all='Skipping preview server tests: no python3 3.8 or later' test_done } split_check() { "$PYTHON" -I "$TEST_OUTPUT_DIRECTORY/serve-split-check.py" \ "$TEST_OUTPUT_DIRECTORY/.." "$1" } test_expect_success 'a CRLF blank line in the body stays in the body' ' split_check crlf-in-body ' test_expect_success 'an LF blank line after CRLF headers stays in the body' ' split_check lf-in-body ' test_expect_success 'a status line is taken off the headers' ' split_check status ' test_expect_success 'an empty body survives, as a redirect leaves one' ' split_check empty-body ' test_expect_success 'output with no blank line at all is all headers' ' split_check no-blank-line ' handler_check() { mkdir "$1" && "$PYTHON" -I "$TEST_OUTPUT_DIRECTORY/serve-handler-check.py" \ "$TEST_OUTPUT_DIRECTORY/.." "$PWD/$1" "$1" } test_expect_success 'a request reaches the CGI with the environment it needs' ' handler_check environment ' test_expect_success 'a request body reaches the CGI with its length' ' handler_check post-body ' test_expect_success 'a root-level asset is served from the data directory' ' handler_check asset ' test_expect_success 'a file of that name inside a repository goes to the CGI' ' handler_check repository-file ' test_expect_success 'a link out of the data directory is no asset' ' handler_check asset-link-outside ' test_expect_success 'a CGI that fails is answered with 500' ' handler_check failing-cgi ' test_expect_success 'a CGI that stalls is answered with 504' ' handler_check stalled-cgi ' test_expect_success 'a body over the cap is refused with 413' ' handler_check oversized-body ' test_expect_success 'a HEAD request gets the headers alone' ' handler_check head ' test_done