diff options
Diffstat (limited to 'subplot/ewww.py')
-rw-r--r-- | subplot/ewww.py | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/subplot/ewww.py b/subplot/ewww.py new file mode 100644 index 0000000..9282d64 --- /dev/null +++ b/subplot/ewww.py @@ -0,0 +1,106 @@ +############################################################################# +# Some helpers to make step functions simpler. + +import json +import logging +import os +import random +import re +import shutil +import signal +import socket +import subprocess +import time +import urllib.parse + +import yaml + + +# Name of Rust binary, debug-build. +def _binary(name): + return os.path.abspath(os.path.join(srcdir, "target", "debug", name)) + + +# Write a file with given content. +def _write(filename, content): + open(filename, "w").write(content) + + +# Construct a URL that points to server running on localhost by +# replacing the actual scheme and host with ones that work for test. +def _url(ctx, url): + port = ctx["config"]["port"] + c = urllib.parse.urlparse(url) + host = c[1] + c = (c[0], "localhost:{}".format(port)) + c[2:] + return urllib.parse.urlunparse(c), host + + +############################################################################# +# The actual step functions. + + +# Fail: use this for unimplemented steps. +def fixme(*args, **kwargs): + assert 0 + + +# Create a file. +def create_file(ctx, filename=None, content=None): + logging.debug(f"Creating file {filename} with {content}") + dirname = os.path.dirname(filename) + os.makedirs(dirname) + _write(filename, content) + + +# Copy test certificate from source tree, where it's been created previously by +# ./check. +def copy_test_certificate(ctx, cert=None, key=None): + logging.debug(f"Copying test.pem, test.key from srcdir to {cert} and {key}") + shutil.copy(os.path.join(srcdir, "test.pem"), cert) + shutil.copy(os.path.join(srcdir, "test.key"), key) + + +# Start server using named configuration file. +def start_server(ctx, filename=None): + logging.debug(f"Starting ewww with config file {filename}") + config = get_file(filename).decode("UTF-8") + config = yaml.safe_load(config) + port = config["port"] = random.randint(2000, 30000) + logging.debug(f"Picked randomly port for ewww: {config['port']}") + ctx["config"] = config + config = yaml.safe_dump(config) + _write(filename, config) + + start_daemon(ctx, "ewww", [_binary("ewww"), filename]) + + if not port_open("localhost", port, 5.0): + stderr = open(ctx["daemon"]["ewww"]["stderr"]).read() + logging.debug(f"Stderr from daemon: {stderr!r}") + + +# Wait for a port to be open +def port_open(host, port, timeout): + logging.debug(f"Waiting for port localhost:{port} to be available") + started = time.time() + while time.time() < started + timeout: + try: + socket.create_connection((host, port), timeout=timeout) + return True + except socket.error: + pass + logging.error(f"Port localhost:{port} is not open") + return False + + +# Stop previously started server. +def stop_server(ctx): + logging.debug("Stopping ewww") + stop_daemon(ctx, "ewww") + + +# Make an HTTP request. +def request(ctx, method=None, url=None): + logging.debug(f"Making HTTP request to ewww: {method} {url}") + url, host = _url(ctx, url) + http_request(ctx, host=host, method=method, url=url) |