#!/usr/bin/python
import unittest, os, socket, time, sys, struct
import common
from autotest_lib.client.bin import utils
from autotest_lib.client.bin.net import net_utils, net_utils_mock
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.client.common_lib import error


class TestNetUtils(unittest.TestCase):
    class network_interface_mock(net_utils_mock.network_interface_mock):
        def __init__(self, iface='some_name', test_init=False):
            super(TestNetUtils.network_interface_mock,
                  self).__init__(iface=iface, test_init=test_init)


    def setUp(self):
        self.god = mock.mock_god()
        self.god.stub_function(utils, "system")
        self.god.stub_function(utils, "system_output")
        self.god.stub_function(utils, "module_is_loaded")
        self.god.stub_function(net_utils, "open")
        self.god.stub_function(time, 'sleep')

        self.god.stub_with(net_utils,"bond", net_utils.bonding)
        self.god.stub_with(os, 'open', net_utils_mock.os_open)
        self.god.stub_with(net_utils, 'netif', net_utils_mock.netutils_netif)

        os.environ['AUTODIR'] = "autodir"


    def tearDown(self):
        self.god.unstub_all()
        del os.environ['AUTODIR']


    #
    # test network_util
    #
    def test_network_util_reset(self):
        utils.system.expect_call('service network restart', ignore_status=False)
        net_utils.network_utils().reset()
        self.god.check_playback()


    def test_network_util_start(self):
        utils.system.expect_call('service network start', ignore_status=False)

        net_utils.network_utils().start()
        self.god.check_playback()


    def test_network_util_stop(self):
        utils.system.expect_call('service network stop', ignore_status=False)

        net_utils.network_utils().stop()
        self.god.check_playback()


    def test_network_util_disable_ip_local_loopback(self):
        msg = "echo '1' > /proc/sys/net/ipv4/route/no_local_loopback"
        utils.system.expect_call(msg, ignore_status=False)
        msg = 'echo 1 > /proc/sys/net/ipv4/route/flush'
        utils.system.expect_call(msg, ignore_status=False)

        net_utils.network_utils().disable_ip_local_loopback()
        self.god.check_playback()


    def test_network_util_enable_ip_local_loopback(self):
        msg = "echo '0' > /proc/sys/net/ipv4/route/no_local_loopback"
        utils.system.expect_call(msg, ignore_status=False)
        msg = 'echo 1 > /proc/sys/net/ipv4/route/flush'
        utils.system.expect_call(msg, ignore_status=False)

        net_utils.network_utils().enable_ip_local_loopback()
        self.god.check_playback()


    #
    # test network_interface
    #
    def test_network_interface_init(self):
        self.god.stub_function(socket, 'socket')
        s = net_utils_mock.socket_stub('eth0', socket, socket)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW).and_return(s)
        self.god.stub_function(s, 'bind')
        self.god.stub_function(s, 'settimeout')
        s.settimeout.expect_call(net_utils.TIMEOUT)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        mock_netif = self.network_interface_mock(iface='eth0', test_init=True)
        self.god.check_playback()
        self.assertEquals(mock_netif.ethtool, 'ethtool')
        self.assertEquals(mock_netif._name, 'eth0')
        self.assertEquals(mock_netif.was_down, 'is_down')
        self.assertEquals(mock_netif.orig_ipaddr, 'get_ipaddr')
        self.assertEquals(mock_netif.was_loopback_enabled,
                          'is_loopback_enabled')
        self.assertEquals(mock_netif._socket, s)


    def test_network_interface_restore(self):
        mock_netif = self.network_interface_mock('eth0')

        mock_netif.was_loopback_enabled = False
        mock_netif.loopback_enabled = True
        mock_netif.was_down = False

        # restore using phyint
        cmd = 'ifconfig %s %s' % (mock_netif._name, mock_netif.orig_ipaddr)
        utils.system.expect_call(cmd)

        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.restore()
        self.god.check_playback()


        # restore using mac
        cmd = 'ifconfig %s %s' % (mock_netif._name, mock_netif.orig_ipaddr)
        utils.system.expect_call(cmd)

        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)

        cmd = '%s -L %s %s %s' % (mock_netif.ethtool,
                                  mock_netif._name, 'mac', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.restore()
        self.god.check_playback()

        # check that down is restored
        mock_netif.was_loopback_enabled = False
        mock_netif.loopback_enabled = True
        mock_netif.was_down = True

        cmd = 'ifconfig %s %s' % (mock_netif._name, mock_netif.orig_ipaddr)
        utils.system.expect_call(cmd)

        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)

        cmd = 'ifconfig %s down' % mock_netif._name
        utils.system.expect_call(cmd)

        mock_netif.restore()
        self.god.check_playback()

        # check that loopback, down are done in sequence
        mock_netif.was_loopback_enabled = True
        mock_netif.loopback_enabled = True
        mock_netif.was_down = True

        cmd = 'ifconfig %s %s' % (mock_netif._name,
                                  mock_netif.orig_ipaddr)

        utils.system.expect_call(cmd)
        cmd = 'ifconfig %s down' % mock_netif._name
        utils.system.expect_call(cmd)

        mock_netif.restore()
        self.god.check_playback()

        # prior loopback matches current loopback
        mock_netif.was_loopback_enabled = False
        mock_netif.loopback_enabled = False
        mock_netif.was_down = True

        cmd = 'ifconfig %s %s' % (mock_netif._name,
                                  mock_netif.orig_ipaddr)
        utils.system.expect_call(cmd)
        cmd = 'ifconfig %s down' % mock_netif._name
        utils.system.expect_call(cmd)

        mock_netif.restore()
        self.god.check_playback()


    def test_network_interface_get_name(self):
        mock_netif = self.network_interface_mock(iface='eth0')
        self.assertEquals(mock_netif.get_name(), 'eth0')


    def test_network_interface_parse_ethtool(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return('\n field: match')
        self.assertEquals(mock_netif.parse_ethtool('field', 'some|match'),
                          'match')

        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(None)
        self.assertEquals(mock_netif.parse_ethtool('field',
                                                   'some|match'), '')

        utils.system_output.expect_call(cmd).and_return(' field: match')
        self.assertEquals(mock_netif.parse_ethtool('field',
                                                   'some|match'), '')
        self.god.check_playback()


    def test_network_interface_get_stats(self):
        mock_netif = self.network_interface_mock()
        self.god.stub_function(os, 'listdir')
        stat_path = '/sys/class/net/%s/statistics/' % mock_netif._name

        # no stat found
        os.listdir.expect_call(stat_path).and_return(())
        self.assertEquals(mock_netif.get_stats(), {})
        self.god.check_playback()

        # can not open stat file
        os.listdir.expect_call(stat_path).and_return(('some_stat',))
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call(stat_path + 'some_stat', 'r').and_return(None)
        self.assertEquals(mock_netif.get_stats(), {})
        self.god.check_playback()

        # found a single stat
        os.listdir.expect_call(stat_path).and_return(('some_stat',))
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call(stat_path + 'some_stat', 'r').and_return(f)
        f.read.expect_call().and_return(1234)
        f.close.expect_call()
        self.assertEquals(mock_netif.get_stats(), {'some_stat':1234})
        self.god.check_playback()

        # found multiple stats
        os.listdir.expect_call(stat_path).and_return(('stat1','stat2'))
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call(stat_path + 'stat1', 'r').and_return(f)
        f.read.expect_call().and_return(1234)
        f.close.expect_call()
        net_utils.open.expect_call(stat_path + 'stat2', 'r').and_return(f)
        f.read.expect_call().and_return(5678)
        f.close.expect_call()

        self.assertEquals(mock_netif.get_stats(), {'stat1':1234, 'stat2':5678})
        self.god.check_playback()


    def test_network_interface_get_stats_diff(self):
        mock_netif = self.network_interface_mock()
        self.god.stub_function(os, 'listdir')
        stat_path = '/sys/class/net/%s/statistics/' % mock_netif._name

        os.listdir.expect_call(stat_path).and_return(('stat1','stat2', 'stat4'))
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call(stat_path + 'stat1', 'r').and_return(f)
        f.read.expect_call().and_return(1234)
        f.close.expect_call()
        net_utils.open.expect_call(stat_path + 'stat2', 'r').and_return(f)
        f.read.expect_call().and_return(0)
        f.close.expect_call()
        net_utils.open.expect_call(stat_path + 'stat4', 'r').and_return(f)
        f.read.expect_call().and_return(10)
        f.close.expect_call()
        self.assertEquals(mock_netif.get_stats_diff({'stat1':1, 'stat2':2,
                                                     'stat3':0}),
                          {'stat1':1233, 'stat2':-2, 'stat4':10})
        self.god.check_playback()


    def test_network_interface_get_driver(self):
        mock_netif = self.network_interface_mock()
        mock_netif.get_driver = net_utils.network_interface.get_driver
        self.god.stub_function(os, 'readlink')
        stat_path = '/sys/class/net/%s/device/driver' % mock_netif._name
        os.readlink.expect_call(stat_path).and_return((
                                                  stat_path+'/driver_name'))
        self.assertEquals(mock_netif.get_driver(mock_netif), 'driver_name')
        self.god.check_playback()


    def test_network_interface_get_carrier(self):
        mock_netif = self.network_interface_mock()
        self.god.stub_function(os, 'readlink')
        stat_path = '/sys/class/net/%s/carrier' % mock_netif._name
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call(stat_path).and_return(f)
        f.read.expect_call().and_return(' 1 ')
        f.close.expect_call()
        self.assertEquals(mock_netif.get_carrier(), '1')
        self.god.check_playback()

        net_utils.open.expect_call(stat_path).and_return(f)
        f.read.expect_call().and_return(' 0 ')
        f.close.expect_call()
        self.assertEquals(mock_netif.get_carrier(), '0')
        self.god.check_playback()

        net_utils.open.expect_call(stat_path).and_return(f)
        f.read.expect_call().and_return('')
        f.close.expect_call()
        self.assertEquals(mock_netif.get_carrier(), '')
        self.god.check_playback()

        net_utils.open.expect_call(stat_path).and_return(None)
        self.assertEquals(mock_netif.get_carrier(), '')
        self.god.check_playback()


    def test_network_interface_is_autoneg_advertised(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Advertised auto-negotiation: Yes')
        self.assertEquals(mock_netif.is_autoneg_advertised(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n Advertised auto-negotiation: No')
        self.assertEquals(mock_netif.is_autoneg_advertised(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_autoneg_advertised(), False)
        self.god.check_playback()


    def test_network_interface_get_speed(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Speed: 1000')
        self.assertEquals(mock_netif.get_speed(), 1000)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n Speed: 10000')
        self.assertEquals(mock_netif.get_speed(), 10000)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')

        try:
            mock_netif.get_speed()
        except ValueError:
            pass
        else:
            self.assertEquals(0,1)
        self.god.check_playback()


    def test_network_interface_is_full_duplex(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Duplex: Full')
        self.assertEquals(mock_netif.is_full_duplex(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n Duplex: Half')
        self.assertEquals(mock_netif.is_full_duplex(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_full_duplex(), False)
        self.god.check_playback()


    def test_network_interface_is_autoneg_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Auto-negotiation: on')
        self.assertEquals(mock_netif.is_autoneg_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n Auto-negotiation: off')
        self.assertEquals(mock_netif.is_autoneg_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_autoneg_on(), False)
        self.god.check_playback()


    def test_network_interface_get_wakeon(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Wake-on: g')
        self.assertEquals(mock_netif.get_wakeon(), 'g')
        self.god.check_playback()


    def test_network_interface_is_rx_summing_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-k', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n rx-checksumming: on')
        self.assertEquals(mock_netif.is_rx_summing_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n rx-checksumming: off')
        self.assertEquals(mock_netif.is_rx_summing_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_rx_summing_on(), False)
        self.god.check_playback()


    def test_network_interface_is_tx_summing_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-k', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n tx-checksumming: on')
        self.assertEquals(mock_netif.is_tx_summing_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n tx-checksumming: off')
        self.assertEquals(mock_netif.is_tx_summing_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_tx_summing_on(), False)
        self.god.check_playback()


    def test_network_interface_is_scatter_gather_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-k', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n scatter-gather: on')
        self.assertEquals(mock_netif.is_scatter_gather_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n scatter-gather: off')
        self.assertEquals(mock_netif.is_scatter_gather_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_scatter_gather_on(), False)
        self.god.check_playback()


    def test_network_interface_is_tso_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-k', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n tcp segmentation offload: on')
        self.assertEquals(mock_netif.is_tso_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n tcp segmentation offload: off')
        self.assertEquals(mock_netif.is_tso_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_tso_on(), False)
        self.god.check_playback()


    def test_network_interface_is_pause_autoneg_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-a', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n Autonegotiate: on')
        self.assertEquals(mock_netif.is_pause_autoneg_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n Autonegotiate: off')
        self.assertEquals(mock_netif.is_pause_autoneg_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_pause_autoneg_on(), False)
        self.god.check_playback()


    def test_network_interface_is_tx_pause_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-a', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n TX: on')
        self.assertEquals(mock_netif.is_tx_pause_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n TX: off')
        self.assertEquals(mock_netif.is_tx_pause_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_tx_pause_on(), False)
        self.god.check_playback()


    def test_network_interface_is_rx_pause_on(self):
        mock_netif = self.network_interface_mock()
        cmd = '%s %s %s' % (mock_netif.ethtool, '-a', mock_netif._name)

        utils.system_output.expect_call(cmd).and_return(
            '\n RX: on')
        self.assertEquals(mock_netif.is_rx_pause_on(), True)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return(
            '\n RX: off')
        self.assertEquals(mock_netif.is_rx_pause_on(), False)
        self.god.check_playback()

        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_rx_pause_on(), False)
        self.god.check_playback()


    def test_network_interface_enable_loopback(self):
        mock_netif = self.network_interface_mock('eth0')

        mock_netif.was_loopback_enabled = False
        mock_netif.loopback_enabled = False
        mock_netif.was_down = False

        self.god.stub_function(net_utils.bonding, 'is_enabled')

        # restore using phyint
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.enable_loopback()
        self.god.check_playback()

        # restore using mac
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'mac', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.enable_loopback()
        self.god.check_playback()

        # catch exception on phyint and mac failures
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'mac', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        try:
            mock_netif.enable_loopback()
        except error.TestError:
            pass
        else:
            self.assertEquals(0,1)
        self.god.check_playback()

        # catch exception on bond enabled
        net_utils.bonding.is_enabled.expect_call().and_return(True)
        try:
            mock_netif.enable_loopback()
        except error.TestError:
            pass
        else:
            self.assertEquals(0,1)
        self.god.check_playback()

        # check that setting tg3 and bnx2x driver have a sleep call
        mock_netif.driver = 'tg3'
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        time.sleep.expect_call(1)
        mock_netif.enable_loopback()
        self.god.check_playback()

        mock_netif.driver = 'bnx2x'
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'enable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        time.sleep.expect_call(1)
        mock_netif.enable_loopback()
        self.god.check_playback()


    def test_network_interface_disable_loopback(self):
        mock_netif = self.network_interface_mock('eth0')

        mock_netif.was_loopback_enabled = False
        mock_netif.loopback_enabled = True
        mock_netif.was_down = False

        # restore using phyint
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.disable_loopback()
        self.god.check_playback()

        # restore using mac
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'mac', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(0)
        mock_netif.disable_loopback()
        self.god.check_playback()

        # catch exception on phyint and mac failures
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'phyint', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        cmd = '%s -L %s %s %s' % (mock_netif.ethtool, mock_netif._name,
                                  'mac', 'disable')
        utils.system.expect_call(cmd, ignore_status=True).and_return(1)
        try:
            mock_netif.disable_loopback()
        except error.TestError:
            pass
        else:
            self.assertEquals(0,1)
        self.god.check_playback()


    def test_network_interface_is_loopback_enabled(self):
        mock_netif = self.network_interface_mock('eth0')
        mock_netif.is_loopback_enabled = \
            net_utils.network_interface.is_loopback_enabled
        try:
            mock_netif.is_loopback_enabled(mock_netif)
        except error.TestError:
            pass
        else:
            self.assertEquals(0,1)
        self.god.check_playback()

        self.god.stub_function(net_utils.bonding, 'is_enabled')
        mock_netif._name = 'eth0'
        net_utils.bonding.is_enabled.expect_call().and_return(False)
        cmd = '%s -l %s' % (mock_netif.ethtool, mock_netif._name)
        utils.system_output.expect_call(cmd).and_return('')
        self.assertEquals(mock_netif.is_loopback_enabled(mock_netif), False)
        self.god.check_playback()

        for ifname in ('eth0', 'eth1', 'eth2', 'eth3', 'eth4'):
            mock_netif._name = ifname
            for bond_enable in (True, False):
                for state in (('disabled', 'disabled', 'enabled'),
                              ('disabled', 'enabled', 'disabled'),
                              ('enabled', 'disabled', 'disabled'),
                              ('disabled', 'disabled', 'disabled')):
                    net_utils.bonding.is_enabled.expect_call().and_return(
                        bond_enable)
                    if bond_enable:
                        self.assertEquals(mock_netif.is_loopback_enabled(
                            mock_netif), False)
                    else:
                        cmd = '%s -l %s' % (mock_netif.ethtool, mock_netif._name)
                        out = 'MAC loopback is %s\n'\
                              'PHY internal loopback is %s\n'\
                              'PHY external loopback is %s' % (
                            state[0], state[1], state[2])
                        utils.system_output.expect_call(cmd).and_return(out)
                        self.assertEquals(mock_netif.is_loopback_enabled(
                            mock_netif), 'enabled' in state)
                    self.god.check_playback()


    def test_network_interface_enable_promisc(self):
        mock_netif = self.network_interface_mock('eth0')
        cmd = 'ifconfig %s promisc' % mock_netif._name
        utils.system.expect_call(cmd)
        mock_netif.enable_promisc()
        self.god.check_playback()


    def test_network_interface_disable_promisc(self):
        mock_netif = self.network_interface_mock()
        cmd = 'ifconfig %s -promisc' % mock_netif._name
        utils.system.expect_call(cmd)
        mock_netif.disable_promisc()
        self.god.check_playback()


    def test_network_interface_get_hwaddr(self):
        mock_netif = self.network_interface_mock()
        f = self.god.create_mock_class(file, 'file')
        net_utils.open.expect_call('/sys/class/net/%s/address'
                                       % mock_netif._name).and_return(f)
        hw_addr = '00:0e:0c:c3:7d:a8'
        f.read.expect_call().and_return(' ' + hw_addr + ' ')
        f.close.expect_call()
        self.assertEquals(mock_netif.get_hwaddr(), hw_addr)
        self.god.check_playback()


    def test_network_interface_set_hwaddr(self):
        mock_netif = self.network_interface_mock()
        hw_addr = '00:0e:0c:c3:7d:a8'
        cmd = 'ifconfig %s hw ether %s' % (mock_netif._name,
                                           hw_addr)
        utils.system.expect_call(cmd)
        mock_netif.set_hwaddr(hw_addr)
        self.god.check_playback()


    def test_network_interface_add_maddr(self):
        mock_netif = self.network_interface_mock()
        maddr = '01:00:5e:00:00:01'
        cmd = 'ip maddr add %s dev %s' % (maddr, mock_netif._name)
        utils.system.expect_call(cmd)
        mock_netif.add_maddr(maddr)
        self.god.check_playback()


    def test_network_interface_del_maddr(self):
        mock_netif = self.network_interface_mock()
        maddr = '01:00:5e:00:00:01'
        cmd = 'ip maddr del %s dev %s' % (maddr, mock_netif._name)
        utils.system.expect_call(cmd)
        mock_netif.del_maddr(maddr)
        self.god.check_playback()


    def test_network_interface_get_ipaddr(self):
        mock_netif = self.network_interface_mock()
        ip_addr = '110.211.112.213'
        out_format = \
          'eth0      Link encap:Ethernet  HWaddr 00:0E:0C:C3:7D:A8\n'\
          '          inet addr:%s  Bcast:10.246.90.255'\
          ' Mask:255.255.255.0\n'\
          '          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500'\
          ' Metric:1\n'\
          '          RX packets:463070 errors:0 dropped:0 overruns:0'\
          ' frame:0\n'\
          '          TX packets:32548 errors:0 dropped:0 overruns:0'\
          ' carrier:0\n'\
          '          collisions:0 txqueuelen:0'
        out = out_format % ip_addr

        cmd = 'ifconfig %s' % mock_netif._name
        utils.system_output.expect_call(cmd).and_return(out)
        self.assertEquals(mock_netif.get_ipaddr(), ip_addr)
        self.god.check_playback()

        cmd = 'ifconfig %s' % mock_netif._name
        utils.system_output.expect_call(cmd).and_return('some output')
        self.assertEquals(mock_netif.get_ipaddr(), '0.0.0.0')
        self.god.check_playback()

        cmd = 'ifconfig %s' % mock_netif._name
        utils.system_output.expect_call(cmd).and_return(None)
        self.assertEquals(mock_netif.get_ipaddr(), '0.0.0.0')
        self.god.check_playback()

        ip_addr = '1.2.3.4'
        out = out_format % ip_addr
        cmd = 'ifconfig %s' % mock_netif._name
        utils.system_output.expect_call(cmd).and_return(out)
        self.assertEquals(mock_netif.get_ipaddr(), ip_addr)
        self.god.check_playback()


    def test_network_interface_set_ipaddr(self):
        mock_netif = self.network_interface_mock()
        ip_addr = '1.2.3.4'
        cmd = 'ifconfig %s %s' % (mock_netif._name, ip_addr)
        utils.system.expect_call(cmd)
        mock_netif.set_ipaddr(ip_addr)
        self.god.check_playback()


    def test_network_interface_is_down(self):
        mock_netif = self.network_interface_mock()
        out_format = \
          'eth0      Link encap:Ethernet  HWaddr 00:0E:0C:C3:7D:A8\n'\
          '          inet addr:1.2.3.4  Bcast:10.246.90.255'\
          ' Mask:255.255.255.0\n'\
          '          %s BROADCAST RUNNING MASTER MULTICAST  MTU:1500'\
          ' Metric:1\n'\
          '          RX packets:463070 errors:0 dropped:0 overruns:0'\
          ' frame:0\n'\
          '          TX packets:32548 errors:0 dropped:0 overruns:0'\
          ' carrier:0\n'\
          '          collisions:0 txqueuelen:0'
        for state in ('UP', 'DOWN', 'NONE', ''):
            out = out_format % state
            cmd = 'ifconfig %s' % mock_netif._name
            utils.system_output.expect_call(cmd).and_return(out)
            self.assertEquals(mock_netif.is_down(), state != 'UP')
            self.god.check_playback()

        cmd = 'ifconfig %s' % mock_netif._name
        utils.system_output.expect_call(cmd).and_return(None)
        self.assertEquals(mock_netif.is_down(), False)
        self.god.check_playback()


    def test_network_interface_up(self):
        mock_netif = self.network_interface_mock()
        cmd = 'ifconfig %s up' % mock_netif._name
        utils.system.expect_call(cmd)
        mock_netif.up()
        self.god.check_playback()


    def test_network_interface_down(self):
        mock_netif = self.network_interface_mock()
        cmd = 'ifconfig %s down' % mock_netif._name
        utils.system.expect_call(cmd)
        mock_netif.down()
        self.god.check_playback()


    def test_network_interface_wait_for_carrier(self):
        mock_netif = self.network_interface_mock()
        mock_netif.wait_for_carrier = \
                             net_utils.network_interface.wait_for_carrier
        f = self.god.create_mock_class(file, 'file')
        spath = '/sys/class/net/%s/carrier' % mock_netif._name
        # y = 0 - test that an exception is thrown
        # y = 1, 100 - check that carrier is checked until timeout
        for y in (0, 1, 100):
            max_timeout = y
            if y:
                for x in xrange(max_timeout - 1):
                    net_utils.open.expect_call(spath).and_return(f)
                    f.read.expect_call().and_return(' ' + '0' + ' ')
                    f.close.expect_call()
                    time.sleep.expect_call(1)

                net_utils.open.expect_call(spath).and_return(f)
                f.read.expect_call().and_return(' ' + '1' + ' ')
                f.close.expect_call()
            try:
                mock_netif.wait_for_carrier(mock_netif, max_timeout)
            except:
                pass
            else:
                if not y:
                    self.assertEquals(0, 1)
            self.god.check_playback()


    def test_network_interface_send(self):
        mock_netif = self.network_interface_mock()
        mock_netif.send('test buffer')
        self.assertEquals(mock_netif._socket.send_val, 'test buffer')


    def test_network_interface_recv(self):
        mock_netif = self.network_interface_mock()
        test_str = 'test string'
        mock_netif._socket.recv_val = test_str
        rcv_str = mock_netif.recv(len(test_str))
        self.assertEquals(rcv_str, test_str)


    def test_network_interface_flush(self):
        mock_netif = self.network_interface_mock()
        self.god.stub_function(mock_netif._socket, 'close')
        mock_netif._socket.close.expect_call()
        s = self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW).and_return(s)
        s.settimeout.expect_call(net_utils.TIMEOUT)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))


    #
    # bonding tests
    #
    def test_bonding_is_enabled(self):
        try:
            net_utils.bond().is_enabled()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)


    def test_bonding_is_bondable(self):
        try:
            net_utils.bond().is_enabled()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)


    def test_bonding_enable(self):
        try:
            net_utils.bond().is_enabled()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)


    def test_bonding_disable(self):
        try:
            net_utils.bond().is_enabled()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)


    def test_bonding_get_mii_status(self):
        self.assertEquals(net_utils.bond().get_mii_status(), {})


    def test_get_mode_bonding(self):
        self.assertEquals(net_utils.bond().get_mode(), net_utils.bonding.NO_MODE)


    def test_bonding_wait_for_state_change(self):
        self.god.stub_function(utils, "ping_default_gateway")

        time.sleep.expect_call(10)
        utils.ping_default_gateway.expect_call().and_return(False)
        self.assertEquals(net_utils.bond().wait_for_state_change(), True)

        for x in xrange(9):
            time.sleep.expect_call(10)
            utils.ping_default_gateway.expect_call().and_return(True)

        time.sleep.expect_call(10)
        utils.ping_default_gateway.expect_call().and_return(False)
        self.assertEquals(net_utils.bond().wait_for_state_change(), True)

        for x in xrange(10):
            time.sleep.expect_call(10)
            utils.ping_default_gateway.expect_call().and_return(True)

        self.assertEquals(net_utils.bond().wait_for_state_change(), False)

        self.god.check_playback()


    def test_bonding_get_active_interfaces(self):
        self.assertEquals(net_utils.bond().get_active_interfaces(), [])
        self.god.check_playback()


    def test_bonding_get_slave_interfaces(self):
        self.assertEquals(net_utils.bond().get_slave_interfaces(), [])
        self.god.check_playback()


    #
    # ethernet tests
    #

    def test_ethernet_mac_string_to_binary(self):
        mac_bin = net_utils.ethernet.mac_string_to_binary('00:01:02:03:04:05')
        self.assertEqual(mac_bin, '\x00\x01\x02\x03\x04\x05')


    def test_ethernet_mac_binary_to_string(self):
        mac_str = net_utils.ethernet.mac_binary_to_string(
            '\x00\x01\x02\x03\x04\x05')
        self.assertEqual(mac_str, '00:01:02:03:04:05')


    def test_ethernet_pack(self):
        dst = net_utils.ethernet.mac_string_to_binary('00:01:02:03:04:05')
        src = net_utils.ethernet.mac_string_to_binary('16:17:18:19:1A:1B')
        protocol = 2030
        payload = 'some payload'
        frame = struct.pack("!6s6sH", dst, src, protocol) + payload
        self.assertEquals(net_utils.ethernet.pack(dst, src,protocol, payload),
                          frame)


    def test_ethernet_unpack(self):
        dst = net_utils.ethernet.mac_string_to_binary('00:01:02:03:04:05')
        src = net_utils.ethernet.mac_string_to_binary('16:17:18:19:1A:1B')
        protocol = 2030
        payload = 'some payload'
        frame = net_utils.ethernet.pack(dst, src, protocol, payload)
        uframe = net_utils.ethernet.unpack(frame)
        self.assertEquals(uframe[net_utils.ethernet.FRAME_KEY_DST_MAC], dst)
        self.assertEquals(uframe[net_utils.ethernet.FRAME_KEY_SRC_MAC], src)
        self.assertEquals(uframe[net_utils.ethernet.FRAME_KEY_PROTO], protocol)
        self.assertEquals(uframe[net_utils.ethernet.FRAME_KEY_PAYLOAD], payload)


    # raw_socket tests
    #
    def test_raw_socket_open(self):
        self.god.stub_function(socket, 'setdefaulttimeout')

        s = self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')

        # open without a protocol
        socket.setdefaulttimeout.expect_call(1)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW).and_return(s)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        sock.open(protocol=None)

        self.god.check_playback()

        # double open should throw an exception
        try:
            sock.open()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)

        self.god.check_playback()

        # open a protocol
        socket.setdefaulttimeout.expect_call(1)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW,
                                  socket.htons(1234)).and_return(s)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        sock.open(protocol=1234)

        self.god.check_playback()


    def test_raw_socket_close(self):
        self.god.stub_function(socket, 'setdefaulttimeout')

        s = self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')

        # close without open
        socket.setdefaulttimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        try:
            sock.close()
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)

        # close after open
        socket.setdefaulttimeout.expect_call(1)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW).and_return(s)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        sock.open(protocol=None)

        s.close.expect_call()
        sock.close()
        self.god.check_playback()


    def test_raw_socket_recv(self):
        self.god.stub_function(socket, 'setdefaulttimeout')

        self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')

        # rcv without open
        socket.setdefaulttimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        try:
            sock.recv(10)
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)

        self.god.check_playback()

        # open a protocol and try to get packets of varying sizes
        # I could not get socket.recv to get a mock expect_call. To keep
        # on going, added a socket stub
        s = net_utils_mock.socket_stub('eth0', socket, socket)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW,
                                  socket.htons(1234)).and_return(s)

        self.god.stub_function(s, 'bind')
        self.god.stub_function(s, 'settimeout')
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        sock.open(protocol=1234)

        s.recv_val = ''
        self.assertEquals(sock.recv(1), (None, 0))

        s.recv_val = '\xFF' * (net_utils.ethernet.ETH_PACKET_MIN_SIZE-5)
        self.assertEquals(sock.recv(1), (None, 0))

        # when receiving a packet, make sure the timeout is not change
        s.recv_val = '\xEE' * (net_utils.ethernet.ETH_PACKET_MIN_SIZE-4)
        self.assertEquals(sock.recv(1), (s.recv_val, 1))

        s.recv_val = '\xDD' * (net_utils.ethernet.ETH_PACKET_MIN_SIZE)
        self.assertEquals(sock.recv(1), (s.recv_val, 1))

        s.recv_val = '\xCC' * (net_utils.ethernet.ETH_PACKET_MAX_SIZE)
        self.assertEquals(sock.recv(1), (s.recv_val, 1))

        s.recv_val = '\xBB' * (net_utils.ethernet.ETH_PACKET_MAX_SIZE+1)
        packet, time_left = sock.recv(1)
        self.assertEquals(len(packet), net_utils.ethernet.ETH_PACKET_MAX_SIZE)
        self.assertEquals(packet,
                          s.recv_val[:net_utils.ethernet.ETH_PACKET_MAX_SIZE])


        # test timeout
        s.recv_val = ''
        s.throw_timeout = False
        sock.recv(5)
        self.assertEquals(sock.recv(1), (None, 0))
        s.throw_timeout = True
        sock.recv(5)
        self.assertEquals(sock.recv(1), (None, 0))

        self.god.check_playback()


    def test_raw_socket_send(self):
        self.god.stub_function(socket, 'setdefaulttimeout')
        self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')
        self.god.stub_function(socket, 'send')

        # send without open
        socket.setdefaulttimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        try:
            sock.send('test this packet')
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)
        self.god.check_playback()

        # open a protocol and try to send a packet
        s = net_utils_mock.socket_stub('eth0', socket, socket)
        self.god.stub_function(s, 'bind')
        self.god.stub_function(s, 'settimeout')
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW,
                                  socket.htons(1234)).and_return(s)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        packet = '\xFF\xAA\xBB\xCC\xDD\x11packet data\x00\x00'
        s.send.expect_call(packet)
        sock.open(protocol=1234)
        sock.send(packet)
        self.god.check_playback()


    def test_raw_socket_send_to(self):
        self.god.stub_function(socket, 'setdefaulttimeout')
        self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')
        self.god.stub_function(socket, 'send')

        # send without open
        socket.setdefaulttimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        try:
            sock.send_to('0', '1', 1, 'test this packet')
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)
        self.god.check_playback()

        # open a protocol and try to send a packet
        s = net_utils_mock.socket_stub('eth0', socket, socket)
        self.god.stub_function(s, 'bind')
        self.god.stub_function(s, 'settimeout')
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW,
                                  socket.htons(1234)).and_return(s)
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        packet = '\x00\x00packet data\x00\x00'
        s.send.expect_call(packet)
        sock.open(protocol=1234)
        try:
            sock.send_to(None, None, 1, packet)
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)
        self.god.check_playback()

        dst_mac = '\x00\x01\x02\x03\x04\x05'
        src_mac = '\xFF\xEE\xDD\xCC\xBB\xAA'
        protocol = 1234
        s.send.expect_call(dst_mac+src_mac+'%d'%protocol+packet)
        sock.send_to(dst_mac, src_mac, protocol, packet)
        self.god.check_playback()


    def test_raw_socket_recv_from(self):

        def __set_clock(sock):
            time.clock.expect_call().and_return(0.0)
            time.clock.expect_call().and_return(0.0)
            time.clock.expect_call().and_return(float(sock.socket_timeout()) + 0.5)

        self.god.stub_function(socket, 'setdefaulttimeout')

        self.god.create_mock_class(socket.socket, "socket")
        self.god.stub_function(socket, 'socket')

        # rcv without open
        socket.setdefaulttimeout.expect_call(1)
        sock = net_utils.raw_socket('eth0')
        try:
            sock.recv_from(None, None, None)
        except error.TestError:
            pass
        else:
            self.assertEquals(1, 0)

        self.god.check_playback()

        # open a protocol and try to get packets of varying sizes
        # I could not get socket.recv to get a mock expect_call. To keep
        # on going, added a socket stub
        s = net_utils_mock.socket_stub('eth0', socket, socket)
        socket.socket.expect_call(socket.PF_PACKET,
                                  socket.SOCK_RAW,
                                  socket.htons(1234)).and_return(s)

        self.god.stub_function(s, 'bind')
        self.god.stub_function(s, 'settimeout')
        s.bind.expect_call(('eth0', net_utils.raw_socket.ETH_P_ALL))
        s.settimeout.expect_call(1)
        sock.open(protocol=1234)

        s.recv_val = ''
        dst_mac = net_utils.ethernet.mac_string_to_binary('00:01:02:03:04:05')
        src_mac = net_utils.ethernet.mac_string_to_binary('16:17:18:19:1A:1B')
        t_mac = net_utils.ethernet.mac_string_to_binary('E6:E7:E8:E9:EA:EB')
        protocol = 2030
        t_protocol = 1234
        data = '\xEE' * (net_utils.ethernet.ETH_PACKET_MIN_SIZE)

        # no data to receive at socket
        self.assertEquals(sock.recv_from(None, None, None), None)
        self.assertEquals(sock.recv_from(dst_mac, None, None), None)
        self.assertEquals(sock.recv_from(None, src_mac, None), None)
        self.assertEquals(sock.recv_from(None, None, protocol), None)

        # receive packet < min size
        s.recv_val = (struct.pack("!6s6sH", dst_mac, src_mac, protocol) +
                      'packet_to_short')
        self.assertEquals(sock.recv_from(None, None, None), None)

        # receive packet, filtering on mac address and protocol
        s.recv_val = struct.pack("!6s6sH", dst_mac, t_mac, t_protocol) + data
        frame = net_utils.ethernet.unpack(s.recv_val)
        self.assertEquals(sock.recv_from(None, None, None), frame)
        self.assertEquals(sock.recv_from(dst_mac, None, None), frame)

        # use time clock to speed up the timeout in send_to()
        self.god.stub_function(time, 'clock')
        __set_clock(sock)
        self.assertEquals(sock.recv_from(dst_mac, src_mac, None), None)
        __set_clock(sock)
        self.assertEquals(sock.recv_from(dst_mac, None, protocol), None)
        __set_clock(sock)
        self.assertEquals(sock.recv_from(dst_mac, src_mac, protocol), None)
        self.god.unstub(time, 'clock')

        s.recv_val = struct.pack("!6s6sH", dst_mac, src_mac, protocol) + data
        frame = net_utils.ethernet.unpack(s.recv_val)
        self.assertEquals(sock.recv_from(dst_mac, None, None), frame)
        self.assertEquals(sock.recv_from(dst_mac, src_mac, None), frame)
        self.assertEquals(sock.recv_from(dst_mac, src_mac, protocol), frame)
        self.assertEquals(sock.recv_from(None, None, protocol), frame)
        self.assertEquals(sock.recv_from(None, src_mac, None), frame)
        self.god.stub_function(time, 'clock')
        __set_clock(sock)
        self.assertEquals(sock.recv_from(None, None, t_protocol), None)
        __set_clock(sock)
        self.assertEquals(sock.recv_from(None, t_mac, None), None)
        self.god.unstub(time, 'clock')


        self.god.check_playback()


if __name__ == "__main__":
    unittest.main()
