2013-04-07 5 views
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 

문제는 있지만 작동하는지 확인하기 위해 테스트 케이스를 작성하는 방법에 대한 터널을 작성하는 방법에 대한 아니다 파이썬 단위 테스트를 사용하여 유닉스 계열의 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.') 

답변

1

하는 당신은 간단하게 빌릴 수 있습니다 테스트 케이스를 pytun에서 제거하고 단순화합니다. 실제로, 실제 연결을 테스트하는 것은 패키지로 수행되기 때문에, 상당히 다른 테스트를 시도하지 않으면 수정없이 테스트를 실행하는 것만으로 도망 갈 수 있습니다. https://github.com/montag451/pytun/tree/master/test

원시 소켓이므로 클라이언트에서 일반 ASCII 메시지를 보내고 서버에서 수신했는지 확인한 다음 서버가 확인 응답을 보내도록 요청하면됩니다.

+0

감사합니다. 사전에 – pylover

+0

튜닝을 자동으로 테스트해야하며, 몬스터 테스트는 명령 프롬프트에서 실행하고 작동하려면 몇 가지 인수를 전달해야합니다. 그래서 나는 서버 - 클라이언트 방식으로 두 개의 소켓을 작성하여 터널 인터페이스를 통해 통신 할 계획이다. 클라이언트는 아무것도 보내고 서버는 수신 한 내용을 반향시킵니다. 너 무슨 생각이야? – pylover

+1

나는 setUp 메소드 내에서 서버 설정을하고 명령 행을 통해 이전에 전달 된 것을 전달할 것이다. 블로킹 (다른 스레드를 죽일 방법이 필요함을 의미하기 때문에)을 다른 스레드에서 포크해야 할 수도 있습니다. 예, 클라이언트로부터 간단한 "메아리"를 보내고 서버와 클라이언트 모두에 대해 소켓에서 데이터를 읽을 때이를 반박합니다. 모든 설정을 자동화 된 방식으로 수행 할 수 있으므로 테스트를 실행하기 위해 명령 줄 인수를 전달하여 손으로 서버를 설정하지 않아도됩니다. –