# Copyright (c) 2012 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
import time

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


class firmware_ECSharedMem(FirmwareTest):
    """
    Servo based EC shared memory test.
    """
    version = 1

    def initialize(self, host, cmdline_args):
        super(firmware_ECSharedMem, self).initialize(host, cmdline_args)
        # Don't bother if there is no Chrome EC.
        if not self.check_ec_capability():
            raise error.TestNAError("Nothing needs to be tested on this device")
        # Only run in normal mode
        self.switcher.setup_mode('normal')
        self.ec.send_command("chan 0")

    def cleanup(self):
        try:
            self.ec.send_command("chan 0xffffffff")
        except Exception as e:
            logging.error("Caught exception: %s", str(e))
        super(firmware_ECSharedMem, self).cleanup()

    def shared_mem_checker(self):
        """Return whether there is still EC shared memory available.
        """
        match = self.ec.send_command_get_output("shmem",
                                                ["Size:\s+([0-9-]+)\r"])[0]
        shmem_size = int(match[1])
        logging.info("EC shared memory size if %d bytes", shmem_size)
        if shmem_size <= 0:
            return False
        elif shmem_size <= 256:
            logging.warning("EC shared memory is less than 256 bytes")
        return True

    def jump_checker(self):
        """Check for available EC shared memory after jumping to RW image.
        """
        self.ec.send_command("sysjump RW")
        time.sleep(self.faft_config.ec_boot_to_console)
        return self.shared_mem_checker()

    def run_once(self):
        """Execute the main body of the test.
        """
        if not self.check_ec_capability():
            raise error.TestNAError("Nothing needs to be tested on this device")

        logging.info("Check shared memory in normal operation and crash EC.")
        self.check_state(self.shared_mem_checker)
        self.switcher.mode_aware_reboot(
                'custom', lambda:self.ec.send_command('crash unaligned'))

        logging.info("Check shared memory after crash and system jump.")
        self.check_state([self.shared_mem_checker, self.jump_checker])
        self.switcher.mode_aware_reboot('custom', self.sync_and_ec_reboot)
