# 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']