【问题标题】:Tunnel interface unit-testing隧道接口单元测试
【发布时间】:2013-04-07 22:44:11
【问题描述】:

我制作了一个包裹 pytun.TunTapDevice 的 Tun 类:

from pytun import TunTapDevice

class Tun(object):
    def __init__(self,name='tun',addr=None,dstaddr=None,netmask=None,mtu=None):

        tun = TunTapDevice(name=name)
        if addr     : tun.addr      = addr
        if dstaddr  : tun.dstaddr   = dstaddr
        if netmask  : tun.netmask   = netmask
        if mtu      : tun.mtu       = mtu
        self._tun = tun
        self.up = self._tun.up
        self.down = self._tun.down
        self.read = self._tun.read
        self.write = self._tun.write
        self.close = self._tun.close


    @property
    def name(self):
        return self._tun.name

    @property
    def mtu(self):
        return self._tun.mtu

问题不在于如何编写隧道,而在于如何编写测试用例以确保它在使用 python 单元测试的类 unix OSE 中正常工作。

我应该写什么来确保它有效?可能是 ARP 请求、ICMP、DNS 数据包或其他任何东西:

class TestTunnel(unittest.TestCase):

    def setUp(self):
        self.tun = Tun(name='tun0', addr='192.168.0.23', netmask='255.255.255.0',mtu=1500)

    def test_tunnel(self):
        self.tun.write(?????)
        self.assertEqual(self.tun.read(),????)

编辑 1:

我终于通过这段代码得到了它:

from select import select
import dpkt
import struct

class TunnelTestCase( unittest.TestCase):

    def setUp(self):

        self.tun = Tun(name='testtun',
                       addr='192.168.6.92',
                       dstaddr='192.168.6.93',
                       netmask='255.255.255.0', 
                       mtu=1500)
        self.tun.up()

    def _ip2str(self,ip):
        return '.'.join([str(i) for i in struct.unpack('!BBBB',ip)])

    def test_echo(self):
        reqPack = dpkt.ip.IP('E\x00\x00T\x00\x00@\x00@\x01\xac\x9f\xc0\xa8\x06]\xc0\xa8\x06\\\x08\x00\x1c\xae\t\xc7\x00\x01\x0f\x8adQq\xab\x01\x00\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567')
        self.tun.write(reqPack.pack())

        r,_w,_ex = select([self.tun],[],[],4)
        if len(r) and r[0] == self.tun:
            replyPack = dpkt.ip.IP(self.tun.read())
            self.assertEqual(self._ip2str(replyPack.src), self.tun.addr)
            self.assertEqual(self._ip2str(replyPack.dst), self.tun.dstaddr)
            return

        self.assert_(False, 'ICMP Echo timeout, the tunnel interface may not works properly in your system.')

【问题讨论】:

    标签: python unit-testing unix python-2.7 tunnel


    【解决方案1】:

    您可以简单地从 pytun 借用测试用例并简化它们。事实上,我认为测试实际连接性是在他们的包中完成的,所以除非你试图测试一些显着不同的东西,否则你可以不加修改地运行那里的测试。 https://github.com/montag451/pytun/tree/master/test

    由于它是一个原始套接字,您可以简单地尝试从客户端发送一个纯 ascii 消息并验证它是否被服务器接收,然后让服务器发回一个确认,您可以对此进行断言。

    【讨论】:

    • 我需要自动测试 tun,montag 测试需要从命令提示符运行并传递一些参数才能工作。所以我计划以服务器 - 客户端的方式编写两个套接字,以通过隧道接口进行通信。客户端发送任何内容,服务器只是回显接收到的任何内容。你的想法是什么?
    • 我只需要在 setUp 方法中设置服务器,然后通过命令行手动传入之前传入的内容。您可能需要在另一个线程上分叉它,因为它可能会阻塞(这也意味着您需要一种方法来杀死该另一个线程)。是的,只需从客户端执行一个简单的回显“Hello World”,并在从服务器和客户端的套接字中读取数据时断言。您可以以自动方式完成所有设置,无需通过传递命令行参数来手动设置服务器来运行测试。
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 2012-11-27
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多