diff --git a/.evergreen/generated_configs/tasks.yml b/.evergreen/generated_configs/tasks.yml index 94404d7828..942967bbec 100644 --- a/.evergreen/generated_configs/tasks.yml +++ b/.evergreen/generated_configs/tasks.yml @@ -75,7 +75,7 @@ tasks: SUB_TEST_NAME: session-creds TOOLCHAIN_VERSION: 3.14t tags: [auth-aws, auth-aws-session-creds, free-threaded] - - name: test-auth-aws-9.0-web-identity-python3.14-cov + - name: test-auth-aws-9.0-web-identity-python3.14 commands: - func: run server vars: @@ -87,8 +87,7 @@ tasks: TEST_NAME: auth_aws SUB_TEST_NAME: web-identity TOOLCHAIN_VERSION: "3.14" - COVERAGE: "1" - tags: [auth-aws, auth-aws-web-identity, pr] + tags: [auth-aws, auth-aws-web-identity] - name: test-auth-aws-9.0-web-identity-session-name-python3.14 commands: - func: run server @@ -103,7 +102,7 @@ tasks: AWS_ROLE_SESSION_NAME: test TOOLCHAIN_VERSION: "3.14" tags: [auth-aws, auth-aws-web-identity] - - name: test-auth-aws-rapid-regular-python3.10-min-deps + - name: test-auth-aws-rapid-regular-python3.15t commands: - func: run server vars: @@ -114,10 +113,9 @@ tasks: vars: TEST_NAME: auth_aws SUB_TEST_NAME: regular - TOOLCHAIN_VERSION: "3.10" - TEST_MIN_DEPS: "1" - tags: [auth-aws, auth-aws-regular] - - name: test-auth-aws-latest-assume-role-python3.11 + TOOLCHAIN_VERSION: 3.15t + tags: [auth-aws, auth-aws-regular, free-threaded] + - name: test-auth-aws-latest-assume-role-python3.15-cov commands: - func: run server vars: @@ -128,8 +126,9 @@ tasks: vars: TEST_NAME: auth_aws SUB_TEST_NAME: assume-role - TOOLCHAIN_VERSION: "3.11" - tags: [auth-aws, auth-aws-assume-role] + TOOLCHAIN_VERSION: "3.15" + COVERAGE: "1" + tags: [auth-aws, auth-aws-assume-role, pr] - name: test-auth-aws-ecs commands: - func: assume ec2 role @@ -378,6 +377,18 @@ tasks: SUB_TEST_NAME: embedded TOOLCHAIN_VERSION: "3.14" tags: [mod_wsgi, pr] + - name: mod-wsgi-embedded-mode-replica-set-python3.15 + commands: + - func: run server + vars: + TOPOLOGY: replica_set + TOOLCHAIN_VERSION: "3.15" + - func: run tests + vars: + TEST_NAME: mod_wsgi + SUB_TEST_NAME: embedded + TOOLCHAIN_VERSION: "3.15" + tags: [mod_wsgi, pr] # No orchestration tests - name: test-no-orchestration-python3.10-min-deps @@ -388,13 +399,13 @@ tasks: TOOLCHAIN_VERSION: "3.10" TEST_MIN_DEPS: "1" tags: [test-no-orchestration, python-3.10] - - name: test-no-orchestration-python3.14 + - name: test-no-orchestration-python3.15 commands: - func: assume ec2 role - func: run tests vars: - TOOLCHAIN_VERSION: "3.14" - tags: [test-no-orchestration, python-3.14] + TOOLCHAIN_VERSION: "3.15" + tags: [test-no-orchestration, python-3.15] - name: test-no-orchestration-pypy3.11 commands: - func: assume ec2 role @@ -525,14 +536,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-valid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-valid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: valid TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-invalid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -612,14 +623,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-invalid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-invalid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-delegate-valid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -699,14 +710,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-delegate-valid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-delegate-valid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: valid-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-delegate-invalid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -786,14 +797,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-delegate-invalid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-delegate-invalid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-soft-fail-v4.4-python3.10-min-deps @@ -873,14 +884,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-soft-fail-latest-python3.14 + - name: test-ocsp-ecdsa-soft-fail-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: no-responder TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-valid-cert-server-staples-v4.4-python3.10-min-deps @@ -989,14 +1000,14 @@ tasks: - ocsp-ecdsa - rapid - ocsp-staple - - name: test-ocsp-ecdsa-valid-cert-server-staples-latest-python3.14-cov + - name: test-ocsp-ecdsa-valid-cert-server-staples-latest-python3.15-cov commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: valid TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest COVERAGE: "1" tags: @@ -1110,14 +1121,14 @@ tasks: - ocsp-ecdsa - rapid - ocsp-staple - - name: test-ocsp-ecdsa-invalid-cert-server-staples-latest-python3.14 + - name: test-ocsp-ecdsa-invalid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -1229,14 +1240,14 @@ tasks: - ocsp-ecdsa - rapid - ocsp-staple - - name: test-ocsp-ecdsa-delegate-valid-cert-server-staples-latest-python3.14 + - name: test-ocsp-ecdsa-delegate-valid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: valid-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -1348,14 +1359,14 @@ tasks: - ocsp-ecdsa - rapid - ocsp-staple - - name: test-ocsp-ecdsa-delegate-invalid-cert-server-staples-latest-python3.14 + - name: test-ocsp-ecdsa-delegate-invalid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -1439,14 +1450,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-v4.4-python3.10-min-deps @@ -1526,14 +1537,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-ecdsa-malicious-no-responder-muststaple-server-does-not-staple-v4.4-python3.10-min-deps @@ -1613,14 +1624,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-ecdsa, rapid] - - name: test-ocsp-ecdsa-malicious-no-responder-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-ecdsa-malicious-no-responder-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: no-responder TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-ecdsa, latest] - name: test-ocsp-rsa-valid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -1700,14 +1711,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-valid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-valid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: valid TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-invalid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -1787,14 +1798,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-invalid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-invalid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-delegate-valid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -1874,14 +1885,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-delegate-valid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-delegate-valid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: valid-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-delegate-invalid-cert-server-does-not-staple-v4.4-python3.10-min-deps @@ -1961,14 +1972,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-delegate-invalid-cert-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-delegate-invalid-cert-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-soft-fail-v4.4-python3.10-min-deps @@ -2048,14 +2059,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-soft-fail-latest-python3.14 + - name: test-ocsp-rsa-soft-fail-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json OCSP_SERVER_TYPE: no-responder TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-valid-cert-server-staples-v4.4-python3.10-min-deps @@ -2163,14 +2174,14 @@ tasks: - ocsp-rsa - rapid - ocsp-staple - - name: test-ocsp-rsa-valid-cert-server-staples-latest-python3.14 + - name: test-ocsp-rsa-valid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: valid TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -2282,14 +2293,14 @@ tasks: - ocsp-rsa - rapid - ocsp-staple - - name: test-ocsp-rsa-invalid-cert-server-staples-latest-python3.14 + - name: test-ocsp-rsa-invalid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -2401,14 +2412,14 @@ tasks: - ocsp-rsa - rapid - ocsp-staple - - name: test-ocsp-rsa-delegate-valid-cert-server-staples-latest-python3.14 + - name: test-ocsp-rsa-delegate-valid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: valid-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -2520,14 +2531,14 @@ tasks: - ocsp-rsa - rapid - ocsp-staple - - name: test-ocsp-rsa-delegate-invalid-cert-server-staples-latest-python3.14 + - name: test-ocsp-rsa-delegate-invalid-cert-server-staples-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: - ocsp @@ -2611,14 +2622,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: revoked TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-v4.4-python3.10-min-deps @@ -2698,14 +2709,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-delegate-malicious-invalid-cert-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: revoked-delegate TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] - name: test-ocsp-rsa-malicious-no-responder-muststaple-server-does-not-staple-v4.4-python3.10-min-deps @@ -2785,14 +2796,14 @@ tasks: VERSION: rapid TEST_MIN_DEPS: "1" tags: [ocsp, ocsp-rsa, rapid] - - name: test-ocsp-rsa-malicious-no-responder-muststaple-server-does-not-staple-latest-python3.14 + - name: test-ocsp-rsa-malicious-no-responder-muststaple-server-does-not-staple-latest-python3.15 commands: - func: run tests vars: ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json OCSP_SERVER_TYPE: no-responder TEST_NAME: ocsp - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" VERSION: latest tags: [ocsp, ocsp-rsa, latest] @@ -2908,7 +2919,7 @@ tasks: tags: [search_index] # Server version tests - - name: test-server-version-python3.14t-async-auth-nossl-replica-set + - name: test-server-version-python3.12-async-auth-nossl-replica-set commands: - func: run server vars: @@ -2920,15 +2931,14 @@ tasks: AUTH: auth SSL: nossl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: 3.14t + TOOLCHAIN_VERSION: "3.12" TEST_NAME: default_async tags: - server-version - - python-3.14t + - python-3.12 - replica_set-auth-nossl - async - - free-threaded - - name: test-server-version-python3.13-sync-auth-nossl-replica-set + - name: test-server-version-python3.11-sync-auth-nossl-replica-set commands: - func: run server vars: @@ -2940,33 +2950,35 @@ tasks: AUTH: auth SSL: nossl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: "3.13" + TOOLCHAIN_VERSION: "3.11" TEST_NAME: default_sync tags: - server-version - - python-3.13 + - python-3.11 - replica_set-auth-nossl - sync - - name: test-server-version-python3.12-async-auth-ssl-replica-set + - name: test-server-version-python3.10-async-auth-ssl-replica-set-min-deps commands: - func: run server vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set + TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: "3.12" + TEST_MIN_DEPS: "1" + TOOLCHAIN_VERSION: "3.10" TEST_NAME: default_async tags: - server-version - - python-3.12 + - python-3.10 - replica_set-auth-ssl - async - - name: test-server-version-python3.11-sync-auth-ssl-replica-set + - name: test-server-version-pypy3.11-sync-auth-ssl-replica-set commands: - func: run server vars: @@ -2978,14 +2990,14 @@ tasks: AUTH: auth SSL: ssl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: pypy3.11 TEST_NAME: default_sync tags: - server-version - - python-3.11 + - python-pypy3.11 - replica_set-auth-ssl - sync - - name: test-server-version-python3.11-async-noauth-nossl-replica-set-cov + - name: test-server-version-python3.15t-async-noauth-nossl-replica-set-cov commands: - func: run server vars: @@ -2999,39 +3011,38 @@ tasks: SSL: nossl TOPOLOGY: replica_set COVERAGE: "1" - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_async tags: - server-version - - python-3.11 + - python-3.15t - replica_set-noauth-nossl - async - pr - - name: test-server-version-python3.10-sync-noauth-nossl-replica-set-min-deps-cov + - free-threaded + - name: test-server-version-python3.14-sync-noauth-nossl-replica-set-cov commands: - func: run server vars: AUTH: noauth SSL: nossl TOPOLOGY: replica_set - TEST_MIN_DEPS: "1" COVERAGE: "1" - func: run tests vars: AUTH: noauth SSL: nossl TOPOLOGY: replica_set - TEST_MIN_DEPS: "1" COVERAGE: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: "3.14" TEST_NAME: default_sync tags: - server-version - - python-3.10 + - python-3.14 - replica_set-noauth-nossl - sync - pr - - name: test-server-version-pypy3.11-async-noauth-ssl-replica-set + - name: test-server-version-python3.14t-async-noauth-ssl-replica-set commands: - func: run server vars: @@ -3043,14 +3054,15 @@ tasks: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.14t TEST_NAME: default_async tags: - server-version - - python-pypy3.11 + - python-3.14t - replica_set-noauth-ssl - async - - name: test-server-version-python3.14-sync-noauth-ssl-replica-set + - free-threaded + - name: test-server-version-python3.13-sync-noauth-ssl-replica-set commands: - func: run server vars: @@ -3062,14 +3074,14 @@ tasks: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.13" TEST_NAME: default_sync tags: - server-version - - python-3.14 + - python-3.13 - replica_set-noauth-ssl - sync - - name: test-server-version-python3.14-async-auth-nossl-sharded-cluster + - name: test-server-version-python3.11-async-auth-nossl-sharded-cluster commands: - func: run server vars: @@ -3081,33 +3093,34 @@ tasks: AUTH: auth SSL: nossl TOPOLOGY: sharded_cluster - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.11" TEST_NAME: default_async tags: - server-version - - python-3.14 + - python-3.11 - sharded_cluster-auth-nossl - async - - name: test-server-version-python3.14t-sync-auth-nossl-sharded-cluster + - name: test-server-version-python3.10-sync-auth-nossl-sharded-cluster-min-deps commands: - func: run server vars: AUTH: auth SSL: nossl TOPOLOGY: sharded_cluster + TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: auth SSL: nossl TOPOLOGY: sharded_cluster - TOOLCHAIN_VERSION: 3.14t + TEST_MIN_DEPS: "1" + TOOLCHAIN_VERSION: "3.10" TEST_NAME: default_sync tags: - server-version - - python-3.14t + - python-3.10 - sharded_cluster-auth-nossl - sync - - free-threaded - name: test-server-version-python3.10-async-auth-ssl-sharded-cluster-min-deps-cov commands: - func: run server @@ -3228,6 +3241,45 @@ tasks: - sharded_cluster-auth-ssl - async - free-threaded + - name: test-server-version-python3.15-async-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_async + tags: + - server-version + - python-3.15 + - sharded_cluster-auth-ssl + - async + - name: test-server-version-python3.15t-async-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + TOOLCHAIN_VERSION: 3.15t + TEST_NAME: default_async + tags: + - server-version + - python-3.15t + - sharded_cluster-auth-ssl + - async + - free-threaded - name: test-server-version-pypy3.11-async-auth-ssl-sharded-cluster commands: - func: run server @@ -3367,6 +3419,45 @@ tasks: - sharded_cluster-auth-ssl - sync - free-threaded + - name: test-server-version-python3.15-sync-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_sync + tags: + - server-version + - python-3.15 + - sharded_cluster-auth-ssl + - sync + - name: test-server-version-python3.15t-sync-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + TOOLCHAIN_VERSION: 3.15t + TEST_NAME: default_sync + tags: + - server-version + - python-3.15t + - sharded_cluster-auth-ssl + - sync + - free-threaded - name: test-server-version-pypy3.11-sync-auth-ssl-sharded-cluster commands: - func: run server @@ -3386,7 +3477,7 @@ tasks: - python-pypy3.11 - sharded_cluster-auth-ssl - sync - - name: test-server-version-python3.12-async-noauth-nossl-sharded-cluster + - name: test-server-version-python3.14-async-noauth-nossl-sharded-cluster commands: - func: run server vars: @@ -3398,14 +3489,14 @@ tasks: AUTH: noauth SSL: nossl TOPOLOGY: sharded_cluster - TOOLCHAIN_VERSION: "3.12" + TOOLCHAIN_VERSION: "3.14" TEST_NAME: default_async tags: - server-version - - python-3.12 + - python-3.14 - sharded_cluster-noauth-nossl - async - - name: test-server-version-python3.11-sync-noauth-nossl-sharded-cluster + - name: test-server-version-python3.14t-sync-noauth-nossl-sharded-cluster commands: - func: run server vars: @@ -3417,35 +3508,34 @@ tasks: AUTH: noauth SSL: nossl TOPOLOGY: sharded_cluster - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: 3.14t TEST_NAME: default_sync tags: - server-version - - python-3.11 + - python-3.14t - sharded_cluster-noauth-nossl - sync - - name: test-server-version-python3.10-async-noauth-ssl-sharded-cluster-min-deps + - free-threaded + - name: test-server-version-python3.13-async-noauth-ssl-sharded-cluster commands: - func: run server vars: AUTH: noauth SSL: ssl TOPOLOGY: sharded_cluster - TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: noauth SSL: ssl TOPOLOGY: sharded_cluster - TEST_MIN_DEPS: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: "3.13" TEST_NAME: default_async tags: - server-version - - python-3.10 + - python-3.13 - sharded_cluster-noauth-ssl - async - - name: test-server-version-pypy3.11-sync-noauth-ssl-sharded-cluster + - name: test-server-version-python3.12-sync-noauth-ssl-sharded-cluster commands: - func: run server vars: @@ -3457,11 +3547,11 @@ tasks: AUTH: noauth SSL: ssl TOPOLOGY: sharded_cluster - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: "3.12" TEST_NAME: default_sync tags: - server-version - - python-pypy3.11 + - python-3.12 - sharded_cluster-noauth-ssl - sync - name: test-server-version-python3.13-async-auth-nossl-standalone @@ -3542,31 +3632,29 @@ tasks: - python-3.10 - standalone-auth-ssl - sync - - name: test-server-version-python3.10-async-noauth-nossl-standalone-min-deps-cov + - name: test-server-version-python3.15-async-noauth-nossl-standalone-cov commands: - func: run server vars: AUTH: noauth SSL: nossl TOPOLOGY: standalone - TEST_MIN_DEPS: "1" COVERAGE: "1" - func: run tests vars: AUTH: noauth SSL: nossl TOPOLOGY: standalone - TEST_MIN_DEPS: "1" COVERAGE: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: "3.15" TEST_NAME: default_async tags: - server-version - - python-3.10 + - python-3.15 - standalone-noauth-nossl - async - pr - - name: test-server-version-pypy3.11-sync-noauth-nossl-standalone-cov + - name: test-server-version-python3.15t-sync-noauth-nossl-standalone-cov commands: - func: run server vars: @@ -3580,14 +3668,15 @@ tasks: SSL: nossl TOPOLOGY: standalone COVERAGE: "1" - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_sync tags: - server-version - - python-pypy3.11 + - python-3.15t - standalone-noauth-nossl - sync - pr + - free-threaded - name: test-server-version-python3.14-async-noauth-ssl-standalone commands: - func: run server @@ -3695,7 +3784,7 @@ tasks: - python-3.12 - sharded_cluster-auth-ssl - sync - - name: test-standard-v4.4-pypy3.11-sync-auth-ssl-sharded-cluster + - name: test-standard-v4.4-python3.15t-sync-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -3709,15 +3798,15 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "4.4" - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_sync tags: - test-standard - server-4.4 - - python-pypy3.11 + - python-3.15t - sharded_cluster-auth-ssl - sync - - pypy + - free-threaded - name: test-standard-v4.4-python3.10-sync-noauth-nossl-standalone-min-deps commands: - func: run server @@ -3765,6 +3854,29 @@ tasks: - standalone-noauth-nossl - sync - free-threaded + - name: test-standard-v4.4-pypy3.11-sync-noauth-nossl-standalone + commands: + - func: run server + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "4.4" + - func: run tests + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "4.4" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_sync + tags: + - test-standard + - server-4.4 + - python-pypy3.11 + - standalone-noauth-nossl + - sync + - pypy - name: test-standard-v5.0-python3.11-async-noauth-ssl-replica-set commands: - func: run server @@ -3831,7 +3943,7 @@ tasks: - python-3.12 - sharded_cluster-auth-ssl - async - - name: test-standard-v5.0-pypy3.11-async-auth-ssl-sharded-cluster + - name: test-standard-v5.0-python3.15t-async-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -3845,15 +3957,15 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "5.0" - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_async tags: - test-standard - server-5.0 - - python-pypy3.11 + - python-3.15t - sharded_cluster-auth-ssl - async - - pypy + - free-threaded - name: test-standard-v5.0-python3.10-async-noauth-nossl-standalone-min-deps commands: - func: run server @@ -3901,6 +4013,29 @@ tasks: - standalone-noauth-nossl - async - free-threaded + - name: test-standard-v5.0-pypy3.11-async-noauth-nossl-standalone + commands: + - func: run server + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "5.0" + - func: run tests + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "5.0" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_async + tags: + - test-standard + - server-5.0 + - python-pypy3.11 + - standalone-noauth-nossl + - async + - pypy - name: test-standard-v6.0-python3.10-sync-noauth-ssl-replica-set-min-deps commands: - func: run server @@ -3948,6 +4083,29 @@ tasks: - replica_set-noauth-ssl - sync - free-threaded + - name: test-standard-v6.0-pypy3.11-sync-noauth-ssl-replica-set + commands: + - func: run server + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "6.0" + - func: run tests + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "6.0" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_sync + tags: + - test-standard + - server-6.0 + - python-pypy3.11 + - replica_set-noauth-ssl + - sync + - pypy - name: test-standard-v6.0-python3.11-sync-auth-ssl-sharded-cluster commands: - func: run server @@ -4014,6 +4172,28 @@ tasks: - python-3.13 - standalone-noauth-nossl - sync + - name: test-standard-v6.0-python3.15-sync-noauth-nossl-standalone + commands: + - func: run server + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "6.0" + - func: run tests + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "6.0" + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_sync + tags: + - test-standard + - server-6.0 + - python-3.15 + - standalone-noauth-nossl + - sync - name: test-standard-v7.0-python3.10-async-noauth-ssl-replica-set-min-deps commands: - func: run server @@ -4061,6 +4241,29 @@ tasks: - replica_set-noauth-ssl - async - free-threaded + - name: test-standard-v7.0-pypy3.11-async-noauth-ssl-replica-set + commands: + - func: run server + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "7.0" + - func: run tests + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "7.0" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_async + tags: + - test-standard + - server-7.0 + - python-pypy3.11 + - replica_set-noauth-ssl + - async + - pypy - name: test-standard-v7.0-python3.11-async-auth-ssl-sharded-cluster commands: - func: run server @@ -4127,6 +4330,28 @@ tasks: - python-3.13 - standalone-noauth-nossl - async + - name: test-standard-v7.0-python3.15-async-noauth-nossl-standalone + commands: + - func: run server + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "7.0" + - func: run tests + vars: + AUTH: noauth + SSL: nossl + TOPOLOGY: standalone + VERSION: "7.0" + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_async + tags: + - test-standard + - server-7.0 + - python-3.15 + - standalone-noauth-nossl + - async - name: test-standard-v8.0-python3.13-sync-noauth-ssl-replica-set commands: - func: run server @@ -4149,6 +4374,28 @@ tasks: - python-3.13 - replica_set-noauth-ssl - sync + - name: test-standard-v8.0-python3.15-sync-noauth-ssl-replica-set + commands: + - func: run server + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "8.0" + - func: run tests + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "8.0" + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_sync + tags: + - test-standard + - server-8.0 + - python-3.15 + - replica_set-noauth-ssl + - sync - name: test-standard-v8.0-python3.10-sync-auth-ssl-sharded-cluster-min-deps commands: - func: run server @@ -4196,6 +4443,29 @@ tasks: - sharded_cluster-auth-ssl - sync - free-threaded + - name: test-standard-v8.0-pypy3.11-sync-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: "8.0" + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: "8.0" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_sync + tags: + - test-standard + - server-8.0 + - python-pypy3.11 + - sharded_cluster-auth-ssl + - sync + - pypy - name: test-standard-v8.0-python3.12-sync-noauth-nossl-standalone commands: - func: run server @@ -4218,7 +4488,7 @@ tasks: - python-3.12 - standalone-noauth-nossl - sync - - name: test-standard-v8.0-pypy3.11-sync-noauth-nossl-standalone + - name: test-standard-v8.0-python3.15t-sync-noauth-nossl-standalone commands: - func: run server vars: @@ -4232,15 +4502,15 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "8.0" - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_sync tags: - test-standard - server-8.0 - - python-pypy3.11 + - python-3.15t - standalone-noauth-nossl - sync - - pypy + - free-threaded - name: test-standard-v9.0-python3.13-async-noauth-ssl-replica-set commands: - func: run server @@ -4263,6 +4533,28 @@ tasks: - python-3.13 - replica_set-noauth-ssl - async + - name: test-standard-v9.0-python3.15-async-noauth-ssl-replica-set + commands: + - func: run server + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "9.0" + - func: run tests + vars: + AUTH: noauth + SSL: ssl + TOPOLOGY: replica_set + VERSION: "9.0" + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_async + tags: + - test-standard + - server-9.0 + - python-3.15 + - replica_set-noauth-ssl + - async - name: test-standard-v9.0-python3.10-async-auth-ssl-sharded-cluster-min-deps commands: - func: run server @@ -4310,6 +4602,29 @@ tasks: - sharded_cluster-auth-ssl - async - free-threaded + - name: test-standard-v9.0-pypy3.11-async-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: "9.0" + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: "9.0" + TOOLCHAIN_VERSION: pypy3.11 + TEST_NAME: default_async + tags: + - test-standard + - server-9.0 + - python-pypy3.11 + - sharded_cluster-auth-ssl + - async + - pypy - name: test-standard-v9.0-python3.12-async-noauth-nossl-standalone commands: - func: run server @@ -4332,7 +4647,7 @@ tasks: - python-3.12 - standalone-noauth-nossl - async - - name: test-standard-v9.0-pypy3.11-async-noauth-nossl-standalone + - name: test-standard-v9.0-python3.15t-async-noauth-nossl-standalone commands: - func: run server vars: @@ -4346,15 +4661,15 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "9.0" - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_async tags: - test-standard - server-9.0 - - python-pypy3.11 + - python-3.15t - standalone-noauth-nossl - async - - pypy + - free-threaded - name: test-standard-latest-python3.12-async-noauth-ssl-replica-set-cov commands: - func: run server @@ -4380,7 +4695,7 @@ tasks: - replica_set-noauth-ssl - async - pr - - name: test-standard-latest-pypy3.11-async-noauth-ssl-replica-set + - name: test-standard-latest-python3.15t-async-noauth-ssl-replica-set-cov commands: - func: run server vars: @@ -4388,21 +4703,24 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: latest + COVERAGE: "1" - func: run tests vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set VERSION: latest - TOOLCHAIN_VERSION: pypy3.11 + COVERAGE: "1" + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_async tags: - test-standard - server-latest - - python-pypy3.11 + - python-3.15t - replica_set-noauth-ssl - async - - pypy + - free-threaded + - pr - name: test-standard-latest-python3.13-async-auth-ssl-sharded-cluster-cov commands: - func: run server @@ -4428,6 +4746,31 @@ tasks: - sharded_cluster-auth-ssl - async - pr + - name: test-standard-latest-python3.15-async-auth-ssl-sharded-cluster-cov + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: latest + COVERAGE: "1" + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: latest + COVERAGE: "1" + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_async + tags: + - test-standard + - server-latest + - python-3.15 + - sharded_cluster-auth-ssl + - async + - pr - name: test-standard-latest-python3.11-async-noauth-nossl-standalone-cov commands: - func: run server @@ -4500,7 +4843,7 @@ tasks: - python-3.12 - replica_set-noauth-ssl - sync - - name: test-standard-rapid-pypy3.11-sync-noauth-ssl-replica-set + - name: test-standard-rapid-python3.15t-sync-noauth-ssl-replica-set commands: - func: run server vars: @@ -4514,15 +4857,15 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: rapid - TOOLCHAIN_VERSION: pypy3.11 + TOOLCHAIN_VERSION: 3.15t TEST_NAME: default_sync tags: - test-standard - server-rapid - - python-pypy3.11 + - python-3.15t - replica_set-noauth-ssl - sync - - pypy + - free-threaded - name: test-standard-rapid-python3.13-sync-auth-ssl-sharded-cluster commands: - func: run server @@ -4545,6 +4888,28 @@ tasks: - python-3.13 - sharded_cluster-auth-ssl - sync + - name: test-standard-rapid-python3.15-sync-auth-ssl-sharded-cluster + commands: + - func: run server + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: rapid + - func: run tests + vars: + AUTH: auth + SSL: ssl + TOPOLOGY: sharded_cluster + VERSION: rapid + TOOLCHAIN_VERSION: "3.15" + TEST_NAME: default_sync + tags: + - test-standard + - server-rapid + - python-3.15 + - sharded_cluster-auth-ssl + - sync - name: test-standard-rapid-python3.11-sync-noauth-nossl-standalone commands: - func: run server @@ -4591,7 +4956,7 @@ tasks: - sync # String query preview tests - - name: test-string-query-preview-v8.2-python3.14-noauth-ssl-replica-set + - name: test-string-query-preview-v8.2-python3.15-noauth-ssl-replica-set commands: - func: run server vars: @@ -4605,11 +4970,11 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: "8.2" - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" tags: - test-string-query-preview - server-8.2 - - python-3.14 + - python-3.15 - replica_set-noauth-ssl - noauth @@ -4787,7 +5152,7 @@ tasks: - python-3.13 - standalone-noauth-nossl - noauth - - name: test-non-standard-v6.0-python3.11-noauth-ssl-replica-set + - name: test-non-standard-v6.0-python3.15-noauth-ssl-replica-set commands: - func: run server vars: @@ -4801,14 +5166,14 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: "6.0" - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: "3.15" tags: - test-non-standard - server-6.0 - - python-3.11 + - python-3.15 - replica_set-noauth-ssl - noauth - - name: test-non-standard-v6.0-python3.12-auth-ssl-sharded-cluster + - name: test-non-standard-v6.0-python3.10-auth-ssl-sharded-cluster-min-deps commands: - func: run server vars: @@ -4816,17 +5181,19 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "6.0" + TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: auth SSL: ssl TOPOLOGY: sharded_cluster VERSION: "6.0" - TOOLCHAIN_VERSION: "3.12" + TEST_MIN_DEPS: "1" + TOOLCHAIN_VERSION: "3.10" tags: - test-non-standard - server-6.0 - - python-3.12 + - python-3.10 - sharded_cluster-auth-ssl - auth - name: test-non-standard-v6.0-pypy3.11-auth-ssl-sharded-cluster @@ -4851,7 +5218,7 @@ tasks: - sharded_cluster-auth-ssl - auth - pypy - - name: test-non-standard-v6.0-python3.10-noauth-nossl-standalone-min-deps + - name: test-non-standard-v6.0-python3.15t-noauth-nossl-standalone commands: - func: run server vars: @@ -4859,22 +5226,21 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "6.0" - TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: noauth SSL: nossl TOPOLOGY: standalone VERSION: "6.0" - TEST_MIN_DEPS: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: 3.15t tags: - test-non-standard - server-6.0 - - python-3.10 + - python-3.15t - standalone-noauth-nossl - noauth - - name: test-non-standard-v7.0-python3.14t-noauth-ssl-replica-set + - free-threaded + - name: test-non-standard-v7.0-python3.12-noauth-ssl-replica-set commands: - func: run server vars: @@ -4888,15 +5254,14 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: "7.0" - TOOLCHAIN_VERSION: 3.14t + TOOLCHAIN_VERSION: "3.12" tags: - test-non-standard - server-7.0 - - python-3.14t + - python-3.12 - replica_set-noauth-ssl - noauth - - free-threaded - - name: test-non-standard-v7.0-python3.14-auth-ssl-sharded-cluster + - name: test-non-standard-v7.0-python3.13-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -4910,14 +5275,14 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "7.0" - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.13" tags: - test-non-standard - server-7.0 - - python-3.14 + - python-3.13 - sharded_cluster-auth-ssl - auth - - name: test-non-standard-v7.0-python3.13-noauth-nossl-standalone + - name: test-non-standard-v7.0-python3.11-noauth-nossl-standalone commands: - func: run server vars: @@ -4931,11 +5296,11 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "7.0" - TOOLCHAIN_VERSION: "3.13" + TOOLCHAIN_VERSION: "3.11" tags: - test-non-standard - server-7.0 - - python-3.13 + - python-3.11 - standalone-noauth-nossl - noauth - name: test-non-standard-v7.0-pypy3.11-noauth-nossl-standalone @@ -4960,7 +5325,7 @@ tasks: - standalone-noauth-nossl - noauth - pypy - - name: test-non-standard-v8.0-python3.11-noauth-ssl-replica-set + - name: test-non-standard-v8.0-python3.14-noauth-ssl-replica-set commands: - func: run server vars: @@ -4974,11 +5339,11 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: "8.0" - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: "3.14" tags: - test-non-standard - server-8.0 - - python-3.11 + - python-3.14 - replica_set-noauth-ssl - noauth - name: test-non-standard-v8.0-pypy3.11-noauth-ssl-replica-set @@ -5003,7 +5368,7 @@ tasks: - replica_set-noauth-ssl - noauth - pypy - - name: test-non-standard-v8.0-python3.12-auth-ssl-sharded-cluster + - name: test-non-standard-v8.0-python3.15t-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -5017,14 +5382,15 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "8.0" - TOOLCHAIN_VERSION: "3.12" + TOOLCHAIN_VERSION: 3.15t tags: - test-non-standard - server-8.0 - - python-3.12 + - python-3.15t - sharded_cluster-auth-ssl - auth - - name: test-non-standard-v8.0-python3.10-noauth-nossl-standalone-min-deps + - free-threaded + - name: test-non-standard-v8.0-python3.14t-noauth-nossl-standalone commands: - func: run server vars: @@ -5032,22 +5398,21 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "8.0" - TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: noauth SSL: nossl TOPOLOGY: standalone VERSION: "8.0" - TEST_MIN_DEPS: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: 3.14t tags: - test-non-standard - server-8.0 - - python-3.10 + - python-3.14t - standalone-noauth-nossl - noauth - - name: test-non-standard-v9.0-python3.14t-noauth-ssl-replica-set + - free-threaded + - name: test-non-standard-v9.0-python3.10-noauth-ssl-replica-set-min-deps commands: - func: run server vars: @@ -5055,21 +5420,22 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: "9.0" + TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set VERSION: "9.0" - TOOLCHAIN_VERSION: 3.14t + TEST_MIN_DEPS: "1" + TOOLCHAIN_VERSION: "3.10" tags: - test-non-standard - server-9.0 - - python-3.14t + - python-3.10 - replica_set-noauth-ssl - noauth - - free-threaded - - name: test-non-standard-v9.0-python3.14-auth-ssl-sharded-cluster + - name: test-non-standard-v9.0-python3.11-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -5083,11 +5449,11 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: "9.0" - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.11" tags: - test-non-standard - server-9.0 - - python-3.14 + - python-3.11 - sharded_cluster-auth-ssl - auth - name: test-non-standard-v9.0-pypy3.11-auth-ssl-sharded-cluster @@ -5112,7 +5478,7 @@ tasks: - sharded_cluster-auth-ssl - auth - pypy - - name: test-non-standard-v9.0-python3.13-noauth-nossl-standalone + - name: test-non-standard-v9.0-python3.15-noauth-nossl-standalone commands: - func: run server vars: @@ -5126,14 +5492,14 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: "9.0" - TOOLCHAIN_VERSION: "3.13" + TOOLCHAIN_VERSION: "3.15" tags: - test-non-standard - server-9.0 - - python-3.13 + - python-3.15 - standalone-noauth-nossl - noauth - - name: test-non-standard-latest-python3.14t-noauth-ssl-replica-set + - name: test-non-standard-latest-python3.15t-noauth-ssl-replica-set commands: - func: run server vars: @@ -5147,11 +5513,11 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: latest - TOOLCHAIN_VERSION: 3.14t + TOOLCHAIN_VERSION: 3.15t tags: - test-non-standard - server-latest - - python-3.14t + - python-3.15t - replica_set-noauth-ssl - noauth - free-threaded @@ -5177,7 +5543,7 @@ tasks: - replica_set-noauth-ssl - noauth - pypy - - name: test-non-standard-latest-python3.14-auth-ssl-sharded-cluster-cov + - name: test-non-standard-latest-python3.15-auth-ssl-sharded-cluster-cov commands: - func: run server vars: @@ -5193,16 +5559,16 @@ tasks: TOPOLOGY: sharded_cluster VERSION: latest COVERAGE: "1" - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" tags: - test-non-standard - server-latest - - python-3.14 + - python-3.15 - sharded_cluster-auth-ssl - auth - pr - cov - - name: test-non-standard-latest-python3.14-auth-ssl-sharded-cluster + - name: test-non-standard-latest-python3.15-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -5216,15 +5582,15 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: latest - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" tags: - test-non-standard-no-cov - server-latest - - python-3.14 + - python-3.15 - sharded_cluster-auth-ssl - auth - pr - - name: test-non-standard-latest-python3.13-noauth-nossl-standalone + - name: test-non-standard-latest-python3.14-noauth-nossl-standalone commands: - func: run server vars: @@ -5238,14 +5604,14 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: latest - TOOLCHAIN_VERSION: "3.13" + TOOLCHAIN_VERSION: "3.14" tags: - test-non-standard - server-latest - - python-3.13 + - python-3.14 - standalone-noauth-nossl - noauth - - name: test-non-standard-rapid-python3.11-noauth-ssl-replica-set + - name: test-non-standard-rapid-python3.13-noauth-ssl-replica-set commands: - func: run server vars: @@ -5259,14 +5625,14 @@ tasks: SSL: ssl TOPOLOGY: replica_set VERSION: rapid - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: "3.13" tags: - test-non-standard - server-rapid - - python-3.11 + - python-3.13 - replica_set-noauth-ssl - noauth - - name: test-non-standard-rapid-python3.12-auth-ssl-sharded-cluster + - name: test-non-standard-rapid-python3.14t-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -5280,14 +5646,15 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: rapid - TOOLCHAIN_VERSION: "3.12" + TOOLCHAIN_VERSION: 3.14t tags: - test-non-standard - server-rapid - - python-3.12 + - python-3.14t - sharded_cluster-auth-ssl - auth - - name: test-non-standard-rapid-python3.10-noauth-nossl-standalone-min-deps + - free-threaded + - name: test-non-standard-rapid-python3.12-noauth-nossl-standalone commands: - func: run server vars: @@ -5295,19 +5662,17 @@ tasks: SSL: nossl TOPOLOGY: standalone VERSION: rapid - TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: noauth SSL: nossl TOPOLOGY: standalone VERSION: rapid - TEST_MIN_DEPS: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: "3.12" tags: - test-non-standard - server-rapid - - python-3.10 + - python-3.12 - standalone-noauth-nossl - noauth - name: test-non-standard-rapid-pypy3.11-noauth-nossl-standalone @@ -5344,16 +5709,16 @@ tasks: - vector - python-3.10 - test-numpy - - name: test-numpy-python3.14-python3.14-cov + - name: test-numpy-python3.15-python3.15-cov commands: - func: test numpy vars: - TOOLCHAIN_VERSION: "3.14" + TOOLCHAIN_VERSION: "3.15" COVERAGE: "1" tags: - binary - vector - - python-3.14 + - python-3.15 - test-numpy - pr @@ -5619,7 +5984,7 @@ tasks: - sharded_cluster-auth-ssl - auth - pypy - - name: test-standard-auth-latest-python3.11-auth-ssl-sharded-cluster-cov + - name: test-standard-auth-latest-python3.15-auth-ssl-sharded-cluster-cov commands: - func: run server vars: @@ -5635,11 +6000,11 @@ tasks: TOPOLOGY: sharded_cluster VERSION: latest COVERAGE: "1" - TOOLCHAIN_VERSION: "3.11" + TOOLCHAIN_VERSION: "3.15" tags: - test-standard-auth - server-latest - - python-3.11 + - python-3.15 - sharded_cluster-auth-ssl - auth - pr @@ -5665,7 +6030,7 @@ tasks: - sharded_cluster-auth-ssl - auth - pypy - - name: test-standard-auth-rapid-python3.10-auth-ssl-sharded-cluster-min-deps + - name: test-standard-auth-rapid-python3.15t-auth-ssl-sharded-cluster commands: - func: run server vars: @@ -5673,21 +6038,20 @@ tasks: SSL: ssl TOPOLOGY: sharded_cluster VERSION: rapid - TEST_MIN_DEPS: "1" - func: run tests vars: AUTH: auth SSL: ssl TOPOLOGY: sharded_cluster VERSION: rapid - TEST_MIN_DEPS: "1" - TOOLCHAIN_VERSION: "3.10" + TOOLCHAIN_VERSION: 3.15t tags: - test-standard-auth - server-rapid - - python-3.10 + - python-3.15t - sharded_cluster-auth-ssl - auth + - free-threaded - name: test-standard-auth-rapid-pypy3.11-auth-ssl-sharded-cluster commands: - func: run server diff --git a/.evergreen/generated_configs/variants.yml b/.evergreen/generated_configs/variants.yml index 9fe505c562..de2ce0e5ce 100644 --- a/.evergreen/generated_configs/variants.yml +++ b/.evergreen/generated_configs/variants.yml @@ -64,7 +64,7 @@ buildvariants: - name: .test-no-orchestration display_name: Atlas connect RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: TEST_NAME: atlas_connect tags: [pr] @@ -75,7 +75,7 @@ buildvariants: - name: .auth-aws display_name: Auth AWS RHEL8 run_on: - - rhel87-small + - rhel8.10-small tags: [] - name: auth-aws-win64 tasks: @@ -105,7 +105,7 @@ buildvariants: - name: .aws_lambda display_name: FaaS Lambda run_on: - - rhel87-small + - rhel8.10-small # Backport pr tests - name: backport-pr @@ -113,7 +113,7 @@ buildvariants: - name: backport-pr display_name: Backport PR run_on: - - rhel87-small + - rhel8.10-small # Compression tests - name: compression-snappy-rhel8 @@ -121,7 +121,7 @@ buildvariants: - name: .test-standard display_name: Compression snappy RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: COMPRESSOR: snappy - name: compression-zlib-rhel8 @@ -129,7 +129,7 @@ buildvariants: - name: .test-standard display_name: Compression zlib RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: COMPRESSOR: zlib - name: compression-zstd-rhel8 @@ -137,13 +137,15 @@ buildvariants: - name: .test-standard display_name: Compression zstd RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: COMPRESSOR: zstd - name: compression-zstd-ubuntu-22 tasks: - name: .test-standard !.server-4.4 !.server-5.0 .python-3.14 - name: .test-standard !.server-4.4 !.server-5.0 .python-3.14t + - name: .test-standard !.server-4.4 !.server-5.0 .python-3.15 + - name: .test-standard !.server-4.4 !.server-5.0 .python-3.15t display_name: Compression zstd Ubuntu-22 run_on: - ubuntu2204-small @@ -156,7 +158,7 @@ buildvariants: - name: coverage-report display_name: Coverage Report run_on: - - rhel87-small + - rhel8.10-small # Disable test commands tests - name: disable-test-commands-rhel8 @@ -164,7 +166,7 @@ buildvariants: - name: .test-standard .server-latest display_name: Disable test commands RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: AUTH: auth SSL: ssl @@ -176,26 +178,26 @@ buildvariants: - name: .test-non-standard .standalone-noauth-nossl display_name: Doctests RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: TEST_NAME: doctest # Encryption tests - name: encryption-rhel8 tasks: - - name: .test-non-standard + - name: .test-non-standard !.python-3.15t - name: .test-string-query-preview display_name: Encryption RHEL8 run_on: - - rhel87-small + - rhel8.10-small batchtime: 1440 expansions: TEST_NAME: encryption tags: [encryption_tag] - name: encryption-macos tasks: - - name: .test-non-standard !.pypy !.cov - - name: .test-non-standard-no-cov !.pypy + - name: .test-non-standard !.pypy !.cov !.python-3.15t + - name: .test-non-standard-no-cov !.pypy !.python-3.15t - name: .test-string-query-preview display_name: Encryption macOS run_on: @@ -206,8 +208,8 @@ buildvariants: tags: [encryption_tag] - name: encryption-win64 tasks: - - name: .test-non-standard !.pypy !.cov - - name: .test-non-standard-no-cov !.pypy + - name: .test-non-standard !.pypy !.cov !.python-3.15t + - name: .test-non-standard-no-cov !.pypy !.python-3.15t - name: .test-string-query-preview display_name: Encryption Win64 run_on: @@ -218,11 +220,11 @@ buildvariants: tags: [encryption_tag] - name: encryption-crypt_shared-rhel8 tasks: - - name: .test-non-standard + - name: .test-non-standard !.python-3.15t - name: .test-string-query-preview display_name: Encryption crypt_shared RHEL8 run_on: - - rhel87-small + - rhel8.10-small batchtime: 1440 expansions: TEST_NAME: encryption @@ -230,8 +232,8 @@ buildvariants: tags: [encryption_tag] - name: encryption-crypt_shared-macos tasks: - - name: .test-non-standard !.pypy !.cov - - name: .test-non-standard-no-cov !.pypy + - name: .test-non-standard !.pypy !.cov !.python-3.15t + - name: .test-non-standard-no-cov !.pypy !.python-3.15t - name: .test-string-query-preview display_name: Encryption crypt_shared macOS run_on: @@ -243,8 +245,8 @@ buildvariants: tags: [encryption_tag] - name: encryption-crypt_shared-win64 tasks: - - name: .test-non-standard !.pypy !.cov - - name: .test-non-standard-no-cov !.pypy + - name: .test-non-standard !.pypy !.cov !.python-3.15t + - name: .test-non-standard-no-cov !.pypy !.python-3.15t - name: .test-string-query-preview display_name: Encryption crypt_shared Win64 run_on: @@ -256,15 +258,36 @@ buildvariants: tags: [encryption_tag] - name: encryption-pyopenssl-rhel8 tasks: - - name: .test-non-standard + - name: .test-non-standard !.python-3.15t display_name: Encryption PyOpenSSL RHEL8 run_on: - - rhel87-small + - rhel8.10-small batchtime: 1440 expansions: TEST_NAME: encryption SUB_TEST_NAME: pyopenssl tags: [encryption_tag] + - name: encryption-ubuntu-22 + tasks: + - name: .test-non-standard .python-3.15t !.server-4.4 !.server-5.0 + display_name: Encryption Ubuntu-22 + run_on: + - ubuntu2204-small + batchtime: 1440 + expansions: + TEST_NAME: encryption + tags: [encryption_tag, pr] + - name: encryption-pyopenssl-ubuntu-22 + tasks: + - name: .test-non-standard .python-3.15t + display_name: Encryption PyOpenSSL Ubuntu-22 + run_on: + - ubuntu2204-small + batchtime: 1440 + expansions: + TEST_NAME: encryption + SUB_TEST_NAME: pyopenssl + tags: [encryption_tag, pr] # Enterprise auth tests - name: auth-enterprise-rhel8 @@ -272,7 +295,7 @@ buildvariants: - name: .test-standard-auth .auth !.free-threaded display_name: Auth Enterprise RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: TEST_NAME: enterprise_auth AUTH: auth @@ -301,7 +324,7 @@ buildvariants: - name: .test-standard .sync !.free-threaded display_name: Green Gevent RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: GREEN_FRAMEWORK: gevent @@ -311,7 +334,7 @@ buildvariants: - name: check-import-time display_name: Import Time run_on: - - rhel87-small + - rhel8.10-small # Kms tests - name: kms @@ -337,7 +360,7 @@ buildvariants: - name: .test-non-standard .server-latest .sharded_cluster-auth-ssl display_name: Load Balancer run_on: - - rhel87-small + - rhel8.10-small batchtime: 1440 expansions: TEST_NAME: load_balancer @@ -348,7 +371,7 @@ buildvariants: - name: .test-min-support display_name: Min Support RHEL8 run_on: - - rhel87-small + - rhel8.10-small # Mockupdb tests - name: mockupdb-rhel8 @@ -356,7 +379,7 @@ buildvariants: - name: .test-no-orchestration display_name: MockupDB RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: TEST_NAME: mockupdb tags: [pr] @@ -377,7 +400,7 @@ buildvariants: - name: .test-standard display_name: No C Ext RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: NO_EXT: "1" @@ -387,7 +410,7 @@ buildvariants: - name: .test-no-orchestration display_name: No server RHEL8 run_on: - - rhel87-small + - rhel8.10-small tags: [pr] # Ocsp tests @@ -396,14 +419,14 @@ buildvariants: - name: .ocsp display_name: OCSP RHEL8 run_on: - - rhel87-small + - rhel8.10-small batchtime: 10080 - name: ocsp-staples-rhel8 tasks: - name: .ocsp-staple .pr display_name: OCSP Staples RHEL8 run_on: - - rhel87-small + - rhel8.10-small tags: [pr] - name: ocsp-win64 tasks: @@ -467,18 +490,18 @@ buildvariants: # Pyopenssl tests - name: pyopenssl-rhel8 tasks: - - name: .test-standard .sync - - name: .test-standard .async .replica_set-noauth-ssl + - name: .test-standard !.python-3.15t .sync + - name: .test-standard !.python-3.15t .async .replica_set-noauth-ssl display_name: PyOpenSSL RHEL8 run_on: - - rhel87-small + - rhel8.10-small batchtime: 1440 expansions: SUB_TEST_NAME: pyopenssl - name: pyopenssl-macos tasks: - - name: .test-standard !.pypy .sync - - name: .test-standard !.pypy .async .replica_set-noauth-ssl + - name: .test-standard !.pypy !.python-3.15t .sync + - name: .test-standard !.pypy !.python-3.15t .async .replica_set-noauth-ssl display_name: PyOpenSSL macOS run_on: - macos-14 @@ -487,14 +510,25 @@ buildvariants: SUB_TEST_NAME: pyopenssl - name: pyopenssl-win64 tasks: - - name: .test-standard !.pypy .sync - - name: .test-standard !.pypy .async .replica_set-noauth-ssl + - name: .test-standard !.pypy !.python-3.15t .sync + - name: .test-standard !.pypy !.python-3.15t .async .replica_set-noauth-ssl display_name: PyOpenSSL Win64 run_on: - windows-2022-latest-small batchtime: 1440 expansions: SUB_TEST_NAME: pyopenssl + - name: pyopenssl-ubuntu-22 + tasks: + - name: .test-standard .python-3.15t !.server-4.4 !.server-5.0 .sync + - name: .test-standard .python-3.15t !.server-4.4 !.server-5.0 .async .replica_set-noauth-ssl + display_name: PyOpenSSL Ubuntu-22 + run_on: + - ubuntu2204-small + batchtime: 1440 + expansions: + SUB_TEST_NAME: pyopenssl + tags: [pr] # Search index tests - name: search-index-helpers-rhel8 @@ -502,7 +536,7 @@ buildvariants: - name: .search_index display_name: Search Index Helpers RHEL8 run_on: - - rhel87-small + - rhel8.10-small # Server version tests - name: mongodb-v4.4 @@ -510,7 +544,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v4.4" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "4.4" tags: [coverage_tag] @@ -519,7 +553,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v5.0" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "5.0" tags: [coverage_tag] @@ -528,7 +562,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v6.0" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "6.0" tags: [coverage_tag] @@ -537,7 +571,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v7.0" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "7.0" tags: [coverage_tag] @@ -546,7 +580,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v8.0" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "8.0" tags: [coverage_tag] @@ -555,7 +589,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB v9.0" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: "9.0" tags: [coverage_tag] @@ -564,7 +598,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB rapid" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: rapid tags: [coverage_tag] @@ -573,7 +607,7 @@ buildvariants: - name: .server-version display_name: "* MongoDB latest" run_on: - - rhel87-small + - rhel8.10-small expansions: VERSION: latest tags: [coverage_tag] @@ -584,7 +618,7 @@ buildvariants: - name: .test-no-orchestration display_name: SFP RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: TEST_NAME: sfp tags: [pr] @@ -601,7 +635,7 @@ buildvariants: - name: .test-standard !.replica_set-noauth-ssl .server-latest display_name: Stable API require v1 RHEL8 Auth run_on: - - rhel87-small + - rhel8.10-small expansions: AUTH: auth REQUIRE_API_VERSION: "1" @@ -618,7 +652,7 @@ buildvariants: - name: .test-standard .server-latest .standalone-noauth-nossl display_name: Stable API accept v2 RHEL8 Auth run_on: - - rhel87-small + - rhel8.10-small expansions: AUTH: auth ORCHESTRATION_FILE: versioned-api-testing.json @@ -668,7 +702,7 @@ buildvariants: - name: .test-standard .standalone-noauth-nossl display_name: Storage InMemory RHEL8 run_on: - - rhel87-small + - rhel8.10-small expansions: STORAGE_ENGINE: inmemory @@ -678,7 +712,7 @@ buildvariants: - name: .test-numpy display_name: Test Numpy RHEL8 run_on: - - rhel87-small + - rhel8.10-small tags: [binary, vector, pr] - name: test-numpy-macos tasks: diff --git a/.evergreen/scripts/generate_config.py b/.evergreen/scripts/generate_config.py index 033cdb6f6f..f8f8be140a 100644 --- a/.evergreen/scripts/generate_config.py +++ b/.evergreen/scripts/generate_config.py @@ -143,15 +143,15 @@ def get_encryption_expansions(encryption): ): expansions = get_encryption_expansions(encryption) display_name = get_variant_name(encryption, host, **expansions) - tasks = [".test-non-standard", ".test-string-query-preview"] + tasks = [".test-non-standard !.python-3.15t", ".test-string-query-preview"] if host != "rhel8": # Exclude PyPy (not tested with encryption on macOS/win64) and coverage tasks # (encryption suites exceed the 60-min timeout with coverage overhead on macOS/win64). # Also include the non-coverage companion tasks (test-non-standard-no-cov) which # carry the "latest" server tasks without COVERAGE=1. tasks = [ - ".test-non-standard !.pypy !.cov", - ".test-non-standard-no-cov !.pypy", + ".test-non-standard !.pypy !.cov !.python-3.15t", + ".test-non-standard-no-cov !.pypy !.python-3.15t", ".test-string-query-preview", ] variant = create_variant( @@ -170,7 +170,7 @@ def get_encryption_expansions(encryption): expansions = get_encryption_expansions(encryption) display_name = get_variant_name(encryption, host, **expansions) variant = create_variant( - [".test-non-standard"], + [".test-non-standard !.python-3.15t"], display_name, host=host, expansions=expansions, @@ -178,6 +178,37 @@ def get_encryption_expansions(encryption): tags=tags, ) variants.append(variant) + + # The 3.15t encryption tests only run on Ubuntu 22, whose OpenSSL 3.0.2 is + # needed to build the cryptography package; only MongoDB 6.0+ runs there. + host = HOSTS["ubuntu22"] + expansions = get_encryption_expansions("Encryption") + display_name = get_variant_name("Encryption", host, **expansions) + variants.append( + create_variant( + [".test-non-standard .python-3.15t !.server-4.4 !.server-5.0"], + display_name, + host=host, + expansions=expansions, + batchtime=batchtime, + tags=[*tags, "pr"], + ) + ) + + # The 3.15t PyOpenSSL tests only run on Ubuntu 22, whose OpenSSL 3.0.2 is + # needed to build the cryptography package. + expansions = get_encryption_expansions("Encryption PyOpenSSL") + display_name = get_variant_name("Encryption PyOpenSSL", host, **expansions) + variants.append( + create_variant( + [".test-non-standard .python-3.15t"], + display_name, + host=host, + expansions=expansions, + batchtime=batchtime, + tags=[*tags, "pr"], + ) + ) return variants @@ -220,6 +251,8 @@ def create_compression_variants(): tasks = [ ".test-standard !.server-4.4 !.server-5.0 .python-3.14", ".test-standard !.server-4.4 !.server-5.0 .python-3.14t", + ".test-standard !.server-4.4 !.server-5.0 .python-3.15", + ".test-standard !.server-4.4 !.server-5.0 .python-3.15t", ] display_name = get_variant_name(f"Compression {compressor}", host) variants.append( @@ -258,7 +291,11 @@ def create_pyopenssl_variants(): for host in ["rhel8", "macos", "win64"]: display_name = get_variant_name(base_name, host) - base_task = ".test-standard" if host == "rhel8" else ".test-standard !.pypy" + base_task = ( + ".test-standard !.python-3.15t" + if host == "rhel8" + else ".test-standard !.pypy !.python-3.15t" + ) # We only need to run a subset on async. tasks = [f"{base_task} .sync", f"{base_task} .async .replica_set-noauth-ssl"] variants.append( @@ -271,6 +308,24 @@ def create_pyopenssl_variants(): ) ) + # The 3.15t PyOpenSSL tests only run on Ubuntu 22, whose OpenSSL 3.0.2 is + # needed to build the cryptography package; only MongoDB 6.0+ runs there. + host = HOSTS["ubuntu22"] + tasks = [ + ".test-standard .python-3.15t !.server-4.4 !.server-5.0 .sync", + ".test-standard .python-3.15t !.server-4.4 !.server-5.0 .async .replica_set-noauth-ssl", + ] + variants.append( + create_variant( + tasks, + get_variant_name(base_name, host), + host=host, + expansions=expansions, + batchtime=batchtime, + tags=["pr"], + ) + ) + return variants diff --git a/.evergreen/scripts/generate_config_utils.py b/.evergreen/scripts/generate_config_utils.py index 296d4e2416..efb8d6a34b 100644 --- a/.evergreen/scripts/generate_config_utils.py +++ b/.evergreen/scripts/generate_config_utils.py @@ -22,7 +22,7 @@ ############## ALL_VERSIONS = ["4.4", "5.0", "6.0", "7.0", "8.0", "9.0", "rapid", "latest"] -CPYTHONS = ["3.10", "3.11", "3.12", "3.13", "3.14t", "3.14"] +CPYTHONS = ["3.10", "3.11", "3.12", "3.13", "3.14t", "3.14", "3.15t", "3.15"] PYPYS = ["pypy3.11"] MIN_SUPPORT_VERSIONS = ["3.9", "pypy3.9", "pypy3.10"] ALL_PYTHONS = CPYTHONS + PYPYS @@ -57,7 +57,7 @@ class Host: # Hosts with toolchains. -HOSTS["rhel8"] = Host("rhel8", "rhel87-small", "RHEL8", dict()) +HOSTS["rhel8"] = Host("rhel8", "rhel8.10-small", "RHEL8", dict()) HOSTS["win64"] = Host("win64", "windows-64-vsMulti-small", "Win64", dict()) HOSTS["win-latest"] = Host("win-latest", "windows-2022-latest-small", "WinLatest", dict()) HOSTS["win32"] = Host("win32", "windows-64-vsMulti-small", "Win32", dict()) @@ -93,7 +93,7 @@ def create_variant_generic( display_name: str, *, host: Host | str | None = None, - default_run_on="rhel87-small", + default_run_on="rhel8.10-small", expansions: dict | None = None, **kwargs: Any, ) -> BuildVariant: diff --git a/.evergreen/scripts/setup_tests.py b/.evergreen/scripts/setup_tests.py index 5199fe3959..a8839533c1 100644 --- a/.evergreen/scripts/setup_tests.py +++ b/.evergreen/scripts/setup_tests.py @@ -290,7 +290,13 @@ def handle_test_env() -> None: krb_conf.touch() write_env("KRB5_CONFIG", krb_conf) LOGGER.info("Writing keytab") - keytab = base64.b64decode(config["KEYTAB_BASE64"]) + # Python 3.15 rejects unpadded base64 by default; padded=False + # accepts it, and older Pythons need the padding added explicitly. + keytab_b64 = "".join(config["KEYTAB_BASE64"].split()) + try: + keytab = base64.b64decode(keytab_b64, padded=False) + except TypeError: + keytab = base64.b64decode(keytab_b64 + "=" * (-len(keytab_b64) % 4)) keytab_file = ROOT / ".evergreen/drivers.keytab" with keytab_file.open("wb") as fid: fid.write(keytab) diff --git a/.github/workflows/dist.yml b/.github/workflows/dist.yml index bc40d847b1..819261bd9d 100644 --- a/.github/workflows/dist.yml +++ b/.github/workflows/dist.yml @@ -73,7 +73,7 @@ jobs: # Note: the default manylinux is manylinux_2_28 run: | python -m pip install -U pip - python -m pip install "cibuildwheel>=3.2.0,<4" + python -m pip install "cibuildwheel>=4.2.0,<5" - name: Build wheels env: @@ -92,8 +92,12 @@ jobs: ls wheelhouse/*cp312*.whl ls wheelhouse/*cp313*.whl ls wheelhouse/*cp314*.whl + # The free-threaded wheel's interpreter tag is also cp315, so match + # the standard wheel on its interpreter-abi boundary. + ls wheelhouse/*cp315-cp315-*.whl # Free-threading builds: ls wheelhouse/*cp314t*.whl + ls wheelhouse/*cp315t*.whl - uses: actions/upload-artifact@v7 with: diff --git a/doc/changelog.rst b/doc/changelog.rst index 41e6dee233..5fb2fb4731 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -4,6 +4,10 @@ Changelog Changes in Version 4.19.0 (2026/XX/XX) -------------------------------------- +PyMongo 4.19 brings a number of changes including: + +- Added support for Python 3.15. + Bug fixes ......... diff --git a/pymongo/network_layer.py b/pymongo/network_layer.py index dbb3e9f903..9909add8e0 100644 --- a/pymongo/network_layer.py +++ b/pymongo/network_layer.py @@ -27,6 +27,7 @@ from typing import ( TYPE_CHECKING, Any, + Callable, Optional, Union, ) @@ -75,65 +76,25 @@ # the MongoDB wire protocol async def async_socket_sendall(sock: Union[socket.socket, _sslConn], buf: bytes) -> None: timeout = sock.gettimeout() - sock.settimeout(0.0) loop = asyncio.get_running_loop() try: if _HAVE_SSL and isinstance(sock, (SSLSocket, _sslConn)): - await asyncio.wait_for(_async_socket_sendall_ssl(sock, buf, loop), timeout=timeout) + # Blocking SSL send: non-blocking send raises on a peer reset on Python 3.15. + await _async_blocking_socket_call(loop, sock.sendall, buf, timeout) else: - await asyncio.wait_for(loop.sock_sendall(sock, buf), timeout=timeout) # type: ignore[arg-type] + # loop.sock_sendall requires a non-blocking socket. + sock.settimeout(0.0) + try: + await asyncio.wait_for(loop.sock_sendall(sock, buf), timeout=timeout) # type: ignore[arg-type] + finally: + sock.settimeout(timeout) except asyncio.TimeoutError as exc: # Convert the asyncio.wait_for timeout error to socket.timeout which pool.py understands. raise socket.timeout("timed out") from exc - finally: - sock.settimeout(timeout) if sys.platform != "win32": - async def _async_socket_sendall_ssl( - sock: Union[socket.socket, _sslConn], buf: bytes, loop: AbstractEventLoop - ) -> None: - view = memoryview(buf) - sent = 0 - - def _is_ready(fut: Future[Any]) -> None: - if fut.done(): - return - fut.set_result(None) - - while sent < len(buf): - try: - sent += sock.send(view[sent:]) - except BLOCKING_IO_ERRORS as exc: - fd = sock.fileno() - # Check for closed socket. - if fd == -1: - raise SSLError("Underlying socket has been closed") from None - if isinstance(exc, BLOCKING_IO_READ_ERROR): - fut = loop.create_future() - loop.add_reader(fd, _is_ready, fut) - try: - await fut - finally: - loop.remove_reader(fd) - if isinstance(exc, BLOCKING_IO_WRITE_ERROR): - fut = loop.create_future() - loop.add_writer(fd, _is_ready, fut) - try: - await fut - finally: - loop.remove_writer(fd) - if _HAVE_PYOPENSSL and isinstance(exc, BLOCKING_IO_LOOKUP_ERROR): - fut = loop.create_future() - loop.add_reader(fd, _is_ready, fut) - try: - loop.add_writer(fd, _is_ready, fut) - await fut - finally: - loop.remove_reader(fd) - loop.remove_writer(fd) - async def _async_socket_receive_ssl( conn: _sslConn, length: int, loop: AbstractEventLoop, once: Optional[bool] = False ) -> memoryview: @@ -187,28 +148,6 @@ def _is_ready(fut: Future[Any]) -> None: else: # The default Windows asyncio event loop does not support loop.add_reader/add_writer: # https://docs.python.org/3/library/asyncio-platforms.html#asyncio-platform-support - # Note: In PYTHON-4493 we plan to replace this code with asyncio streams. - async def _async_socket_sendall_ssl( - sock: Union[socket.socket, _sslConn], buf: bytes, dummy: AbstractEventLoop - ) -> None: - view = memoryview(buf) - total_length = len(buf) - total_sent = 0 - # Backoff starts at 1ms, doubles on timeout up to 512ms, and halves on success - # down to 1ms. - backoff = 0.001 - while total_sent < total_length: - try: - sent = sock.send(view[total_sent:]) - except BLOCKING_IO_ERRORS: - await asyncio.sleep(backoff) - sent = 0 - if sent > 0: - backoff = max(backoff / 2, 0.001) - else: - backoff = min(backoff * 2, 0.512) - total_sent += sent - async def _async_socket_receive_ssl( conn: _sslConn, length: int, dummy: AbstractEventLoop, once: Optional[bool] = False ) -> memoryview: @@ -236,11 +175,46 @@ async def _async_socket_receive_ssl( return mv +async def _async_blocking_socket_call( + loop: AbstractEventLoop, + func: Callable[..., Any], + arg: Any, + timeout: Optional[float], +) -> Any: + """Run a blocking socket operation in a worker thread with a timeout. + + The worker cannot be interrupted, so the future is shielded from cancellation. + The call holds a default-executor thread until the socket timeout fires. + """ + inner = loop.run_in_executor(None, func, arg) + fut = asyncio.shield(inner) + try: + return await asyncio.wait_for(fut, timeout=timeout) + except (asyncio.CancelledError, asyncio.TimeoutError): + # Wait for the worker, shielded from further cancellations, so the + # caller does not close the socket under it. + while True: + try: + await asyncio.shield(inner) + break + except asyncio.CancelledError: + continue + except Exception: + break + raise + except (BrokenPipeError, ConnectionResetError, ConnectionAbortedError) as exc: + # A send to a connection the peer closed or reset raises raw on + # Python 3.15; report it as the graceful close the KMS path expects. + raise OSError("connection closed") from exc + + def sendall(sock: Union[socket.socket, _sslConn], buf: bytes) -> None: + """Send all of buf on the socket.""" sock.sendall(buf) async def _poll_cancellation(conn: AsyncConnection) -> None: + """Return once the connection's operation is cancelled.""" while True: if conn.cancel_context.cancelled: return @@ -251,9 +225,8 @@ async def _poll_cancellation(conn: AsyncConnection) -> None: async def async_receive_data_socket( sock: Union[socket.socket, _sslConn], length: int ) -> memoryview: - sock_timeout = sock.gettimeout() - timeout = sock_timeout - + """Receive exactly length bytes from the socket.""" + timeout = sock.gettimeout() sock.settimeout(0.0) loop = asyncio.get_running_loop() try: @@ -270,12 +243,13 @@ async def async_receive_data_socket( except asyncio.TimeoutError as err: raise socket.timeout("timed out") from err finally: - sock.settimeout(sock_timeout) + sock.settimeout(timeout) async def _async_socket_receive( conn: socket.socket, length: int, loop: AbstractEventLoop ) -> memoryview: + """Receive exactly length bytes from a non-blocking socket.""" mv = memoryview(bytearray(length)) bytes_read = 0 while bytes_read < length: diff --git a/pyproject.toml b/pyproject.toml index 346df2f427..2adddcd29b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Topic :: Database", "Typing :: Typed", ] diff --git a/test/__init__.py b/test/__init__.py index eb588abec9..00eb1356fb 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -358,7 +358,15 @@ def fips_enabled(self): if self._fips_enabled is not None: return self._fips_enabled try: - subprocess.run(["fips-mode-setup", "--is-enabled"], check=True) + # Python 3.15 warns on fork() in multi-threaded processes, which + # gevent's monkey-patched subprocess triggers. + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message=r".*use of fork\(\) may lead to deadlocks.*", + category=DeprecationWarning, + ) + subprocess.run(["fips-mode-setup", "--is-enabled"], check=True) self._fips_enabled = True except (subprocess.SubprocessError, FileNotFoundError): self._fips_enabled = False diff --git a/test/asynchronous/__init__.py b/test/asynchronous/__init__.py index d31e653705..d1eecf41c8 100644 --- a/test/asynchronous/__init__.py +++ b/test/asynchronous/__init__.py @@ -358,7 +358,15 @@ def fips_enabled(self): if self._fips_enabled is not None: return self._fips_enabled try: - subprocess.run(["fips-mode-setup", "--is-enabled"], check=True) + # Python 3.15 warns on fork() in multi-threaded processes, which + # gevent's monkey-patched subprocess triggers. + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message=r".*use of fork\(\) may lead to deadlocks.*", + category=DeprecationWarning, + ) + subprocess.run(["fips-mode-setup", "--is-enabled"], check=True) self._fips_enabled = True except (subprocess.SubprocessError, FileNotFoundError): self._fips_enabled = False diff --git a/test/asynchronous/test_async_network_layer.py b/test/asynchronous/test_async_network_layer.py index b1da68e5b1..2c4b9cd7e4 100644 --- a/test/asynchronous/test_async_network_layer.py +++ b/test/asynchronous/test_async_network_layer.py @@ -19,13 +19,20 @@ import asyncio import struct import sys +import threading +import time from unittest.mock import AsyncMock, MagicMock, patch sys.path[0:0] = [""] from pymongo.common import MAX_MESSAGE_SIZE from pymongo.errors import ProtocolError -from pymongo.network_layer import PyMongoProtocol, _async_socket_receive, receive_message +from pymongo.network_layer import ( + PyMongoProtocol, + _async_blocking_socket_call, + _async_socket_receive, + receive_message, +) from test.asynchronous import AsyncUnitTest, unittest from test.utils_shared import pack_msg_header @@ -244,6 +251,69 @@ async def test_raises_on_connection_closed(self): await _async_socket_receive(mock_socket, 10, loop) +class TestAsyncBlockingSocketCall(AsyncUnitTest): + async def test_returns_result(self): + result = await _async_blocking_socket_call(asyncio.get_running_loop(), len, b"abc", None) + self.assertEqual(result, 3) + + async def test_timeout_waits_for_worker(self): + # On timeout the call must wait for the worker so the caller does not + # close the socket while it is still in use. + finished = threading.Event() + + def slow(arg): + time.sleep(0.4) + finished.set() + + with self.assertRaises(asyncio.TimeoutError): + await _async_blocking_socket_call(asyncio.get_running_loop(), slow, None, 0.3) + self.assertTrue(finished.is_set()) + + async def test_cancellation_waits_for_worker(self): + # On cancellation the call must also wait for the worker, for the same + # reason: the caller closes the socket once the cancellation propagates. + finished = threading.Event() + + def slow(arg): + time.sleep(0.2) + finished.set() + + task = asyncio.create_task( + _async_blocking_socket_call(asyncio.get_running_loop(), slow, None, None) + ) + await asyncio.sleep(0.05) + task.cancel() + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(finished.is_set()) + + async def test_second_cancellation_does_not_interrupt_cleanup(self): + # A cancellation landing while the cleanup is already waiting on the + # worker must not skip the wait: the worker finishes before the + # original cancellation propagates. + finished = threading.Event() + + def slow(arg): + time.sleep(0.3) + finished.set() + + task = asyncio.create_task( + _async_blocking_socket_call(asyncio.get_running_loop(), slow, None, None) + ) + await asyncio.sleep(0.05) + task.cancel() + + async def cancel_again(): + await asyncio.sleep(0.05) + task.cancel() + + re_cancel = asyncio.create_task(cancel_again()) + with self.assertRaises(asyncio.CancelledError): + await task + await re_cancel + self.assertTrue(finished.is_set()) + + class _FakeSocket: """Feeds a byte buffer, simulating a socket. diff --git a/test/asynchronous/test_client.py b/test/asynchronous/test_client.py index 90a2d33a45..0c95ba978b 100644 --- a/test/asynchronous/test_client.py +++ b/test/asynchronous/test_client.py @@ -129,6 +129,7 @@ is_greenthread_patched, lazy_client_trial, one, + suppress_fork_deprecation, ) _IS_SYNC = False @@ -2192,12 +2193,13 @@ async def test_srv_max_hosts_kwarg(self): def test_sigstop_sigcont(self): test_dir = os.path.dirname(os.path.realpath(__file__)) script = os.path.join(test_dir, "sigstop_sigcont.py") - p = subprocess.Popen( - [sys.executable, script, async_client_context.uri], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) + with suppress_fork_deprecation(): + p = subprocess.Popen( + [sys.executable, script, async_client_context.uri], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) self.addCleanup(p.wait, timeout=1) self.addCleanup(p.kill) time.sleep(1) diff --git a/test/asynchronous/test_monitor.py b/test/asynchronous/test_monitor.py index 842c470b8f..ed4a025580 100644 --- a/test/asynchronous/test_monitor.py +++ b/test/asynchronous/test_monitor.py @@ -30,7 +30,11 @@ from test.asynchronous.utils import ( async_wait_until, ) -from test.utils_shared import ServerAndTopologyEventListener, gevent_monkey_patched +from test.utils_shared import ( + ServerAndTopologyEventListener, + gevent_monkey_patched, + suppress_fork_deprecation, +) _IS_SYNC = False @@ -113,9 +117,10 @@ def test_no_thread_start_runtime_err_on_shutdown(self): "-c", "from pymongo import AsyncMongoClient; c = AsyncMongoClient()", ] - completed_process: subprocess.CompletedProcess = subprocess.run( - command, capture_output=True - ) + with suppress_fork_deprecation(): + completed_process: subprocess.CompletedProcess = subprocess.run( + command, capture_output=True + ) self.assertFalse(completed_process.stderr) self.assertFalse(completed_process.stdout) diff --git a/test/test_client.py b/test/test_client.py index 249f95d8fc..ee492e9b9b 100644 --- a/test/test_client.py +++ b/test/test_client.py @@ -128,6 +128,7 @@ is_greenthread_patched, lazy_client_trial, one, + suppress_fork_deprecation, ) _IS_SYNC = True @@ -2145,12 +2146,13 @@ def test_srv_max_hosts_kwarg(self): def test_sigstop_sigcont(self): test_dir = os.path.dirname(os.path.realpath(__file__)) script = os.path.join(test_dir, "sigstop_sigcont.py") - p = subprocess.Popen( - [sys.executable, script, client_context.uri], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) + with suppress_fork_deprecation(): + p = subprocess.Popen( + [sys.executable, script, client_context.uri], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) self.addCleanup(p.wait, timeout=1) self.addCleanup(p.kill) time.sleep(1) diff --git a/test/test_daemon.py b/test/test_daemon.py index 799367b541..a4da905c31 100644 --- a/test/test_daemon.py +++ b/test/test_daemon.py @@ -26,6 +26,7 @@ import pymongo.daemon as daemon_module from pymongo.daemon import _popen_wait, _silence_resource_warning, _spawn_daemon from test import unittest +from test.utils_shared import suppress_fork_deprecation class TestPopenWait(unittest.TestCase): @@ -172,10 +173,11 @@ def test_detached_process_constant_value(self): class TestMainBlock(unittest.TestCase): def test_exits_with_zero(self): # Run daemon.py as a script with a no-op subprocess; verify it exits cleanly. - result = subprocess.run( - [sys.executable, "-m", "pymongo.daemon", sys.executable, "-c", "pass"], - timeout=15, - ) + with suppress_fork_deprecation(): + result = subprocess.run( + [sys.executable, "-m", "pymongo.daemon", sys.executable, "-c", "pass"], + timeout=15, + ) self.assertEqual(0, result.returncode) diff --git a/test/test_monitor.py b/test/test_monitor.py index 3f24a5f2a2..8fd427cb3a 100644 --- a/test/test_monitor.py +++ b/test/test_monitor.py @@ -30,7 +30,11 @@ from test.utils import ( wait_until, ) -from test.utils_shared import ServerAndTopologyEventListener, gevent_monkey_patched +from test.utils_shared import ( + ServerAndTopologyEventListener, + gevent_monkey_patched, + suppress_fork_deprecation, +) _IS_SYNC = True @@ -109,9 +113,10 @@ def test_no_thread_start_runtime_err_on_shutdown(self): "-c", "from pymongo import MongoClient; c = MongoClient()", ] - completed_process: subprocess.CompletedProcess = subprocess.run( - command, capture_output=True - ) + with suppress_fork_deprecation(): + completed_process: subprocess.CompletedProcess = subprocess.run( + command, capture_output=True + ) self.assertFalse(completed_process.stderr) self.assertFalse(completed_process.stdout) diff --git a/test/test_uri_parser.py b/test/test_uri_parser.py index c16d28b08f..15195e4ecd 100644 --- a/test/test_uri_parser.py +++ b/test/test_uri_parser.py @@ -41,6 +41,7 @@ split_options, ) from test import unittest +from test.utils_shared import suppress_fork_deprecation class TestURI(unittest.TestCase): @@ -700,12 +701,13 @@ def test_validate_uri_srv_structure(self): class TestMainBlock(unittest.TestCase): def test_valid_uri_prints_parsed_dict(self): # Run uri_parser.py as a script; a valid URI is pretty-printed. - result = subprocess.run( - [sys.executable, "-m", "pymongo.uri_parser", "mongodb://localhost:27017/mydb"], - capture_output=True, - text=True, - timeout=15, - ) + with suppress_fork_deprecation(): + result = subprocess.run( + [sys.executable, "-m", "pymongo.uri_parser", "mongodb://localhost:27017/mydb"], + capture_output=True, + text=True, + timeout=15, + ) self.assertEqual(0, result.returncode) # The output is a valid Python literal; parse it and assert on values # rather than the formatting of the pretty-printed text. @@ -715,12 +717,13 @@ def test_valid_uri_prints_parsed_dict(self): def test_invalid_uri_prints_error(self): # An invalid URI is caught and its message printed, still exiting 0. - result = subprocess.run( - [sys.executable, "-m", "pymongo.uri_parser", "not-a-valid-uri"], - capture_output=True, - text=True, - timeout=15, - ) + with suppress_fork_deprecation(): + result = subprocess.run( + [sys.executable, "-m", "pymongo.uri_parser", "not-a-valid-uri"], + capture_output=True, + text=True, + timeout=15, + ) self.assertEqual(0, result.returncode) self.assertIn("Invalid URI scheme", result.stdout) diff --git a/test/utils_shared.py b/test/utils_shared.py index 6ae9405207..96f3b1f6ed 100644 --- a/test/utils_shared.py +++ b/test/utils_shared.py @@ -595,6 +595,24 @@ def is_greenthread_patched(): return gevent_monkey_patched() +@contextlib.contextmanager +def suppress_fork_deprecation(): + """Suppress the fork() DeprecationWarning Python 3.15 raises in multi-threaded processes. + + Only gevent's monkey patching makes the process multi-threaded while these + subprocesses fork; the warning is a thread-count heuristic and benign for + subprocesses, which exec immediately (PYTHON-5874). + """ + with warnings.catch_warnings(): + if is_greenthread_patched(): + warnings.filterwarnings( + "ignore", + message=r".*use of fork\(\) may lead to deadlocks.*", + category=DeprecationWarning, + ) + yield + + def parse_read_preference(pref): # Make first letter lowercase to match read_pref's modes. mode_string = pref.get("mode", "primary")