1
0

log_printer_test.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import mock
  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 unittest
  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. class LogPrinterTest(unittest.TestCase):
  20. def get_default_output(self, monochrome=False):
  21. def reader(*args, **kwargs):
  22. yield b"hello\nworld"
  23. container = build_mock_container(reader)
  24. output = run_log_printer([container], monochrome=monochrome)
  25. return output
  26. def test_single_container(self):
  27. output = self.get_default_output()
  28. self.assertIn('hello', output)
  29. self.assertIn('world', output)
  30. def test_monochrome(self):
  31. output = self.get_default_output(monochrome=True)
  32. self.assertNotIn('\033[', output)
  33. def test_polychrome(self):
  34. output = self.get_default_output()
  35. self.assertIn('\033[', output)
  36. def test_unicode(self):
  37. glyph = u'\u2022'
  38. def reader(*args, **kwargs):
  39. yield glyph.encode('utf-8') + b'\n'
  40. container = build_mock_container(reader)
  41. output = run_log_printer([container])
  42. if six.PY2:
  43. output = output.decode('utf-8')
  44. self.assertIn(glyph, output)
  45. def test_wait_on_exit(self):
  46. exit_status = 3
  47. mock_container = mock.Mock(
  48. spec=Container,
  49. name='cname',
  50. wait=mock.Mock(return_value=exit_status))
  51. expected = '{} exited with code {}\n'.format(mock_container.name, exit_status)
  52. self.assertEqual(expected, wait_on_exit(mock_container))
  53. def test_generator_with_no_logs(self):
  54. mock_container = mock.Mock(
  55. spec=Container,
  56. has_api_logs=False,
  57. log_driver='none',
  58. name_without_project='web_1',
  59. wait=mock.Mock(return_value=0))
  60. output = run_log_printer([mock_container])
  61. self.assertIn(
  62. "WARNING: no logs are available with the 'none' log driver\n",
  63. output
  64. )
  65. def run_log_printer(containers, monochrome=False):
  66. output = six.StringIO()
  67. LogPrinter(containers, output=output, monochrome=monochrome).run()
  68. return output.getvalue()