# 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("Quick 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)
