test_logger.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env python
  2. # Author: Leonardo Gama (@leogama)
  3. # Copyright (c) 2022-2024 The Uncertainty Quantification Foundation.
  4. # License: 3-clause BSD. The full license text is available at:
  5. # - https://github.com/uqfoundation/dill/blob/master/LICENSE
  6. import logging
  7. import re
  8. import tempfile
  9. import dill
  10. from dill import detect
  11. from dill.logger import stderr_handler, adapter as logger
  12. try:
  13. from StringIO import StringIO
  14. except ImportError:
  15. from io import StringIO
  16. test_obj = {'a': (1, 2), 'b': object(), 'f': lambda x: x**2, 'big': list(range(10))}
  17. def test_logging(should_trace):
  18. buffer = StringIO()
  19. handler = logging.StreamHandler(buffer)
  20. logger.addHandler(handler)
  21. try:
  22. dill.dumps(test_obj)
  23. if should_trace:
  24. regex = re.compile(r'(\S*┬ \w.*[^)]' # begin pickling object
  25. r'|│*└ # \w.* \[\d+ (\wi)?B])' # object written (with size)
  26. )
  27. for line in buffer.getvalue().splitlines():
  28. assert regex.fullmatch(line)
  29. return buffer.getvalue()
  30. else:
  31. assert buffer.getvalue() == ""
  32. finally:
  33. logger.removeHandler(handler)
  34. buffer.close()
  35. def test_trace_to_file(stream_trace):
  36. file = tempfile.NamedTemporaryFile(mode='r')
  37. with detect.trace(file.name, mode='w'):
  38. dill.dumps(test_obj)
  39. file_trace = file.read()
  40. file.close()
  41. # Apparently, objects can change location in memory...
  42. reghex = re.compile(r'0x[0-9A-Za-z]+')
  43. file_trace, stream_trace = reghex.sub('0x', file_trace), reghex.sub('0x', stream_trace)
  44. # PyPy prints dictionary contents with repr(dict)...
  45. regdict = re.compile(r'(dict\.__repr__ of ).*')
  46. file_trace, stream_trace = regdict.sub(r'\1{}>', file_trace), regdict.sub(r'\1{}>', stream_trace)
  47. assert file_trace == stream_trace
  48. if __name__ == '__main__':
  49. logger.removeHandler(stderr_handler)
  50. test_logging(should_trace=False)
  51. detect.trace(True)
  52. test_logging(should_trace=True)
  53. detect.trace(False)
  54. test_logging(should_trace=False)
  55. loglevel = logging.ERROR
  56. logger.setLevel(loglevel)
  57. with detect.trace():
  58. stream_trace = test_logging(should_trace=True)
  59. test_logging(should_trace=False)
  60. assert logger.getEffectiveLevel() == loglevel
  61. test_trace_to_file(stream_trace)