tests/functional: Convert the m68k nextcube test with tesseract

The code that handles running of tesseract needs to be tweaked a little
bit to be able to run without the functions from avocado.utils, and
while we're at it, drop some legacy stuff that was still there due to
Tesseract 3 support that we already dropped a while ago.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20240830133841.142644-29-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Thomas Huth 2024-08-30 15:38:22 +02:00
parent 88c907199a
commit 576fffbc8e
5 changed files with 56 additions and 59 deletions

View File

@ -1282,6 +1282,7 @@ S: Odd Fixes
F: hw/m68k/next-*.c F: hw/m68k/next-*.c
F: hw/display/next-fb.c F: hw/display/next-fb.c
F: include/hw/m68k/next-cube.h F: include/hw/m68k/next-cube.h
F: tests/functional/test_m68k_nextcube.py
q800 q800
M: Laurent Vivier <laurent@vivier.eu> M: Laurent Vivier <laurent@vivier.eu>

View File

@ -1,46 +0,0 @@
# ...
#
# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org>
#
# 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 re
import logging
from avocado.utils import process
from avocado.utils.path import find_command, CmdNotFoundError
def tesseract_available(expected_version):
try:
find_command('tesseract')
except CmdNotFoundError:
return False
res = process.run('tesseract --version')
try:
version = res.stdout_text.split()[1]
except IndexError:
version = res.stderr_text.split()[1]
return int(version.split('.')[0]) >= expected_version
match = re.match(r'tesseract\s(\d)', res)
if match is None:
return False
# now this is guaranteed to be a digit
return int(match.groups()[0]) >= expected_version
def tesseract_ocr(image_path, tesseract_args='', tesseract_version=3):
console_logger = logging.getLogger('tesseract')
console_logger.debug(image_path)
if tesseract_version == 4:
tesseract_args += ' --oem 1'
proc = process.run("tesseract {} {} stdout".format(tesseract_args,
image_path))
lines = []
for line in proc.stdout_text.split('\n'):
sline = line.strip()
if len(sline):
console_logger.debug(sline)
lines += [sline]
return lines

View File

@ -43,6 +43,10 @@ tests_loongarch64_system_thorough = [
'loongarch64_virt', 'loongarch64_virt',
] ]
tests_m68k_system_thorough = [
'm68k_nextcube'
]
tests_microblaze_system_thorough = [ tests_microblaze_system_thorough = [
'microblaze_s3adsp1800' 'microblaze_s3adsp1800'
] ]

View File

@ -0,0 +1,35 @@
# ...
#
# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org>
#
# 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 re
import logging
from . import has_cmd, run_cmd
def tesseract_available(expected_version):
if not has_cmd('tesseract'):
return False
(stdout, stderr, ret) = run_cmd([ 'tesseract', '--version'])
if ret:
return False
version = stdout.split()[1]
return int(version.split('.')[0]) >= expected_version
def tesseract_ocr(image_path, tesseract_args=''):
console_logger = logging.getLogger('console')
console_logger.debug(image_path)
(stdout, stderr, ret) = run_cmd(['tesseract', image_path,
'stdout'])
if ret:
return None
lines = []
for line in stdout.split('\n'):
sline = line.strip()
if len(sline):
console_logger.debug(sline)
lines += [sline]
return lines

View File

@ -1,3 +1,5 @@
#!/usr/bin/env python3
#
# Functional test that boots a VM and run OCR on the framebuffer # Functional test that boots a VM and run OCR on the framebuffer
# #
# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org> # Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org>
@ -8,10 +10,10 @@
import os import os
import time import time
from avocado_qemu import QemuSystemTest from qemu_test import QemuSystemTest, Asset
from avocado import skipUnless from unittest import skipUnless
from tesseract_utils import tesseract_available, tesseract_ocr from qemu_test.tesseract import tesseract_available, tesseract_ocr
PIL_AVAILABLE = True PIL_AVAILABLE = True
try: try:
@ -21,19 +23,15 @@ except ImportError:
class NextCubeMachine(QemuSystemTest): class NextCubeMachine(QemuSystemTest):
"""
:avocado: tags=arch:m68k
:avocado: tags=machine:next-cube
:avocado: tags=device:framebuffer
"""
timeout = 15 timeout = 15
ASSET_ROM = Asset(('https://sourceforge.net/p/previous/code/1350/tree/'
'trunk/src/Rev_2.5_v66.BIN?format=raw'),
'1b753890b67095b73e104c939ddf62eca9e7d0aedde5108e3893b0ed9d8000a4')
def check_bootrom_framebuffer(self, screenshot_path): def check_bootrom_framebuffer(self, screenshot_path):
rom_url = ('https://sourceforge.net/p/previous/code/1350/tree/' rom_path = self.ASSET_ROM.fetch()
'trunk/src/Rev_2.5_v66.BIN?format=raw')
rom_hash = 'b3534796abae238a0111299fc406a9349f7fee24'
rom_path = self.fetch_asset(rom_url, asset_hash=rom_hash)
self.vm.add_args('-bios', rom_path) self.vm.add_args('-bios', rom_path)
self.vm.launch() self.vm.launch()
@ -48,6 +46,7 @@ class NextCubeMachine(QemuSystemTest):
@skipUnless(PIL_AVAILABLE, 'Python PIL not installed') @skipUnless(PIL_AVAILABLE, 'Python PIL not installed')
def test_bootrom_framebuffer_size(self): def test_bootrom_framebuffer_size(self):
self.set_machine('next-cube')
screenshot_path = os.path.join(self.workdir, "dump.ppm") screenshot_path = os.path.join(self.workdir, "dump.ppm")
self.check_bootrom_framebuffer(screenshot_path) self.check_bootrom_framebuffer(screenshot_path)
@ -60,11 +59,15 @@ class NextCubeMachine(QemuSystemTest):
# that it is still alpha-level software. # that it is still alpha-level software.
@skipUnless(tesseract_available(4), 'tesseract OCR tool not available') @skipUnless(tesseract_available(4), 'tesseract OCR tool not available')
def test_bootrom_framebuffer_ocr_with_tesseract(self): def test_bootrom_framebuffer_ocr_with_tesseract(self):
self.set_machine('next-cube')
screenshot_path = os.path.join(self.workdir, "dump.ppm") screenshot_path = os.path.join(self.workdir, "dump.ppm")
self.check_bootrom_framebuffer(screenshot_path) self.check_bootrom_framebuffer(screenshot_path)
lines = tesseract_ocr(screenshot_path, tesseract_version=4) lines = tesseract_ocr(screenshot_path)
text = '\n'.join(lines) text = '\n'.join(lines)
self.assertIn('Testing the FPU', text) self.assertIn('Testing the FPU', text)
self.assertIn('System test failed. Error code', text) self.assertIn('System test failed. Error code', text)
self.assertIn('Boot command', text) self.assertIn('Boot command', text)
self.assertIn('Next>', text) self.assertIn('Next>', text)
if __name__ == '__main__':
QemuSystemTest.main()