log_printer_test.py 2.5 KB

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