나는 래핑 툰 클래스를했습니다 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
문제는 있지만 작동하는지 확인하기 위해 테스트 케이스를 작성하는 방법에 대한 터널을 작성하는 방법에 대한 아니다 파이썬 단위 테스트를 사용하여 유닉스 계열의 oses에서 제대로 작동합니다.
작동을 보장하려면 무엇을 써야합니까? 어쩌면 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
튜닝을 자동으로 테스트해야하며, 몬스터 테스트는 명령 프롬프트에서 실행하고 작동하려면 몇 가지 인수를 전달해야합니다. 그래서 나는 서버 - 클라이언트 방식으로 두 개의 소켓을 작성하여 터널 인터페이스를 통해 통신 할 계획이다. 클라이언트는 아무것도 보내고 서버는 수신 한 내용을 반향시킵니다. 너 무슨 생각이야? – pylover
나는 setUp 메소드 내에서 서버 설정을하고 명령 행을 통해 이전에 전달 된 것을 전달할 것이다. 블로킹 (다른 스레드를 죽일 방법이 필요함을 의미하기 때문에)을 다른 스레드에서 포크해야 할 수도 있습니다. 예, 클라이언트로부터 간단한 "메아리"를 보내고 서버와 클라이언트 모두에 대해 소켓에서 데이터를 읽을 때이를 반박합니다. 모든 설정을 자동화 된 방식으로 수행 할 수 있으므로 테스트를 실행하기 위해 명령 줄 인수를 전달하여 손으로 서버를 설정하지 않아도됩니다. –