test_logging.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import functools
  2. import inspect
  3. import logging
  4. import sys
  5. import pytest
  6. IS_PYPY = '__pypy__' in sys.builtin_module_names
  7. setup_py = """\
  8. from setuptools import setup
  9. setup(
  10. name="test_logging",
  11. version="0.0"
  12. )
  13. """
  14. @pytest.mark.parametrize(
  15. ('flags', 'expected_level'), [([], "INFO"), (["--verbose"], "DEBUG")]
  16. )
  17. def test_verbosity_level(tmp_path, monkeypatch, flags, expected_level):
  18. """Make sure the correct verbosity level is set (issue #3038)"""
  19. import setuptools # noqa: F401 # import setuptools to monkeypatch distutils
  20. import distutils # <- load distutils after all the patches take place
  21. logger = logging.Logger(__name__)
  22. monkeypatch.setattr(logging, "root", logger)
  23. unset_log_level = logger.getEffectiveLevel()
  24. assert logging.getLevelName(unset_log_level) == "NOTSET"
  25. setup_script = tmp_path / "setup.py"
  26. setup_script.write_text(setup_py, encoding="utf-8")
  27. dist = distutils.core.run_setup(setup_script, stop_after="init")
  28. dist.script_args = flags + ["sdist"]
  29. dist.parse_command_line() # <- where the log level is set
  30. log_level = logger.getEffectiveLevel()
  31. log_level_name = logging.getLevelName(log_level)
  32. assert log_level_name == expected_level
  33. def flaky_on_pypy(func):
  34. @functools.wraps(func)
  35. def _func():
  36. try:
  37. func()
  38. except AssertionError: # pragma: no cover
  39. if IS_PYPY:
  40. msg = "Flaky monkeypatch on PyPy (#4124)"
  41. pytest.xfail(f"{msg}. Original discussion in #3707, #3709.")
  42. raise
  43. return _func
  44. @flaky_on_pypy
  45. def test_patching_does_not_cause_problems():
  46. # Ensure `dist.log` is only patched if necessary
  47. import _distutils_hack
  48. import setuptools.logging
  49. from distutils import dist
  50. setuptools.logging.configure()
  51. if _distutils_hack.enabled():
  52. # Modern logging infra, no problematic patching.
  53. assert dist.__file__ is None or "setuptools" in dist.__file__
  54. assert isinstance(dist.log, logging.Logger)
  55. else:
  56. assert inspect.ismodule(dist.log)