log_printer_test.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import pytest
  4. import six
  5. from compose.cli.log_printer import LogPrinter
  6. from compose.cli.log_printer import wait_on_exit
  7. from compose.container import Container
  8. from tests import mock
  9. def build_mock_container(reader):
  10. return mock.Mock(
  11. spec=Container,
  12. name='myapp_web_1',
  13. name_without_project='web_1',
  14. has_api_logs=True,
  15. log_stream=None,
  16. attach=reader,
  17. wait=mock.Mock(return_value=0),
  18. )
  19. @pytest.fixture
  20. def output_stream():
  21. output = six.StringIO()
  22. output.flush = mock.Mock()
  23. return output
  24. @pytest.fixture
  25. def mock_container():
  26. def reader(*args, **kwargs):
  27. yield b"hello\nworld"
  28. return build_mock_container(reader)
  29. class TestLogPrinter(object):
  30. def test_single_container(self, output_stream, mock_container):
  31. LogPrinter([mock_container], output=output_stream).run()
  32. output = output_stream.getvalue()
  33. assert 'hello' in output
  34. assert 'world' in output
  35. # Call count is 2 lines + "container exited line"
  36. assert output_stream.flush.call_count == 3
  37. def test_monochrome(self, output_stream, mock_container):
  38. LogPrinter([mock_container], output=output_stream, monochrome=True).run()
  39. assert '\033[' not in output_stream.getvalue()
  40. def test_polychrome(self, output_stream, mock_container):
  41. LogPrinter([mock_container], output=output_stream).run()
  42. assert '\033[' in output_stream.getvalue()
  43. def test_unicode(self, output_stream):
  44. glyph = u'\u2022'
  45. def reader(*args, **kwargs):
  46. yield glyph.encode('utf-8') + b'\n'
  47. container = build_mock_container(reader)
  48. LogPrinter([container], output=output_stream).run()
  49. output = output_stream.getvalue()
  50. if six.PY2:
  51. output = output.decode('utf-8')
  52. assert glyph in output
  53. def test_wait_on_exit(self):
  54. exit_status = 3
  55. mock_container = mock.Mock(
  56. spec=Container,
  57. name='cname',
  58. wait=mock.Mock(return_value=exit_status))
  59. expected = '{} exited with code {}\n'.format(mock_container.name, exit_status)
  60. assert expected == wait_on_exit(mock_container)
  61. def test_generator_with_no_logs(self, mock_container, output_stream):
  62. mock_container.has_api_logs = False
  63. mock_container.log_driver = 'none'
  64. LogPrinter([mock_container], output=output_stream).run()
  65. output = output_stream.getvalue()
  66. assert "WARNING: no logs are available with the 'none' log driver\n" in output