1# Copyright 2016 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from autotest_lib.server import utils
6
7AUTHOR = "mzhuo@chromium.org"
8NAME = "enterprise_CFM_Test.huddly"
9TIME = "LONG"
10TEST_CATEGORY = "Functional"
11TEST_CLASS = "enterprise"
12TEST_TYPE = "server"
13DEPENDENCIES = ""
14JOB_RETRIES = 1
15
16DOC = """
17This test verifies peripherals for Bluestreak.
18Tests and verifications can be selected in control file.
19action_list defines the list of all available tests, which are keys for dict
20action_list, value for the key defines how many times this test will be run
21in one loop.
22
23verification_list defineds the list of all available verifications,
24which are keys for dict verification_list. True means this verification specified
25by this key will be performed.
26
27Testing flow can be set in control file.
28test_flow_control defines:
291. runtestonly, if True, no cleartmp and enrollment are done before test,
30                and no cleartpm is done after test.  Before running test on CfM
31                we assume the CfM is enrolled,
32                else, cleartpm and enrollment will be done before test,
33                and cleartmp is done afterwards.
342. setupcleanup, (TODO)if True, before exit from test cleanup is done,
35                 else, no cleanup before exit.
36                 This provides way to keep setup stays in original status when test
37                 is aborted.
383. abort_on_failure: if True, test is aborted if test fails or verification fails,
39                     else, test continutes.
404. random_mode: if True, sequence of multiple test in one loop is randomized everytime.
41                else, sequence is same for all loops.
425. recovery_on_fatal_failure: if True, reboot CfM when fatal failure occurs,
43                              else, no reboot.
446. skipcfmc: All working CfM should have speaker, camera connected.
45             For Bluestreak in addition to speaker/camera, Mimo should be connected.
46             If True script checks the above statement before starting test,
47             else, no check will be done before test starts.
487. debug: If True, script prints more informations, for example, cli output, name of
49          test and verification. This is intend to give user more output for information
50          purpose. This is different from logging.debug which is turned on by "--debug"
51          when  kickstarting script,
52          else, less output.
538. report: If True, after each loop script prints out summary for test and verification.
54
55Dict error_key_words provides the list of error logs which script checks and verify.
56If script finds any of them in the log, script claims test failure. This list can be
57updated on the fly. Dict has keys, the value for each key is the list which contains
58the list of error log script looks for when scanning log files.
59
60How to run it:
611. Run cros_sdk
622. Go to ~/chromiumos/src/third_party/autotest/files/server/site_tests/enterprise_CFM_Test
633. Edit control file. Replace meeting_code working for CfM to be tested.
644. Update test_config, action_config, verification_config, test_flow_control ane etc properly.
655. Issue command line to kickstart autotest:
66test_that --autotest_dir ~/trunk/src/third_party/autotest/files/ --board=guado
67100.123.174.2 enterprise_CFM_Test.demo
68
69"""
70
71args_dict = utils.args_to_dict(args)
72
73error_key_words = {'usb': [
74                   'Setup ERROR: setup context command',
75                   'URB transfer length is wrong',
76                   'device descriptor read',
77                   'unable to enumerate USB device',
78                   'hub_port_status failed',
79                   'cannot reset port',
80                   'nonzero write bulk status received',
81                   'Device not responding to setup address',
82                   'device not accepting address',
83                   'Set SEL for device-initiated U2 failed',
84                   'Set SEL for device-initiated U1 failed',
85                   'Disable of device-initiated U1 failed',
86                   'Disable of device-initiated U2 failed',
87                   'usb_set_interface failed',
88                   'MIMO has wedged; issuing hub reset'
89                  ],
90                   'kernel': [
91                   'ERROR Transfer event TRB DMA ptr',
92                   'crashes with segfault',
93                   'segfault at',
94                   'cut here',
95                   'end trace',
96                   'Failed to resubmit video URB',
97                   'go2001_watchdog:',
98                   'go2001_ctx_error_locked:'
99                  ],
100                   'video': [
101                   'uvcvideo: Failed to query',
102                   'VIDIOC_DQBUF failed',
103                   'uvcvideo: Non-zero status'
104                   'uvcvideo: Failed to set UVC commit control',
105                   'uvcvideo: UVC non compliance',
106                   'Failed to resubmit video URB',
107                   'No streaming interface found',
108                   'Dequeued v4l2 buffer contains corrupted data'
109                  ],
110                   'audio': [
111                   'hw_params: Input/output error: rate:',
112                   'Init device retry failed',
113                   'Init Hangouts Meet speakermic: USB Audio',
114                   'usb_set_interface failed',
115                   'hw_params: Input/output error: rate:',
116                   'Init device retry failed',
117                  ],
118                   'chrome': [
119                   '#No match for getting seqNum',
120                   'Cannot get RenderProcess',
121                   'segfault at',
122                   'ERR crash_reporter',
123                   'Watchdog resetting firmware',
124                   'Failed to create scanout buffer',
125                   'Failed to enable controller',
126                   'Failed to configure: device',
127                   'Failed to export buffer to dma_buf',
128                   'Failed to take control of the display',
129                   'WARNING: texture bound to texture unit 0 is not renderable',
130                   'Failed to modeset controller'
131                  ],
132                   'atrus': [
133                   '#Internal TrueVoice parameters',
134                   'write: Connection timed out',
135                   'Error: report failed',
136                   'write: Broken pipe',
137                   'protocol error'
138                  ],
139                   'usb_stability': [
140                   '#autotest',
141                   'USB disconnect',
142                   'New USB device found',
143                  ]
144}
145
146
147# !!! Please change meeting code working for CfM.
148# !!! If meeting_code for different domain is used, meeting might be timeout.
149# vol_change_mode: if set to 1, make one call to set voluem to target volume,
150#                  else, make multiple calls to update volume until volume
151#                  equals to target volume.
152test_config = {
153               'gpio_list': ['218','219', '209'],
154               'gpiopause': 8,
155               'puts': "2bd9:0011",
156               'is_meeting': 1,
157               'meeting_code': 'otg-dkps-ovj', # this works for crosprq4.com
158               'repeat': 200,
159               'reboot_timeout': 30,
160               'loop_timeout': 60,
161               'action_timeout': 10,
162               'min_timeout': 5,
163               'debug_timeout': 9999,
164               'vol_change_step': 6,
165               'vol_change_mode': 1,
166               'reboot_after_min_meets': 5,
167               'gpio_after_min_meets': 10
168}
169
170#action_config['meeting_test'] should be 0, 1.
171#  0: no meeting test to be done
172#  1: In each loop first CfM joins meeting, after all tests are done,
173#     CfM leaves meeting.
174#the value of 'mute_unmute_camera_test', 'mute_unmute_mic_test' and
175#'speaker_volume_test" and etc is number of test for each key to be done in
176#one meeting.
177action_config = {
178                 'meeting_test': 1,
179                 'mute_unmute_camera_test': 3,
180                 'mute_unmute_mic_test': 0,
181                 'speaker_volume_test': 0,
182                 'gpio_test': 1,
183                 'reboot_test': 1,
184                 'reset_usb_test': 0,
185                 'flap_monitor_test': 0
186}
187
188
189verification_config = {
190                      'check_usb_enumeration':True,
191                      'check_usb_inf_init': True,
192                      'check_v4l2_interface': True,
193                      'check_audio_card':  False,
194                      'check_cras_speaker': False,
195                      'check_cras_mic': False,
196                      'check_cras_pspeaker': False,
197                      'check_cras_pmic': False,
198                      'check_cras_speaker_vol': False,
199                      'check_cras_mic_mute': False,
200                      'check_prefer_camera': False,
201                      'check_camera_mute': False,
202                      'check_audio_stream': False,
203                      'check_video_stream': True,
204                      'check_hotrod_speaker': False,
205                      'check_hotrod_mic': False,
206                      'check_hotrod_camera': False,
207                      'check_hotrod_pspeaker': False,
208                      'check_hotrod_pmic': False,
209                      'check_hotrod_pcamera': False,
210                      'check_hotrod_speaker_vol': False,
211                      'check_hotrod_mic_state': False,
212                      'check_hotrod_camera_state': False,
213                      'check_usb_errorlog': True,
214                      'check_kernel_errorlog': True,
215                      'check_video_errorlog': True,
216                      'check_audio_errorlog': True,
217                      'check_chrome_errorlog': True,
218                      'check_atrus_errorlog': False,
219                      'check_usb_stability': True,
220                      'check_process_crash': False,
221                      'check_kernel_panic': False
222}
223
224
225test_flow_control = {
226                     'runtestonly': True,
227                     'setupcleanup': True,
228                     'abort_on_failure': True,
229                     'random_mode': True,
230                     'recovery_on_fatal_failure': False,
231                     'skipcfmc': True,
232                     'debug': True,
233                     'report': True
234}
235
236
237servo_args = hosts.CrosHost.get_servo_arguments(args_dict)
238
239
240def run_test(machine):
241    host = hosts.create_host(machine, servo_args=None)
242    run_test_only = test_flow_control['runtestonly']
243    job.run_test('enterprise_CFM_Test', host=host,
244                  run_test_only=run_test_only,
245                  test_config=test_config, action_config=action_config,
246                  verification_config=verification_config,
247                  error_key_words=error_key_words,
248                  test_flow_control=test_flow_control,
249                  tag='huddly')
250
251
252parallel_simple(run_test, machines)
253