xref: /openbmc/openbmc/poky/bitbake/lib/bb/tests/color.py (revision 517393d9)
1635e0e46SAndrew Geissler#
2635e0e46SAndrew Geissler# BitBake Test for ANSI color code filtering
3635e0e46SAndrew Geissler#
4635e0e46SAndrew Geissler# Copyright (C) 2020  Agilent Technologies, Inc.
5635e0e46SAndrew Geissler# Author: Chris Laplante <chris.laplante@agilent.com>
6635e0e46SAndrew Geissler#
7635e0e46SAndrew Geissler# SPDX-License-Identifier: MIT
8635e0e46SAndrew Geissler#
9635e0e46SAndrew Geissler
10635e0e46SAndrew Geisslerimport unittest
11635e0e46SAndrew Geisslerimport bb.progress
12635e0e46SAndrew Geisslerimport bb.data
13635e0e46SAndrew Geisslerimport bb.event
14635e0e46SAndrew Geisslerfrom bb.progress import filter_color, filter_color_n
15635e0e46SAndrew Geisslerimport io
16635e0e46SAndrew Geisslerimport re
17635e0e46SAndrew Geissler
18635e0e46SAndrew Geissler
19635e0e46SAndrew Geisslerclass ProgressWatcher:
20635e0e46SAndrew Geissler    def __init__(self):
21635e0e46SAndrew Geissler        self._reports = []
22635e0e46SAndrew Geissler
23*517393d9SAndrew Geissler    def handle_event(self, event, d):
24635e0e46SAndrew Geissler        self._reports.append((event.progress, event.rate))
25635e0e46SAndrew Geissler
26635e0e46SAndrew Geissler    def reports(self):
27635e0e46SAndrew Geissler        return self._reports
28635e0e46SAndrew Geissler
29635e0e46SAndrew Geissler
30635e0e46SAndrew Geisslerclass ColorCodeTests(unittest.TestCase):
31635e0e46SAndrew Geissler    def setUp(self):
32635e0e46SAndrew Geissler        self.d = bb.data.init()
33635e0e46SAndrew Geissler        self._progress_watcher = ProgressWatcher()
3495ac1b8dSAndrew Geissler        bb.event.register("bb.build.TaskProgress", self._progress_watcher.handle_event, data=self.d)
35635e0e46SAndrew Geissler
36635e0e46SAndrew Geissler    def tearDown(self):
37635e0e46SAndrew Geissler        bb.event.remove("bb.build.TaskProgress", None)
38635e0e46SAndrew Geissler
39635e0e46SAndrew Geissler    def test_filter_color(self):
40635e0e46SAndrew Geissler        input_string = "~~~~~~~~~~~~^~~~~~~~"
41635e0e46SAndrew Geissler        filtered = filter_color(input_string)
42635e0e46SAndrew Geissler        self.assertEqual(filtered, "~~~~~~~~~~~~^~~~~~~~")
43635e0e46SAndrew Geissler
44635e0e46SAndrew Geissler    def test_filter_color_n(self):
45635e0e46SAndrew Geissler        input_string = "~~~~~~~~~~~~^~~~~~~~"
46635e0e46SAndrew Geissler        filtered, code_count = filter_color_n(input_string)
47635e0e46SAndrew Geissler        self.assertEqual(filtered, "~~~~~~~~~~~~^~~~~~~~")
48635e0e46SAndrew Geissler        self.assertEqual(code_count, 4)
49635e0e46SAndrew Geissler
50635e0e46SAndrew Geissler    def test_LineFilterProgressHandler_color_filtering(self):
51635e0e46SAndrew Geissler        class CustomProgressHandler(bb.progress.LineFilterProgressHandler):
52635e0e46SAndrew Geissler            PROGRESS_REGEX = re.compile(r"Progress: (?P<progress>\d+)%")
53635e0e46SAndrew Geissler
54635e0e46SAndrew Geissler            def writeline(self, line):
55635e0e46SAndrew Geissler                match = self.PROGRESS_REGEX.match(line)
56635e0e46SAndrew Geissler                if match:
57635e0e46SAndrew Geissler                    self.update(int(match.group("progress")))
58635e0e46SAndrew Geissler                    return False
59635e0e46SAndrew Geissler                return True
60635e0e46SAndrew Geissler
61635e0e46SAndrew Geissler        buffer = io.StringIO()
62635e0e46SAndrew Geissler        handler = CustomProgressHandler(self.d, buffer)
63635e0e46SAndrew Geissler        handler.write("Program output!\n")
64635e0e46SAndrew Geissler        handler.write("More output!\n")
65635e0e46SAndrew Geissler        handler.write("Progress: 10%\n") # 10%
66635e0e46SAndrew Geissler        handler.write("Even more\n")
67635e0e46SAndrew Geissler        handler.write("Progress: 50%\n") # 50%
68635e0e46SAndrew Geissler        handler.write("Progress: 60%\n") # 60%
69635e0e46SAndrew Geissler        handler.write("Progress: 100%\n") # 100%
70635e0e46SAndrew Geissler
71635e0e46SAndrew Geissler        expected = [(10, None), (50, None), (60, None), (100, None)]
72635e0e46SAndrew Geissler        self.assertEqual(self._progress_watcher.reports(), expected)
73635e0e46SAndrew Geissler
74635e0e46SAndrew Geissler        self.assertEqual(buffer.getvalue(), "Program output!\nMore output!\nEven more\n")
75635e0e46SAndrew Geissler
76635e0e46SAndrew Geissler    def test_BasicProgressHandler_color_filtering(self):
77635e0e46SAndrew Geissler        buffer = io.StringIO()
78635e0e46SAndrew Geissler        handler = bb.progress.BasicProgressHandler(self.d, outfile=buffer)
79635e0e46SAndrew Geissler        handler.write("1%\n") # 1%
80635e0e46SAndrew Geissler        handler.write("2%\n") # 2%
81635e0e46SAndrew Geissler        handler.write("10%\n") # 10%
82635e0e46SAndrew Geissler        handler.write("100%\n") # 100%
83635e0e46SAndrew Geissler
84635e0e46SAndrew Geissler        expected = [(0, None), (1, None), (2, None), (10, None), (100, None)]
85635e0e46SAndrew Geissler        self.assertListEqual(self._progress_watcher.reports(), expected)
86635e0e46SAndrew Geissler
87635e0e46SAndrew Geissler    def test_OutOfProgressHandler_color_filtering(self):
88635e0e46SAndrew Geissler        buffer = io.StringIO()
89635e0e46SAndrew Geissler        handler = bb.progress.OutOfProgressHandler(self.d, r'(\d+) of (\d+)', outfile=buffer)
90635e0e46SAndrew Geissler        handler.write("Text text 1 of 5") # 1/5
91635e0e46SAndrew Geissler        handler.write("Text text 3 of 5") # 3/5
92635e0e46SAndrew Geissler        handler.write("Text text 5 of 5") # 5/5
93635e0e46SAndrew Geissler
94635e0e46SAndrew Geissler        expected = [(0, None), (20.0, None), (60.0, None), (100.0, None)]
95635e0e46SAndrew Geissler        self.assertListEqual(self._progress_watcher.reports(), expected)
96