普通文本  |  144行  |  5.37 KB

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