# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging

from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest

BIOS_PATH = '/tmp/test.firmware_Bmpblk.bios.bin'
PRINT_CBFS_CMD = 'cbfstool %s print' % BIOS_PATH
LAYOUT_CBFS_CMD = 'cbfstool %s layout' % BIOS_PATH


class firmware_Bmpblk(FirmwareTest):
    """
    This test checks whether the BIOS was built with a correctly configured
    bmpblk to ensure crisp firmware screen images and text. The bmpblk for every
    device needs to be explicitly configured for the device's screen resolution
    to ensure optimal quality. Relies on flashrom and cbfstool to inspect BIOS.
    """
    version = 1

    def run_once(self):
        """Runs a single iteration of the test."""
        self.faft_client.bios.dump_whole(BIOS_PATH)
        layout = self.faft_client.system.run_shell_command_get_output(
                            LAYOUT_CBFS_CMD)
        layout = '\n'.join(layout)
        logging.debug('cbfstool layout output:\n\n%s', layout)
        print_cbfs_cmd_options=''
        if 'BOOT_STUB' in layout:
          print_cbfs_cmd_options=' -r BOOT_STUB'
        try:
            files = self.faft_client.system.run_shell_command_get_output(
                    PRINT_CBFS_CMD + print_cbfs_cmd_options)
            files = '\n'.join(files)
            logging.debug('cbfstool print output:\n\n%s', files)
            if 'romstage' not in files:
                raise error.TestError("Sanity check failed: Can't read CBFS")
            if 'vbgfx.bin' not in files:
                raise error.TestNAError('This board has no firmware screens')
            if 'vbgfx_not_scaled' in files:
                logging.error("This firmware's bmpblk was built for a generic "
                              "1366x768 display resolution. Images will get "
                              "scaled up at runtime and look blurry. You need "
                              "to explicitly set the panel resolution for this "
                              "board in bmpblk/images/boards.yaml and add it "
                              "to CROS_BOARDS in the sys-boot/chromeos-bmpblk"
                              ".ebuild. Do *not* do this until you are certain "
                              "of the panel resolution that the final product "
                              "will ship with!")
                raise error.TestFail('bmpblk images not scaled for this board')
        finally:
            self.faft_client.system.remove_file(BIOS_PATH)
