fix(fastapi): increase recursion limit during tests

The default recursion limit used by Docker's archlinux:base-devel
Python package becomes problematic in some cases when running tests
against our FastAPI application using starlette.testclient.TestClient
(aliased to fastapi.testclient.TestClient). starlette ends up with
test failures because it exceeds the recursion limit, but this only
happens when using the `TestClient`. When the ASGI servers are run,
this is not an issue and so in that case, the recursion limit has
not been touched.

This change uses a `TEST_RECURSION_LIMIT` environment variable to
modify the recursion limit of the FastAPI application. This variable
is, by default, only supplied when running pytests in Docker, but
can be force-supplied by the user.

TEST_RECURSION_LIMIT=10000 has been added to `.env` and `.gitlab-ci.yml`.

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-10-23 20:06:00 -07:00
parent 5fb75b9614
commit 94d494866f
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
4 changed files with 20 additions and 0 deletions

1
.env
View file

@ -4,3 +4,4 @@ MARIADB_SOCKET_DIR="/var/run/mysqld/"
CGIT_CLONE_PREFIX_PHP=https://localhost:8443
CGIT_CLONE_PREFIX_FASTAPI=https://localhost:8444
GIT_DATA_DIR="./aur.git/"
TEST_RECURSION_LIMIT=10000

View file

@ -9,6 +9,7 @@ cache:
variables:
AUR_CONFIG: conf/config # Default MySQL config setup in before_script.
DB_HOST: localhost
TEST_RECURSION_LIMIT: 10000
before_script:
- export PATH="$HOME/.poetry/bin:${PATH}"

View file

@ -1,5 +1,7 @@
import asyncio
import http
import os
import sys
import typing
from urllib.parse import quote_plus
@ -25,6 +27,19 @@ app = FastAPI(exception_handlers=errors.exceptions)
@app.on_event("startup")
async def app_startup():
# https://stackoverflow.com/questions/67054759/about-the-maximum-recursion-error-in-fastapi
# Test failures have been observed by internal starlette code when
# using starlette.testclient.TestClient. Looking around in regards
# to the recursion error has really not recommended a course of action
# other than increasing the recursion limit. For now, that is how
# we handle the issue: an optional TEST_RECURSION_LIMIT env var
# provided by the user. Docker uses .env's TEST_RECURSION_LIMIT
# when running test suites.
# TODO: Find a proper fix to this issue.
recursion_limit = int(os.environ.get(
"TEST_RECURSION_LIMIT", sys.getrecursionlimit()))
sys.setrecursionlimit(recursion_limit)
session_secret = aurweb.config.get("fastapi", "session_secret")
if not session_secret:
raise Exception("[fastapi] session_secret must not be empty")

View file

@ -216,6 +216,7 @@ services:
init: true
environment:
- AUR_CONFIG=conf/config
- TEST_RECURSION_LIMIT=${TEST_RECURSION_LIMIT}
entrypoint: /docker/test-mysql-entrypoint.sh
command: /docker/scripts/run-pytests.sh clean
stdin_open: true
@ -241,6 +242,7 @@ services:
init: true
environment:
- AUR_CONFIG=conf/config.sqlite
- TEST_RECURSION_LIMIT=${TEST_RECURSION_LIMIT}
entrypoint: /docker/test-sqlite-entrypoint.sh
command: setup-sqlite.sh run-pytests.sh clean
stdin_open: true
@ -262,6 +264,7 @@ services:
init: true
environment:
- AUR_CONFIG=conf/config
- TEST_RECURSION_LIMIT=${TEST_RECURSION_LIMIT}
entrypoint: /docker/tests-entrypoint.sh
command: setup-sqlite.sh run-tests.sh
stdin_open: true