[pypy-svn] r42408 - in pypy/dist/pypy/lib/distributed: . test

fijal at codespeak.net fijal at codespeak.net
Sat Apr 28 20:44:32 CEST 2007


Author: fijal
Date: Sat Apr 28 20:44:31 2007
New Revision: 42408

Added:
   pypy/dist/pypy/lib/distributed/test/test_socklayer.py
Modified:
   pypy/dist/pypy/lib/distributed/socklayer.py
Log:
Some simple wrappers around a socket and a weird test, which
does not close the socket properly, need to be rethinked at some point


Modified: pypy/dist/pypy/lib/distributed/socklayer.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/socklayer.py	(original)
+++ pypy/dist/pypy/lib/distributed/socklayer.py	Sat Apr 28 20:44:31 2007
@@ -19,6 +19,7 @@
         self.buffer = ""
         self.conn = conn
 
+class ReceiverWrapper(SocketWrapper):
     def receive(self):
         msg, self.buffer = decodemessage(self.buffer)
         while msg is None:
@@ -31,28 +32,39 @@
         trace("received %s" % msg[1])
         return marshal.loads(msg[1])
 
+class SenderWrapper(SocketWrapper):
     def send(self, data):
         trace("sending %s" % (data,))
         self.conn.sendall(message('c', marshal.dumps(data)))
         trace("done")
 
-def socket_listener(address=('', 12122), socket=socket):
+def socket_listener(address, socket=socket):
     s = socket(AF_INET, SOCK_STREAM)
     s.bind(address)
     s.listen(1)
     print "Waiting for connection"
     conn, addr = s.accept()
 
-    sw = SocketWrapper(conn)
-    return sw.send, sw.receive
+    return SenderWrapper(conn).send, ReceiverWrapper(conn).receive
+
+def socket_loop(address, to_export, socket=socket):
+    from distributed import RemoteProtocol, remote_loop
+    try:
+        send, receive = socket_listener(address, socket)
+        remote_loop(RemoteProtocol(send, receive, to_export))
+    except Finished:
+        pass
 
 def socket_connecter(address, socket=socket):
     s = socket(AF_INET, SOCK_STREAM)
     print "Connecting %s" % (address,)
     s.connect(address)
 
-    sw = SocketWrapper(s)
-    return sw.send, sw.receive
+    return SenderWrapper(s).send, ReceiverWrapper(s).receive
+
+def connect(address, socket=socket):
+    from distributed import RemoteProtocol
+    return RemoteProtocol(*socket_connecter(address, socket))
 
 def spawn_remote_side(code, gw):
     """ A very simple wrapper around greenexecnet to allow

Added: pypy/dist/pypy/lib/distributed/test/test_socklayer.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/distributed/test/test_socklayer.py	Sat Apr 28 20:44:31 2007
@@ -0,0 +1,28 @@
+
+from pypy.conftest import gettestobjspace
+
+# XXX think how to close the socket
+
+class AppTestSocklayer:
+    def setup_class(cls):
+        cls.space = gettestobjspace(**{"objspace.std.withtproxy": True,
+                                       "usemodules":("_stackless","rsocket", "select")})
+    
+    def test_socklayer(self):
+        class X:
+            z = 3
+
+        x = X()
+
+        from py.__.green.pipe.gsocket import GreenSocket
+        from distributed.socklayer import socket_loop, connect
+        from py.__.green.greensock2 import oneof, allof
+
+        def one():
+            socket_loop(('127.0.0.1', 21211), {'x':x}, socket=GreenSocket)
+
+        def two():
+            rp = connect(('127.0.0.1', 21211), GreenSocket)
+            assert rp.get_remote('x').z == 3
+
+        oneof(one, two)



More information about the Pypy-commit mailing list