From nobody Tue Feb 10 12:59:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567871798; cv=none; d=zoho.com; s=zohoarc; b=ScaaV962N0ApOp1JcP3SYypO4YP6ybdmcrcn1BfSrxwjrQ2Imw2xE8yjUiqmtWRJ3XhWBy62ccI2PHVDlrYQ03posdJje4t47pwv2kfzTi24++8nZ87L9j51Kg1VDQyyzi8jWTZX5X9cvht2Z3scrOQap0KJ1QTc+pjymR6A594= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567871798; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=3/MAIxhVMjzHPxk6i+ZNE+2r2ZgoAuT7WenvBxcwPkY=; b=NDibXPGM37XKp/QKdeNgqwdKJc6/yjEylv4gWhxaTpeGDSvO3Xk+NTMHQIzznbuN4pk89LWeeB/2iLWHeAv9Zuer0q2ic1ZiXft5ZpddpiLRTj+J886J4XrWHh5SEUzsK/iF5SoBbIMuzq/iOnMbetrslgO4ynnBK2eE1U9x4t0= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567871798436537.3636595937766; Sat, 7 Sep 2019 08:56:38 -0700 (PDT) Received: from localhost ([::1]:35830 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i6d4i-0003hD-6I for importer@patchew.org; Sat, 07 Sep 2019 11:56:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48813) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i6cwT-0003o0-2v for qemu-devel@nongnu.org; Sat, 07 Sep 2019 11:48:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i6cwR-0007kg-7Z for qemu-devel@nongnu.org; Sat, 07 Sep 2019 11:48:00 -0400 Received: from mail-wr1-f54.google.com ([209.85.221.54]:44354) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i6cwQ-0007jv-TT for qemu-devel@nongnu.org; Sat, 07 Sep 2019 11:47:59 -0400 Received: by mail-wr1-f54.google.com with SMTP id 30so9437694wrk.11 for ; Sat, 07 Sep 2019 08:47:58 -0700 (PDT) Received: from thl530.multi.box (pD9E8385F.dip0.t-ipconnect.de. [217.232.56.95]) by smtp.gmail.com with ESMTPSA id s19sm17173418wrb.14.2019.09.07.08.47.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Sep 2019 08:47:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3/MAIxhVMjzHPxk6i+ZNE+2r2ZgoAuT7WenvBxcwPkY=; b=MJyEucwEEhEh7Et/+RBPSUokCDpTv0/jvoeUhOdSXMElirgr90SoKSzdiKeEnvYgAC hB02tXlgAO5pp3lcjlyIQJ0EB18sCyk5xcCUgU0jh02llB+IHJekMCOui3+QDE+sBZet G88cYWNKAiuj6xvWIs1UaS87ZaeXMjiIF9FWtjzkPTBGbgyn+rNp7As2/uSXXpVm74fQ 0ufmTRgf4oGwAnvlo/f+aw7ckNUfbYLK0Oz2p6NkbNLRei9lubCFd3bC3/srFtJlFwXd Z8nib4wWAAh4XfUkFjz7CASfdRjTwNHTA1zS0ZZnn6Q2l4APLWmniT8JgmYfCXXoaUL5 3bEQ== X-Gm-Message-State: APjAAAVw0yc2DgFR6BkKoawU6aji/PtWA9MCmNVPEMMPGPGSgFUWaRSA S17spF6nDrD7tCcXq8uPJm0= X-Google-Smtp-Source: APXvYqxccI2ATjfH/E3hDu4P8eE+Q+iTrHjMwqSF0ATmzVO/bnmgmM2p7WIb7UPIot53TReApu2MDQ== X-Received: by 2002:a5d:46c4:: with SMTP id g4mr10825226wrs.189.1567871277815; Sat, 07 Sep 2019 08:47:57 -0700 (PDT) From: Thomas Huth To: Peter Maydell , qemu-devel@nongnu.org Date: Sat, 7 Sep 2019 17:47:43 +0200 Message-Id: <20190907154744.4136-8-huth@tuxfamily.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190907154744.4136-1-huth@tuxfamily.org> References: <20190907154744.4136-1-huth@tuxfamily.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.221.54 Subject: [Qemu-devel] [PULL 7/8] tests/acceptance: Add test of NeXTcube framebuffer using OCR X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daud=C3=A9 Add a test of the NeXTcube framebuffer using the Tesseract OCR engine on a screenshot of the framebuffer device. The test is very quick: $ avocado --show=3Dapp,console run tests/acceptance/machine_m68k_nextcube= .py JOB ID : 78844a92424cc495bd068c3874d542d1e20f24bc JOB LOG : /home/phil/avocado/job-results/job-2019-08-13T13.16-78844a9/= job.log (1/3) tests/acceptance/machine_m68k_nextcube.py:NextCubeMachine.test_boo= trom_framebuffer_size: PASS (2.16 s) (2/3) tests/acceptance/machine_m68k_nextcube.py:NextCubeMachine.test_boo= trom_framebuffer_ocr_with_tesseract_v3: - ue r pun Honl'=EF=AC=82x ; 5=E2=80=98 55=E2=80=98 avg ncaaaaa 25 MHZ, memary jag m Backplane slat =C2=ABa Ethernet address a a r a r3 2 Memgry sackets aea canflqured far 16MB Darlly page made stMs but have 16M= B page made stMs )nstalled Memgry sackets a and 1 canflqured far 16MB Darlly page made stMs but have= 16MB page made stMs )nstalled [...] Yestlnq the rpu, 5:: system test raneg Errar egge 51 Egg: cammand Default pggc devlce nut fauna NEXY>I PASS (2.64 s) (3/3) tests/acceptance/machine_m68k_nextcube.py:NextCubeMachine.test_boo= trom_framebuffer_ocr_with_tesseract_v4: SKIP: tesseract v4 OCR tool not ava= ilable RESULTS : PASS 2 | ERROR 0 | FAIL 0 | SKIP 1 | WARN 0 | INTERRUPT 0 | = CANCEL 0 JOB TIME : 5.35 s Documentation on how to install tesseract: https://github.com/tesseract-ocr/tesseract/wiki#installation Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20190813134921.30602-2-philmd@redhat.com> Signed-off-by: Thomas Huth --- tests/acceptance/machine_m68k_nextcube.py | 121 ++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/acceptance/machine_m68k_nextcube.py diff --git a/tests/acceptance/machine_m68k_nextcube.py b/tests/acceptance/m= achine_m68k_nextcube.py new file mode 100644 index 0000000000..e09cab9f20 --- /dev/null +++ b/tests/acceptance/machine_m68k_nextcube.py @@ -0,0 +1,121 @@ +# Functional test that boots a VM and run OCR on the framebuffer +# +# Copyright (c) Philippe Mathieu-Daud=C3=A9 +# +# 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 re +import time +import logging +import distutils.spawn + +from avocado_qemu import Test +from avocado import skipUnless +from avocado.utils import process +from avocado.utils.path import find_command, CmdNotFoundError + +PIL_AVAILABLE =3D True +try: + from PIL import Image +except ImportError: + PIL_AVAILABLE =3D False + + +def tesseract_available(expected_version): + try: + find_command('tesseract') + except CmdNotFoundError: + return False + res =3D process.run('tesseract --version') + try: + version =3D res.stdout_text.split()[1] + except IndexError: + version =3D res.stderr_text.split()[1] + return int(version.split('.')[0]) =3D=3D expected_version + + match =3D 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]) =3D=3D expected_version + + +class NextCubeMachine(Test): + + timeout =3D 15 + + def check_bootrom_framebuffer(self, screenshot_path): + rom_url =3D ('http://www.nextcomputers.org/NeXTfiles/Software/ROM_= Files/' + '68040_Non-Turbo_Chipset/Rev_2.5_v66.BIN') + rom_hash =3D 'b3534796abae238a0111299fc406a9349f7fee24' + rom_path =3D self.fetch_asset(rom_url, asset_hash=3Drom_hash) + + self.vm.set_machine('next-cube') + 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.command('human-monitor-command', + command_line=3D'screendump %s' % screenshot_path) + + @skipUnless(PIL_AVAILABLE, 'Python PIL not installed') + def test_bootrom_framebuffer_size(self): + """ + :avocado: tags=3Darch:m68k + :avocado: tags=3Dmachine:next_cube + :avocado: tags=3Ddevice:framebuffer + """ + screenshot_path =3D os.path.join(self.workdir, "dump.png") + self.check_bootrom_framebuffer(screenshot_path) + + width, height =3D Image.open(screenshot_path).size + self.assertEqual(width, 1120) + self.assertEqual(height, 832) + + @skipUnless(tesseract_available(3), 'tesseract v3 OCR tool not availab= le') + def test_bootrom_framebuffer_ocr_with_tesseract_v3(self): + """ + :avocado: tags=3Darch:m68k + :avocado: tags=3Dmachine:next_cube + :avocado: tags=3Ddevice:framebuffer + """ + screenshot_path =3D os.path.join(self.workdir, "dump.png") + self.check_bootrom_framebuffer(screenshot_path) + + console_logger =3D logging.getLogger('console') + text =3D process.run("tesseract %s stdout" % screenshot_path).stdo= ut_text + for line in text.split('\n'): + if len(line): + console_logger.debug(line) + self.assertIn('Backplane', text) + self.assertIn('Ethernet address', text) + + # 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 v4 OCR tool not availab= le') + def test_bootrom_framebuffer_ocr_with_tesseract_v4(self): + """ + :avocado: tags=3Darch:m68k + :avocado: tags=3Dmachine:next_cube + :avocado: tags=3Ddevice:framebuffer + """ + screenshot_path =3D os.path.join(self.workdir, "dump.png") + self.check_bootrom_framebuffer(screenshot_path) + + console_logger =3D logging.getLogger('console') + proc =3D process.run("tesseract --oem 1 %s stdout" % screenshot_pa= th) + text =3D proc.stdout_text + for line in text.split('\n'): + if len(line): + console_logger.debug(line) + self.assertIn('Testing the FPU, SCC', text) + self.assertIn('System test failed. Error code 51', text) + self.assertIn('Boot command', text) + self.assertIn('Next>', text) --=20 2.21.0