color.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #
  2. # BitBake Test for ANSI color code filtering
  3. #
  4. # Copyright (C) 2020 Agilent Technologies, Inc.
  5. # Author: Chris Laplante <chris.laplante@agilent.com>
  6. #
  7. # SPDX-License-Identifier: MIT
  8. #
  9. import unittest
  10. import bb.progress
  11. import bb.data
  12. import bb.event
  13. from bb.progress import filter_color, filter_color_n
  14. import io
  15. import re
  16. class ProgressWatcher:
  17. def __init__(self):
  18. self._reports = []
  19. def handle_event(self, event):
  20. self._reports.append((event.progress, event.rate))
  21. def reports(self):
  22. return self._reports
  23. class ColorCodeTests(unittest.TestCase):
  24. def setUp(self):
  25. self.d = bb.data.init()
  26. self._progress_watcher = ProgressWatcher()
  27. bb.event.register("bb.build.TaskProgress", self._progress_watcher.handle_event)
  28. def tearDown(self):
  29. bb.event.remove("bb.build.TaskProgress", None)
  30. def test_filter_color(self):
  31. input_string = "~~~~~~~~~~~~^~~~~~~~"
  32. filtered = filter_color(input_string)
  33. self.assertEqual(filtered, "~~~~~~~~~~~~^~~~~~~~")
  34. def test_filter_color_n(self):
  35. input_string = "~~~~~~~~~~~~^~~~~~~~"
  36. filtered, code_count = filter_color_n(input_string)
  37. self.assertEqual(filtered, "~~~~~~~~~~~~^~~~~~~~")
  38. self.assertEqual(code_count, 4)
  39. def test_LineFilterProgressHandler_color_filtering(self):
  40. class CustomProgressHandler(bb.progress.LineFilterProgressHandler):
  41. PROGRESS_REGEX = re.compile(r"Progress: (?P<progress>\d+)%")
  42. def writeline(self, line):
  43. match = self.PROGRESS_REGEX.match(line)
  44. if match:
  45. self.update(int(match.group("progress")))
  46. return False
  47. return True
  48. buffer = io.StringIO()
  49. handler = CustomProgressHandler(self.d, buffer)
  50. handler.write("Program output!\n")
  51. handler.write("More output!\n")
  52. handler.write("Progress: 10%\n") # 10%
  53. handler.write("Even more\n")
  54. handler.write("Progress: 50%\n") # 50%
  55. handler.write("Progress: 60%\n") # 60%
  56. handler.write("Progress: 100%\n") # 100%
  57. expected = [(10, None), (50, None), (60, None), (100, None)]
  58. self.assertEqual(self._progress_watcher.reports(), expected)
  59. self.assertEqual(buffer.getvalue(), "Program output!\nMore output!\nEven more\n")
  60. def test_BasicProgressHandler_color_filtering(self):
  61. buffer = io.StringIO()
  62. handler = bb.progress.BasicProgressHandler(self.d, outfile=buffer)
  63. handler.write("1%\n") # 1%
  64. handler.write("2%\n") # 2%
  65. handler.write("10%\n") # 10%
  66. handler.write("100%\n") # 100%
  67. expected = [(0, None), (1, None), (2, None), (10, None), (100, None)]
  68. self.assertListEqual(self._progress_watcher.reports(), expected)
  69. def test_OutOfProgressHandler_color_filtering(self):
  70. buffer = io.StringIO()
  71. handler = bb.progress.OutOfProgressHandler(self.d, r'(\d+) of (\d+)', outfile=buffer)
  72. handler.write("Text text 1 of 5") # 1/5
  73. handler.write("Text text 3 of 5") # 3/5
  74. handler.write("Text text 5 of 5") # 5/5
  75. expected = [(0, None), (20.0, None), (60.0, None), (100.0, None)]
  76. self.assertListEqual(self._progress_watcher.reports(), expected)