[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/2] tests/acceptance: Add tests for the Pegasos2 machine
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [PATCH 2/2] tests/acceptance: Add tests for the Pegasos2 machine |
Date: |
Tue, 13 Jul 2021 11:50:08 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 |
On 7/13/21 12:05 AM, Cleber Rosa wrote:
> Wainer dos Santos Moschetta writes:
>
>> Hi,
>>
>> On 5/15/21 10:45 AM, Philippe Mathieu-Daudé wrote:
>>> Add a pair of tests for the Pegasos2 machine following the steps from:
>>> https://lists.nongnu.org/archive/html/qemu-devel/2021-01/msg01553.html
>>>
>>> $ PEGASOS2_ROM_PATH=/tmp/pegasos2.rom AVOCADO_ALLOW_UNTRUSTED_CODE=1 \
>>> avocado --show=app,console,tesseract \
>>> run -t machine:pegasos2 tests/acceptance/
>>> (1/2)
>>> tests/acceptance/machine_ppc_pegasos.py:PPCPegasos2.test_rom_serial_console:
>>> console: PegasosII Boot Strap (c) 2002-2003 bplan GmbH
>>> console: Running on CPU PVR:000C0209
>>> console: Enable L1 ICache...
>>> Done.
>>> console: Reading W83194 :
>>> FAILED.
>>> console: Setting Front Side Bus to 133MHz...
>>> FAILED.
>>> console: Configuring DDR...
>>> Done.
>>> console: Configuring PCI0...
>>> Done.
>>> console: Configuring PCI1...
>>> Done.
>>> console: Configuring ETH...
>>> Done.
>>> console: Releasing IDE reset ...
>>> Done.
>>> console: Configuring Legacy Devices
>>> console: Initializing KBD...
>>> Done.
>>> console: Testing 10000000 Bytes, Pass: 00000000 Failed: 00000000
>>> console: RAM TEST (fill linear)...
>>> Done.
>>> console: FFFFFFFF
>>> console: SmartFirmware:
>>> console: cpu0: PowerPC,G4 CPUClock 599 Mhz BUSClock 133 Mhz (Version
>>> 0x000C,0x0209)
>>> console: no/bad nvramrc - performing default startup script
>>> console: channel 1 unit 0 : atapi | QEMU DVD-ROM
>>> | 2.5+
>>> console: ATA device not present or not responding
>>> console: Welcome to SmartFirmware(tm) for bplan Pegasos2 version 1.1
>>> (20040405172512)
>>> PASS (5.23 s)
>>> (2/2)
>>> tests/acceptance/machine_ppc_pegasos.py:PPCPegasos2.test_morphos_cdrom_vga:
>>> ...
>>> console: Welcome to SmartFirmware(tm) for bplan Pegasos2 version 1.1
>>> (20040405172512)
>>> console: SmartFirmware(tm) Copyright 1996-2001 by CodeGen, Inc.
>>> console: All Rights Reserved.
>>> console: Pegasos BIOS Extensions Copyright 2001-2003 by bplan GmbH.
>>> console: All Rights Reserved.
>>> console: entering main read/eval loop...
>>> console: ok boot cd boot.img
>>> console: ISO-9660 filesystem: System-ID: "MORPHOS" Volume-ID:
>>> "MorphOSBoot"
>>> console: " flags=0x2 extent=0x20 size=0x1800
>>> console: Memory used before SYS_Init: 9MB
>>> console: PCI ATA/ATAPI Driver@2: PIO Mode 4
>>> console: PCI ATA/ATAPI Driver@2: UDMA Mode 5
>>> console: ide.device@2: QEMU QEMU DVD-ROM <CDROM>
>>> console: ide.device@2: CDRom <CD001>,<MORPHOS > found, bootable
>>> tesseract: Ambient Screen 4: Saturday, 15 May 2021, 13:36:06 &
>>> tesseract: keymap
>>> tesseract: Albanian keyboard with 101/104 keys
>>> tesseract: ‘American keyboard with Greek input extension, 105 keys
>>> tesseract: Belarusian keyboard with 105 keys
>>> tesseract: Belgian keyboard with 105 keys J
>>> tesseract: British Apple keyboard
>>> tesseract: British keyboard with 105 keys
>>> tesseract: Bulgarian keyboard with 104 keys
>>> tesseract: Canadian keyboard with 105 keys
>>> tesseract: Colemak layout for keyboards with 101/104 keys
>>> tesseract: Croatian keyboard with 101/108 keys
>>> tesseract: Czech keyboard (QWERTY) with 101/104 keys
>>> tesseract: Czech keyboard (QWERTZ) with 101/104 keys
>>> tesseract: Danish keyboard with 105 keys
>>> PASS (28.56 s)
>>> RESULTS : PASS 2 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0 |
>>> CANCEL 0
>>> JOB TIME : 34.42 s
>>>
>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>> ---
>>> tests/acceptance/machine_ppc_pegasos.py | 98 +++++++++++++++++++++++++
>>> 1 file changed, 98 insertions(+)
>>> create mode 100644 tests/acceptance/machine_ppc_pegasos.py
>>>
>>> diff --git a/tests/acceptance/machine_ppc_pegasos.py
>>> b/tests/acceptance/machine_ppc_pegasos.py
>>> new file mode 100644
>>> index 00000000000..d36e920ebde
>>> --- /dev/null
>>> +++ b/tests/acceptance/machine_ppc_pegasos.py
>>> @@ -0,0 +1,98 @@
>>> +# Functional tests for the Pegasos2 machine.
>>> +#
>>> +# Copyright (c) 2021 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.
>>> +#
>>> +# SPDX-License-Identifier: GPL-2.0-or-later
>>> +
>>> +import os
>>> +import time
>>> +
>>> +from avocado import skipUnless
>>> +from avocado_qemu import Test
>>> +from avocado_qemu import exec_command_and_wait_for_pattern
>>> +from avocado_qemu import wait_for_console_pattern
>>> +from tesseract_utils import tesseract_available, tesseract_ocr
>>> +
>>> +PIL_AVAILABLE = True
>>> +try:
>>> + from PIL import Image
>>> +except ImportError:
>>> + PIL_AVAILABLE = False
>>> +
>>> +
>>> +@skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
>>> +@skipUnless(os.getenv('PEGASOS2_ROM_PATH'), 'PEGASOS2_ROM_PATH not
>>> available')
>>> +class PPCPegasos2(Test):
>>> + timeout = 60
>>> +
>>> + def test_rom_serial_console(self):
>>> + """
>>> + :avocado: tags=arch:ppc
>>> + :avocado: tags=machine:pegasos2
>>> + :avocado: tags=device:mv64361
>>> + :avocado: tags=device:vt8231
>>> + """
>>> + rom_hash = '3248e02596480f2dba5944bd219ecfad'
>>
>> rom_hash the same on both test methods, so it can be an object attribute.
>>
>
> Good point, agreed. One more suggestion, is to convert this to a sha1
> instead, as it's the default fetch_asset() hash algorithm. The
> equivalent sha1 hash would be "08dc28afb3d10fb223376a28eebfd07c9f8df9fa".
IIRC the agreement / recommendation was to use the hash provided with
blob first, and if not present, add one using the default (which
currently is sha1). I used MD5 because this is what was already
available in [1], I haven't generated it. But ...
>>> + rom_path = self.fetch_asset('file://' +
>>> os.getenv('PEGASOS2_ROM_PATH'),
>>> + asset_hash=rom_hash, algorithm='md5')
>>
>> The tester may have the ROM file hosted elsewhere, so I wouldn't
>> prefix it with 'file://'.
>>
>
> While I also agree with your suggestion, since Avocado 85.0, the best way
> to go about assets that are not publicly available is to reference it by
> name it and have registered locally with "avocado assets register".
>
> According to [1], users would need to:
>
> 1. Download and ELF file that contains the ROM
> 2. Extract the rom with "tail -c +85581 up050404 | head -c 524288
> >pegasos2.rom"
... since Wainer suggested that, the up050404 file MD5 is public:
http://www.bplan-gmbh.de/flash_update_for_pegasos_ii_en.html
MD5 checksum:dea2d54d14726bb818e5fa3be9610fcc
So you can use that to verify 'up050404' then os.seek() to extract
the rom, no need to verify the rom anymore.
> Then, I'd suggest we ask users to run:
>
> 3. avocado assets register --hash 08dc28afb3d10fb223376a28eebfd07c9f8df9fa
> pegasos2.rom file://`pwd`/pegasos2.rom
And here we'd register 'up050404'.
> With that, we can now simply use:
>
> rom_path = self.fetch_asset('pegasos2.rom', asset_hash=self.rom_hash)
Wow, this is awesome!
>>> +
>>> + self.vm.set_console()
>>> + self.vm.add_args('-bios', rom_path)
>>> + self.vm.launch()
>>> + msg = 'PegasosII Boot Strap (c) 2002-2003 bplan GmbH'
>>> + wait_for_console_pattern(self, msg)
>>> + msg = 'Welcome to SmartFirmware(tm) for bplan Pegasos2 version 1.1'
>>> + wait_for_console_pattern(self, msg)
>>> +
>>> + def test_morphos_cdrom_vga(self):
>>> + """
>>> + :avocado: tags=arch:ppc
>>> + :avocado: tags=machine:pegasos2
>>> + :avocado: tags=device:mv64361
>>> + :avocado: tags=device:vt8231
>>> + :avocado: tags=device:ati-vga
>>> + """
>>> + rom_hash = '3248e02596480f2dba5944bd219ecfad'
>>> + rom_path = self.fetch_asset('file://' +
>>> os.getenv('PEGASOS2_ROM_PATH'),
>>> + asset_hash=rom_hash, algorithm='md5')
>>
>> Likewise.
>>
>> - Wainer
>>
>>> + iso_url = 'https://www.morphos-team.net/morphos-3.15.iso'
>>> + iso_hash = 'a19dbfbbc4728e0ba9ceb6335db69ca4'
>>> + iso_path = self.fetch_asset(iso_url,
>>> + asset_hash=iso_hash, algorithm='md5')
>>> +
>>> + self.vm.set_console()
>>> + self.vm.add_args('-bios', rom_path,
>>> + '-device', 'ati-vga,romfile=',
>>> + '-cdrom', iso_path)
>>> + self.vm.launch()
>>> + msg = 'Welcome to SmartFirmware(tm) for bplan Pegasos2 version 1.1'
>>> + wait_for_console_pattern(self, msg)
>>> + wait_for_console_pattern(self, 'entering main read/eval loop...')
>>> + msg = 'filesystem: System-ID: "MORPHOS" Volume-ID: "MorphOSBoot"'
>>> + exec_command_and_wait_for_pattern(self, 'boot cd boot.img', msg)
>>> +
>>> + msg = 'ide.device@2: CDRom <CD001>,<MORPHOS > found, bootable'
>>> + wait_for_console_pattern(self, msg)
>>> + if PIL_AVAILABLE:
>>> + delay_s = 20 if tesseract_available(4) else 8
>>> +
>>> + 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(delay_s)
>>> +
>>> + screenshot_path = os.path.join(self.workdir, "dump.ppm")
>>> + self.vm.command('human-monitor-command',
>>> + command_line='screendump %s' % screenshot_path)
>>> + width, height = Image.open(screenshot_path).size
>>> + self.assertEqual(width, 2048)
>>> + self.assertEqual(height, 1152)
>>> +
>>> + if tesseract_available(4):
>>> + lines = tesseract_ocr(screenshot_path, tesseract_version=4)
>>> + text = '\n'.join(lines)
>>> + msg = 'American keyboard with Greek input extension, 105
>>> keys'
>>> + self.assertIn(msg, text)
>
> Phil,
>
> If you don't mind, I'll send a respin of this test with Wainer's and my
> suggestions.
Sure, thank you!
>
> Cheers,
> - Cleber.
>
> [1] - https://lists.nongnu.org/archive/html/qemu-ppc/2021-01/msg00112.html
> [2] -
> http://web.archive.org/web/20071021223056/http://www.bplan-gmbh.de/up050404/up050404
>