log_printer_test.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import os
  4. import six
  5. from compose.cli.log_printer import LogPrinter
  6. from tests import unittest
  7. class LogPrinterTest(unittest.TestCase):
  8. def get_default_output(self, monochrome=False):
  9. def reader(*args, **kwargs):
  10. yield b"hello\nworld"
  11. container = MockContainer(reader)
  12. output = run_log_printer([container], monochrome=monochrome)
  13. return output
  14. def test_single_container(self):
  15. output = self.get_default_output()
  16. self.assertIn('hello', output)
  17. self.assertIn('world', output)
  18. def test_monochrome(self):
  19. output = self.get_default_output(monochrome=True)
  20. self.assertNotIn('\033[', output)
  21. def test_polychrome(self):
  22. output = self.get_default_output()
  23. self.assertIn('\033[', output)
  24. def test_unicode(self):
  25. glyph = u'\u2022'
  26. def reader(*args, **kwargs):
  27. yield glyph.encode('utf-8') + b'\n'
  28. container = MockContainer(reader)
  29. output = run_log_printer([container])
  30. if six.PY2:
  31. output = output.decode('utf-8')
  32. self.assertIn(glyph, output)
  33. def run_log_printer(containers, monochrome=False):
  34. r, w = os.pipe()
  35. reader, writer = os.fdopen(r, 'r'), os.fdopen(w, 'w')
  36. printer = LogPrinter(containers, output=writer, monochrome=monochrome)
  37. printer.run()
  38. writer.close()
  39. return reader.read()
  40. class MockContainer(object):
  41. def __init__(self, reader):
  42. self._reader = reader
  43. @property
  44. def name(self):
  45. return 'myapp_web_1'
  46. @property
  47. def name_without_project(self):
  48. return 'web_1'
  49. def attach(self, *args, **kwargs):
  50. return self._reader()
  51. def wait(self, *args, **kwargs):
  52. return 0