# Copyright (c) 2013 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.client.bin import utils
from autotest_lib.client.common_lib import error
"""
This module contains functions that are commonly used by tests while
interacting with a ChromeNetworkingTestContext.
"""
LONG_TIMEOUT = 120
SHORT_TIMEOUT = 10
def get_ui_property(network, property_name, expansion_level=1):
"""
Returns the value of the property by applying a '.'-delimited path
expansion, or None if the property is not found.
@param network: A JSON dictionary containing network data, as returned by
chrome.networkingPrivate.
@param property_name: The property to obtain.
@param expansion_level: Denotes the number of levels to descend through
property based on the path expansion. For example, for property
"A.B.C":
level: 0
return: props["A.B.C"]
level: 1
return: props["A"]["B.C"]
level: >2
return: props["A"]["B"]["C"]
@return The value of the requested property, or None if not found.
"""
path = property_name.split('.', expansion_level)
result = network
for key in path:
value = result.get(key, None)
if value is None:
return None
result = value
return result
def check_ui_property(chrome_networking_test_context,
network_guid,
property_name,
expected_value,
expansion_level=1,
timeout=LONG_TIMEOUT):
"""
Polls until the given network property has the expected value.
@param chrome_networking_test_context: Instance of
chrome_networking_test_context.ChromeNetworkingTestContext.
@param network_guid: GUID of the network.
@param property_name: Property to check.
@param expected_value: Value the property is expected to obtain.
@param expansion_level: Path expansion depth.
@param timeout: Timeout interval in which the property should reach the
expected value.
@raises error.TestFail, if the check doesn't pass within |timeout|.
"""
def _compare_props():
network = call_test_function_check_success(
chrome_networking_test_context,
'getNetworkInfo',
('"' + network_guid + '"',))
value = get_ui_property(network, property_name, expansion_level)
return value == expected_value
utils.poll_for_condition(
_compare_props,
error.TestFail('Property "' + property_name + '" on network "' +
network_guid + '" never obtained value "' +
expected_value + '"'),
timeout)
def simple_network_sanity_check(
network, expected_name, expected_type, check_name_prefix=True):
"""
Simple check to ensure that the network type and name match the expected
values.
@param network: A JSON dictionary containing network data, as returned by
chrome.networkingPrivate.
@param expected_name: The expected value of the 'Name' property.
@param expected_type: The expected value of the 'Type' property.
@param check_name_prefix: If True, the check will not fail, as long as the
value of the 'Name' property starts with |expected_name|. If False,
this function will check for an exact match.
@raises error.TestFail if any of the checks doesn't pass.
"""
if network['Type'] != expected_type:
raise error.TestFail(
'Expected network of type "' + expected_type + '", found ' +
network["Type"])
network_name = network['Name']
name_error_message = (
'Network name "%s" did not match the expected: %s (Check prefix '
'only=%s).' % (network_name, expected_name, check_name_prefix))
if ((check_name_prefix and not network_name.startswith(expected_name)) or
(not check_name_prefix and network_name != expected_name)):
raise error.TestFail(name_error_message)
def call_test_function_check_success(
chrome_networking_test_context, function, args, timeout=SHORT_TIMEOUT):
"""
Invokes the given function and makes sure that it succeeds. If the function
succeeds then the result is returned, otherwise an error.TestFail is
raised.
@param chrome_networking_test_context: Instance of
chrome_networking_test_context.ChromeNetworkingTestContext.
@param function: String, containing the network test function to execute.
@param args: Tuple of arguments to pass to |function|.
@param timeout: Timeout in which the function should terminate.
@raises: error.TestFail, if function returns with failure.
@return: The result value of the function. If |function| doesn't have a
result value, the Python equivalent of the JS "null" will be
returned.
"""
call_status = chrome_networking_test_context.call_test_function(
timeout, function, *args)
if call_status['status'] != chrome_networking_test_context.STATUS_SUCCESS:
raise error.TestFail('Function "' + function + '" did not return with '
'status SUCCESS: ' + str(call_status))
return call_status['result']