qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

machine_mips_malta.py (4484B)


      1 # Functional tests for the MIPS Malta board
      2 #
      3 # Copyright (c) Philippe Mathieu-Daudé <f4bug@amsat.org>
      4 #
      5 # This work is licensed under the terms of the GNU GPL, version 2 or later.
      6 # See the COPYING file in the top-level directory.
      7 #
      8 # SPDX-License-Identifier: GPL-2.0-or-later
      9 
     10 import os
     11 import gzip
     12 import logging
     13 
     14 from avocado import skipUnless
     15 from avocado_qemu import QemuSystemTest
     16 from avocado_qemu import wait_for_console_pattern
     17 from avocado.utils import archive
     18 from avocado import skipIf
     19 
     20 
     21 NUMPY_AVAILABLE = True
     22 try:
     23     import numpy as np
     24 except ImportError:
     25     NUMPY_AVAILABLE = False
     26 
     27 CV2_AVAILABLE = True
     28 try:
     29     import cv2
     30 except ImportError:
     31     CV2_AVAILABLE = False
     32 
     33 
     34 @skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed')
     35 @skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed')
     36 class MaltaMachineFramebuffer(QemuSystemTest):
     37 
     38     timeout = 30
     39 
     40     KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
     41 
     42     def do_test_i6400_framebuffer_logo(self, cpu_cores_count):
     43         """
     44         Boot Linux kernel and check Tux logo is displayed on the framebuffer.
     45         """
     46         screendump_path = os.path.join(self.workdir, 'screendump.pbm')
     47 
     48         kernel_url = ('https://github.com/philmd/qemu-testing-blob/raw/'
     49                       'a5966ca4b5/mips/malta/mips64el/'
     50                       'vmlinux-4.7.0-rc1.I6400.gz')
     51         kernel_hash = '096f50c377ec5072e6a366943324622c312045f6'
     52         kernel_path_gz = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
     53         kernel_path = self.workdir + "vmlinux"
     54         archive.gzip_uncompress(kernel_path_gz, kernel_path)
     55 
     56         tuxlogo_url = ('https://github.com/torvalds/linux/raw/v2.6.12/'
     57                        'drivers/video/logo/logo_linux_vga16.ppm')
     58         tuxlogo_hash = '3991c2ddbd1ddaecda7601f8aafbcf5b02dc86af'
     59         tuxlogo_path = self.fetch_asset(tuxlogo_url, asset_hash=tuxlogo_hash)
     60 
     61         self.vm.set_console()
     62         kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
     63                                'clocksource=GIC console=tty0 console=ttyS0')
     64         self.vm.add_args('-kernel', kernel_path,
     65                          '-smp', '%u' % cpu_cores_count,
     66                          '-vga', 'std',
     67                          '-append', kernel_command_line)
     68         self.vm.launch()
     69         framebuffer_ready = 'Console: switching to colour frame buffer device'
     70         wait_for_console_pattern(self, framebuffer_ready,
     71                                  failure_message='Kernel panic - not syncing')
     72         self.vm.command('human-monitor-command', command_line='stop')
     73         self.vm.command('human-monitor-command',
     74                         command_line='screendump %s' % screendump_path)
     75         logger = logging.getLogger('framebuffer')
     76 
     77         match_threshold = 0.95
     78         screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR)
     79         tuxlogo_bgr = cv2.imread(tuxlogo_path, cv2.IMREAD_COLOR)
     80         result = cv2.matchTemplate(screendump_bgr, tuxlogo_bgr,
     81                                    cv2.TM_CCOEFF_NORMED)
     82         loc = np.where(result >= match_threshold)
     83         tuxlogo_count = 0
     84         h, w = tuxlogo_bgr.shape[:2]
     85         debug_png = os.getenv('AVOCADO_CV2_SCREENDUMP_PNG_PATH')
     86         for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1):
     87             logger.debug('found Tux at position (x, y) = %s', pt)
     88             cv2.rectangle(screendump_bgr, pt,
     89                           (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
     90         if debug_png:
     91             cv2.imwrite(debug_png, screendump_bgr)
     92         self.assertGreaterEqual(tuxlogo_count, cpu_cores_count)
     93 
     94     def test_mips_malta_i6400_framebuffer_logo_1core(self):
     95         """
     96         :avocado: tags=arch:mips64el
     97         :avocado: tags=machine:malta
     98         :avocado: tags=cpu:I6400
     99         """
    100         self.do_test_i6400_framebuffer_logo(1)
    101 
    102     @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
    103     def test_mips_malta_i6400_framebuffer_logo_7cores(self):
    104         """
    105         :avocado: tags=arch:mips64el
    106         :avocado: tags=machine:malta
    107         :avocado: tags=cpu:I6400
    108         :avocado: tags=mips:smp
    109         """
    110         self.do_test_i6400_framebuffer_logo(7)
    111 
    112     @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
    113     def test_mips_malta_i6400_framebuffer_logo_8cores(self):
    114         """
    115         :avocado: tags=arch:mips64el
    116         :avocado: tags=machine:malta
    117         :avocado: tags=cpu:I6400
    118         :avocado: tags=mips:smp
    119         """
    120         self.do_test_i6400_framebuffer_logo(8)