# 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.server.cros.faftsequence import FAFTSequence

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


    def setup(self):
        super(firmware_ECSharedMem, self).setup()
        # Only run in normal mode
        self.setup_dev_mode(False)


    def shared_mem_checker(self):
        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):
        self.ec.send_command("sysjump RW")
        time.sleep(self.delay.ec_boot_to_console)
        return self.shared_mem_checker()


    def run_once(self):
        if not self.check_ec_capability():
            return
        self.register_faft_sequence((
            {   # Step 1, check shared memory in normal operation and crash EC
                'state_checker': self.shared_mem_checker,
                'reboot_action': (self.ec.send_command, "crash unaligned")
            },
            {   # Step 2, Check shared memory after crash and system jump
                'state_checker': [self.shared_mem_checker, self.jump_checker],
                'reboot_action': self.sync_and_ec_reboot,
            },
            {   # Step 3, dummy step to make step 2 reboot so as to clean EC
                #         state.
            }
        ))
        self.run_faft_sequence()
