# Copyright 2016 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.

from autotest_lib.server import utils

AUTHOR = "mzhuo@chromium.org"
NAME = "enterprise_CFM_Test.test"
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "enterprise"
TEST_TYPE = "server"
DEPENDENCIES = ""
JOB_RETRIES = 1

DOC = """
This test verifies peripherals for Bluestreak.
Tests and verifications can be selected in control file.
action_list defines the list of all available tests, which are keys for dict
action_list, value for the key defines how many times this test will be run
in one loop.

verification_list defineds the list of all available verifications,
which are keys for dict verification_list. True means this verification specified
by this key will be performed.

Testing flow can be set in control file.
test_flow_control defines:
1. runtestonly, if True, no cleartmp and enrollment are done before test,
                and no cleartpm is done after test.  Before running test on CfM
                we assume the CfM is enrolled,
                else, cleartpm and enrollment will be done before test,
                and cleartmp is done afterwards.
2. setupcleanup, (TODO)if True, before exit from test cleanup is done,
                 else, no cleanup before exit.
                 This provides way to keep setup stays in original status when test
                 is aborted.
3. abort_on_failure: if True, test is aborted if test fails or verification fails,
                     else, test continutes.
4. random_mode: if True, sequence of multiple test in one loop is randomized everytime.
                else, sequence is same for all loops.
5. recovery_on_fatal_failure: if True, reboot CfM when fatal failure occurs,
                              else, no reboot.
6. skipcfmc: All working CfM should have speaker, camera connected.
             For Bluestreak in addition to speaker/camera, Mimo should be connected.
             If True script checks the above statement before starting test,
             else, no check will be done before test starts.
7. debug: If True, script prints more informations, for example, cli output, name of
          test and verification. This is intend to give user more output for information
          purpose. This is different from logging.debug which is turned on by "--debug"
          when  kickstarting script,
          else, less output.
8. report: If True, after each loop script prints out summary for test and verification.

Dict error_key_words provides the list of error logs which script checks and verify.
If script finds any of them in the log, script claims test failure. This list can be
updated on the fly. Dict has keys, the value for each key is the list which contains
the list of error log script looks for when scanning log files.

How to run it:
1. Run cros_sdk
2. Go to ~/chromiumos/src/third_party/autotest/files/server/site_tests/enterprise_CFM_Test
3. Edit control file. Replace meeting_code working for CfM to be tested.
4. Update test_config, action_config, verification_config, test_flow_control ane etc properly.
5. Issue command line to kickstart autotest:
test_that --autotest_dir ~/trunk/src/third_party/autotest/files/ --board=guado
100.123.174.2 enterprise_CFM_Test.demo

"""

args_dict = utils.args_to_dict(args)

error_key_words = {'usb': [
                   'Setup ERROR: setup context command',
                   'URB transfer length is wrong',
                   'device descriptor read',
                   'unable to enumerate USB device',
                   'hub_port_status failed',
                   'cannot reset port',
                   'nonzero write bulk status received',
                   'Device not responding to setup address',
                   'device not accepting address',
                   'Set SEL for device-initiated U2 failed',
                   'Set SEL for device-initiated U1 failed',
                   'Disable of device-initiated U1 failed',
                   'Disable of device-initiated U2 failed',
                   'usb_set_interface failed',
                   'MIMO has wedged; issuing hub reset'
                  ],
                   'kernel': [
                   'ERROR Transfer event TRB DMA ptr',
                   'crashes with segfault',
                   'segfault at',
                   'cut here',
                   'end trace',
                   'Failed to resubmit video URB',
                   'go2001_watchdog:',
                   'go2001_ctx_error_locked:'
                  ],
                   'video': [
                   'uvcvideo: Failed to query',
                   'VIDIOC_DQBUF failed',
                   'uvcvideo: Non-zero status'
                   'uvcvideo: Failed to set UVC commit control',
                   'uvcvideo: UVC non compliance',
                   'Failed to resubmit video URB',
                   'No streaming interface found',
                   'Dequeued v4l2 buffer contains corrupted data'
                  ],
                   'audio': [
                   'hw_params: Input/output error: rate:',
                   'Init device retry failed',
                   'Init Hangouts Meet speakermic: USB Audio',
                   'usb_set_interface failed',
                   'hw_params: Input/output error: rate:',
                   'Init device retry failed',
                  ],
                   'chrome': [
                   '#No match for getting seqNum',
                   'Cannot get RenderProcess',
                   'segfault at',
                   'ERR crash_reporter',
                   'Watchdog resetting firmware',
                   'Failed to create scanout buffer',
                   'Failed to enable controller',
                   'Failed to configure: device',
                   'Failed to export buffer to dma_buf',
                   'Failed to take control of the display',
                   'WARNING: texture bound to texture unit 0 is not renderable',
                   'Failed to modeset controller'
                  ],
                   'atrus': [
                   '#Internal TrueVoice parameters',
                   'write: Connection timed out',
                   'Error: report failed',
                   'write: Broken pipe',
                   'protocol error'
                  ],
                   'usb_stability': [
                   '#autotest',
                   'USB disconnect',
                   'New USB device found',
                  ]
}


# !!! Please change meeting code working for CfM.
# !!! If meeting_code for different domain is used, meeting might be timeout.
# vol_change_mode: if set to 1, make one call to set voluem to target volume,
#                  else, make multiple calls to update volume until volume
#                  equals to target volume.
test_config = {
               'gpio_list': ['218','219', '209'],
               'gpiopause': 8,
               'puts': "",
               'is_meeting': 1,
               'meeting_code': 'otg-dkps-ovj', # this works for crosprq4.com
               'repeat': 200,
               'reboot_timeout': 30,
               'loop_timeout': 60,
               'action_timeout': 10,
               'min_timeout': 5,
               'debug_timeout': 9999,
               'vol_change_step': 6,
               'vol_change_mode': 1,
               'reboot_after_min_meets': 5,
               'gpio_after_min_meets': 10
}

#action_config['meeting_test'] should be 0, 1.
#  0: no meeting test to be done
#  1: In each loop first CfM joins meeting, after all tests are done,
#     CfM leaves meeting.
#the value of 'mute_unmute_camera_test', 'mute_unmute_mic_test' and
#'speaker_volume_test" and etc is number of test for each key to be done in
#one meeting.
action_config = {
                 'meeting_test': 1,
                 'mute_unmute_camera_test': 3,
                 'mute_unmute_mic_test': 3,
                 'speaker_volume_test': 3,
                 'gpio_test': 1,
                 'reboot_test': 1,
                 'reset_usb_test': 0,
                 'flap_monitor_test': 0
}


verification_config = {
                      'check_usb_enumeration':True,
                      'check_usb_inf_init': True,
                      'check_v4l2_interface': True,
                      'check_audio_card':  True,
                      'check_cras_speaker': True,
                      'check_cras_mic': True,
                      'check_cras_pspeaker': True,
                      'check_cras_pmic': True,
                      'check_cras_speaker_vol': True,
                      'check_cras_mic_mute': True,
                      'check_prefer_camera': False,
                      'check_camera_mute': False,
                      'check_audio_stream': True,
                      'check_video_stream': True,
                      'check_hotrod_speaker': False,
                      'check_hotrod_mic': False,
                      'check_hotrod_camera': False,
                      'check_hotrod_pspeaker': False,
                      'check_hotrod_pmic': False,
                      'check_hotrod_pcamera': False,
                      'check_hotrod_speaker_vol': False,
                      'check_hotrod_mic_state': False,
                      'check_hotrod_camera_state': False,
                      'check_usb_errorlog': True,
                      'check_kernel_errorlog': True,
                      'check_video_errorlog': True,
                      'check_audio_errorlog': True,
                      'check_chrome_errorlog': True,
                      'check_atrus_errorlog': True,
                      'check_usb_stability': True,
                      'check_process_crash': False,
                      'check_kernel_panic': False
}


test_flow_control = {
                     'runtestonly': True,
                     'setupcleanup': True,
                     'abort_on_failure': True,
                     'random_mode': True,
                     'recovery_on_fatal_failure': True,
                     'skipcfmc': True,
                     'debug': True,
                     'report': True
}


servo_args = hosts.CrosHost.get_servo_arguments(args_dict)


def run_test(machine):
    host = hosts.create_host(machine, servo_args=None)
    run_test_only = test_flow_control['runtestonly']
    job.run_test('enterprise_CFM_Test', host=host,
                  run_test_only=run_test_only,
                  test_config=test_config, action_config=action_config,
                  verification_config=verification_config,
                  error_key_words=error_key_words,
                  test_flow_control=test_flow_control,
                  tag='test')


parallel_simple(run_test, machines)
