| # 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) |