summaryrefslogtreecommitdiff
path: root/subplot/ewww.py
diff options
context:
space:
mode:
Diffstat (limited to 'subplot/ewww.py')
-rw-r--r--subplot/ewww.py106
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)