PYTHON-5138 Convert setup_tests.py to a cli (#2154)

This commit is contained in:
Steven Silvester 2025-02-21 14:27:33 -06:00 committed by GitHub
parent b56605cc1f
commit 25b2d77b63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 449 additions and 570 deletions

View File

@ -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", "AUTH", "SSL", "TEST_ENCRYPTION", "TEST_ENCRYPTION_PYOPENSSL", "TEST_CRYPT_SHARED", "TEST_PYOPENSSL", "SETDEFAULTENCODING", "TEST_LOADBALANCER", "TEST_SEVERLESS", "SKIP_CSOT_TESTS", "MONGODB_STARTED", "DISABLE_TEST_COMMANDS", "GREEN_FRAMEWORK", "NO_EXT", "COVERAGE", "COMPRESSORS", "MONGODB_API_VERSION", "skip_crypt_shared", "VERSION", "TOPOLOGY", "STORAGE_ENGINE", "ORCHESTRATION_FILE", "REQUIRE_API_VERSION", "LOAD_BALANCER", "skip_web_identity_auth_test", "skip_ECS_auth_test"]
include_expansions_in_env: ["is_patch", "project", "version_id", "skip_web_identity_auth_test", "skip_ECS_auth_test"]
binary: bash
working_dir: "src"
args:
@ -205,18 +205,13 @@ functions:
- command: subprocess.exec
params:
binary: bash
include_expansions_in_env: ["VERSION", "TOPOLOGY", "AUTH", "SSL", "ORCHESTRATION_FILE", "LOAD_BALANCER"]
include_expansions_in_env: [VERSION, TOPOLOGY, AUTH, SSL, ORCHESTRATION_FILE, LOAD_BALANCER,
STORAGE_ENGINE, REQUIRE_API_VERSION, DRIVERS_TOOLS, TEST_CRYPT_SHARED]
args:
- src/.evergreen/scripts/run-with-env.sh
- src/.evergreen/scripts/bootstrap-mongo-orchestration.sh
- command: expansions.update
params:
file: mo-expansion.yml
- command: expansions.update
params:
updates:
- key: MONGODB_STARTED
value: "1"
"bootstrap data lake":
- command: subprocess.exec
@ -250,17 +245,6 @@ functions:
- .evergreen/scripts/run-with-env.sh
- .evergreen/scripts/run-mod-wsgi-tests.sh
"run mockupdb tests":
- 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-mockupdb-tests.sh
"run doctests":
- command: subprocess.exec
type: test
@ -276,14 +260,12 @@ functions:
- command: subprocess.exec
type: test
params:
include_expansions_in_env: ["TEST_DATA_LAKE", "PYTHON_BINARY", "AUTH", "SSL",
"AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN", "TEST_SUITES",
"TEST_INDEX_MANAGEMENT", "CRYPT_SHARED_LIB_PATH", "TEST_ENCRYPTION", "TEST_ENCRYPTION_PYOPENSSL",
"TEST_CRYPT_SHARED", "TEST_PYOPENSSL", "TEST_LOADBALANCER", "TEST_SEVERLESS", "MONGODB_URI"]
include_expansions_in_env: [AUTH, SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,
AWS_SESSION_TOKEN, COVERAGE, PYTHON_BINARY, LIBMONGOCRYPT_URL, MONGODB_URI,
DISABLE_TEST_COMMANDS, GREEN_FRAMEWORK, NO_EXT, COMPRESSORS]
binary: bash
working_dir: "src"
args:
- .evergreen/scripts/setup-tests.sh
args: [.evergreen/just.sh, setup-test, "${TEST_NAME}", "${SUB_TEST_NAME}"]
- command: subprocess.exec
type: test
params:
@ -755,7 +737,9 @@ tasks:
- name: "mockupdb"
tags: ["mockupdb"]
commands:
- func: "run mockupdb tests"
- func: "run tests"
vars:
TEST_NAME: mockupdb
- name: "doctests"
tags: ["doctests"]
@ -770,6 +754,8 @@ tasks:
tags: ["serverless"]
commands:
- func: "run tests"
vars:
TEST_NAME: serverless
- name: "test-enterprise-auth"
tags: ["enterprise-auth"]
@ -789,7 +775,7 @@ tasks:
TOPOLOGY: "replica_set"
- func: "run tests"
vars:
TEST_INDEX_MANAGEMENT: "1"
TEST_NAME: index_management
AUTH: "auth"
- name: "mod-wsgi-standalone"
@ -857,7 +843,7 @@ tasks:
- func: "bootstrap data lake"
- func: "run tests"
vars:
TEST_DATA_LAKE: "true"
TEST_NAME: "data_lake"
- name: "test-aws-lambda-deployed"
commands:

File diff suppressed because it is too large Load Diff

View File

@ -318,7 +318,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /opt/python/3.9/bin/python3
tags: [encryption_tag]
- name: encryption-rhel8-python3.13
@ -331,7 +331,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /opt/python/3.13/bin/python3
tags: [encryption_tag]
- name: encryption-rhel8-pypy3.10
@ -344,7 +344,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
tags: [encryption_tag]
- name: encryption-crypt_shared-rhel8-python3.9
@ -357,7 +357,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /opt/python/3.9/bin/python3
tags: [encryption_tag]
@ -371,7 +371,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /opt/python/3.13/bin/python3
tags: [encryption_tag]
@ -385,7 +385,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
tags: [encryption_tag]
@ -399,8 +399,8 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_ENCRYPTION_PYOPENSSL: "true"
TEST_NAME: encryption
SUB_TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.9/bin/python3
tags: [encryption_tag]
- name: encryption-pyopenssl-rhel8-python3.13
@ -413,8 +413,8 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_ENCRYPTION_PYOPENSSL: "true"
TEST_NAME: encryption
SUB_TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.13/bin/python3
tags: [encryption_tag]
- name: encryption-pyopenssl-rhel8-pypy3.10
@ -427,8 +427,8 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_ENCRYPTION_PYOPENSSL: "true"
TEST_NAME: encryption
SUB_TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
tags: [encryption_tag]
- name: encryption-rhel8-python3.10
@ -438,7 +438,7 @@ buildvariants:
run_on:
- rhel87-small
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /opt/python/3.10/bin/python3
- name: encryption-crypt_shared-rhel8-python3.11
tasks:
@ -447,7 +447,7 @@ buildvariants:
run_on:
- rhel87-small
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /opt/python/3.11/bin/python3
- name: encryption-pyopenssl-rhel8-python3.12
@ -457,8 +457,8 @@ buildvariants:
run_on:
- rhel87-small
expansions:
TEST_ENCRYPTION: "true"
TEST_ENCRYPTION_PYOPENSSL: "true"
TEST_NAME: encryption
SUB_TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.12/bin/python3
- name: encryption-macos-python3.9
tasks:
@ -468,7 +468,7 @@ buildvariants:
- macos-14
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /Library/Frameworks/Python.Framework/Versions/3.9/bin/python3
tags: [encryption_tag]
- name: encryption-macos-python3.13
@ -479,7 +479,7 @@ buildvariants:
- macos-14
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: /Library/Frameworks/Python.Framework/Versions/3.13/bin/python3
tags: [encryption_tag]
- name: encryption-crypt_shared-macos-python3.9
@ -490,7 +490,7 @@ buildvariants:
- macos-14
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /Library/Frameworks/Python.Framework/Versions/3.9/bin/python3
tags: [encryption_tag]
@ -502,7 +502,7 @@ buildvariants:
- macos-14
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: /Library/Frameworks/Python.Framework/Versions/3.13/bin/python3
tags: [encryption_tag]
@ -514,7 +514,7 @@ buildvariants:
- windows-64-vsMulti-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: C:/python/Python39/python.exe
tags: [encryption_tag]
- name: encryption-win64-python3.13
@ -525,7 +525,7 @@ buildvariants:
- windows-64-vsMulti-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
PYTHON_BINARY: C:/python/Python313/python.exe
tags: [encryption_tag]
- name: encryption-crypt_shared-win64-python3.9
@ -536,7 +536,7 @@ buildvariants:
- windows-64-vsMulti-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: C:/python/Python39/python.exe
tags: [encryption_tag]
@ -548,7 +548,7 @@ buildvariants:
- windows-64-vsMulti-small
batchtime: 10080
expansions:
TEST_ENCRYPTION: "true"
TEST_NAME: encryption
TEST_CRYPT_SHARED: "true"
PYTHON_BINARY: C:/python/Python313/python.exe
tags: [encryption_tag]
@ -772,7 +772,7 @@ buildvariants:
# No c ext tests
- name: no-c-ext-rhel8-python3.9
tasks:
- name: .standalone .noauth .nossl .sync_async
- name: .standalone .noauth .nossl !.sync_async
display_name: No C Ext RHEL8 Python3.9
run_on:
- rhel87-small
@ -781,7 +781,7 @@ buildvariants:
PYTHON_BINARY: /opt/python/3.9/bin/python3
- name: no-c-ext-rhel8-python3.10
tasks:
- name: .replica_set .noauth .nossl .sync_async
- name: .replica_set .noauth .nossl !.sync_async
display_name: No C Ext RHEL8 Python3.10
run_on:
- rhel87-small
@ -790,7 +790,7 @@ buildvariants:
PYTHON_BINARY: /opt/python/3.10/bin/python3
- name: no-c-ext-rhel8-python3.11
tasks:
- name: .sharded_cluster .noauth .nossl .sync_async
- name: .sharded_cluster .noauth .nossl !.sync_async
display_name: No C Ext RHEL8 Python3.11
run_on:
- rhel87-small
@ -799,7 +799,7 @@ buildvariants:
PYTHON_BINARY: /opt/python/3.11/bin/python3
- name: no-c-ext-rhel8-python3.12
tasks:
- name: .standalone .noauth .nossl .sync_async
- name: .standalone .noauth .nossl !.sync_async
display_name: No C Ext RHEL8 Python3.12
run_on:
- rhel87-small
@ -808,7 +808,7 @@ buildvariants:
PYTHON_BINARY: /opt/python/3.12/bin/python3
- name: no-c-ext-rhel8-python3.13
tasks:
- name: .replica_set .noauth .nossl .sync_async
- name: .replica_set .noauth .nossl !.sync_async
display_name: No C Ext RHEL8 Python3.13
run_on:
- rhel87-small
@ -997,7 +997,7 @@ buildvariants:
- macos-14
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: /Library/Frameworks/Python.Framework/Versions/3.9/bin/python3
- name: pyopenssl-rhel8-python3.10
tasks:
@ -1008,7 +1008,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.10/bin/python3
- name: pyopenssl-rhel8-python3.11
tasks:
@ -1019,7 +1019,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.11/bin/python3
- name: pyopenssl-rhel8-python3.12
tasks:
@ -1030,7 +1030,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/3.12/bin/python3
- name: pyopenssl-win64-python3.13
tasks:
@ -1041,7 +1041,7 @@ buildvariants:
- windows-64-vsMulti-small
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: C:/python/Python313/python.exe
- name: pyopenssl-rhel8-pypy3.10
tasks:
@ -1052,7 +1052,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_PYOPENSSL: "true"
TEST_NAME: pyopenssl
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
# Search index tests
@ -1288,7 +1288,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_SERVERLESS: "true"
TEST_NAME: serverless
AUTH: auth
SSL: ssl
PYTHON_BINARY: /opt/python/3.9/bin/python3
@ -1300,7 +1300,7 @@ buildvariants:
- rhel87-small
batchtime: 10080
expansions:
TEST_SERVERLESS: "true"
TEST_NAME: serverless
AUTH: auth
SSL: ssl
PYTHON_BINARY: /opt/python/3.13/bin/python3

View File

@ -2,7 +2,7 @@
set -o errexit # Exit the script with error if any of the commands fail
HERE=$(dirname ${BASH_SOURCE:-$0})
. $DRIVERS_TOOLS/.evergreen/csfle/azurekms/setup-secrets.sh
SUCCESS=false TEST_FLE_AZURE_AUTO=1 bash $HERE/scripts/setup-tests.sh
bash $HERE/just.sh setup-test kms azure-fail
KEY_NAME="${AZUREKMS_KEYNAME}" \
KEY_VAULT_ENDPOINT="${AZUREKMS_KEYVAULTENDPOINT}" \
$HERE/just.sh test-eg

View File

@ -19,7 +19,7 @@ AZUREKMS_CMD="tar xf mongo-python-driver.tgz" \
$DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh
echo "Untarring file ... end"
echo "Running test ... begin"
AZUREKMS_CMD="SUCCESS=true TEST_FLE_AZURE_AUTO=1 bash .evergreen/just.sh setup-test" \
AZUREKMS_CMD="bash .evergreen/just.sh setup-test kms azure" \
$DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh
AZUREKMS_CMD="KEY_NAME=\"$AZUREKMS_KEYNAME\" KEY_VAULT_ENDPOINT=\"$AZUREKMS_KEYVAULTENDPOINT\" bash ./.evergreen/just.sh test-eg" \
$DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh

View File

@ -18,7 +18,7 @@ echo "Untarring file ... begin"
GCPKMS_CMD="tar xf mongo-python-driver.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
echo "Untarring file ... end"
echo "Running test ... begin"
GCPKMS_CMD="SUCCESS=true TEST_FLE_GCP_AUTO=1 bash ./.evergreen/just.sh setup-test" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
GCPKMS_CMD="bash ./.evergreen/just.sh setup-test kms gcp" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
GCPKMS_CMD="./.evergreen/just.sh test-eg" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
echo "Running test ... end"
bash $HERE/scripts/teardown-tests.sh

View File

@ -26,11 +26,9 @@ apt-get -qq update < /dev/null > /dev/null
apt-get -qq install $PYTHON_VER $PYTHON_VER-venv build-essential $PYTHON_VER-dev -y < /dev/null > /dev/null
export PYTHON_BINARY=$PYTHON_VER
export TEST_AUTH_AWS=1
export AUTH="auth"
export SET_XTRACE_ON=1
cd src
rm -rf .venv
rm -f .evergreen/scripts/test-env.sh || true
bash ./.evergreen/just.sh setup-test
bash ./.evergreen/just.sh setup-test auth_aws ecs
bash .evergreen/just.sh test-eg

View File

@ -29,5 +29,5 @@ else
exit 1
fi
TEST_AUTH_OIDC=1 COVERAGE=1 AUTH="auth" bash ./.evergreen/just.sh setup-test
COVERAGE=1 bash ./.evergreen/just.sh setup-test auth_oidc
bash ./.evergreen/just.sh test-eg "${@:1}"

View File

@ -14,7 +14,6 @@ export TEST_PATH="${PROJECT_DIRECTORY}/specifications/source/benchmarking/data"
export OUTPUT_FILE="${PROJECT_DIRECTORY}/results.json"
export PYTHON_BINARY=/opt/mongodbtoolchain/v4/bin/python3
export PERF_TEST=1
bash ./.evergreen/just.sh setup-test
bash ./.evergreen/just.sh setup-test perf
bash ./.evergreen/just.sh test-eg

View File

@ -1,8 +1,11 @@
#!/bin/bash
set -eu
set -eux
SCRIPT_DIR=$(dirname ${BASH_SOURCE:-$0})
ROOT_DIR="$(dirname "$(dirname $SCRIPT_DIR)")"
SCRIPT_DIR="$( cd -- "$SCRIPT_DIR" > /dev/null 2>&1 && pwd )"
ROOT_DIR="$(dirname $SCRIPT_DIR)"
pushd $ROOT_DIR
export PIP_QUIET=1 # Quiet by default
export PIP_PREFER_BINARY=1 # Prefer binary dists by default
@ -16,7 +19,7 @@ else
echo "Not sourcing env inputs"
fi
# Ensure there are test inputs.
# Handle test inputs.
if [ -f $SCRIPT_DIR/scripts/test-env.sh ]; then
echo "Sourcing test inputs"
. $SCRIPT_DIR/scripts/test-env.sh
@ -24,9 +27,10 @@ else
echo "Missing test inputs, please run 'just setup-test'"
fi
# Source the local secrets export file if available.
if [ -f "$ROOT_DIR/secrets-export.sh" ]; then
. "$ROOT_DIR/secrets-export.sh"
if [ -f "./secrets-export.sh" ]; then
. "./secrets-export.sh"
fi
PYTHON_IMPL=$(uv run python -c "import platform; print(platform.python_implementation())")
@ -54,7 +58,7 @@ uv run python -c 'import sys; print(sys.version)'
PIP_QUIET=0 uv run ${UV_ARGS} --with pip pip list
# Record the start time for a perf test.
if [ -n "${PERF_TEST:-}" ]; then
if [ -n "${TEST_PERF:-}" ]; then
start_time=$(date +%s)
fi
@ -75,7 +79,7 @@ fi
echo "Running tests with $TEST_ARGS... done."
# Handle perf test post actions.
if [ -n "${PERF_TEST:-}" ]; then
if [ -n "${TEST_PERF:-}" ]; then
end_time=$(date +%s)
elapsed_secs=$((end_time-start_time))
@ -90,3 +94,5 @@ fi
if [ -n "${COVERAGE:-}" ]; then
rm -rf .pytest_cache
fi
popd

View File

@ -1,6 +1,7 @@
#!/bin/bash
set -o xtrace
set -eu
# Enable core dumps if enabled on the machine
# Copied from https://github.com/mongodb/mongo/blob/master/etc/evergreen.yml
@ -29,7 +30,7 @@ if [ "$(uname -s)" = "Darwin" ]; then
fi
fi
if [ -n "${skip_crypt_shared}" ]; then
if [ -z "${TEST_CRYPT_SHARED:-}" ]; then
export SKIP_CRYPT_SHARED=1
fi

View File

@ -55,24 +55,11 @@ export MONGODB_BINARIES="$DRIVERS_TOOLS/mongodb/bin"
cat <<EOT > "$SCRIPT_DIR"/env.sh
export PROJECT_DIRECTORY="$PROJECT_DIRECTORY"
export CURRENT_VERSION="$CURRENT_VERSION"
export SKIP_LEGACY_SHELL=1
export DRIVERS_TOOLS="$DRIVERS_TOOLS"
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 SETDEFAULTENCODING="${SETDEFAULTENCODING:-}"
export SKIP_CSOT_TESTS="${SKIP_CSOT_TESTS:-}"
export MONGODB_STARTED="${MONGODB_STARTED:-}"
export DISABLE_TEST_COMMANDS="${DISABLE_TEST_COMMANDS:-}"
export GREEN_FRAMEWORK="${GREEN_FRAMEWORK:-}"
export NO_EXT="${NO_EXT:-}"
export COVERAGE="${COVERAGE:-}"
export COMPRESSORS="${COMPRESSORS:-}"
export MONGODB_API_VERSION="${MONGODB_API_VERSION:-}"
export skip_crypt_shared="${skip_crypt_shared:-}"
export STORAGE_ENGINE="${STORAGE_ENGINE:-}"
export REQUIRE_API_VERSION="${REQUIRE_API_VERSION:-}"
export skip_web_identity_auth_test="${skip_web_identity_auth_test:-}"
export skip_ECS_auth_test="${skip_ECS_auth_test:-}"
@ -96,14 +83,8 @@ SKIP_LEGACY_SHELL=1
DRIVERS_TOOLS="$DRIVERS_TOOLS"
MONGO_ORCHESTRATION_HOME="$MONGO_ORCHESTRATION_HOME"
MONGODB_BINARIES="$MONGODB_BINARIES"
TMPDIR="$MONGO_ORCHESTRATION_HOME/db"
EOT
# Skip CSOT tests on non-linux platforms.
if [ "$(uname -s)" != "Linux" ]; then
echo "export SKIP_CSOT_TESTS=1" >> $SCRIPT_DIR/env.sh
fi
# Add these expansions to make it easier to call out tests scripts from the EVG yaml
cat <<EOT > expansion.yml
DRIVERS_TOOLS: "$DRIVERS_TOOLS"

View File

@ -344,11 +344,11 @@ def create_encryption_variants() -> list[BuildVariant]:
batchtime = BATCHTIME_WEEK
def get_encryption_expansions(encryption):
expansions = dict(TEST_ENCRYPTION="true")
expansions = dict(TEST_NAME="encryption")
if "crypt_shared" in encryption:
expansions["TEST_CRYPT_SHARED"] = "true"
if "PyOpenSSL" in encryption:
expansions["TEST_ENCRYPTION_PYOPENSSL"] = "true"
expansions["SUB_TEST_NAME"] = "pyopenssl"
return expansions
host = DEFAULT_HOST
@ -487,7 +487,7 @@ def create_enterprise_auth_variants():
def create_pyopenssl_variants():
base_name = "PyOpenSSL"
batchtime = BATCHTIME_WEEK
expansions = dict(TEST_PYOPENSSL="true")
expansions = dict(TEST_NAME="pyopenssl")
variants = []
for python in ALL_PYTHONS:
@ -588,7 +588,7 @@ def create_no_c_ext_variants():
variants = []
host = DEFAULT_HOST
for python, topology in zip_cycle(CPYTHONS, TOPOLOGIES):
tasks = [f".{topology} .noauth .nossl .sync_async"]
tasks = [f".{topology} .noauth .nossl !.sync_async"]
expansions = dict()
handle_c_ext(C_EXTS[0], expansions)
display_name = get_display_name("No C Ext", host, python=python)
@ -645,7 +645,7 @@ def create_disable_test_commands_variants():
def create_serverless_variants():
host = DEFAULT_HOST
batchtime = BATCHTIME_WEEK
expansions = dict(TEST_SERVERLESS="true", AUTH="auth", SSL="ssl")
expansions = dict(TEST_NAME="serverless", AUTH="auth", SSL="ssl")
tasks = ["serverless_task_group"]
base_name = "Serverless"
return [
@ -811,17 +811,11 @@ def create_server_tasks():
SSL=ssl,
)
bootstrap_func = FunctionCall(func="bootstrap mongo-orchestration", vars=bootstrap_vars)
test_suites = ""
test_vars = dict(AUTH=auth, SSL=ssl, SYNC=sync)
if sync == "sync":
test_suites = "default"
test_vars["TEST_NAME"] = "default_sync"
elif sync == "async":
test_suites = "default_async"
test_vars = dict(
AUTH=auth,
SSL=ssl,
SYNC=sync,
TEST_SUITES=test_suites,
)
test_vars["TEST_NAME"] = "default_async"
test_func = FunctionCall(func="run tests", vars=test_vars)
tasks.append(EvgTask(name=name, tags=tags, commands=[bootstrap_func, test_func]))
return tasks
@ -834,9 +828,10 @@ def create_load_balancer_tasks():
tags = ["load-balancer", auth, ssl]
bootstrap_vars = dict(TOPOLOGY="sharded_cluster", AUTH=auth, SSL=ssl, LOAD_BALANCER="true")
bootstrap_func = FunctionCall(func="bootstrap mongo-orchestration", vars=bootstrap_vars)
test_vars = dict(AUTH=auth, SSL=ssl, TEST_LOADBALANCER="true")
test_vars = dict(AUTH=auth, SSL=ssl, TEST_NAME="load_balancer")
test_func = FunctionCall(func="run tests", vars=test_vars)
tasks.append(EvgTask(name=name, tags=tags, commands=[bootstrap_func, test_func]))
return tasks

View File

@ -4,5 +4,5 @@
set +x
set -o errexit
bash "${DRIVERS_TOOLS}"/.evergreen/auth_aws/setup_secrets.sh drivers/atlas_connect
TEST_ATLAS=1 bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh setup-test
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh setup-test atlas
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh test-eg

View File

@ -5,5 +5,5 @@ set -eu
set +x
# Use the default python to bootstrap secrets.
bash "${DRIVERS_TOOLS}"/.evergreen/secrets_handling/setup-secrets.sh drivers/enterprise_auth
TEST_ENTERPRISE_AUTH=1 AUTH=auth bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh setup-test
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh setup-test enterprise_auth
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh test-eg

View File

@ -2,5 +2,5 @@
set -eu
HERE=$(dirname ${BASH_SOURCE:-$0})
. $HERE/env.sh
SUCCESS=false TEST_FLE_GCP_AUTO=1 bash $HERE/setup-tests.sh
./.evergreen/just.sh setup-test kms gcp-fail
bash ./.evergreen/just.sh test-eg

View File

@ -1,5 +0,0 @@
#!/bin/bash
set -o xtrace
export PYTHON_BINARY=${PYTHON_BINARY}
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh test-mockupdb

View File

@ -24,5 +24,5 @@ echo "Running MONGODB-AWS authentication tests for $1"
# Handle credentials and environment setup.
. "$DRIVERS_TOOLS"/.evergreen/auth_aws/aws_setup.sh "$1"
TEST_AUTH_AWS=1 AUTH="auth" bash ./.evergreen/just.sh setup-test
bash ./.evergreen/just.sh setup-test auth_aws $1
bash ./.evergreen/just.sh test-eg

View File

@ -1,9 +1,12 @@
#!/bin/bash
set -eu
TEST_OCSP=1 \
PYTHON_BINARY="${PYTHON_BINARY}" \
pushd "${PROJECT_DIRECTORY}/.evergreen"
bash scripts/setup-dev-env.sh
CA_FILE="${DRIVERS_TOOLS}/.evergreen/ocsp/${OCSP_ALGORITHM}/ca.pem" \
OCSP_TLS_SHOULD_SUCCEED="${OCSP_TLS_SHOULD_SUCCEED}" \
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh setup-test
bash "${PROJECT_DIRECTORY}"/.evergreen/just.sh test-eg
OCSP_TLS_SHOULD_SUCCEED="${OCSP_TLS_SHOULD_SUCCEED}" \
bash scripts/setup-tests.sh ocsp
bash run-tests.sh
bash "${DRIVERS_TOOLS}"/.evergreen/ocsp/teardown.sh
popd

View File

@ -3,7 +3,9 @@
set -eux
HERE=$(dirname ${BASH_SOURCE:-$0})
pushd "$(dirname "$(dirname $HERE)")" > /dev/null
HERE="$( cd -- "$HERE" > /dev/null 2>&1 && pwd )"
ROOT=$(dirname "$(dirname $HERE)")
pushd $ROOT > /dev/null
# Source the env files to pick up common variables.
if [ -f $HERE/env.sh ]; then
@ -26,7 +28,7 @@ fi
# Ensure there is a python venv.
if [ ! -d $BIN_DIR ]; then
. .evergreen/utils.sh
. $ROOT/.evergreen/utils.sh
if [ -z "${PYTHON_BINARY:-}" ]; then
PYTHON_BINARY=$(find_python3)
@ -49,3 +51,5 @@ echo "Setting up python environment... done."
if [ -d .git ] && [ ! -f .git/hooks/pre-commit ]; then
uv run --frozen pre-commit install
fi
popd > /dev/null

View File

@ -8,54 +8,15 @@ set -eu
# COVERAGE If non-empty, run the test suite with coverage.
# COMPRESSORS If non-empty, install appropriate compressor.
# LIBMONGOCRYPT_URL The URL to download libmongocrypt.
# TEST_DATA_LAKE If non-empty, run data lake tests.
# TEST_ENCRYPTION If non-empty, run encryption tests.
# TEST_CRYPT_SHARED If non-empty, install crypt_shared lib.
# TEST_SERVERLESS If non-empy, test on serverless.
# TEST_LOADBALANCER If non-empy, test load balancing.
# TEST_FLE_AZURE_AUTO If non-empy, test auto FLE on Azure
# TEST_FLE_GCP_AUTO If non-empy, test auto FLE on GCP
# TEST_PYOPENSSL If non-empy, test with PyOpenSSL
# TEST_ENTERPRISE_AUTH If non-empty, test with Enterprise Auth
# TEST_AUTH_AWS If non-empty, test AWS Auth Mechanism
# TEST_AUTH_OIDC If non-empty, test OIDC Auth Mechanism
# TEST_PERF If non-empty, run performance tests
# TEST_OCSP If non-empty, run OCSP tests
# TEST_ATLAS If non-empty, test Atlas connections
# TEST_INDEX_MANAGEMENT If non-empty, run index management tests
# TEST_ENCRYPTION_PYOPENSSL If non-empy, test encryption with PyOpenSSL
# PERF_TEST If non-empty, run the performance tests.
# MONGODB_API_VERSION The mongodb api version to use in tests.
# MONGODB_URI If non-empty, use as the MONGODB_URI in tests.
# PYTHON_BINARY The python binary to use in tests.
SCRIPT_DIR=$(dirname ${BASH_SOURCE:-$0})
ROOT_DIR="$(dirname "$(dirname $SCRIPT_DIR)")"
# Try to source the env file.
if [ -f $SCRIPT_DIR/env.sh ]; then
source $SCRIPT_DIR/env.sh
fi
# Source serverless secrets if applicable.
if [ -n "${TEST_SERVERLESS:-}" ]; then
source $DRIVERS_TOOLS/.evergreen/serverless/secrets-export.sh
fi
# Source atlas secrets if applicable.
if [ -n "${TEST_INDEX_MANAGEMENT:-}" ]; then
source $DRIVERS_TOOLS/.evergreen/atlas/secrets-export.sh
fi
# Source ADL secrets if applicable.
if [ -n "${TEST_DATA_LAKE:-}" ]; then
source ${DRIVERS_TOOLS}/.evergreen/atlas_data_lake/secrets-export.sh
fi
# Source local secrets if applicable.
if [ -f "$ROOT_DIR/secrets-export.sh" ]; then
source "$ROOT_DIR/secrets-export.sh"
fi
. $ROOT_DIR/.evergreen/utils.sh
PYTHON=${PYTHON_BINARY:-$(find_python3)}
$PYTHON $SCRIPT_DIR/setup_tests.py
uv run $SCRIPT_DIR/setup_tests.py "$@"

View File

@ -1,5 +1,6 @@
from __future__ import annotations
import argparse
import base64
import dataclasses
import io
@ -20,64 +21,52 @@ HERE = Path(__file__).absolute().parent
ROOT = HERE.parent.parent
ENV_FILE = HERE / "test-env.sh"
DRIVERS_TOOLS = os.environ.get("DRIVERS_TOOLS", "").replace(os.sep, "/")
PLATFORM = "windows" if os.name == "nt" else sys.platform
PLATFORM = "windows" if os.name == "nt" else sys.platform.lower()
logging.basicConfig(level=logging.INFO)
LOGGER = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(message)s")
EXPECTED_VARS = [
"TEST_ENCRYPTION",
"TEST_ENCRYPTION_PYOPENSSL",
"TEST_CRYPT_SHARED",
"TEST_PYOPENSSL",
"TEST_LOAD_BALANCER",
"TEST_SERVERLESS",
"TEST_INDEX_MANAGEMENT",
"TEST_ENTERPRISE_AUTH",
"TEST_FLE_AZURE_AUTO",
"TEST_FLE_GCP_AUTO",
"TEST_LOADBALANCER",
"TEST_DATA_LAKE",
"TEST_ATLAS",
"TEST_OCSP",
"TEST_AUTH_AWS",
"TEST_AUTH_OIDC",
"COMPRESSORS",
"MONGODB_URI",
"PERF_TEST",
"GREEN_FRAMEWORK",
"PYTHON_BINARY",
"LIBMONGOCRYPT_URL",
]
# Passthrough environment variables.
PASS_THROUGH_ENV = ["GREEN_FRAMEWORK", "NO_EXT", "MONGODB_API_VERSION"]
# Handle the test suite based on the presence of env variables.
TEST_SUITE_MAP = dict(
TEST_DATA_LAKE="data_lake",
TEST_AUTH_OIDC="auth_oidc",
TEST_INDEX_MANAGEMENT="index_management",
TEST_ENTERPRISE_AUTH="auth",
TEST_LOADBALANCER="load_balancer",
TEST_ENCRYPTION="encryption",
TEST_FLE_AZURE_AUTO="csfle",
TEST_FLE_GCP_AUTO="csfle",
TEST_ATLAS="atlas",
TEST_OCSP="ocsp",
TEST_AUTH_AWS="auth_aws",
PERF_TEST="perf",
)
# Map the test name to a test suite.
TEST_SUITE_MAP = {
"atlas": "atlas",
"auth_aws": "auth_aws",
"auth_oidc": "auth_oidc",
"data_lake": "data_lake",
"default": "",
"default_async": "default_async",
"default_sync": "default",
"encryption": "encryption",
"enterprise_auth": "auth",
"index_management": "index_management",
"kms": "csfle",
"load_balancer": "load_balancer",
"mockupdb": "mockupdb",
"pyopenssl": "",
"ocsp": "ocsp",
"perf": "perf",
"serverless": "",
}
# Handle extras based on the presence of env variables.
EXTRAS_MAP = dict(
TEST_AUTH_OIDC="aws",
TEST_AUTH_AWS="aws",
TEST_OCSP="ocsp",
TEST_PYOPENSSL="ocsp",
TEST_ENTERPRISE_AUTH="gssapi",
TEST_ENCRYPTION="encryption",
TEST_FLE_AZURE_AUTO="encryption",
TEST_FLE_GCP_AUTO="encryption",
TEST_ENCRYPTION_PYOPENSSL="ocsp",
)
# Tests that require a sub test suite.
SUB_TEST_REQUIRED = ["auth_aws", "kms"]
# Map the test name to test extra.
EXTRAS_MAP = {
"auth_aws": "aws",
"auth_oidc": "aws",
"encryption": "encryption",
"enterprise_auth": "gssapi",
"kms": "encryption",
"ocsp": "ocsp",
"pyopenssl": "ocsp",
}
# Map the test name to test group.
GROUP_MAP = dict(mockupdb="mockupdb", perf="perf")
@dataclasses.dataclass
@ -87,7 +76,7 @@ class Distro:
arch: str
def write_env(name: str, value: Any) -> None:
def write_env(name: str, value: Any = "1") -> None:
with ENV_FILE.open("a", newline="\n") as fid:
# Remove any existing quote chars.
value = str(value).replace('"', "")
@ -105,6 +94,43 @@ def run_command(cmd: str) -> None:
LOGGER.info("Running command %s... done.", cmd)
def read_env(path: Path | str) -> dict[str, Any]:
config = dict()
with Path(path).open() as fid:
for line in fid.readlines():
if "=" not in line:
continue
name, _, value = line.strip().partition("=")
if value.startswith(('"', "'")):
value = value[1:-1]
name = name.replace("export ", "")
config[name] = value
return config
def get_options():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("test_name", choices=sorted(TEST_SUITE_MAP), nargs="?", default="default")
parser.add_argument("sub_test_name", nargs="?")
parser.add_argument(
"--verbose", "-v", action="store_true", help="Whether to log at the DEBUG level"
)
parser.add_argument(
"--quiet", "-q", action="store_true", help="Whether to log at the WARNING level"
)
parser.add_argument("--auth", action="store_true", help="Whether to add authentication")
parser.add_argument("--ssl", action="store_true", help="Whether to add TLS configuration")
# Get the options.
opts = parser.parse_args()
if opts.verbose:
LOGGER.setLevel(logging.DEBUG)
elif opts.quiet:
LOGGER.setLevel(logging.WARNING)
return opts
def get_distro() -> Distro:
name = ""
version_id = ""
@ -169,55 +195,80 @@ def setup_libmongocrypt():
def handle_test_env() -> None:
opts = get_options()
test_name = opts.test_name
sub_test_name = opts.sub_test_name
if test_name in SUB_TEST_REQUIRED and not sub_test_name:
raise ValueError(f"Test '{test_name}' requires a sub_test_name")
AUTH = os.environ.get("AUTH", "noauth")
if opts.auth or "auth" in test_name:
AUTH = "auth"
# 'auth_aws ecs' shouldn't have extra auth set.
if test_name == "auth_aws" and sub_test_name == "ecs":
AUTH = "noauth"
SSL = os.environ.get("SSL", "nossl")
TEST_SUITES = os.environ.get("TEST_SUITES", "")
if opts.ssl:
SSL = "ssl"
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"]
# Save variables in EXPECTED_VARS that have values.
test_title = test_name
if sub_test_name:
test_title += f" {sub_test_name}"
LOGGER.info(f"Setting up '{test_title}' with {AUTH=} and {SSL=}...")
# Create the test env file with the initial set of values.
with ENV_FILE.open("w", newline="\n") as fid:
fid.write("#!/usr/bin/env bash\n")
fid.write("set +x\n")
fid.write(f"export AUTH={AUTH}\n")
fid.write(f"export SSL={SSL}\n")
for var in EXPECTED_VARS:
value = os.environ.get(var, "")
# Remove any existing quote chars.
value = value.replace('"', "")
if value:
fid.write(f'export {var}="{value}"\n')
ENV_FILE.chmod(ENV_FILE.stat().st_mode | stat.S_IEXEC)
for env_var, extra in EXTRAS_MAP.items():
if env_var in os.environ:
UV_ARGS.append(f"--extra {extra}")
write_env("AUTH", AUTH)
write_env("SSL", SSL)
for env_var, suite in TEST_SUITE_MAP.items():
if TEST_SUITES:
break
if env_var in os.environ:
TEST_SUITES = suite
# Skip CSOT tests on non-linux platforms.
if PLATFORM != "linux":
write_env("SKIP_CSOT_TESTS")
# Set an environment variable for the test name and sub test name.
write_env(f"TEST_{test_name.upper()}")
write_env("SUB_TEST_NAME", sub_test_name)
# Handle pass through env vars.
for var in PASS_THROUGH_ENV:
if is_set(var):
write_env(var, os.environ[var])
if extra := EXTRAS_MAP.get(test_name, ""):
UV_ARGS.append(f"--extra {extra}")
if group := GROUP_MAP.get(test_name, ""):
UV_ARGS.append(f"--group {group}")
if AUTH != "noauth":
if is_set("TEST_DATA_LAKE"):
DB_USER = os.environ["ADL_USERNAME"]
DB_PASSWORD = os.environ["ADL_PASSWORD"]
elif is_set("TEST_SERVERLESS"):
DB_USER = os.environ("SERVERLESS_ATLAS_USER")
DB_PASSWORD = os.environ("SERVERLESS_ATLAS_PASSWORD")
write_env("MONGODB_URI", os.environ("SERVERLESS_URI"))
write_env("SINGLE_MONGOS_LB_URI", os.environ("SERVERLESS_URI"))
write_env("MULTI_MONGOS_LB_URI", os.environ("SERVERLESS_URI"))
elif is_set("TEST_AUTH_OIDC"):
if test_name == "data_lake":
config = read_env(f"{DRIVERS_TOOLS}/.evergreen/atlas_data_lake/secrets-export.sh")
DB_USER = config["ADL_USERNAME"]
DB_PASSWORD = config["ADL_PASSWORD"]
elif test_name == "serverless":
config = read_env(f"{DRIVERS_TOOLS}/.evergreen/serverless/secrets-export.sh")
DB_USER = config["SERVERLESS_ATLAS_USER"]
DB_PASSWORD = config["SERVERLESS_ATLAS_PASSWORD"]
write_env("MONGODB_URI", config["SERVERLESS_URI"])
write_env("SINGLE_MONGOS_LB_URI", config["SERVERLESS_URI"])
write_env("MULTI_MONGOS_LB_URI", config["SERVERLESS_URI"])
elif test_name == "auth_oidc":
DB_USER = os.environ["OIDC_ADMIN_USER"]
DB_PASSWORD = os.environ["OIDC_ADMIN_PWD"]
write_env("DB_IP", os.environ["MONGODB_URI"])
elif is_set("TEST_INDEX_MANAGEMENT"):
DB_USER = os.environ["DRIVERS_ATLAS_LAMBDA_USER"]
DB_PASSWORD = os.environ["DRIVERS_ATLAS_LAMBDA_PASSWORD"]
elif test_name == "index_management":
config = read_env(f"{DRIVERS_TOOLS}/.evergreen/atlas/secrets-export.sh")
DB_USER = config["DRIVERS_ATLAS_LAMBDA_USER"]
DB_PASSWORD = config["DRIVERS_ATLAS_LAMBDA_PASSWORD"]
write_env("MONGODB_URI", config["MONGODB_URI"])
else:
DB_USER = "bob"
DB_PASSWORD = "pwd123" # noqa: S105
@ -225,16 +276,17 @@ def handle_test_env() -> None:
write_env("DB_PASSWORD", DB_PASSWORD)
LOGGER.info("Added auth, DB_USER: %s", DB_USER)
if is_set("MONGODB_STARTED"):
if is_set("MONGODB_URI"):
write_env("PYMONGO_MUST_CONNECT", "true")
if is_set("DISABLE_TEST_COMMANDS"):
write_env("PYMONGO_DISABLE_TEST_COMMANDS", "1")
if is_set("TEST_ENTERPRISE_AUTH"):
if test_name == "enterprise_auth":
config = read_env(f"{ROOT}/secrets-export.sh")
if PLATFORM == "windows":
LOGGER.info("Setting GSSAPI_PASS")
write_env("GSSAPI_PASS", os.environ["SASL_PASS"])
write_env("GSSAPI_PASS", config["SASL_PASS"])
write_env("GSSAPI_CANONICALIZE", "true")
else:
# BUILD-3830
@ -242,23 +294,22 @@ def handle_test_env() -> None:
krb_conf.touch()
write_env("KRB5_CONFIG", krb_conf)
LOGGER.info("Writing keytab")
keytab = base64.b64decode(os.environ["KEYTAB_BASE64"])
keytab = base64.b64decode(config["KEYTAB_BASE64"])
keytab_file = ROOT / ".evergreen/drivers.keytab"
with keytab_file.open("wb") as fid:
fid.write(keytab)
principal = os.environ["PRINCIPAL"]
principal = config["PRINCIPAL"]
LOGGER.info("Running kinit")
os.environ["KRB5_CONFIG"] = str(krb_conf)
cmd = f"kinit -k -t {keytab_file} -p {principal}"
run_command(cmd)
LOGGER.info("Setting GSSAPI variables")
write_env("GSSAPI_HOST", os.environ["SASL_HOST"])
write_env("GSSAPI_PORT", os.environ["SASL_PORT"])
write_env("GSSAPI_PRINCIPAL", os.environ["PRINCIPAL"])
write_env("GSSAPI_HOST", config["SASL_HOST"])
write_env("GSSAPI_PORT", config["SASL_PORT"])
write_env("GSSAPI_PRINCIPAL", config["PRINCIPAL"])
if is_set("TEST_LOADBALANCER"):
write_env("LOAD_BALANCER", "1")
if test_name == "load_balancer":
SINGLE_MONGOS_LB_URI = os.environ.get(
"SINGLE_MONGOS_LB_URI", "mongodb://127.0.0.1:8000/?loadBalanced=true"
)
@ -285,9 +336,9 @@ def handle_test_env() -> None:
if compressors == "snappy":
UV_ARGS.append("--extra snappy")
elif compressors == "zstd":
UV_ARGS.append("--extra zstandard")
UV_ARGS.append("--extra zstd")
if is_set("TEST_ENCRYPTION") or is_set("TEST_FLE_AZURE_AUTO") or is_set("TEST_FLE_GCP_AUTO"):
if test_name in ["encryption", "kms"]:
# Check for libmongocrypt download.
if not (ROOT / "libmongocrypt").exists():
setup_libmongocrypt()
@ -311,14 +362,18 @@ def handle_test_env() -> None:
write_env("PYMONGOCRYPT_LIB", PYMONGOCRYPT_LIB.as_posix())
# PATH is updated by configure-env.sh for access to mongocryptd.
if is_set("TEST_ENCRYPTION"):
if test_name == "encryption":
if not DRIVERS_TOOLS:
raise RuntimeError("Missing DRIVERS_TOOLS")
run_command(f"bash {DRIVERS_TOOLS}/.evergreen/csfle/setup-secrets.sh")
run_command(f"bash {DRIVERS_TOOLS}/.evergreen/csfle/start-servers.sh")
if sub_test_name == "pyopenssl":
UV_ARGS.append("--extra ocsp")
if is_set("TEST_CRYPT_SHARED"):
CRYPT_SHARED_DIR = Path(os.environ["CRYPT_SHARED_LIB_PATH"]).parent.as_posix()
config = read_env(f"{DRIVERS_TOOLS}/mo-expansion.sh")
CRYPT_SHARED_DIR = Path(config["CRYPT_SHARED_LIB_PATH"]).parent.as_posix()
LOGGER.info("Using crypt_shared_dir %s", CRYPT_SHARED_DIR)
if PLATFORM == "windows":
write_env("PATH", f"{CRYPT_SHARED_DIR}:$PATH")
@ -329,21 +384,25 @@ def handle_test_env() -> None:
)
write_env("LD_LIBRARY_PATH", f"{CRYPT_SHARED_DIR}:${{LD_LIBRARY_PATH:-}}")
if is_set("TEST_FLE_AZURE_AUTO") or is_set("TEST_FLE_GCP_AUTO"):
if "SUCCESS" not in os.environ:
raise RuntimeError("Must define SUCCESS")
if test_name == "kms":
if sub_test_name.startswith("azure"):
write_env("TEST_FLE_AZURE_AUTO")
else:
write_env("TEST_FLE_GCP_AUTO")
write_env("SUCCESS", os.environ["SUCCESS"])
write_env("SUCCESS", "fail" not in sub_test_name)
MONGODB_URI = os.environ.get("MONGODB_URI", "")
if "@" in MONGODB_URI:
raise RuntimeError("MONGODB_URI unexpectedly contains user credentials in FLE test!")
if is_set("TEST_OCSP"):
if test_name == "ocsp":
write_env("CA_FILE", os.environ["CA_FILE"])
write_env("OCSP_TLS_SHOULD_SUCCEED", os.environ["OCSP_TLS_SHOULD_SUCCEED"])
if is_set("PERF_TEST"):
UV_ARGS.append("--group perf")
if test_name == "auth_aws":
write_env("MONGODB_URI", os.environ["MONGODB_URI"])
if test_name == "perf":
# PYTHON-4769 Run perf_test.py directly otherwise pytest's test collection negatively
# affects the benchmark results.
TEST_ARGS = f"test/performance/perf_test.py {TEST_ARGS}"
@ -355,6 +414,7 @@ def handle_test_env() -> None:
# coverage >=5 is needed for relative_files=true.
UV_ARGS.append("--group coverage")
TEST_ARGS = f"{TEST_ARGS} --cov"
write_env("COVERAGE")
if is_set("GREEN_FRAMEWORK"):
framework = os.environ["GREEN_FRAMEWORK"]
@ -364,12 +424,15 @@ def handle_test_env() -> None:
# Use --capture=tee-sys so pytest prints test output inline:
# https://docs.pytest.org/en/stable/how-to/capture-stdout-stderr.html
TEST_ARGS = f"-v --capture=tee-sys --durations=5 {TEST_ARGS}"
if TEST_SUITES:
TEST_ARGS = f"-m {TEST_SUITES} {TEST_ARGS}"
TEST_SUITE = TEST_SUITE_MAP[test_name]
if TEST_SUITE:
TEST_ARGS = f"-m {TEST_SUITE} {TEST_ARGS}"
write_env("TEST_ARGS", TEST_ARGS)
write_env("UV_ARGS", " ".join(UV_ARGS))
LOGGER.info(f"Setting up test '{test_title}' with {AUTH=} and {SSL=}... done.")
if __name__ == "__main__":
handle_test_env()

View File

@ -212,7 +212,7 @@ the pages will re-render and the browser will automatically refresh.
- Start the servers using
`LOAD_BALANCER=true TOPOLOGY=sharded_cluster AUTH=noauth SSL=nossl MONGODB_VERSION=6.0 DRIVERS_TOOLS=$PWD/drivers-evergreen-tools MONGO_ORCHESTRATION_HOME=$PWD/drivers-evergreen-tools/.evergreen/orchestration $PWD/drivers-evergreen-tools/.evergreen/run-orchestration.sh`.
- Set up the test using:
`MONGODB_URI='mongodb://localhost:27017,localhost:27018/' TEST_LOADBALANCER=1 just setup-test`.
`MONGODB_URI='mongodb://localhost:27017,localhost:27018/' just setup-test load-balancer`.
- Run the tests from the `pymongo` checkout directory using:
`just test-eg`.
@ -220,7 +220,7 @@ the pages will re-render and the browser will automatically refresh.
- Clone `drivers-evergreen-tools`:
`git clone git@github.com:mongodb-labs/drivers-evergreen-tools.git`.
- Run `export DRIVERS_TOOLS=$PWD/drivers-evergreen-tools`
- Run `TEST_ENCRYPTION=1 AWS_PROFILE=<profile> just setup-test` after setting up your AWS profile with `aws configure sso`.
- Run `AWS_PROFILE=<profile> just setup-test encryption` after setting up your AWS profile with `aws configure sso`.
- Run the tests with `just test-eg`.
- When done, run `just teardown-test` to clean up.

View File

@ -60,17 +60,13 @@ lint-manual:
test *args="-v --durations=5 --maxfail=10":
{{uv_run}} --extra test pytest {{args}}
[group('test')]
test-mockupdb *args:
{{uv_run}} -v --extra test --group mockupdb pytest -m mockupdb {{args}}
[group('test')]
test-eg *args:
bash ./.evergreen/run-tests.sh {{args}}
[group('test')]
setup-test:
bash .evergreen/scripts/setup-tests.sh
setup-test *args="":
bash .evergreen/scripts/setup-tests.sh {{args}}
[group('test')]
teardown-test:

View File

@ -47,20 +47,14 @@ class TestAsyncClientContext(AsyncUnitTest):
)
def test_enableTestCommands_is_disabled(self):
if not os.environ.get("PYMONGO_DISABLE_TEST_COMMANDS"):
raise SkipTest("PYMONGO_DISABLE_TEST_COMMANDS is not set")
if not os.environ.get("DISABLE_TEST_COMMANDS"):
raise SkipTest("DISABLE_TEST_COMMANDS is not set")
self.assertFalse(
async_client_context.test_commands_enabled,
"enableTestCommands must be disabled when PYMONGO_DISABLE_TEST_COMMANDS is set.",
"enableTestCommands must be disabled when DISABLE_TEST_COMMANDS is set.",
)
def test_setdefaultencoding_worked(self):
if not os.environ.get("SETDEFAULTENCODING"):
raise SkipTest("SETDEFAULTENCODING is not set")
self.assertEqual(sys.getdefaultencoding(), os.environ["SETDEFAULTENCODING"])
def test_free_threading_is_enabled(self):
if "free-threading build" not in sys.version:
raise SkipTest("this test requires the Python free-threading build")

View File

@ -38,10 +38,6 @@ pytestmark = pytest.mark.data_lake
class TestDataLakeMustConnect(AsyncUnitTest):
async def test_connected_to_data_lake(self):
data_lake = os.environ.get("TEST_DATA_LAKE")
if not data_lake:
self.skipTest("TEST_DATA_LAKE is not set")
self.assertTrue(
async_client_context.is_data_lake and async_client_context.connected,
"client context must be connected to data lake when DATA_LAKE is set. Failed attempts:\n{}".format(

View File

@ -51,8 +51,6 @@ _NAME = "test-search-index"
class TestCreateSearchIndex(AsyncIntegrationTest):
async def test_inputs(self):
if not os.environ.get("TEST_INDEX_MANAGEMENT"):
raise unittest.SkipTest("Skipping index management tests")
listener = AllowListEventListener("createSearchIndexes")
client = self.simple_client(event_listeners=[listener])
coll = client.test.test
@ -90,8 +88,6 @@ class SearchIndexIntegrationBase(AsyncPyMongoTestCase):
@classmethod
def setUpClass(cls) -> None:
if not os.environ.get("TEST_INDEX_MANAGEMENT"):
raise unittest.SkipTest("Skipping index management tests")
cls.url = os.environ.get("MONGODB_URI")
cls.username = os.environ["DB_USER"]
cls.password = os.environ["DB_PASSWORD"]

View File

@ -47,20 +47,14 @@ class TestClientContext(UnitTest):
)
def test_enableTestCommands_is_disabled(self):
if not os.environ.get("PYMONGO_DISABLE_TEST_COMMANDS"):
raise SkipTest("PYMONGO_DISABLE_TEST_COMMANDS is not set")
if not os.environ.get("DISABLE_TEST_COMMANDS"):
raise SkipTest("DISABLE_TEST_COMMANDS is not set")
self.assertFalse(
client_context.test_commands_enabled,
"enableTestCommands must be disabled when PYMONGO_DISABLE_TEST_COMMANDS is set.",
"enableTestCommands must be disabled when DISABLE_TEST_COMMANDS is set.",
)
def test_setdefaultencoding_worked(self):
if not os.environ.get("SETDEFAULTENCODING"):
raise SkipTest("SETDEFAULTENCODING is not set")
self.assertEqual(sys.getdefaultencoding(), os.environ["SETDEFAULTENCODING"])
def test_free_threading_is_enabled(self):
if "free-threading build" not in sys.version:
raise SkipTest("this test requires the Python free-threading build")

View File

@ -38,10 +38,6 @@ pytestmark = pytest.mark.data_lake
class TestDataLakeMustConnect(UnitTest):
def test_connected_to_data_lake(self):
data_lake = os.environ.get("TEST_DATA_LAKE")
if not data_lake:
self.skipTest("TEST_DATA_LAKE is not set")
self.assertTrue(
client_context.is_data_lake and client_context.connected,
"client context must be connected to data lake when DATA_LAKE is set. Failed attempts:\n{}".format(

View File

@ -51,8 +51,6 @@ _NAME = "test-search-index"
class TestCreateSearchIndex(IntegrationTest):
def test_inputs(self):
if not os.environ.get("TEST_INDEX_MANAGEMENT"):
raise unittest.SkipTest("Skipping index management tests")
listener = AllowListEventListener("createSearchIndexes")
client = self.simple_client(event_listeners=[listener])
coll = client.test.test
@ -90,8 +88,6 @@ class SearchIndexIntegrationBase(PyMongoTestCase):
@classmethod
def setUpClass(cls) -> None:
if not os.environ.get("TEST_INDEX_MANAGEMENT"):
raise unittest.SkipTest("Skipping index management tests")
cls.url = os.environ.get("MONGODB_URI")
cls.username = os.environ["DB_USER"]
cls.password = os.environ["DB_PASSWORD"]