2013-04-07 30 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 

的問題不是怎麼寫的隧道,而是關於如何編寫測試用例,以確保它的工作原理在使用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.') 

回答

1

你可能只是能夠借來自pytun的測試用例並簡化它們。事實上,我認爲測試實際的連通性是在他們的軟件包中完成的,所以除非你試圖測試一些明顯不同的東西,否則你可能能夠在沒有修改的情況下運行測試。 https://github.com/montag451/pytun/tree/master/test

由於它是一個原始套接字,您可以簡單地嘗試從客戶端發送純ASCII消息並驗證它是否已被服務器接收,然後讓服務器發回確認消息,您可以對此進行斷言。

+0

預先感謝 – pylover 2013-04-07 22:59:27

+0

我需要自動測試tun,montag測試需要從命令提示符運行,並傳遞一些參數來工作。所以我打算以服務器 - 客戶端方式編寫兩個套接字,以通過隧道接口進行通信。客戶端發送任何東西和服務器只是迴應接收到的任你的想法是什麼? – pylover 2013-04-08 15:30:48

+1

我只是在setUp方法內部完成服務器的設置,並傳入之前通過命令行手動傳入的內容。您可能需要在另一個線程上分支它,因爲它可能會阻塞(這也意味着您需要一種方法來殺死其他線程)。是的,只是從客戶端做一個簡單的回聲「Hello World」,並且在從服務器和客戶端的套接字讀取數據時斷言。您可以自動完成所有設置,無需手動設置服務器,只需傳遞命令行參數即可運行測試。 – 2013-04-08 17:37:49