test/transport_tcp.py
author Tero Marttila <terom@fixme.fi>
Sun, 23 Aug 2009 22:43:39 +0300
changeset 36 4d5c02fe9c27
parent 35 50dc1517f797
child 37 14db3fe42b6c
permissions -rw-r--r--
add test for IPv6 -> IPv4 connect failure
34
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
import unittest
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
36
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
     3
from qmsk.net.socket import socket as _socket, af_inet, af_inet6
34
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
from qmsk.net.transport import tcp, socket, endpoint
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
class TestService (unittest.TestCase) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    def setUp (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
        # create service on random port
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        self.ss = tcp.Service(None, af=socket.AF_INET)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        self.addr = self.ss.sock.getsockname()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    def test_bind_addr (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        # ensure it binds on the right AF
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        self.assertEquals(self.addr.family, socket.AF_INET)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    def test_connect_accept (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        # ensure we can connect to it...
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        sock = _socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        sock.connect(self.addr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        # and accept
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        sc = self.ss.accept()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        # test both ways
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        self.assertEquals(sock.getpeername().port, self.addr.port)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.assertEquals(sc.sock.getpeername().port, sock.getsockname().port)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
class TestClient (unittest.TestCase) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    def setUp (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        # create listening socket on random port
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        self.ls = _socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        self.ls.listen(1)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        self.sockaddr = af_inet.sockaddr_in('127.0.0.1', self.ls.getsockname().port)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        self.addr = endpoint.SockAddr(self.sockaddr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
   
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    def test_connect_unspec (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        cc = tcp.Client(self.addr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        cs = cc.connect()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        self.assertEquals(cs.sock.getpeername(), self.sockaddr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    def test_connect_inet4 (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        cc = tcp.Client(self.addr, socket.AF_INET)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        cs = cc.connect()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        self.assertEquals(cs.sock.getpeername(), self.sockaddr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    def test_connect_bind (self) :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        sockaddr = af_inet.sockaddr_in('127.0.0.1', self.sockaddr.port + 1)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        # connect with bind()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        cc = tcp.Client(self.addr, bind_endpoint=endpoint.SockAddr(sockaddr))
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        cs = cc.connect()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        self.assertEquals(cs.sock.getsockname(), sockaddr)
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        self.assertEquals(cs.sock.getpeername(), self.sockaddr)
36
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    59
 
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    60
    def test_connect_bind6 (self) :
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    61
        sockaddr = af_inet6.sockaddr_in6('::1', self.sockaddr.port + 1)
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    62
        
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    63
        # connect with bind()
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    64
        cc = tcp.Client(self.addr, bind_endpoint=endpoint.SockAddr(sockaddr))
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    65
        
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    66
        # should fail (IPv6 -> IPv4)
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    67
        self.assertRaises(socket.SocketConnectEndpointError, cc.connect)
34
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    
35
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    69
    def test_connect_inet (self) :
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    70
        cc = tcp.Client(endpoint.InetAddr('localhost', self.sockaddr.port), socket.AF_INET)
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    71
        cs = cc.connect()
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    72
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    73
        self.assertEquals(cs.sock.getpeername(), self.sockaddr)
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    74
36
4d5c02fe9c27 add test for IPv6 -> IPv4 connect failure
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    75
    
34
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
if __name__ == '__main__' :
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    unittest.main()
5ce1f16ee3fa some basic unit tests for tcp
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78