#!/usr/bin/python2
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()
