[pypy-svn] r26230 - in pypy/dist/pypy/rpython/rctypes/socketmodule: . test

ac at codespeak.net ac at codespeak.net
Mon Apr 24 09:02:35 CEST 2006


Author: ac
Date: Mon Apr 24 09:02:35 2006
New Revision: 26230

Modified:
   pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py
   pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py
   pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py
Log:
(aleale, arre)
Add error message to socket.error.
Fix some typos in ctypes_socket.
Add some tests and fix the bugs they exposed.
Added some constants missing on Linux (there are more to add).



Modified: pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py	Mon Apr 24 09:02:35 2006
@@ -6,15 +6,8 @@
 
 
 class error(Exception):
-    pass
-
-def makesockaddr(self, caddr):
-    family = caddr.sa_family
-    if family == AF_INET:
-        caddr = cast(pointer(caddr), POINTER(_c.sockaddr_in)).contents
-        return (_c.inet_ntoa(caddr.sin_addr), _c.ntohs(caddr.sin_port))
-    else:
-        raise NotImplementedError('Unsupported address family') # XXX
+    def __init__(self, errno):
+        Exception.__init__(self, errno, _c.strerror(errno)) 
 
 
 class socket(object):
@@ -59,25 +52,25 @@
             raise NotImplementedError('Unsupported address family') # XXX
 
     def listen(self, backlog):
-        if self._fd != -1:
-            fd = self._fd
-            res = _c.listen(fd, backlog)
-            if res == -1:
-                raise error(_c.errno.value)
-        else:
-            XXX
+        fd = self._fd
+        if backlog < 1:
+            backlog = 1
+        res = _c.listen(fd, backlog)
+        if res == -1:
+            raise error(_c.errno.value)
                     
     def accept(self):
-        peeraddr = _c.sockaddr()
-        peeraddrlen = _c.socklen_t(sizeof(peeraddr))
-        newfd = _c.socketaccept(self._fd, pointer(peeraddr),
+        peeraddr = pointer(_c.sockaddr())
+        peeraddrlen = _c.socklen_t(sizeof(_c.sockaddr))
+        newfd = _c.socketaccept(self._fd, peeraddr,
                                 pointer(peeraddrlen))
         if newfd < 0:
             raise error(_c.errno.value)
         newsocket = socket(self.family, self.type, self.proto, newfd)
-        return (newsocket, makesockaddr(peeraddr))
+        return (newsocket, makesockaddr(peeraddr, peeraddrlen, self.proto))
     
     def connect_ex(self, addr):
+        host, port = addr
         caddr = self._getsockaddr(addr)
         paddr = cast(pointer(caddr), _c.sockaddr_ptr)
         result = _c.socketconnect(self._fd, paddr,
@@ -93,22 +86,22 @@
         return self._fd
     
     def getpeername(self):
-        peeraddr = _c.sockaddr()
-        peeraddrlen = _c.socklen_t(sizeof(peeraddr))
-        res = _c.socketgetpeername(self._fd, pointer(peeraddr),
+        peeraddr = pointer(_c.sockaddr())
+        peeraddrlen = _c.socklen_t(sizeof(_c.sockaddr))
+        res = _c.socketgetpeername(self._fd, peeraddr,
                                    pointer(peeraddrlen))
         if res < 0:
             raise error(_c.errno.value)
-        return makesockaddr(peeraddr)
+        return makesockaddr(peeraddr, peeraddrlen, self.proto)
     
     def getsockname(self):
-        peeraddr = _c.sockaddr()
-        peeraddrlen = _c.socklen_t(sizeof(peeraddr))
-        res = _c.socketgetsockname(self._fd, pointer(peeraddr),
+        peeraddr = pointer(_c.sockaddr())
+        peeraddrlen = _c.socklen_t(sizeof(_c.sockaddr))
+        res = _c.socketgetsockname(self._fd, peeraddr,
                                    pointer(peeraddrlen))
         if res < 0:
             raise error(_c.errno.value)
-        return makesockaddr(peeraddr)
+        return makesockaddr(peeraddr, peeraddrlen, self.proto)
     
     def getsockopt(self, level, optname, buflen=-1):
         pass
@@ -169,7 +162,7 @@
         a = cast(caddr, POINTER(_c.sockaddr_in))
         return makeipaddr(caddr, caddrlen), _c.ntohs(a.contents.sin_port)
     else:
-        XXX
+        raise NotImplementedError("Unsupported address family %d" % caddr.contents.sa_family)
 
 def getaddrinfo(host, port, family=AF_UNSPEC, socktype=0, proto=0, flags=0):
     if isinstance(port, (int, long)):

Modified: pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py	Mon Apr 24 09:02:35 2006
@@ -14,13 +14,18 @@
             'arpa/inet.h'
             )
 HEADER = ''.join(['#include <%s>\n' % filename for filename in includes])
-constants = {}
+constants = {"BDADDR_ANY": "00:00:00:00:00:00",
+             "BDADDR_LOCAL": "00:00:00:FF:FF:FF"}
 
 # constants
-for name in ['AF_APPLETALK', 'AF_INET', 'AF_INET6', 'AF_IPX','AF_ROUTE', 
-'AF_SNA', 'AF_UNIX', 'AF_UNSPEC', 'AI_ADDRCONFIG', 'AI_ALL', 'AI_CANONNAME',
-'AI_DEFAULT', 'AI_MASK', 'AI_NUMERICHOST', 'AI_PASSIVE', 'AI_V4MAPPED',
-'AI_V4MAPPED_CFG', 'EAI_ADDRFAMILY', 'EAI_AGAIN', 'EAI_BADFLAGS',
+for name in ['AF_APPLETALK', 'AF_ASH', 'AF_ATMPVC', 'AF_ATMSVC', 'AF_AX25',
+             'AF_BLUETOOTH', 'AF_BRIDGE', 'AF_ECONET', 'AF_INET', 'AF_INET6',
+             'AF_IPX', 'AF_IRDA', 'AF_KEY', 'AF_NETBEUI', 'AF_NETLINK',
+             'AF_NETROM', 'AF_PACKET', 'AF_PPPOX', 'AF_ROSE', 'AF_ROUTE',
+             'AF_SECURITY', 'AF_WANPIPE', 'AF_SNA', 'AF_UNIX', 'AF_X25',
+             'AF_UNSPEC', 'AI_ADDRCONFIG', 'AI_ALL', 'AI_CANONNAME',
+'AI_DEFAULT', 'AI_MASK', 'AI_NUMERICHOST', 'AI_NUMERICSERV', 'AI_PASSIVE', 'AI_V4MAPPED',
+'AI_V4MAPPED_CFG', 'BDADDR_ANY', 'EAI_ADDRFAMILY', 'EAI_AGAIN', 'EAI_BADFLAGS',
 'EAI_BADHINTS', 'EAI_FAIL', 'EAI_FAMILY', 'EAI_MAX', 'EAI_MEMORY',
 'EAI_NODATA', 'EAI_NONAME', 'EAI_PROTOCOL', 'EAI_SERVICE', 'EAI_SOCKTYPE',
 'EAI_SYSTEM', 'INADDR_UNSPEC_GROUP', 'IPPROTO_AH',
@@ -118,6 +123,9 @@
 socketdll = cdll.LoadLibrary(dllname)
 
 errno = c_int.in_dll(socketdll, 'errno')
+strerror = socketdll.strerror
+strerror.argtypes = [c_int]
+strerror.restype = c_char_p
 
 socket = socketdll.socket
 socket.argtypes = [c_int, c_int, c_int]
@@ -148,15 +156,15 @@
 htonl.argtypes = [uint32_t]
 htonl.restype = uint32_t
 
-htons = socketdll.htonl
+htons = socketdll.htons
 htons.argtypes = [uint16_t]
 htons.restype = uint16_t
 
-ntohl = socketdll.htonl
+ntohl = socketdll.ntohl
 ntohl.argtypes = [uint32_t]
 ntohl.restype = uint32_t
 
-ntohs = socketdll.htonl
+ntohs = socketdll.ntohs
 ntohs.argtypes = [uint16_t]
 ntohs.restype = uint16_t
 
@@ -218,4 +226,4 @@
 
 socketshutdown = socketdll.shutdown
 socketshutdown.argtypes = [c_int, c_int]
-socketshutdown.restype = c_int
\ No newline at end of file
+socketshutdown.restype = c_int

Modified: pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py	Mon Apr 24 09:02:35 2006
@@ -1,23 +1,51 @@
 import py
-import _socket, errno
+import _socket, errno, thread
 from pypy.rpython.rctypes.socketmodule import _socket as _rsocket
+from pypy.module._socket.test import echoserver
 
 def interface_matcher(interface1, interface2):
-    members = [member for member in dir(interface1) if not member.startswith('_')]
-    members.remove('CAPI')
+    members = [member for member in dir(interface1) if member != "CAPI" and not member.startswith('_')]
     verifying_set = dir(interface2)
     for member in members:
         assert member in verifying_set
 
 def test_interfaces():
+    py.test.skip("In progress.")
     interface_matcher(_socket, _rsocket)
     interface_matcher(_rsocket, _socket)
     interface_matcher(_socket.socket, _rsocket.socket)
     interface_matcher(_rsocket.socket, _socket.socket)
 
-def test_accept():
-    s = _rsocket.socket(_rsocket.AF_INET, _rsocket.SOCK_STREAM,
-                        _socket.IPPROTO_TCP)
-    e = py.test.raises(_rsocket.error, s.accept).value
-    assert e.args[0] == errno.EINVAL
+class TestSocket:
+
+    HOST = "127.0.0.1"
+    PORT = echoserver.PORT
+    family = _socket.AF_INET
+    
+    def setup_class(cls):    
+        thread.start_new_thread(echoserver.start_server, (),
+                                            {"address_family": cls.family})
+        import time
+        time.sleep(1)
+    def teardown_class(cls):
+        import telnetlib
+        tn = telnetlib.Telnet(cls.HOST, cls.PORT)
+        tn.write("shutdown\n")
+        tn.close()
+
+    def test_accept_no_bind(self):
+        s = _rsocket.socket(_rsocket.AF_INET, _rsocket.SOCK_STREAM,
+                            _socket.IPPROTO_TCP)
+        e = py.test.raises(_rsocket.error, s.accept).value
+        assert e.args[0] == errno.EINVAL
     
+    def test_getpeername(self):
+        s = _rsocket.socket(self.family, _socket.SOCK_STREAM, 0)
+        s.connect((self.HOST, self.PORT))
+        sockname = s.getpeername()
+        s.close()
+        host, port = sockname
+        assert host == self.HOST
+        assert port == self.PORT
+        
+



More information about the Pypy-commit mailing list