0
我做了一个包装类屯pytun.TunTapDevice:隧道接口单元测试
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-like 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\[email protected]\[email protected]\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 !"#$%&\'()*+,-./')
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.')
预先感谢 – pylover 2013-04-07 22:59:27
我需要自动测试tun,montag测试需要从命令提示符运行,并传递一些参数来工作。所以我打算以服务器 - 客户端方式编写两个套接字,以通过隧道接口进行通信。客户端发送任何东西和服务器只是回应接收到的任你的想法是什么? – pylover 2013-04-08 15:30:48
我只是在setUp方法内部完成服务器的设置,并传入之前通过命令行手动传入的内容。您可能需要在另一个线程上分支它,因为它可能会阻塞(这也意味着您需要一种方法来杀死其他线程)。是的,只是从客户端做一个简单的回声“Hello World”,并且在从服务器和客户端的套接字读取数据时断言。您可以自动完成所有设置,无需手动设置服务器,只需传递命令行参数即可运行测试。 – 2013-04-08 17:37:49