Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

40 lines
1.2KB

  1. """
  2. Test utilities for error checking
  3. """
  4. from contextlib import contextmanager
  5. from typing import Iterator
  6. import subprocess
  7. from pathlib import Path
  8. import tempfile
  9. import os
  10. @contextmanager
  11. def expect_error_marker(expect: str) -> Iterator[None]:
  12. """
  13. A context-manager function that should wrap a scope that causes an error
  14. from ``dds``.
  15. :param expect: The error message ID string that is expected to appear.
  16. The wrapped scope should raise :class:`subprocess.CalledProcessError`.
  17. After handling the exception, asserts that the subprocess wrote an
  18. error marker containing the string given in ``expect``.
  19. """
  20. tdir = Path(tempfile.mkdtemp())
  21. err_file = tdir / 'error'
  22. try:
  23. os.environ['DDS_WRITE_ERROR_MARKER'] = str(err_file)
  24. yield
  25. assert False, 'dds subprocess did not raise CallProcessError'
  26. except subprocess.CalledProcessError:
  27. assert err_file.exists(), \
  28. f'No error marker file was generated, but dds exited with an error (Expected "{expect}")'
  29. marker = err_file.read_text().strip()
  30. assert marker == expect, \
  31. f'dds did not produce the expected error (Expected {expect}, got {marker})'
  32. finally:
  33. os.environ.pop('DDS_WRITE_ERROR_MARKER')