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