On 2/15/20 8:22 PM, Philippe Mathieu-Daudé wrote: > Add a test that verifies that each core properly displays the > Raspberry Pi logo on the framebuffer device. > > We simply follow the OpenCV "Template Matching with Multiple Objects" > tutorial, replacing Lionel Messi by a raspberrry: > https://docs.opencv.org/4.2.0/d4/dc6/tutorial_py_template_matching.html > > When OpenCV and NumPy are installed, this test can be run using: > > $ avocado --show=app,framebuffer run -t device:bcm2835-fb tests/acceptance/ > JOB ID : 9bbbc54c0a6fa180348d0b5305507f76852b4da2 > JOB LOG : avocado/job-results/job-2020-01-31T23.48-9bbbc54/job.log > (1/1) > tests/acceptance/boot_linux_console.py:BootLinuxConsole.test_arm_raspi2_framebuffer_logo: > framebuffer: found raspberry at position (x, y) = (0, 0) > framebuffer: found raspberry at position (x, y) = (71, 0) > framebuffer: found raspberry at position (x, y) = (142, 0) > framebuffer: found raspberry at position (x, y) = (213, 0) > PASS (11.06 s) > RESULTS : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0 | > CANCEL 0 > JOB TIME : 11.39 s > > Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org>
Reviewed-by: Luc Michel <luc.mic...@greensocs.com> > --- > The resulting match can be visualised at https://pasteboard.co/ISzNHtx.png > --- > tests/acceptance/boot_linux_console.py | 62 ++++++++++++++++++++++++++ > 1 file changed, 62 insertions(+) > > diff --git a/tests/acceptance/boot_linux_console.py > b/tests/acceptance/boot_linux_console.py > index 989db7d461..7c960051a6 100644 > --- a/tests/acceptance/boot_linux_console.py > +++ b/tests/acceptance/boot_linux_console.py > @@ -12,6 +12,7 @@ > import lzma > import gzip > import shutil > +import logging > > from avocado import skipUnless > from avocado_qemu import Test > @@ -22,6 +23,19 @@ > from avocado.utils import archive > > > +NUMPY_AVAILABLE = True > +try: > + import numpy as np > +except ImportError: > + NUMPY_AVAILABLE = False > + > +CV2_AVAILABLE = True > +try: > + import cv2 > +except ImportError: > + CV2_AVAILABLE = False > + > + > class BootLinuxConsole(Test): > """ > Boots a Linux kernel and checks that the console is operational and the > @@ -451,6 +465,54 @@ def test_arm_raspi2_uart1(self): > """ > self.do_test_arm_raspi(2, 'bcm2835_aux') > > + @skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed') > + @skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed') > + def test_arm_raspi2_framebuffer_logo(self): > + """ > + :avocado: tags=arch:arm > + :avocado: tags=machine:raspi2 > + :avocado: tags=device:bcm2835-fb > + """ > + screendump_path = os.path.join(self.workdir, 'screendump.pbm') > + rpilogo_url = ('https://github.com/raspberrypi/linux/raw/' > + 'raspberrypi-kernel_1.20190517-1/' > + 'drivers/video/logo/logo_linux_clut224.ppm') > + rpilogo_hash = 'fff3cc20c6030acce0953147f9baac43f44ed6b0' > + rpilogo_path = self.fetch_asset(rpilogo_url, asset_hash=rpilogo_hash) > + deb_url = ('http://archive.raspberrypi.org/debian/' > + 'pool/main/r/raspberrypi-firmware/' > + 'raspberrypi-kernel_1.20190215-1_armhf.deb') > + deb_hash = 'cd284220b32128c5084037553db3c482426f3972' > + deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash) > + kernel_path = self.extract_from_deb(deb_path, '/boot/kernel7.img') > + dtb_path = self.extract_from_deb(deb_path, > '/boot/bcm2709-rpi-2-b.dtb') > + > + self.vm.set_console() > + kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + > + 'earlycon=pl011,0x3f201000 console=ttyAMA0') > + self.vm.add_args('-kernel', kernel_path, > + '-dtb', dtb_path, > + '-append', kernel_command_line) > + self.vm.launch() > + framebuffer_ready = 'Console: switching to colour frame buffer > device' > + wait_for_console_pattern(self, framebuffer_ready) > + self.vm.command('human-monitor-command', command_line='stop') > + self.vm.command('human-monitor-command', > + command_line='screendump %s' % screendump_path) > + logger = logging.getLogger('framebuffer') > + > + cpu_cores_count = 4 > + match_threshold = 0.95 > + screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR) > + rpilogo_bgr = cv2.imread(rpilogo_path, cv2.IMREAD_COLOR) > + result = cv2.matchTemplate(screendump_bgr, rpilogo_bgr, > + cv2.TM_CCOEFF_NORMED) > + loc = np.where(result >= match_threshold) > + rpilogo_count = 0 > + for rpilogo_count, pt in enumerate(zip(*loc[::-1]), start=1): > + logger.debug('found raspberry at position (x, y) = %s', pt) > + self.assertGreaterEqual(rpilogo_count, cpu_cores_count) > + > def test_arm_exynos4210_initrd(self): > """ > :avocado: tags=arch:arm >