diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c91b63..7d73efd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,8 +53,9 @@ jobs: - mypy runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - python: [ '3.9', '3.10', '3.11', '3.12', '3.13'] + python: [ '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15' ] steps: - uses: actions/checkout@v7.0.1 - name: Setup Build Tools @@ -64,6 +65,7 @@ jobs: - name: Set Up Python uses: actions/setup-python@v7.0.0 with: + allow-prereleases: true python-version: ${{ matrix.python }} - name: Install dependencies run: | diff --git a/tests/conftest.py b/tests/conftest.py index 79fc925..945c43d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -109,7 +109,15 @@ def http_server_port() -> int: @pytest.fixture(scope='session') def http_server(request, krb_realm: k5test.K5Realm, http_server_port: int): - ps = mp.Process( + # Python 3.14 changed the default multiprocessing start method on POSIX + # from "fork" to "forkserver". "forkserver" (and "spawn") pickle the + # target's arguments to hand them to the worker process, but the + # ``k5test.K5Realm`` object holds an unpicklable ``threading.Lock`` + # (``TypeError: cannot pickle '_thread.lock' object``). Force the classic + # "fork" method so the realm is inherited via memory instead of pickled. + # These tests are POSIX/Kerberos-only, so "fork" is always available here. + ctx = mp.get_context('fork') + ps = ctx.Process( target=start_http_server, args=(krb_realm,), kwargs={'port': http_server_port},