diff options
author | Thomas Huth <thuth@redhat.com> | 2024-08-30 15:38:22 +0200 |
---|---|---|
committer | Thomas Huth <thuth@redhat.com> | 2024-09-04 11:14:33 +0200 |
commit | 576fffbc8eefd806c47850f8e1c60fdcb37733e3 (patch) | |
tree | a2302ba894f02795a2217b655fda044d0e6543f7 /tests/functional | |
parent | 88c907199aba4ff78985a5727fa56ec667a94cda (diff) | |
download | qemu-576fffbc8eefd806c47850f8e1c60fdcb37733e3.zip qemu-576fffbc8eefd806c47850f8e1c60fdcb37733e3.tar.gz qemu-576fffbc8eefd806c47850f8e1c60fdcb37733e3.tar.bz2 |
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>
Diffstat (limited to 'tests/functional')
-rw-r--r-- | tests/functional/meson.build | 4 | ||||
-rw-r--r-- | tests/functional/qemu_test/tesseract.py | 35 | ||||
-rwxr-xr-x | tests/functional/test_m68k_nextcube.py | 73 |
3 files changed, 112 insertions, 0 deletions
diff --git a/tests/functional/meson.build b/tests/functional/meson.build index fcb99c5..61cdd1d 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -43,6 +43,10 @@ tests_loongarch64_system_thorough = [ 'loongarch64_virt', ] +tests_m68k_system_thorough = [ + 'm68k_nextcube' +] + tests_microblaze_system_thorough = [ 'microblaze_s3adsp1800' ] diff --git a/tests/functional/qemu_test/tesseract.py b/tests/functional/qemu_test/tesseract.py new file mode 100644 index 0000000..c4087b7 --- /dev/null +++ b/tests/functional/qemu_test/tesseract.py @@ -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 diff --git a/tests/functional/test_m68k_nextcube.py b/tests/functional/test_m68k_nextcube.py new file mode 100755 index 0000000..89385a1 --- /dev/null +++ b/tests/functional/test_m68k_nextcube.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# +# Functional test that boots a VM and run OCR on the framebuffer +# +# 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 os +import time + +from qemu_test import QemuSystemTest, Asset +from unittest import skipUnless + +from qemu_test.tesseract import tesseract_available, tesseract_ocr + +PIL_AVAILABLE = True +try: + from PIL import Image +except ImportError: + PIL_AVAILABLE = False + + +class NextCubeMachine(QemuSystemTest): + + 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): + rom_path = self.ASSET_ROM.fetch() + + 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) + + self.vm.cmd('human-monitor-command', + command_line='screendump %s' % screenshot_path) + + @skipUnless(PIL_AVAILABLE, 'Python PIL not installed') + def test_bootrom_framebuffer_size(self): + self.set_machine('next-cube') + screenshot_path = os.path.join(self.workdir, "dump.ppm") + 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. + @skipUnless(tesseract_available(4), 'tesseract OCR tool not available') + def test_bootrom_framebuffer_ocr_with_tesseract(self): + self.set_machine('next-cube') + screenshot_path = os.path.join(self.workdir, "dump.ppm") + self.check_bootrom_framebuffer(screenshot_path) + lines = tesseract_ocr(screenshot_path) + text = '\n'.join(lines) + self.assertIn('Testing the FPU', text) + self.assertIn('System test failed. Error code', text) + self.assertIn('Boot command', text) + self.assertIn('Next>', text) + +if __name__ == '__main__': + QemuSystemTest.main() |