From d415a53151c247be5b8705e55e52f474dd9c9569 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Mon, 27 Sep 2021 15:22:14 -0700 Subject: [PATCH] rpc/fix: tweak tests for docker/http to not hang --- .../python/tests/cryptol/test_basics.py | 47 +++++++++++++++---- cryptol-remote-api/run_rpc_tests.sh | 4 +- cryptol-remote-api/test_docker.sh | 7 ++- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/cryptol-remote-api/python/tests/cryptol/test_basics.py b/cryptol-remote-api/python/tests/cryptol/test_basics.py index 178e7af2f..d18f0918b 100644 --- a/cryptol-remote-api/python/tests/cryptol/test_basics.py +++ b/cryptol-remote-api/python/tests/cryptol/test_basics.py @@ -3,6 +3,7 @@ from pathlib import Path import unittest import io +import os import time import cryptol import cryptol.cryptoltypes @@ -21,7 +22,7 @@ def setUpClass(self): self.c = cryptol.connect(verify=False) def test_extend_search_path(self): - """Test that extending the search path acts as expected w.r.t. loads.""" + # Test that extending the search path acts as expected w.r.t. loads c = self.c c.extend_search_path(str(Path('tests','cryptol','test-files', 'test-subdir'))) @@ -68,15 +69,43 @@ def test_check_timeout(self): self.assertLess(t2 - t1, 5) def test_interrupt(self): - c = self.c - c.load_file(str(Path('tests','cryptol','test-files', 'examples','AES.cry'))) + # Check if this test is using a local server, if not we assume it's a remote HTTP server + if os.getenv('CRYPTOL_SERVER') is not None: + c = self.c + c.load_file(str(Path('tests','cryptol','test-files', 'examples','AES.cry'))) + + t1 = time.time() + c.check("\\(bv : [256]) -> ~ (~ (~ (~bv))) == bv", num_tests="all", timeout=30.0) + # ^ .result() intentionally omitted so we don't wait on it's result and we can interrupt + # it on the next line. We add a timeout just in case to the test fails + time.sleep(.5) + c.interrupt() + self.assertTrue(c.safe("aesEncrypt").result()) + t2 = time.time() + self.assertLess(t2 - t1, 15.0) # ensure th interrupt ended things and not the timeout + elif os.getenv('CRYPTOL_SERVER_URL') is not None: + c = self.c + other_c = cryptol.connect(verify=False) + # Since this is the HTTP server, due to client implementation details + # the requests don't return until they get a response, so we fork + # to interrupt the server + newpid = os.fork() + if newpid == 0: + time.sleep(5) + other_c.interrupt() + os._exit(0) + + c.load_file(str(Path('tests','cryptol','test-files', 'examples','AES.cry'))) + + t1 = time.time() + c.check("\\(bv : [256]) -> ~ (~ (~ (~bv))) == bv", num_tests="all", timeout=60.0) + self.assertTrue(c.safe("aesEncrypt").result()) + t2 = time.time() + self.assertLess(t2 - t1, 20.0) # ensure th interrupt ended things and not the timeout + else: + # Otherwise fail... since this shouldn't be possible + self.assertFalse("Impossible") - c.check("\\(bv : [256]) -> ~ (~ (~ (~bv))) == bv", num_tests="all") - # ^ .result() intentionally omitted so we don't wait on it's result and we can interrupt - # it on the next line. - time.sleep(.5) - c.interrupt() - self.assertTrue(c.safe("aesEncrypt").result()) def test_prove_timeout(self): c = self.c diff --git a/cryptol-remote-api/run_rpc_tests.sh b/cryptol-remote-api/run_rpc_tests.sh index e9e24b057..b53be4ffe 100755 --- a/cryptol-remote-api/run_rpc_tests.sh +++ b/cryptol-remote-api/run_rpc_tests.sh @@ -31,10 +31,10 @@ run_test poetry run mypy cryptol/ tests/ get_server cryptol-remote-api echo "Running cryptol-remote-api tests..." -run_test poetry run python -m unittest discover tests/cryptol +run_test poetry run python -m unittest discover --verbose tests/cryptol get_server cryptol-eval-server echo "Running cryptol-eval-server tests..." -run_test poetry run python -m unittest discover tests/cryptol_eval +run_test poetry run python -m unittest discover --verbose tests/cryptol_eval popd diff --git a/cryptol-remote-api/test_docker.sh b/cryptol-remote-api/test_docker.sh index a643c7b86..ad5eb12bd 100755 --- a/cryptol-remote-api/test_docker.sh +++ b/cryptol-remote-api/test_docker.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -euo pipefail + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" PROTO=${1:-"http"} @@ -25,10 +27,13 @@ pushd $DIR/python NUM_FAILS=0 echo "Setting up python environment for remote server clients..." +poetry update poetry install export CRYPTOL_SERVER_URL="$PROTO://localhost:8080/" -poetry run python -m unittest discover tests/cryptol + +echo "Running cryptol-remote-api tests with remote server at $CRYPTOL_SERVER_URL..." +poetry run python -m unittest discover --verbose tests/cryptol if [ $? -ne 0 ]; then NUM_FAILS=$(($NUM_FAILS+1)) fi