# 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. import dbus import logging import time from autotest_lib.client.common_lib import error from autotest_lib.client.cros import dhcp_test_base class network_DhcpFailureWithStaticIP(dhcp_test_base.DhcpTestBase): """The DHCP Negotiation Timeout class. Sets up a virtual ethernet pair, and stops the DHCP server on the pair. Static IP parameters are configured on the interface using shill's StaticIP configuration. Ensure that these parameters are immediately applied to the ipconfig. After the DHCP timeout interval, check to make sure that the same IP config remains applied. """ SHILL_DHCP_TIMEOUT_SECONDS = 30 def check_static_ip_config(self, ipconfig, static_ip_address, name_servers): """Checks that the static IP configuration is applied to the interface ipconfig. @param ipconfig object representing the DBus IPConfig entity to check. @param static_ip_address string IP address we expect to be configured. @param name_servers list of string name servers we expect to be configured on the interface. """ ipconfig_properties = self.shill_proxy.dbus2primitive( ipconfig.GetProperties(utf8_strings=True)) logging.info('IPConfig properties are %r', ipconfig_properties) if static_ip_address != ipconfig_properties['Address']: raise error.TestFail('Expected address %r but got %r' % (static_ip_address, ipconfig_properties['Address'])) if name_servers != ipconfig_properties['NameServers']: raise error.TestFail('Expected name servers %r but got %r' % (name_servers, ipconfig_properties['NameServers'])) def get_ipconfig(self): """Returns the first IPConfig object associated with the peer device.""" ipconfig_objects = ( self.get_interface_ipconfig_objects( self.ethernet_pair.peer_interface_name)) if len(ipconfig_objects) == 0: raise error.TestFail('Failed to retrieve DHCP ipconfig object ' 'from shill.') return ipconfig_objects[0] def test_body(self): """Test main loop.""" self.server.stop() service = self.find_ethernet_service( self.ethernet_pair.peer_interface_name) static_ip_address = '192.168.1.101' name_servers = [ '10.10.10.10', '10.10.11.11' ] config = {'Address' : static_ip_address, 'Prefixlen' : 23, 'NameServers' : name_servers} service.SetProperty(self.shill_proxy.SERVICE_PROPERTY_STATIC_IP_CONFIG, dbus.Dictionary(config, signature='sv')) ipconfig = self.get_ipconfig() self.check_static_ip_config(ipconfig, static_ip_address, name_servers) # Make sure configuration is still correct after DHCP timeout. time.sleep(self.SHILL_DHCP_TIMEOUT_SECONDS + 2) ipconfig = self.get_ipconfig() self.check_static_ip_config(ipconfig, static_ip_address, name_servers)