Home | History | Annotate | Download | only in chrome_testing
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 from autotest_lib.client.bin import utils
      6 from autotest_lib.client.common_lib import error
      7 
      8 """
      9 This module contains functions that are commonly used by tests while
     10 interacting with a ChromeNetworkingTestContext.
     11 
     12 """
     13 
     14 LONG_TIMEOUT = 120
     15 SHORT_TIMEOUT = 10
     16 
     17 def get_ui_property(network, property_name, expansion_level=1):
     18     """
     19     Returns the value of the property by applying a '.'-delimited path
     20     expansion, or None if the property is not found.
     21 
     22     @param network: A JSON dictionary containing network data, as returned by
     23             chrome.networkingPrivate.
     24     @param property_name: The property to obtain.
     25     @param expansion_level: Denotes the number of levels to descend through
     26             property based on the path expansion. For example, for property
     27             "A.B.C":
     28 
     29                 level: 0
     30                 return: props["A.B.C"]
     31 
     32                 level: 1
     33                 return: props["A"]["B.C"]
     34 
     35                 level: >2
     36                 return: props["A"]["B"]["C"]
     37 
     38     @return The value of the requested property, or None if not found.
     39 
     40     """
     41     path = property_name.split('.', expansion_level)
     42     result = network
     43     for key in path:
     44         value = result.get(key, None)
     45         if value is None:
     46             return None
     47         result = value
     48     return result
     49 
     50 
     51 def check_ui_property(chrome_networking_test_context,
     52                       network_guid,
     53                       property_name,
     54                       expected_value,
     55                       expansion_level=1,
     56                       timeout=LONG_TIMEOUT):
     57     """
     58     Polls until the given network property has the expected value.
     59 
     60     @param chrome_networking_test_context: Instance of
     61             chrome_networking_test_context.ChromeNetworkingTestContext.
     62     @param network_guid: GUID of the network.
     63     @param property_name: Property to check.
     64     @param expected_value: Value the property is expected to obtain.
     65     @param expansion_level: Path expansion depth.
     66     @param timeout: Timeout interval in which the property should reach the
     67             expected value.
     68 
     69     @raises error.TestFail, if the check doesn't pass within |timeout|.
     70 
     71     """
     72     def _compare_props():
     73         network = call_test_function_check_success(
     74                 chrome_networking_test_context,
     75                 'getNetworkInfo',
     76                 ('"' + network_guid + '"',))
     77         value = get_ui_property(network, property_name, expansion_level)
     78         return value == expected_value
     79     utils.poll_for_condition(
     80             _compare_props,
     81             error.TestFail('Property "' + property_name + '" on network "' +
     82                            network_guid + '" never obtained value "' +
     83                            expected_value + '"'),
     84             timeout)
     85 
     86 
     87 def simple_network_sanity_check(
     88         network, expected_name, expected_type, check_name_prefix=True):
     89     """
     90     Simple check to ensure that the network type and name match the expected
     91     values.
     92 
     93     @param network: A JSON dictionary containing network data, as returned by
     94             chrome.networkingPrivate.
     95     @param expected_name: The expected value of the 'Name' property.
     96     @param expected_type: The expected value of the 'Type' property.
     97     @param check_name_prefix: If True, the check will not fail, as long as the
     98             value of the 'Name' property starts with |expected_name|. If False,
     99             this function will check for an exact match.
    100 
    101     @raises error.TestFail if any of the checks doesn't pass.
    102 
    103     """
    104     if network['Type'] != expected_type:
    105         raise error.TestFail(
    106                 'Expected network of type "' + expected_type + '", found ' +
    107                 network["Type"])
    108 
    109     network_name = network['Name']
    110     name_error_message = (
    111             'Network name "%s" did not match the expected: %s (Check prefix '
    112             'only=%s).' % (network_name, expected_name, check_name_prefix))
    113     if ((check_name_prefix and not network_name.startswith(expected_name)) or
    114         (not check_name_prefix and network_name != expected_name)):
    115         raise error.TestFail(name_error_message)
    116 
    117 
    118 def call_test_function_check_success(
    119         chrome_networking_test_context, function, args, timeout=SHORT_TIMEOUT):
    120     """
    121     Invokes the given function and makes sure that it succeeds. If the function
    122     succeeds then the result is returned, otherwise an error.TestFail is
    123     raised.
    124 
    125     @param chrome_networking_test_context: Instance of
    126             chrome_networking_test_context.ChromeNetworkingTestContext.
    127     @param function: String, containing the network test function to execute.
    128     @param args: Tuple of arguments to pass to |function|.
    129     @param timeout: Timeout in which the function should terminate.
    130 
    131     @raises: error.TestFail, if function returns with failure.
    132 
    133     @return: The result value of the function. If |function| doesn't have a
    134             result value, the Python equivalent of the JS "null" will be
    135             returned.
    136 
    137     """
    138     call_status = chrome_networking_test_context.call_test_function(
    139             timeout, function, *args)
    140     if call_status['status'] != chrome_networking_test_context.STATUS_SUCCESS:
    141         raise error.TestFail('Function "' + function + '" did not return with '
    142                              'status SUCCESS: ' + str(call_status))
    143     return call_status['result']
    144