aboutsummaryrefslogtreecommitdiff
path: root/tests/functional
diff options
context:
space:
mode:
authorThomas Huth <thuth@redhat.com>2024-08-30 15:38:22 +0200
committerThomas Huth <thuth@redhat.com>2024-09-04 11:14:33 +0200
commit576fffbc8eefd806c47850f8e1c60fdcb37733e3 (patch)
treea2302ba894f02795a2217b655fda044d0e6543f7 /tests/functional
parent88c907199aba4ff78985a5727fa56ec667a94cda (diff)
downloadqemu-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.build4
-rw-r--r--tests/functional/qemu_test/tesseract.py35
-rwxr-xr-xtests/functional/test_m68k_nextcube.py73
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()