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 = "[01;35m[K~~~~~~~~~~~~^~~~~~~~[m[K" 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 = "[01;35m[K~~~~~~~~~~~~^~~~~~~~[m[K" 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: [01;35m[K10[m[K%\n") # 10% 66635e0e46SAndrew Geissler handler.write("Even more\n") 67635e0e46SAndrew Geissler handler.write("[01;35m[KProgress: 50[m[K%\n") # 50% 68635e0e46SAndrew Geissler handler.write("[01;35m[KProgress: 60[m[K%\n") # 60% 69635e0e46SAndrew Geissler handler.write("Pro[01;35m[Kgress: [m[K100%\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("[01;35m[K1[m[K%\n") # 1% 80635e0e46SAndrew Geissler handler.write("[01;35m[K2[m[K%\n") # 2% 81635e0e46SAndrew Geissler handler.write("[01;35m[K10[m[K%\n") # 10% 82635e0e46SAndrew Geissler handler.write("[01;35m[K100[m[K%\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("[01;35m[KText text 1 of[m[K 5") # 1/5 91635e0e46SAndrew Geissler handler.write("[01;35m[KText text 3 of[m[K 5") # 3/5 92635e0e46SAndrew Geissler handler.write("[01;35m[KText text 5 of[m[K 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