blob: 69dc13baa17c2fd1422c115c372947bb17caca36 [file] [log] [blame]
# Copyright 2015 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 logging
import time
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server.cros.network import hostap_config
from autotest_lib.server.cros.network import wifi_cell_test_base
class network_WiFi_LinkMonitorFailure(wifi_cell_test_base.WiFiCellTestBase):
"""Test how a DUT behaves when the network link disappears.
Connects a DUT to an AP, then silently change the gateway IP on the AP
to simulate network link disappearance. Determine the time the DUT take
to detect link failure and the time for the subsequent reassociation
request.
"""
version = 1
# Passive link monitor takes 25 seconds to fail, active link monitor
# takes upto 50 seconds to fail (unicast ARP failures doesn't count since
# unicast ARP gateway support is not established).
LINK_FAILURE_MAX_SECONDS = 80
REASSOCIATE_TIMEOUT_SECONDS = 10
def run_once(self):
"""Body of the test."""
# Establish a connection with an AP.
ap_config = hostap_config.HostapConfig(channel=1)
self.context.configure(ap_config)
ssid = self.context.router.get_ssid()
client_config = xmlrpc_datatypes.AssociationParameters(ssid=ssid)
self.context.assert_connect_wifi(client_config)
self.context.assert_ping_from_dut()
with self.context.client.iw_runner.get_event_logger() as logger:
logger.start()
# Restart local server with a different address index. This will
# simulate the disappearance of the network link from the client's
# point of view.
logging.info("Restart local server with different address")
self.context.router.change_server_address_index()
# wait for the timeout seconds for link failure and reassociation
# to complete.
time.sleep(self.LINK_FAILURE_MAX_SECONDS +
self.REASSOCIATE_TIMEOUT_SECONDS)
logger.stop()
# Link failure detection time.
link_failure_time = logger.get_time_to_disconnected()
if link_failure_time is None:
# Some drivers perform a true Reassociation, without disconnect.
# See also https://crbug.com/990012.
logging.info('Failed to disconnect within timeout; '
'this is expected for some drivers')
elif link_failure_time > self.LINK_FAILURE_MAX_SECONDS:
raise error.TestFail(
'Failed to detect link failure within given timeout')
else:
logging.info('Link failure detection time: %.2f seconds',
link_failure_time)
# Reassociation time.
reassociate_time = logger.get_reassociation_time()
if (reassociate_time is None or
reassociate_time > self.REASSOCIATE_TIMEOUT_SECONDS):
raise error.TestFail(
'Failed to reassociate within given timeout')
logging.info('Reassociate time: %.2f seconds', reassociate_time)