# 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.server.cros.faft.firmware_test import FirmwareTest


class firmware_WriteProtect(FirmwareTest):
    """
    This test checks whether the hardware write-protect state reported by
    crossystem matches the real write-protect state driven by Servo.
    """
    version = 1

    def initialize(self, host, cmdline_args, dev_mode=False):
        super(firmware_WriteProtect, self).initialize(host, cmdline_args)
        self.switcher.setup_mode('dev' if dev_mode else 'normal')
        self._original_wp = self.servo.get('fw_wp') == 'on'

    def cleanup(self):
        try:
            if hasattr(self, '_original_wp'):
              self.set_hardware_write_protect(self._original_wp)
        except Exception as e:
            logging.error('Caught exception: %s', str(e))
        super(firmware_WriteProtect, self).cleanup()

    def run_once(self):
        logging.info('Force write-protect on and reboot for a clean slate.')
        self.set_hardware_write_protect(True)
        self.switcher.mode_aware_reboot()
        self.check_state((self.checkers.crossystem_checker, {
                              'wpsw_boot': '1',
                              'wpsw_cur': '1',
                          }))
        logging.info('Now disable write-protect and check again.')
        self.set_hardware_write_protect(False)
        self.check_state((self.checkers.crossystem_checker, {
                              'wpsw_boot': '1',
                              'wpsw_cur': '0',
                          }))
        logging.info('Reboot so WP change takes effect for wpsw_boot.')
        self.switcher.mode_aware_reboot()
        self.check_state((self.checkers.crossystem_checker, {
                              'wpsw_boot': '0',
                              'wpsw_cur': '0',
                          }))
        logging.info('Enable write-protect again to observe final transition.')
        self.set_hardware_write_protect(True)
        self.check_state((self.checkers.crossystem_checker, {
                              'wpsw_boot': '0',
                              'wpsw_cur': '1',
                          }))
