1bbbd9b6eSWillian Rampazzo# Functional test that boots a VM and run OCR on the framebuffer 2bbbd9b6eSWillian Rampazzo# 3bbbd9b6eSWillian Rampazzo# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org> 4bbbd9b6eSWillian Rampazzo# 5bbbd9b6eSWillian Rampazzo# This work is licensed under the terms of the GNU GPL, version 2 or 6bbbd9b6eSWillian Rampazzo# later. See the COPYING file in the top-level directory. 7bbbd9b6eSWillian Rampazzo 8bbbd9b6eSWillian Rampazzoimport os 9bbbd9b6eSWillian Rampazzoimport time 10bbbd9b6eSWillian Rampazzo 11*2283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest 12bbbd9b6eSWillian Rampazzofrom avocado import skipUnless 13bbbd9b6eSWillian Rampazzo 14bbbd9b6eSWillian Rampazzofrom tesseract_utils import tesseract_available, tesseract_ocr 15bbbd9b6eSWillian Rampazzo 16bbbd9b6eSWillian RampazzoPIL_AVAILABLE = True 17bbbd9b6eSWillian Rampazzotry: 18bbbd9b6eSWillian Rampazzo from PIL import Image 19bbbd9b6eSWillian Rampazzoexcept ImportError: 20bbbd9b6eSWillian Rampazzo PIL_AVAILABLE = False 21bbbd9b6eSWillian Rampazzo 22bbbd9b6eSWillian Rampazzo 23*2283b627SPhilippe Mathieu-Daudéclass NextCubeMachine(QemuSystemTest): 24bbbd9b6eSWillian Rampazzo """ 25bbbd9b6eSWillian Rampazzo :avocado: tags=arch:m68k 26bbbd9b6eSWillian Rampazzo :avocado: tags=machine:next-cube 27bbbd9b6eSWillian Rampazzo :avocado: tags=device:framebuffer 28bbbd9b6eSWillian Rampazzo """ 29bbbd9b6eSWillian Rampazzo 30bbbd9b6eSWillian Rampazzo timeout = 15 31bbbd9b6eSWillian Rampazzo 32bbbd9b6eSWillian Rampazzo def check_bootrom_framebuffer(self, screenshot_path): 33bbbd9b6eSWillian Rampazzo rom_url = ('http://www.nextcomputers.org/NeXTfiles/Software/ROM_Files/' 34bbbd9b6eSWillian Rampazzo '68040_Non-Turbo_Chipset/Rev_2.5_v66.BIN') 35bbbd9b6eSWillian Rampazzo rom_hash = 'b3534796abae238a0111299fc406a9349f7fee24' 36bbbd9b6eSWillian Rampazzo rom_path = self.fetch_asset(rom_url, asset_hash=rom_hash) 37bbbd9b6eSWillian Rampazzo 38bbbd9b6eSWillian Rampazzo self.vm.add_args('-bios', rom_path) 39bbbd9b6eSWillian Rampazzo self.vm.launch() 40bbbd9b6eSWillian Rampazzo 41bbbd9b6eSWillian Rampazzo self.log.info('VM launched, waiting for display') 42bbbd9b6eSWillian Rampazzo # TODO: Use avocado.utils.wait.wait_for to catch the 43bbbd9b6eSWillian Rampazzo # 'displaysurface_create 1120x832' trace-event. 44bbbd9b6eSWillian Rampazzo time.sleep(2) 45bbbd9b6eSWillian Rampazzo 46bbbd9b6eSWillian Rampazzo self.vm.command('human-monitor-command', 47bbbd9b6eSWillian Rampazzo command_line='screendump %s' % screenshot_path) 48bbbd9b6eSWillian Rampazzo 49bbbd9b6eSWillian Rampazzo @skipUnless(PIL_AVAILABLE, 'Python PIL not installed') 50bbbd9b6eSWillian Rampazzo def test_bootrom_framebuffer_size(self): 51bbbd9b6eSWillian Rampazzo screenshot_path = os.path.join(self.workdir, "dump.ppm") 52bbbd9b6eSWillian Rampazzo self.check_bootrom_framebuffer(screenshot_path) 53bbbd9b6eSWillian Rampazzo 54bbbd9b6eSWillian Rampazzo width, height = Image.open(screenshot_path).size 55bbbd9b6eSWillian Rampazzo self.assertEqual(width, 1120) 56bbbd9b6eSWillian Rampazzo self.assertEqual(height, 832) 57bbbd9b6eSWillian Rampazzo 58bbbd9b6eSWillian Rampazzo @skipUnless(tesseract_available(3), 'tesseract v3 OCR tool not available') 59bbbd9b6eSWillian Rampazzo def test_bootrom_framebuffer_ocr_with_tesseract_v3(self): 60bbbd9b6eSWillian Rampazzo screenshot_path = os.path.join(self.workdir, "dump.ppm") 61bbbd9b6eSWillian Rampazzo self.check_bootrom_framebuffer(screenshot_path) 62bbbd9b6eSWillian Rampazzo lines = tesseract_ocr(screenshot_path, tesseract_version=3) 63bbbd9b6eSWillian Rampazzo text = '\n'.join(lines) 64bbbd9b6eSWillian Rampazzo self.assertIn('Backplane', text) 65bbbd9b6eSWillian Rampazzo self.assertIn('Ethernet address', text) 66bbbd9b6eSWillian Rampazzo 67bbbd9b6eSWillian Rampazzo # Tesseract 4 adds a new OCR engine based on LSTM neural networks. The 68bbbd9b6eSWillian Rampazzo # new version is faster and more accurate than version 3. The drawback is 69bbbd9b6eSWillian Rampazzo # that it is still alpha-level software. 70bbbd9b6eSWillian Rampazzo @skipUnless(tesseract_available(4), 'tesseract v4 OCR tool not available') 71bbbd9b6eSWillian Rampazzo def test_bootrom_framebuffer_ocr_with_tesseract_v4(self): 72bbbd9b6eSWillian Rampazzo screenshot_path = os.path.join(self.workdir, "dump.ppm") 73bbbd9b6eSWillian Rampazzo self.check_bootrom_framebuffer(screenshot_path) 74bbbd9b6eSWillian Rampazzo lines = tesseract_ocr(screenshot_path, tesseract_version=4) 75bbbd9b6eSWillian Rampazzo text = '\n'.join(lines) 76bbbd9b6eSWillian Rampazzo self.assertIn('Testing the FPU, SCC', text) 77bbbd9b6eSWillian Rampazzo self.assertIn('System test failed. Error code', text) 78bbbd9b6eSWillian Rampazzo self.assertIn('Boot command', text) 79bbbd9b6eSWillian Rampazzo self.assertIn('Next>', text) 80