blob: 7786968cbe33c5f46c4041540c519a999fa9cee3 [file] [log] [blame]
# Lint as: python2, python3
# Copyright 2019 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.
"""
This class provides functions to initialize variable attentuator used for
Bluetooth range vs rate tests
"""
import logging
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import global_config
from autotest_lib.client.common_lib.cros.network import ping_runner
from autotest_lib.server.cros import dnsname_mangler
from autotest_lib.server.cros.network import attenuator_controller
def init_btattenuator(host, args_dict):
"""
Function to initialize bluetooth attenuator and zero the attenuator
Attenuator address can be passed as argument to test_that or have to
be derived from the host name (hostname-btattenuator). For devices in lab,
attenuator is assumed to be absent unless added to attenuator_hosts.py file
If attenuator is present but not accessible, an exception is raised.
@param host: cros host object representing the DUT
args_dict : arguments passed to test_that
@return: AttenuatorController object if attenutator is present else None
@raises: TestError if attenautor init fails or if attenutator cannot be
accessed
"""
try:
if not utils.is_in_container():
is_moblab = utils.is_moblab()
else:
is_moblab = global_config.global_config.get_config_value(
'SSP', 'is_moblab', type=bool, default=False)
if is_moblab:
# TODO(b:183231262) Implement for moblab
logging.debug('bt attenuator not implemented for moblab')
return None
# If attenuator address is provided in args, then it is used
# else try to derive attenuator hostname from DUT hostname
btattenuator_args = host.get_btattenuator_arguments(
args_dict) if args_dict is not None else {}
btatten_addr = btattenuator_args.get('btatten_addr')
btatten_addr = dnsname_mangler.get_btattenuator_addr(
host.hostname, btatten_addr, True)
logging.debug('Bluetooth attentuator address is %s', btatten_addr)
if not btatten_addr:
logging.debug('Bluetooth attenuator not present')
return None
# Attenuator retains previous attenuation set even if it powered down
# Do not proceed if attenutator is not accessible
if not ping_runner.PingRunner().simple_ping(btatten_addr):
logging.debug('Bluetooth attenuator not accessible')
return None
# Init also sets attenutation to zero
logging.debug('Initializing bluetooth attenuator')
return attenuator_controller.AttenuatorController(btatten_addr)
except error.TestError:
raise
except Exception as e:
logging.error('Exception %s while initializing bt attenuator', str(e))
return None