Ctrl K
ComunidadGuías…

tests/conftest.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2008-2026 Andrew Ziem.
#
# This work is licensed under the terms of the GNU GPL, version 3 or
# later.  See the COPYING file in the top-level directory.

"""
Under plain `pytest`, tests.TestAll's temp-dir wrapper never runs, so
subprocess-spawning tests (e.g. TestCLI.py) would otherwise inherit the
real BleachBit config dir. Set per-worker config and temporary directories
before any test module (and therefore bleachbit) is imported.

The worker-specific directory is also removed at interpreter exit
(pytest_sessionfinish is not called for --collect-only or when the session
is interrupted).
"""

import atexit
import logging
import os
import shutil
import tempfile

# BleachBit's atexit handlers (delete-lock cleanup, GTK nonce cleanup) log
# after pytest has closed its capture streams, printing harmless
# "I/O operation on closed file" errors. Don't surface those.
logging.raiseExceptions = False

_worker = os.environ.get('PYTEST_XDIST_WORKER')
_options_dir = os.environ.get('BLEACHBIT_TEST_OPTIONS_DIR')
# Only a directory made here is removed at exit, never one the caller set
_created_dir = None
# The controller sets the env var before spawning workers, so every worker
# inherits it. Without keying on the worker id they would all share one
# config dir and race on the same bleachbit.ini.
if _worker:
    _prefix = f'bleachbit-test-{_worker}-'
    # Match the whole prefix: the random suffix of the controller's dir can
    # contain a worker id such as gw1.
    if (not _options_dir
            or not os.path.basename(_options_dir).startswith(_prefix)):
        _options_dir = _created_dir = tempfile.mkdtemp(
            prefix=_prefix, dir=_options_dir or None)
        os.environ['BLEACHBIT_TEST_OPTIONS_DIR'] = _options_dir
    # Give each worker a private temporary directory so that tests
    # spawning subprocesses and Windows %TEMP%-based cleaners do
    # not race on the shared system temp.
    for _env_var in ('TEMP', 'TMP', 'TMPDIR'):
        os.environ[_env_var] = _options_dir
    tempfile.tempdir = _options_dir
elif not _options_dir:
    _options_dir = _created_dir = tempfile.mkdtemp(
        prefix='bleachbit-test-master-')
    os.environ['BLEACHBIT_TEST_OPTIONS_DIR'] = _options_dir


def _remove_options_dir():
    """Remove the temporary directory created for this process."""
    if _created_dir and os.path.isdir(_created_dir):
        shutil.rmtree(_created_dir, ignore_errors=True)


# The interpreter exits without a session when pytest is interrupted or
# invoked with --collect-only, so sessionfinish alone would leak the
# directory. Clean up here as a fallback (sessionfinish below handles the
# normal case; a second removal is a no-op).
atexit.register(_remove_options_dir)


# pylint: disable-next=unused-argument
def pytest_sessionfinish(session, exitstatus):
    """Clean up the temporary directory after the test session."""
    _remove_options_dir()