2024-08-30 16:38:22 +03:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
#
|
2019-08-13 16:49:19 +03:00
|
|
|
# Functional test that boots a VM and run OCR on the framebuffer
|
|
|
|
#
|
2020-10-21 13:33:25 +03:00
|
|
|
# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org>
|
2019-08-13 16:49:19 +03:00
|
|
|
#
|
|
|
|
# This work is licensed under the terms of the GNU GPL, version 2 or
|
|
|
|
# later. See the COPYING file in the top-level directory.
|
|
|
|
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
|
2024-08-30 16:38:22 +03:00
|
|
|
from qemu_test import QemuSystemTest, Asset
|
|
|
|
from unittest import skipUnless
|
2020-10-21 13:33:25 +03:00
|
|
|
|
2024-08-30 16:38:22 +03:00
|
|
|
from qemu_test.tesseract import tesseract_available, tesseract_ocr
|
2019-08-13 16:49:19 +03:00
|
|
|
|
|
|
|
PIL_AVAILABLE = True
|
|
|
|
try:
|
|
|
|
from PIL import Image
|
|
|
|
except ImportError:
|
|
|
|
PIL_AVAILABLE = False
|
|
|
|
|
|
|
|
|
2021-09-27 19:14:33 +03:00
|
|
|
class NextCubeMachine(QemuSystemTest):
|
2019-08-13 16:49:19 +03:00
|
|
|
|
|
|
|
timeout = 15
|
|
|
|
|
2024-08-30 16:38:22 +03:00
|
|
|
ASSET_ROM = Asset(('https://sourceforge.net/p/previous/code/1350/tree/'
|
|
|
|
'trunk/src/Rev_2.5_v66.BIN?format=raw'),
|
|
|
|
'1b753890b67095b73e104c939ddf62eca9e7d0aedde5108e3893b0ed9d8000a4')
|
|
|
|
|
2019-08-13 16:49:19 +03:00
|
|
|
def check_bootrom_framebuffer(self, screenshot_path):
|
2024-08-30 16:38:22 +03:00
|
|
|
rom_path = self.ASSET_ROM.fetch()
|
2019-08-13 16:49:19 +03:00
|
|
|
|
|
|
|
self.vm.add_args('-bios', rom_path)
|
|
|
|
self.vm.launch()
|
|
|
|
|
|
|
|
self.log.info('VM launched, waiting for display')
|
|
|
|
# TODO: Use avocado.utils.wait.wait_for to catch the
|
|
|
|
# 'displaysurface_create 1120x832' trace-event.
|
|
|
|
time.sleep(2)
|
|
|
|
|
2023-10-06 18:41:15 +03:00
|
|
|
self.vm.cmd('human-monitor-command',
|
|
|
|
command_line='screendump %s' % screenshot_path)
|
2019-08-13 16:49:19 +03:00
|
|
|
|
|
|
|
@skipUnless(PIL_AVAILABLE, 'Python PIL not installed')
|
|
|
|
def test_bootrom_framebuffer_size(self):
|
2024-08-30 16:38:22 +03:00
|
|
|
self.set_machine('next-cube')
|
2020-10-21 13:50:31 +03:00
|
|
|
screenshot_path = os.path.join(self.workdir, "dump.ppm")
|
2019-08-13 16:49:19 +03:00
|
|
|
self.check_bootrom_framebuffer(screenshot_path)
|
|
|
|
|
|
|
|
width, height = Image.open(screenshot_path).size
|
|
|
|
self.assertEqual(width, 1120)
|
|
|
|
self.assertEqual(height, 832)
|
|
|
|
|
|
|
|
# Tesseract 4 adds a new OCR engine based on LSTM neural networks. The
|
|
|
|
# new version is faster and more accurate than version 3. The drawback is
|
|
|
|
# that it is still alpha-level software.
|
2023-11-01 23:43:22 +03:00
|
|
|
@skipUnless(tesseract_available(4), 'tesseract OCR tool not available')
|
|
|
|
def test_bootrom_framebuffer_ocr_with_tesseract(self):
|
2024-08-30 16:38:22 +03:00
|
|
|
self.set_machine('next-cube')
|
2020-10-21 13:50:31 +03:00
|
|
|
screenshot_path = os.path.join(self.workdir, "dump.ppm")
|
2019-08-13 16:49:19 +03:00
|
|
|
self.check_bootrom_framebuffer(screenshot_path)
|
2024-08-30 16:38:22 +03:00
|
|
|
lines = tesseract_ocr(screenshot_path)
|
2020-10-21 13:35:30 +03:00
|
|
|
text = '\n'.join(lines)
|
2023-11-01 23:43:22 +03:00
|
|
|
self.assertIn('Testing the FPU', text)
|
2019-09-19 19:14:00 +03:00
|
|
|
self.assertIn('System test failed. Error code', text)
|
2019-08-13 16:49:19 +03:00
|
|
|
self.assertIn('Boot command', text)
|
|
|
|
self.assertIn('Next>', text)
|
2024-08-30 16:38:22 +03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
QemuSystemTest.main()
|