diff --git a/.evergreen/config.yml b/.evergreen/config.yml index 6b2b332a5c..97845b86d4 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -42,7 +42,7 @@ functions: # Make an evergreen expansion file with dynamic values - command: subprocess.exec params: - include_expansions_in_env: ["is_patch", "project", "version_id", "skip_web_identity_auth_test", "skip_ECS_auth_test"] + include_expansions_in_env: ["is_patch", "project", "version_id"] binary: bash working_dir: "src" args: @@ -213,16 +213,14 @@ functions: params: file: ${DRIVERS_TOOLS}/mo-expansion.yml - "run doctests": - - command: subprocess.exec - type: test - params: - include_expansions_in_env: [ "PYTHON_BINARY" ] - working_dir: "src" - binary: bash - args: - - .evergreen/scripts/run-with-env.sh - - .evergreen/scripts/run-doctests.sh + "run just script": + - command: subprocess.exec + type: test + params: + include_expansions_in_env: [AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN] + binary: bash + working_dir: "src" + args: [.evergreen/just.sh, "${JUSTFILE_TARGET}"] "run tests": - command: subprocess.exec @@ -248,7 +246,6 @@ functions: binary: bash working_dir: "src" args: - - .evergreen/scripts/run-with-env.sh - .evergreen/scripts/cleanup.sh "teardown system": @@ -305,36 +302,7 @@ tasks: params: args: - src/.evergreen/scripts/run-getdata.sh -# Standard test tasks {{{ - - - name: "mockupdb" - tags: ["mockupdb"] - commands: - - func: "run tests" - vars: - TEST_NAME: mockupdb - - - name: "doctests" - tags: ["doctests"] - commands: - - func: "run server" - - func: "run doctests" - - name: "no-server" - tags: ["no-server"] - commands: - - func: "run tests" - - - name: "free-threading" - tags: ["free-threading"] - commands: - - func: "run server" - vars: - VERSION: "8.0" - TOPOLOGY: "replica_set" - - func: "run tests" - -# }}} - name: "coverage-report" tags: ["coverage"] depends_on: @@ -384,12 +352,6 @@ tasks: - ${github_commit} buildvariants: -- name: "no-server" - display_name: "No server" - run_on: - - rhel84-small - tasks: - - name: "no-server" - name: "Coverage Report" display_name: "Coverage Report" diff --git a/.evergreen/generated_configs/tasks.yml b/.evergreen/generated_configs/tasks.yml index c692ec31db..efc7844061 100644 --- a/.evergreen/generated_configs/tasks.yml +++ b/.evergreen/generated_configs/tasks.yml @@ -713,6 +713,15 @@ tasks: AWS_ROLE_SESSION_NAME: test tags: [auth-aws, auth-aws-web-identity] + # Doctest tests + - name: test-doctests + commands: + - func: run server + - func: run just script + vars: + JUSTFILE_TARGET: docs-test + tags: [doctests] + # Enterprise auth tests - name: test-enterprise-auth commands: @@ -727,6 +736,16 @@ tasks: AUTH: auth tags: [enterprise_auth] + # Free threading tests + - name: test-free-threading + commands: + - func: run server + vars: + VERSION: "8.0" + TOPOLOGY: replica_set + - func: run tests + tags: [free-threading] + # Kms tests - name: test-gcpkms commands: @@ -799,6 +818,14 @@ tasks: TEST_NAME: load_balancer tags: [load-balancer, noauth, nossl] + # Mockupdb tests + - name: test-mockupdb + commands: + - func: run tests + vars: + TEST_NAME: mockupdb + tags: [mockupdb] + # Mod wsgi tests - name: mod-wsgi-standalone commands: @@ -841,6 +868,12 @@ tasks: SUB_TEST_NAME: embedded tags: [mod_wsgi] + # No server tests + - name: test-no-server + commands: + - func: run tests + tags: [no-server] + # Ocsp tests - name: test-ocsp-ecdsa-valid-cert-server-does-not-staple commands: diff --git a/.evergreen/generated_configs/variants.yml b/.evergreen/generated_configs/variants.yml index 361a0c9dde..aa20fef895 100644 --- a/.evergreen/generated_configs/variants.yml +++ b/.evergreen/generated_configs/variants.yml @@ -242,7 +242,7 @@ buildvariants: # Doctests tests - name: doctests-rhel8-python3.9 tasks: - - name: doctests + - name: .doctests display_name: Doctests RHEL8 Python3.9 run_on: - rhel87-small @@ -672,7 +672,7 @@ buildvariants: # Mockupdb tests - name: mockupdb-rhel8-python3.9 tasks: - - name: mockupdb + - name: .mockupdb display_name: MockupDB RHEL8 Python3.9 run_on: - rhel87-small @@ -746,6 +746,14 @@ buildvariants: NO_EXT: "1" PYTHON_BINARY: /opt/python/3.13/bin/python3 + # No server tests + - name: no-server + tasks: + - name: .no-server + display_name: No server + run_on: + - rhel87-small + # Ocsp tests - name: ocsp-rhel8-v4.4-python3.9 tasks: diff --git a/.evergreen/run-tests.sh b/.evergreen/run-tests.sh index 40336c6d2d..6f53ced61c 100755 --- a/.evergreen/run-tests.sh +++ b/.evergreen/run-tests.sh @@ -34,7 +34,10 @@ fi uv sync ${UV_ARGS} --reinstall uv pip list +# Ensure we go back to base environment after the test. +trap "uv sync" EXIT HUP + # Start the test runner. -uv run .evergreen/scripts/run_tests.py "$@" +uv run ${UV_ARGS} .evergreen/scripts/run_tests.py "$@" popd diff --git a/.evergreen/scripts/cleanup.sh b/.evergreen/scripts/cleanup.sh index c58d2163dd..6bb4b3ce5f 100755 --- a/.evergreen/scripts/cleanup.sh +++ b/.evergreen/scripts/cleanup.sh @@ -1,4 +1,12 @@ #!/bin/bash +HERE=$(dirname ${BASH_SOURCE:-$0}) + +# Try to source the env file. +if [ -f $HERE/env.sh ]; then + echo "Sourcing env file" + source $HERE/env.sh +fi + rm -rf "${DRIVERS_TOOLS}" || true rm -f ./secrets-export.sh || true diff --git a/.evergreen/scripts/configure-env.sh b/.evergreen/scripts/configure-env.sh index fa37b8fb08..9ec98bb5be 100755 --- a/.evergreen/scripts/configure-env.sh +++ b/.evergreen/scripts/configure-env.sh @@ -60,8 +60,6 @@ export MONGO_ORCHESTRATION_HOME="$MONGO_ORCHESTRATION_HOME" export MONGODB_BINARIES="$MONGODB_BINARIES" export DRIVERS_TOOLS_BINARIES="$DRIVERS_TOOLS_BINARIES" export PROJECT_DIRECTORY="$PROJECT_DIRECTORY" -export skip_web_identity_auth_test="${skip_web_identity_auth_test:-}" -export skip_ECS_auth_test="${skip_ECS_auth_test:-}" export CARGO_HOME="$CARGO_HOME" export UV_TOOL_DIR="$UV_TOOL_DIR" diff --git a/.evergreen/scripts/generate_config.py b/.evergreen/scripts/generate_config.py index dad4f27bcb..0a2496c66d 100644 --- a/.evergreen/scripts/generate_config.py +++ b/.evergreen/scripts/generate_config.py @@ -685,7 +685,7 @@ def create_mockupdb_variants(): python = CPYTHONS[0] return [ create_variant( - ["mockupdb"], + [".mockupdb"], get_display_name("MockupDB", host, python=python), python=python, host=host, @@ -698,7 +698,7 @@ def create_doctests_variants(): python = CPYTHONS[0] return [ create_variant( - ["doctests"], + [".doctests"], get_display_name("Doctests", host, python=python), python=python, host=host, @@ -748,6 +748,11 @@ def create_aws_auth_variants(): return variants +def create_no_server_variants(): + host = HOSTS["rhel8"] + return [create_variant([".no-server"], "No server", host=host)] + + def create_alternative_hosts_variants(): batchtime = BATCHTIME_WEEK variants = [] @@ -1040,6 +1045,37 @@ def create_ocsp_tasks(): return tasks +def create_mockupdb_tasks(): + test_func = FunctionCall(func="run tests", vars=dict(TEST_NAME="mockupdb")) + task_name = "test-mockupdb" + tags = ["mockupdb"] + return [EvgTask(name=task_name, tags=tags, commands=[test_func])] + + +def create_doctest_tasks(): + server_func = FunctionCall(func="run server") + test_func = FunctionCall(func="run just script", vars=dict(JUSTFILE_TARGET="docs-test")) + task_name = "test-doctests" + tags = ["doctests"] + return [EvgTask(name=task_name, tags=tags, commands=[server_func, test_func])] + + +def create_no_server_tasks(): + test_func = FunctionCall(func="run tests") + task_name = "test-no-server" + tags = ["no-server"] + return [EvgTask(name=task_name, tags=tags, commands=[test_func])] + + +def create_free_threading_tasks(): + vars = dict(VERSION="8.0", TOPOLOGY="replica_set") + server_func = FunctionCall(func="run server", vars=vars) + test_func = FunctionCall(func="run tests") + task_name = "test-free-threading" + tags = ["free-threading"] + return [EvgTask(name=task_name, tags=tags, commands=[server_func, test_func])] + + def create_serverless_tasks(): vars = dict(TEST_NAME="serverless", AUTH="auth", SSL="ssl") test_func = FunctionCall(func="run tests", vars=vars) diff --git a/.evergreen/scripts/run-with-env.sh b/.evergreen/scripts/run-with-env.sh deleted file mode 100755 index 2fd073605d..0000000000 --- a/.evergreen/scripts/run-with-env.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -eu - -# Example use: bash run-with-env.sh run-tests.sh {args...} - -# Parameter expansion to get just the current directory's name -if [ "${PWD##*/}" == "src" ]; then - . .evergreen/scripts/env.sh - if [ -f ".evergreen/scripts/test-env.sh" ]; then - . .evergreen/scripts/test-env.sh - fi -else - . src/.evergreen/scripts/env.sh - if [ -f "src/.evergreen/scripts/test-env.sh" ]; then - . src/.evergreen/scripts/test-env.sh - fi -fi - -set -eu - -# shellcheck source=/dev/null -. "$@" diff --git a/.evergreen/scripts/setup_tests.py b/.evergreen/scripts/setup_tests.py index ae7fde5efc..17f9de1a71 100644 --- a/.evergreen/scripts/setup_tests.py +++ b/.evergreen/scripts/setup_tests.py @@ -128,8 +128,7 @@ def handle_test_env() -> None: TEST_ARGS = "" # Start compiling the args we'll pass to uv. - # Run in an isolated environment so as not to pollute the base venv. - UV_ARGS = ["--isolated --extra test"] + UV_ARGS = ["--extra test --no-group dev"] test_title = test_name if sub_test_name: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5f55e56684..e75510171e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -282,6 +282,27 @@ Note: these tests can only be run from an Evergreen host. - Run `just setup-tests search_index`. - Run `just run-tests`. +### MockupDB tests + +- Run `just setup-tests mockupdb`. +- Run `just run-tests`. + +### Doc tests + +The doc tests require a running server. + +- Run `just run-server`. +- Run `just docs-test`. + +### Free-threaded Python Tests + +In the evergreen builds, the tests are configured to use the free-threaded python from the toolchain. +Locally you can run: + +- Run `just run-server`. +- Run `just setup-tests`. +- Run `UV_PYTHON=3.13t just run-tests`. + ### AWS Lambda tests You will need to set up access to the `drivers-test-secrets-role`, see the [Wiki](https://wiki.corp.mongodb.com/spaces/DRIVERS/pages/239737385/Using+AWS+Secrets+Manager+to+Store+Testing+Secrets). diff --git a/uv.lock b/uv.lock index 8b5d592dc0..7dae5c9136 100644 --- a/uv.lock +++ b/uv.lock @@ -1036,6 +1036,7 @@ snappy = [ { name = "python-snappy" }, ] test = [ + { name = "pip" }, { name = "pytest" }, { name = "pytest-asyncio" }, ] @@ -1080,6 +1081,7 @@ requires-dist = [ { name = "cryptography", marker = "extra == 'ocsp'", specifier = ">=2.5" }, { name = "dnspython", specifier = ">=1.16.0,<3.0.0" }, { name = "furo", marker = "extra == 'docs'", specifier = "==2024.8.6" }, + { name = "pip", marker = "extra == 'test'" }, { name = "pykerberos", marker = "os_name != 'nt' and extra == 'gssapi'" }, { name = "pymongo-auth-aws", marker = "extra == 'aws'", specifier = ">=1.1.0,<2.0.0" }, { name = "pymongo-auth-aws", marker = "extra == 'encryption'", specifier = ">=1.1.0,<2.0.0" },