• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2017 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
5import logging
6import time
7import random
8
9from autotest_lib.client.common_lib import error
10from autotest_lib.server.cros.cfm import cfm_base_test
11from autotest_lib.client.common_lib.cros import power_cycle_usb_util
12from autotest_lib.client.common_lib.cros.cfm.usb import cfm_usb_devices
13from autotest_lib.client.common_lib.cros.cfm.usb import usb_device_collector
14
15
16LONG_TIMEOUT = 20
17SHORT_TIMEOUT = 5
18
19class enterprise_CFM_MimoSanity(cfm_base_test.CfmBaseTest):
20    """Tests the following fuctionality works on CFM enrolled devices:
21           1. Verify CfM has Camera, Speaker and Mimo connected.
22           2. Verify all peripherals have expected usb interfaces.
23           3. Verify after rebooting CfM Mimo is present.
24           4. Verify after powercycle Mimo Mimo comes back.
25    """
26    version = 1
27
28
29    def _power_cycle_mimo_device(self):
30        """Power Cycle Mimo device"""
31        logging.info('Plan to power cycle Mimo')
32        try:
33            power_cycle_usb_util.power_cycle_usb_vidpid(
34                self._host, self._board,
35                self._mimo.vendor_id, self._mimo.product_id)
36        except KeyError:
37           raise error.TestFail('Could not find target device: %s',
38                                self._mimo.product)
39
40
41    def _test_power_cycle_mimo(self):
42        """Power Cycle Mimo device for multiple times"""
43        self._power_cycle_mimo_device()
44        logging.info('Powercycle done for %s (%s)',
45                     self._mimo.product, self._mimo.vid_pid)
46        time.sleep(LONG_TIMEOUT)
47        self._kernel_usb_sanity_test()
48
49
50    def _check_peripherals(self):
51        """
52        Check CfM has camera, speaker and MiMO connected.
53        @returns list of peripherals found.
54        """
55        atruses = self.device_collector.get_devices_by_spec(
56                cfm_usb_devices.ATRUS)
57        if not atruses:
58            raise error.TestFail('Expected to find connected speakers.')
59        self._atrus = atruses[0]
60
61        huddlys = self.device_collector.get_devices_by_spec(
62                cfm_usb_devices.HUDDLY_GO)
63        if not huddlys:
64            raise error.TestFail('Expected to find a connected camera.')
65        self._huddly = huddlys[0]
66
67
68        displays = self.device_collector.get_devices_by_spec(
69                *cfm_usb_devices.ALL_MIMO_DISPLAYS)
70        if not displays:
71            raise error.TestFail('Expected a MiMO display to be connected.')
72        if len(displays) != 1:
73            raise error.TestFail('Expected exactly one MiMO display to be '
74                                 'connected. Found %d' % len(displays))
75        self._mimo = displays[0]
76
77
78        controllers = self.device_collector.get_devices_by_spec(
79            cfm_usb_devices.MIMO_VUE_HID_TOUCH_CONTROLLER)
80        if not controllers:
81            raise error.TestFail('Expected a MiMO controller to be connected.')
82        if len(controllers) != 1:
83            raise error.TestFail('Expected exactly one MiMO controller to be '
84                                 'connected. Found %d' % len(controllers))
85        self._touch_controller = controllers[0]
86
87    def _check_device_interfaces_match_spec(self, spec):
88        for device in self.device_collector.get_devices_by_spec(spec):
89            if not device.interfaces_match_spec(spec):
90                raise error.TestFail(
91                    'Device %s has unexpected interfaces.'
92                    'Expected: %s. Actual: %s' % (device, spec.interfaces,
93                                                  spec.interfaces))
94
95    def _kernel_usb_sanity_test(self):
96        """
97        Check connected camera, speaker and Mimo have expected usb interfaces.
98        """
99        self._check_device_interfaces_match_spec(self._atrus)
100        self._check_device_interfaces_match_spec(self._huddly)
101        self._check_device_interfaces_match_spec(self._mimo)
102        self._check_device_interfaces_match_spec(self._touch_controller)
103
104    def _test_reboot(self):
105        """Reboot testing for Mimo."""
106
107        boot_id = self._host.get_boot_id()
108        self._host.reboot()
109        self._host.wait_for_restart(old_boot_id=boot_id)
110        self.cfm_facade.restart_chrome_for_cfm()
111        time.sleep(SHORT_TIMEOUT)
112        if self._is_meeting:
113            self.cfm_facade.wait_for_meetings_telemetry_commands()
114        else:
115            self.cfm_facade.wait_for_hangouts_telemetry_commands()
116        self._kernel_usb_sanity_test()
117
118
119    def _test_mimo_in_call(self) :
120        """
121        Start a hangout session and end the session after random time.
122
123        @raises error.TestFail if any of the checks fail.
124        """
125        logging.info('Joining meeting...')
126        if self._is_meeting:
127            self.cfm_facade.start_meeting_session()
128        else:
129            self.cfm_facade.start_new_hangout_session('mimo-sanity-test')
130        time.sleep(random.randrange(SHORT_TIMEOUT, LONG_TIMEOUT))
131
132        # Verify USB data in-call.
133        self._kernel_usb_sanity_test()
134
135        if self._is_meeting:
136            self.cfm_facade.end_meeting_session()
137        else:
138            self.cfm_facade.end_hangout_session()
139        logging.info('Session has ended.')
140
141        # Verify USB devices after leaving the call.
142        self._kernel_usb_sanity_test()
143        time.sleep(SHORT_TIMEOUT)
144
145
146    def run_once(self, repetitions, is_meeting):
147        """
148        Runs the test.
149
150        @param repetitions: amount of reboot cycles to perform.
151        """
152        # Remove 'board:' prefix.
153        self._board = self._host.get_board().split(':')[1]
154        self._is_meeting = is_meeting
155
156        self.device_collector = usb_device_collector.UsbDeviceCollector(
157            self._host)
158        self._check_peripherals()
159        self._kernel_usb_sanity_test()
160
161        if self._is_meeting:
162            self.cfm_facade.wait_for_meetings_telemetry_commands()
163        else:
164            self.cfm_facade.wait_for_hangouts_telemetry_commands()
165
166        for i in xrange(1, repetitions + 1):
167            logging.info('Running test cycle %d/%d', i, repetitions)
168            self._test_reboot()
169            self._test_mimo_in_call()
170            self._test_power_cycle_mimo()
171