# Copyright 2017 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 random
import logging
import time
from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.cfm import cfm_base_test
from autotest_lib.client.common_lib.cros.manual import audio_helper
from autotest_lib.client.common_lib.cros.manual import cfm_helper
from autotest_lib.client.common_lib.cros.manual import meet_helper
from autotest_lib.client.common_lib.cros.manual import video_helper
from autotest_lib.client.common_lib.cros.manual import get_usb_devices

ATRUS = "Hangouts Meet speakermic"
CORE_DIR_LINES = 5
FAILURE_REASON = {
                 'telemetry':
                     ['No hangouts or meet telemetry API available',
                      'telemetry api',
                      'RPC: cfm_main_screen.',
                      'Failed RPC',
                      'cfm_main_screen',
                      'Webview with screen param',
                      'autotest_lib.client.common_lib.error.TestFail'],
                 'chrome':[],
                 'kernel':[],
                 'atrus':[]
}
NUM_AUDIO_STREAM_IN_MEETING = 3
LOG_CHECK_LIST = ['check_kernel_errorlog',
                  'check_video_errorlog',
                  'check_audio_errorlog',
                  'check_chrome_errorlog',
                  'check_atrus_errorlog',
                  'check_usb_stability']
TEST_DELAY = 0

class enterprise_CFM_Test(cfm_base_test.CfmBaseTest):
    """Executes multiple tests on CFM device based on control file,
    after each test, perform mulitple verifications based on control
    file. Test flow can be controlled by control file, such as abort
    on failure, or continue on failure.
    """
    version = 1

    def gpio_test(self):
        """
        Powercycle USB port on Guado.
        """
        if self.run_meeting_test:
            if self.random:
                min_meetings = random.randrange(-1, self.gpio_min_meets)
            else:
                min_meetings = self.gpio_min_meets
            if self.meets_last_gpio <=  min_meetings:
                logging.debug('Skip gpio test.')
                return True, None
        if cfm_helper.check_is_platform(self.client, 'guado'):
            status, errmsg =  cfm_helper.gpio_usb_test(self.client,
                              self.gpio_list,
                              self.puts, self.gpio_pause,
                              'guado')
            self.gpio_no += 1
            self.meets_last_gpio = 0
        else:
            logging.info('Skip gpio_test for non-guado CfM.')
            return True, None

        ## workaround for bug b/69261543
        if self.is_in_meet:
            self.is_camera_muted = self.cfm_facade.is_camera_muted()
        return status, errmsg


    def meeting_test(self):
        """
        Join/leave meeting.
        """
        if self.is_in_meet:
            status, errmsg = meet_helper.leave_meeting(self.cfm_facade,
                             self.is_meeting)
            if status:
                self.is_camera_muted = True
                self.is_in_meet = False
                return True, None
            else:
                if self.recover_on_failure or self.meets_last_reboot == 0:
                    self.is_in_meet = False
                else:
                    self.is_in_meet = True
                return False, errmsg
        else:
            status, errmsg = meet_helper.join_meeting(self.cfm_facade,
                             self.is_meeting, self.meeting_code)
            if status:
                self.is_camera_muted = False
                self.is_in_meet = True
                self.meet_no += 1
                self.meets_last_reboot += 1
                self.meets_last_gpio += 1
                return True, None
            else:
                if self.recover_on_failure or self.meets_last_reboot == 0:
                    self.is_in_meet = True
                else:
                    self.is_in_meet = False
                return False, errmsg

    def reboot_test(self):
        """
        Reboot CfM.
        """
        if self.run_meeting_test:
            if self.random:
                min_meetings = random.randrange(-1, self.reboot_min_meets)
            else:
                min_meetings = self.reboot_min_meets
            if self.meets_last_reboot <  min_meetings:
                logging.info('Skip reboot CfM test')
                return True, None
        try:
            self.client.reboot()
            time.sleep(self.reboot_timeout)
        except Exception as e:
            errmsg = 'Reboot test fails for %s' % self.ip_addr
            logging.exception(errmsg)
            self.reboot_log = cfm_helper.check_last_reboot(self.client)
            self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
            return False, errmsg
        self.reboot_no += 1
        self.meets_last_reboot = 0
        if 'meeting_test' in self.action_config:
            self.reboot_log = cfm_helper.check_last_reboot(self.client)
            if list(set(self.verification_config) & set(LOG_CHECK_LIST)):
                self.log_checking_point = cfm_helper.find_last_log(self.client,
                                                                   self.speaker)
            return self.restart_chrome_and_meeting(True)
        self.reboot_log = cfm_helper.check_last_reboot(self.client)
        self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
        if list(set(self.verification_config) & set(LOG_CHECK_LIST)):
            self.log_checking_point = cfm_helper.find_last_log(self.client,
                                                               self.speaker)
        return True, None

    def restart_chrome_and_meeting(self, recovery):
        """
        Restart Chrome and Join/Start meeting if previous state is in meeting.
        """
        result, errmsg = meet_helper.restart_chrome(self.cfm_facade,
                                                    self.is_meeting,
                                                    recovery)
        logging.info('restart chrome result:%s, msg = %s', result,errmsg)
        if not result:
            logging.info('restart chrome result: False, msg = %s', errmsg)
            self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
            return False, errmsg
        if self.is_in_meet:
            logging.info('start meeting if needed')
            self.is_in_meet = False
            self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
            test_result, ret_msg =  self.meeting_test()
            if test_result:
                try:
                    self.is_camera_muted =  self.cfm_facade.is_camera_muted()
                    self.is_mic_muted = self.cfm_facade.is_mic_muted()
                except Exception as e:
                    errmsg = 'Fail to run telemetry api to check camera..'
                    logging.exception(errmsg)
                    return False, errmsg
        self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
        return True, None

    # TODO(mzhuo): Adding resetusb test.
    def reset_usb_test(self):
        """
        Reset USB port
        """
        return True, None

    def mute_unmute_camera_test(self):
        """
        Mute or unmute camera.
        """
        if not self.camera:
            logging.info('Skip mute/unmute camera testing.')
            return True, None
        if self.is_in_meet:
            if self.is_camera_muted:
                status, errmsg = meet_helper.mute_unmute_camera(
                                 self.cfm_facade, True)
                if status:
                    self.is_camera_muted = False
                else:
                    return False, errmsg
            else:
                status, errmsg =  meet_helper.mute_unmute_camera(
                                  self.cfm_facade, False)
                if status:
                    self.is_camera_muted = True
                else:
                    return False, errmsg
        return True, None

    def mute_unmute_mic_test(self):
        """
        Mute or unmute microphone.
        """
        if not self.speaker and not cfm_helper.check_is_platform(self.client,
                                                                 'buddy'):
            logging.info('Skip mute/unmute microphone testing.')
            return True, None
        if self.is_in_meet:
            if self.is_mic_muted:
                status, errmsg =  meet_helper.mute_unmute_mic(self.cfm_facade,
                                  True)
                if status:
                    self.is_mic_muted = False
                else:
                    return False, errmsg
            else:
                status, errmsg =  meet_helper.mute_unmute_mic(self.cfm_facade,
                                  False)
                if status:
                    self.is_mic_muted = True
                else:
                    return False, errmsg
        return True, None


    def speaker_volume_test(self):
        """
        Update speaker volume.
        """
        if not self.speaker and not cfm_helper.check_is_platform(self.client,
                                                                 'buddy'):
            logging.info('Skip update volume of speaker testing.')
            return True, None
        if self.is_in_meet:
            test_result, ret_msg =  meet_helper.speaker_volume_test(
                                   self.cfm_facade,
                                   self.vol_change_step,
                                   self.vol_change_mode, self.random)
            if test_result:
                self.speaker_volume = int(ret_msg)
                return True, None
            else:
                return False, ret_msg
        else:
            return True, None

    # TODO(mzhuo): Adding test to turn on/off monite.
    def flap_monitor_test(self):
        """
        Connect or disconnect monitor.
        """
        return True, None

    def check_usb_enumeration(self):
        """
        Verify all usb devices which were enumerated originally are enumerated.
        """
        return cfm_helper.check_usb_enumeration(self.client,
                                                self.puts)

    def check_usb_inf_init(self):
        """
        Verify all usb devices which were enumerated originally have
        valid interfaces: video interface, audio interface or touch
        interface.
        """
        return cfm_helper.check_usb_interface_initializion(self.client,
               self.puts)

    def check_v4l2_interface(self):
        """
        Verify camera has v4l2 file handler created.
        """
        if not self.camera:
            return True, None
        return video_helper.check_v4l2_interface(self.client,
               self.camera, self.name_camera)

    def check_audio_card(self):
        """
        Verify speaker/microphone has audip file handler created.
        """
        if not self.speaker:
            return True, None
        return audio_helper.check_soundcard_by_name(self.client,
               self.name_speaker)

    def check_cras_speaker(self):
        """
        Verify cras server detects speaker.
        """
        if not self.speaker:
            return True, None
        return audio_helper.check_speaker_exist_cras(self.client,
               self.name_speaker)

    def check_cras_mic(self):
        """
        Verify cras server detects microphone.
        """
        if not self.speaker:
            return True, None
        return audio_helper.check_microphone_exist_cras(self.client,
               self.name_speaker)

    def check_cras_mic_mute(self):
        """
        Verify cras shows mic muted or unmuted as expected.
        """
        if not self.speaker or not self.is_in_meet:
            return True, None
        return audio_helper.check_cras_mic_mute(self.client, self.cfm_facade)

    def check_cras_pspeaker(self):
        """
        Verify cras shows correct preferred speaker.
        """
        if not self.speaker:
            return True, None
        return  audio_helper.check_is_preferred_speaker(self.client,
                self.name_speaker)

    def check_cras_speaker_vol(self):
        """
        Verify cras shows correct volume for speaker.
        """
        if not self.speaker or not self.is_in_meet:
            return True, None
        return audio_helper.check_default_speaker_volume(self.client,
               self.cfm_facade)

    def check_cras_pmic(self):
        """
        Verify cras shows correct preferred microphone.
        """
        if not self.speaker:
            return True, None
        return  audio_helper.check_is_preferred_mic(self.client,
                self.name_speaker)

    # TODO(mzhuo): add verification for preferred camera
    def check_prefer_camera(self):
        """
        Verify preferred camera is correct.
        """
        return True, None

    #TODO(mzhuo): add verification to verify camera is muted or unmuted
    #in video stack in kernel space.
    def check_camera_mute(self):
        """
        Verify camera is muted or unmuted as expected.
        """
        return True, None

    def check_video_stream(self):
        """
        Verify camera is streaming or not streaming as expected.
        """
        if not self.camera:
            return True, None
        return video_helper.check_video_stream(self.client,
               self.is_camera_muted, self.camera, self.name_camera)

    def check_audio_stream(self):
        """
        Verify speaker is streaming or not streaming as expected.
        """
        if not self.speaker:
            return True, None
        return audio_helper.check_audio_stream(self.client,
               self.is_in_meet)

    # TODO(mzhuo): Adding verification for speaker in Hotrod App
    def check_hotrod_speaker(self):
        """
        Verify hotrod shows all speakers.
        """
        return True, None

    # TODO(mzhuo): Adding verification for mic in Hotrod App
    def check_hotrod_mic(self):
        """
        Verify hotrod shows all microphone.
        """
        return True, None

    # TODO(mzhuo): Adding verification for camera in Hotrod App
    def check_hotrod_camera(self):
        """
        Verify hotrod shows all cameras.
        """
        return True, None

     # TODO(mzhuo): Adding verification for speaker in Hotrod App
    def check_hotrod_pspeaker(self):
        """
        Verify hotrod selects correct preferred speaker.
        """
        return True, None

    # TODO(mzhuo): Adding verification for mic in Hotrod App
    def check_hotrod_pmic(self):
        """
        Verify hotrod selects correct preferred microphone.
        """
        return True, None


    # TODO(mzhuo): Adding verification for camera in Hotrod App
    def check_hotrod_pcamera(self):
        """
        Verify hotrod selects correct preferred camera.
        """
        return True, None

    #TODO(mzhuo): Adding verififaction in hotrod layer for speaker volume
    def check_hotrod_speaker_vol(self):
        """
        Verify hotrod can set volume for speaker.
        """
        return True, None

    #TODO(mzhuo): Adding verififaction in hotrod layer for mic mute status
    def check_hotrod_mic_state(self):
        """
        Verify hotrod can mute or unmute microphone.
        """
        return True, None

    #TODO(mzhuo): Adding verififaction in hotrod layer for camera status
    def check_hotrod_camera_state(self):
        """
        Verify hotrod can mute or unmute camera.
        """
        return True, None

    def check_kernel_errorlog(self):
        """
        Check /var/log/message does not contain any element in
        error_key_words['kernel'].
        """
        return cfm_helper.check_log(self.client, self.log_checking_point,
                                    self.error_key_words, 'kernel',
                                    'messages')

    def check_chrome_errorlog(self):
        """
        Check /var/log/chrome/chrome does not contain any element in
        error_key_words['chrome'].
        """
        return cfm_helper.check_log(self.client, self.log_checking_point,
                                    self.error_key_words, 'chrome',
                                    'chrome')

    def check_atrus_errorlog(self):
        """
        Check /var/log/atrus.log does not contain any element in
        error_key_words['atrus'].
        """
        if self.current_test in ['gpio_test', 'resetusb_test']:
            return True, None
        if not self.name_speaker:
            return True, None
        if self.name_speaker not in ATRUS:
            logging.info('Speaker %s', self.name_speaker)
            return True, None
        if cfm_helper.check_is_platform(self.client, 'guado'):
            return cfm_helper.check_log(self.client, self.log_checking_point,
                                        self.error_key_words, 'atrus', 'atrus')
        else:
            return True, None

    def check_video_errorlog(self):
        """
        Check /var/log/message does not contain any element in
        error_key_words['video'].
        """
        return cfm_helper.check_log(self.client, self.log_checking_point,
                                    self.error_key_words, 'video',
                                    'messages')

    def check_audio_errorlog(self):
        """
        Check /var/log/message does not contain any element in
        error_key_words['audio'].
        """
        return cfm_helper.check_log(self.client, self.log_checking_point,
                                    self.error_key_words, 'audio',
                                    'messages')

    def check_usb_errorlog(self):
        """
        Check /var/log/message does not contain any element in
        error_key_words['usb'].
        """
        return cfm_helper.check_log(self.client, self.log_checking_point,
               self.error_key_words, 'usb', 'messages')

    def check_usb_stability(self):
        """
        Check if no disruptive test done, USB device should not go offline.
        """
        if self.current_test in ['gpio_test', 'reboot_test', 'resetusb_test']:
            return True, None
        return cfm_helper.check_log(self.client, self.log_checking_point,
                                    self.error_key_words,
                                    'usb_stability', 'messages')

    def check_process_crash(self):
        """
        check no process crashing.
        """
        test_result, self.cdlines = cfm_helper.check_process_crash(self.client,
                                self.cdlines)
        return test_result, str(self.cdlines)

    #TODO(mzhuo): Adding verififaction to check whether there is kernel panic
    def check_kernel_panic(self):
        """
        Check no kernel panic reported.
        """
        return True, None


    def check_chrome_restarted(self):
        """
        Check whether chrome is killed and restarted.
        """
        if self.chrome_file == cfm_helper.check_chrome_logfile(self.client):
            return True, None
        else:
            self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
            return False, 'Chrome is restarted unexpectly.'

    def check_cfm_rebooted(self):
        """
        Check whether CfM is rebooted.
        """
        logging.info('Last reboot: %s', self.reboot_log)
        if self.reboot_log == cfm_helper.check_last_reboot(self.client):
            return True, None
        else:
            self.reboot_log = cfm_helper.check_last_reboot(self.client)
            return False, 'CfM is rebooted unexpectly.'

    def initialize_action_check_config(self, action_config, verification_config,
                                       fixedmode):
        """
        Initialize action list based on control file.
        @param action_config: dict defines the number of test should be done
                              for each test
        @param fixedmode: if True all tests are executed in fixed order;
                     if False all tests are executed in random order.
        """
        self.action_config =  []
        if action_config['meeting_test'] == 1:
            self.action_config = ['meeting_test']
        if not self.camera:
            action_config['mute_unmute_camera_test'] = 0
            verification_config['check_v4l2_interface'] = False
            verification_config['check_video_stream'] = False
            verification_config['check_video_errorlog'] = False
        if not self.speaker:
            if not cfm_helper.check_is_platform(self.client, 'buddy'):
                action_config['mute_unmute_mic_test'] = 0
                action_config['speaker_volume_test']  = 0
            verification_config['check_audio_card'] = False
            verification_config['check_cras_speaker'] = False
            verification_config['check_cras_mic'] = False
            verification_config['check_cras_pspeaker'] = False
            verification_config['check_cras_pmic'] = False
            verification_config['check_audio_stream'] = False
            verification_config['check_audio_errorlog'] = False
            verification_config['check_cras_speaker_vol'] = False
            verification_config['check_cras_mic_mute'] = False
        not_in_meeting_action = ['meeting_test', 'gpio_test', 'reboot_test']

        if fixedmode:
            for action, nof_times in action_config.iteritems():
                if not action in not_in_meeting_action:
                    self.action_config.extend(nof_times * [action])
        else:
            for action, nof_times in action_config.iteritems():
                if not action in not_in_meeting_action and nof_times  > 0:
                    dup_test = max(1, random.randrange(0, nof_times))
                    for _ in range(dup_test):
                        self.action_config.insert(max(1, random.randrange(-1,
                             len(self.action_config))), action)

        if action_config['meeting_test'] == 1:
            self.action_config.append('meeting_test')

        for action, nof_times in action_config.iteritems():
            if action == 'meeting_test':
                continue
            if action in not_in_meeting_action and nof_times  > 0:
                dup_test = max(1, random.randrange(0, nof_times))
                for _ in range(dup_test):
                    self.action_config.insert(max(0, random.randrange(-1,
                         len(self.action_config))), action)

        logging.info('Test list = %s', self.action_config)
        self.verification_config = [v for v in verification_config.keys()
                                    if verification_config[v]]
        logging.info('Verification list = %s', self.verification_config)


    def initialize_test(self, test_config, action_config, verification_config,
                        error_key_words, test_flow_control):
        """
        Initialize the list of tests and verifications;
        and polulate data needed for test:
            USB devices: which can be retrieved from control file or
            automatically detected by script;
            Test loop, meeting mode, meeting code, test flow contro
            variables.
        """
        self.gpio_pause = test_config['gpiopause']
        self.reboot_timeout =  test_config['reboot_timeout']
        self.vol_change_step = test_config['vol_change_step']
        self.vol_change_mode = test_config['vol_change_mode']
        self.gpio_list = test_config['gpio_list']
        self.is_meeting = test_config['is_meeting']
        self.meeting_code = test_config ['meeting_code']
        self.reboot_min_meets = test_config['reboot_after_min_meets']
        self.gpio_min_meets = test_config['gpio_after_min_meets']
        self.run_meeting_test = action_config['meeting_test']
        self.random = test_flow_control['random_mode']
        self.recover_on_failure = test_flow_control['recovery_on_fatal_failure']
        self.error_key_words = error_key_words
        if test_config['puts']:
            self.puts = test_config['puts'].split(',')
        else:
            self.puts = None

        if verification_config['check_process_crash']:
            cfm_helper.clear_core_file(self.client)

        self.action_fun = {
            'gpio_test': self.gpio_test,
            'meeting_test': self.meeting_test,
            'reboot_test': self.reboot_test,
            'reset_usb_test': self.reset_usb_test,
            'mute_unmute_camera_test': self.mute_unmute_camera_test,
            'mute_unmute_mic_test': self.mute_unmute_mic_test,
            'speaker_volume_test': self.speaker_volume_test,
            'flap_monitor_test': self.flap_monitor_test
            }
        self.veri_fun = {
            'check_usb_enumeration': self.check_usb_enumeration,
            'check_usb_inf_init': self.check_usb_inf_init,
            'check_v4l2_interface': self.check_v4l2_interface,
            'check_audio_card': self.check_audio_card,
            'check_cras_speaker': self.check_cras_speaker,
            'check_cras_mic': self.check_cras_mic,
            'check_cras_pspeaker': self.check_cras_pspeaker,
            'check_cras_pmic': self.check_cras_pmic,
            'check_cras_speaker_vol': self.check_cras_speaker_vol,
            'check_cras_mic_mute': self.check_cras_mic_mute,
            'check_prefer_camera': self.check_prefer_camera,
            'check_camera_mute': self.check_camera_mute,
            'check_audio_stream': self.check_audio_stream,
            'check_video_stream': self.check_video_stream,
            'check_hotrod_speaker': self.check_hotrod_speaker,
            'check_hotrod_mic': self.check_hotrod_mic,
            'check_hotrod_camera': self.check_hotrod_camera,
            'check_hotrod_pspeaker': self.check_hotrod_pspeaker,
            'check_hotrod_pmic': self.check_hotrod_pmic,
            'check_hotrod_pcamera': self.check_hotrod_pcamera,
            'check_hotrod_speaker_vol': self.check_hotrod_speaker_vol,
            'check_hotrod_mic_state': self.check_hotrod_mic_state,
            'check_hotrod_camera_state': self.check_hotrod_camera_state,
            'check_usb_errorlog': self.check_usb_errorlog,
            'check_kernel_errorlog': self.check_kernel_errorlog,
            'check_video_errorlog': self.check_video_errorlog,
            'check_audio_errorlog': self.check_audio_errorlog,
            'check_chrome_errorlog': self.check_chrome_errorlog,
            'check_atrus_errorlog': self.check_atrus_errorlog,
            'check_usb_stability': self.check_usb_stability,
            'check_process_crash': self.check_process_crash,
            'check_kernel_panic': self.check_kernel_panic,
            'check_cfm_rebooted':self.check_cfm_rebooted,
            'check_chrome_restarted':self.check_chrome_restarted
             }

        self.usb_data = []
        self.speaker = None
        self.speaker_volume = None
        self.camera = None
        self.name_speaker = None
        self.mimo_sis = None
        self.mimo_display = None
        self.is_in_meet = False
        self.is_camera_muted = True
        self.is_mic_muted = False
        self.meets_last_reboot = 0
        self.meets_last_gpio = 0
        self.meet_no = 0
        self.reboot_no = 0
        self.gpio_no = 0
        self.cdlines = CORE_DIR_LINES

        usb_data = cfm_helper.retrieve_usb_devices(self.client)
        if not usb_data:
            logging.info('\n\nEnterprise_CFM_Test_Failed.')
            raise error.TestFail('Fails to find any usb devices on CfM.')
        peripherals = cfm_helper.extract_peripherals_for_cfm(usb_data)
        if not peripherals:
            logging.info('\n\nEnterprise_CFM_Test_Failed.')
            raise error.TestFail('Fails to find any periphereal on CfM.')
        if not self.puts:
            self.puts = peripherals.keys()
        else:
            if [put for put in self.puts if not put in peripherals.keys()]:
                logging.info('Fails to find target device %s', put)
                logging.info('\nEnterprise_CFM_Test_Failed.')
                raise error.TestFail('Fails to find device')
        for _put in self.puts:
            if _put in get_usb_devices.CAMERA_MAP.keys():
                self.camera = _put
            if _put in get_usb_devices.SPEAKER_MAP.keys():
                self.speaker = _put
        if self.camera:
            self.name_camera = get_usb_devices.get_device_prod(self.camera)
            logging.info('Camera under test: %s %s',
                          self.camera, self.name_camera)
        if self.speaker:
            self.name_speaker = get_usb_devices.get_device_prod(self.speaker)
            logging.info('Speaker under test: %s %s',
                          self.speaker, self.name_speaker)
        if not test_flow_control['skip_cfm_check']:
            if cfm_helper.check_is_platform(self.client, 'guado'):
                if not cfm_helper.check_peripherals_for_cfm(peripherals):
                    logging.info('Sanity Check on CfM fails.')
                    logging.info('\n\nEnterprise_CFM_Test_Failed.')
                    raise error.TestFail('Sanity Check on CfM fails.')
        self.ip_addr = cfm_helper.get_mgmt_ipv4(self.client)
        logging.info('CfM %s passes confidence check, will start test.',
                      self.ip_addr)

        self.initialize_action_check_config(action_config,
                                            verification_config, True)

        if list(set(self.verification_config) & set(LOG_CHECK_LIST)):
            self.log_checking_point = cfm_helper.find_last_log(self.client,
                                      self.speaker)
        self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
        self.reboot_log = cfm_helper.check_last_reboot(self.client)


    def recovery_routine(self, failure_msg):
        """
        Telemetry api often returns API timeout, or javascript timeout due to
        various reasons. To workout the problem before the fix is ready script
        checks if errmsg from test failure or verification failure has keywords
        defined in FAILURE_REASON['telemetry']. If yes, script checks whether
        CfM is rebooted or Chrome browser is rebooted unexpectly. If no, script
        restarts chrome. If yes no chrome restart is done to preserve valid
        failure state.
        @param failure_msg: failure message returned from test failure or
                            verification failure
        @return True if recovery is successfully done,
                False, if recovery is not done, or fails.
        """
        loop_result = False
        to_be_recovered = False
        if not self.check_chrome_restarted():
            self.chrome_file = cfm_helper.check_chrome_logfile(self.client)
            return False
        if not self.check_cfm_rebooted():
            self.reboot_log = cfm_helper.check_last_reboot(self.client)
            return False
        for _err in FAILURE_REASON['telemetry']:
            if _err in failure_msg:
                to_be_recovered = True
                break
        if to_be_recovered:
            logging.info('Restart Chrome to recover......')
            result, emsg = self.restart_chrome_and_meeting(True)
            if result:
                loop_result = True
                if list(set(self.verification_config) & set(LOG_CHECK_LIST)):
                    self.log_checking_point = cfm_helper.find_last_log(
                                              self.client,
                                              self.speaker)
        return loop_result


    def process_test_result(self, loop_result, loop_no, test_no,
                            failed_tests, failed_verifications,
                            failed_tests_loop,
                            failed_verifications_loop, test_flow_control,
                            test_config, finished_tests_verifications,
                            test_done):
        """
        Proceess test result data, and print out test report.
        @params loop_result: True when all tests and verifications pass,
                             False if any test or verification fails.
        @param loop_no: sequence number of the loop.
        @param test_no: sequence number of the test.
        @param failed_tests: failed tests.
        @param failed_verifications: failed verifications.
        @param failed_tests_loop: failed tests in the loop.
        @param failed_verifications_loop: failed verifications in the loop.
        @param test_flow_control: variable of flow control defined in
                                  control file
        @param test_config: variable of test config defined in control file
        @param finished_tests_verifications: data to keep track number of
               tests and verifications performed.
        @param test_done: True if all loops are done; False otherwose.
        """
        if 'reboot_test' in finished_tests_verifications.keys():
            finished_tests_verifications['reboot_test'] = self.reboot_no
        if not loop_result and not test_done:
            logging.info('\n\nVerification_or_Test_Fail on %s for loop NO:'
                         ' %d, Test: %d', self.ip_addr, loop_no, test_no)
            if failed_tests_loop:
                logging.info('----- Failed_Tests: %s', failed_tests_loop)
            if failed_verifications_loop:
                logging.info('----- Failed_Verifications: %s',
                             failed_verifications_loop)
        if test_flow_control['report']:
            logging.info('\n\n\n----------------Summary---------------')
            logging.info('---Loop %d, Test: %d, Meet: %d, Reboot: %d, Gpio: %s',
                         loop_no, test_no, self.meet_no, self.reboot_no,
                         self.gpio_no)
            for testname, counter in failed_tests.iteritems():
                logging.info('----Test: %s, Failed times: %d, Total Run: %d',
                           testname, counter,
                           finished_tests_verifications[testname])
            for veriname, counter in failed_verifications.iteritems():
                logging.info('----Verification: %s, Failed times: %d,'
                             'Total Run: %d',
                             veriname, counter,
                             finished_tests_verifications[veriname])
            if self.random:
                time.sleep(random.randrange(0, test_config['loop_timeout']))
            else:
                 time.sleep(test_config['loop_timeout'])
        if not test_done:
            if list(set(self.verification_config) & set(LOG_CHECK_LIST)):
                self.log_checking_point = cfm_helper.find_last_log(self.client,
                                          self.speaker)

    def run_once(self, host, run_test_only, test_config, action_config,
                 verification_config,
                 error_key_words, test_flow_control):
        """Runs the test."""
        logging.info('Start_Test_Script:Enterprise_CFM_Test')
        self.client = host
        if test_flow_control['reboot_before_start']:
            try:
                self.client.reboot()
            except Exception as e:
                errmsg = ('Reboot test fails for %s.'
                          '% self.ip_addr')
                logging.exception(errmsg)
                raise error.TestFail(errmsg)
            if action_config['meeting_test'] > 0:
                result, errmsg = meet_helper.restart_chrome(self.cfm_facade,
                                 test_config['is_meeting'], True)
                if not result:
                    logging.info('Restart chrome fails, msg = %s', errmsg)
                    raise error.TestFail(errmsg)

        self.initialize_test(test_config, action_config, verification_config,
                              error_key_words, test_flow_control)
        test_no = 0
        failed_tests = {}
        failed_verifications = {}
        finished_tests_verifications = {}
        test_failure_reason = []
        verification_failure_reason = []


        for loop_no in xrange(1, test_config['repeat'] + 1):
            logging.info('=============%s:Test_Loop_No:%d=============',
                         self.ip_addr, loop_no)
            logging.info('Action list: %s', self.action_config)
            failed_tests_loop = []
            failed_verifications_loop = []
            for test in self.action_config:
                loop_result = True
                if not test in finished_tests_verifications.keys():
                    finished_tests_verifications[test] = 1
                else:
                    finished_tests_verifications[test] += 1
                self.current_test = test
                logging.info('\nStart_test:%s', test)
                test_result, test_msg = self.action_fun[test]()
                test_no += 1
                if test_result:
                    logging.info('Test_Result:%s:SUCCESS', test)
                else:
                    logging.info('Test_Result:%s:FAILURE:%s', test, test_msg)
                    test_failure_reason.append(test_msg)
                    failed_tests_loop.append(test)
                    loop_result = False
                    if not test in failed_tests.keys():
                        failed_tests[test] = 1
                    else:
                        failed_tests[test] += 1
                    logging.info('\n%s:Test_failure:%s:%s', self.ip_addr,
                                 test, test_msg)
                    if self.recover_on_failure or self.meets_last_reboot < 1:
                        loop_result = self.recovery_routine(test_msg)
                if self.random:
                    time.sleep(random.randrange(test_config['min_timeout'],
                                                test_config['action_timeout']))
                else:
                    time.sleep(test_config['min_timeout'])

                for verification in self.verification_config:
                    if not verification in finished_tests_verifications.keys():
                        finished_tests_verifications[verification] = 1
                    else:
                        finished_tests_verifications[verification] += 1

                    logging.info('\nStart_verification:%s', verification)
                    veri_result, veri_msg = self.veri_fun[verification]()
                    if veri_result:
                        logging.info('Verification_Result:%s:SUCCESS',
                                     verification)
                    else:
                        logging.info('Verification_Result:%s:FAILURE:%s',
                                     verification, veri_msg)
                        verification_failure_reason.append(veri_msg)
                        failed_verifications_loop.append(verification)
                        if not verification in failed_verifications.keys():
                            failed_verifications[verification] = 1
                        else:
                            failed_verifications[verification] += 1
                        logging.info('%s:Verification_fail:%s:%s',
                                     self.ip_addr, verification, veri_msg)
                        loop_result = False
                        if self.recover_on_failure:
                            loop_result = self.recovery_routine(veri_msg)

                self.process_test_result(loop_result, loop_no, test_no,
                                         failed_tests,
                                         failed_verifications,
                                         failed_tests_loop,
                                         failed_verifications_loop,
                                         test_flow_control,
                                         test_config,
                                         finished_tests_verifications, False)
                if not loop_result:
                    if test_flow_control['abort_on_failure']:
                        logging.info('Enterprise_CFM_Test_Failed.')
                        time.sleep(test_config['debug_timeout'])
                        logging.info('Enterprise_CFM_Test_Finished.')
                        raise error.TestFail(
                            'Test_or_Verification_fails after {}.'.format(test))
                    else:
                        logging.info('Enterprise_CFM_Test_Failure_Detected.')

            if self.random:
                self.initialize_action_check_config(action_config,
                                                    verification_config, False)

        logging.info('Enterprise_CFM_Test_Finished.')
        self.process_test_result(loop_result, loop_no, test_no,
                                 failed_tests,
                                 failed_verifications,
                                 failed_tests_loop,
                                 failed_verifications_loop,
                                 test_flow_control,
                                 test_config,
                                 finished_tests_verifications, True)
        if test_failure_reason:
            logging.debug('Test failure reason %s', test_failure_reason)
        if verification_failure_reason:
            logging.debug('Verification failure reason %s',
                         verification_failure_reason)
