# Copyright (c) 2014 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 test from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib import utils class network_TwoShills(test.test): """Test that only one shill runs at a time""" SHILL_EXIT_TIMEOUT_SECONDS = 10 version = 1 @staticmethod def is_shill_running(): """ Check if shill is running. @return True or False. """ return utils.get_service_pid("shill") != 0 @staticmethod def get_default_netdev(): """ Get the name of the network device with the default route. @return A string such as "eth0" or "wlan0". """ cmd_result = utils.run( "ip route show default match 0/0 | awk '{print $5}'") return cmd_result.stdout def run_once(self): """Test main loop.""" if not self.is_shill_running(): raise error.TestFail("shill not running at start") default_netdev = self.get_default_netdev() if len(default_netdev) < 1: raise error.TestFail("unable to determine default network device") try: # Run shill, expecting it to abort quickly. If the new # process does not exit within the allotted time, # utils.run() will kill the new process # explicitly. (First with SIGTERM, then SIGKILL.) cmd_result = utils.run( "shill --foreground --device-black-list=%s" % default_netdev, timeout=self.SHILL_EXIT_TIMEOUT_SECONDS, ignore_status = True) except error.CmdTimeoutError: raise error.TestFail("shill did not exit within %d seconds" % self.SHILL_EXIT_TIMEOUT_SECONDS)