# Copyright 2020 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.client.common_lib import error from autotest_lib.client.common_lib import utils from autotest_lib.server import autotest from autotest_lib.server import test from autotest_lib.server.hosts import factory class power_LW(test.test): """Wrapper test around a client test for power lab.""" version = 1 SERVO_V4_ETH_VENDOR = '0bda' SERVO_V4_ETH_PRODUCT = '8153' WIFI_SSID = 'powertest_ap' def _get_wlan_ip(self, host): """Connect to wifi and return wlan ip address.""" wlan_ip = host.get_wlan_ip() if wlan_ip: return wlan_ip if not host.connect_to_wifi(self.WIFI_SSID): logging.info('Script to connect to wifi is probably missing.' 'Run dummy_Pass as a workaround to install it.') autotest_client = autotest.Autotest(host) autotest_client.run_test('dummy_Pass') if not host.connect_to_wifi(self.WIFI_SSID): raise error.TestError('Can not connect to wifi.') wlan_ip = host.get_wlan_ip() if not wlan_ip: raise error.TestError('Can not find wlan ip.') return wlan_ip def _get_wlan_host(self, host, machine): """Return CrosHost object that use wifi.""" wlan_ip = self._get_wlan_ip(host) if machine['hostname'] == wlan_ip: return host hostname = wlan_ip if utils.host_is_in_power_lab(machine['hostname']): hostname = utils.get_power_lab_wlan_hostname(machine['hostname']) machine['hostname'] = hostname return factory.create_host(machine) def _stop_ethernet(self, host): """Find and unbind servo v4 usb ethernet.""" # Stop check_ethernet.hook to reconnect the usb device host.run('stop recover_duts') eth_usb = host.find_usb_devices( self.SERVO_V4_ETH_VENDOR, self.SERVO_V4_ETH_PRODUCT) if len(eth_usb) == 1 and eth_usb[0] and host.get_wlan_ip(): host.unbind_usb_device(eth_usb[0]) def run_once(self, host, test, args, machine): """Prepare DUT for power test then run the client test. The DUT will - Switch from ethernet connection to wifi. - Unbind Servo v4 USB ethernet device. - Set EC to force discharge during the client test. @param host: CrosHost object representing the DUT. @param test: testname @param args: arguments of the test in a dict. @param machine: machine dict of the host. """ wlan_host = self._get_wlan_host(host, machine) if wlan_host != host: self._stop_ethernet(host) args['force_discharge'] = True args['tag'] = args.get('tag', 'PLW') autotest_client = autotest.Autotest(wlan_host) autotest_client.run_test(test, **args) # Restore USB ethernet device. wlan_host.reboot()