Verified Commit 94d49486 authored by Kevin Morris's avatar Kevin Morris
Browse files

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's avatarKevin Morris <kevr@0cost.org>
parent 5fb75b96
Pipeline #12528 passed with stage
in 7 minutes and 54 seconds
......@@ -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
......@@ -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}"
......
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")
......
......@@ -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
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment