datasette/tests/test_datasette_https_server.sh
Jan Lehnardt e03aed0002 Detect server start/stop more reliably.
This is useful, especially in testing, since your test
hosts might not reliabliy start the server within two
seconds, so we do a definite check before progressing.

By the same token, after `kill $server_pid` wait for
the pid to be gone from the process list.

Since now the script can end prematurely, I also added
a cleanup function to make sure the temporary certs are
removed in any case.

n.b. this could also be done with the use of `trap 'fn'
ERR` but that felt like a bit too much magic for this
short a script.
2022-12-18 08:01:51 -08:00

64 lines
1.6 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Generate certificates
python -m trustme
# This creates server.pem, server.key, client.pem
cleanup () {
rm server.pem server.key client.pem
}
# Start the server in the background
datasette --memory \
--ssl-keyfile=server.key \
--ssl-certfile=server.pem \
-p 8152 &
# Store the background process ID in a variable
server_pid=$!
test_url='https://localhost:8152/_memory.json'
# Wait for the server to start
# h/t https://github.com/pouchdb/pouchdb/blob/25db22fb0ff025b8d2c698da30c6c409066baa0c/bin/run-test.sh#L102-L113
waiting=0
until $(curl --output /dev/null --silent --insecure --head --fail --max-time 2 $test_url); do
if [ $waiting -eq 4 ]; then
echo "$test_url can not be reached, server failed to start"
cleanup
exit 1
fi
let waiting=waiting+1
sleep 1
done
# Make a test request using curl
curl -f --cacert client.pem $test_url
# Save curl's exit code (-f option causes it to return one on HTTP errors)
curl_exit_code=$?
# Shut down the server
kill $server_pid
waiting=0
# show all pids
# | find just the $server_pid
# | | dont match on the previous grep
# | | | we dont need the output
# | | | |
until ( ! ps ax | grep $server_pid | grep -v grep > /dev/null ); do
if [ $waiting -eq 4 ]; then
echo "$server_pid does still exist, server failed to stop"
cleanup
exit 1
fi
let waiting=waiting+1
sleep 1
done
# Clean up the certificates
cleanup
echo $curl_exit_code
exit $curl_exit_code