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

fijal at codespeak.net fijal at codespeak.net
Wed Mar 7 18:32:22 CET 2007


Author: fijal
Date: Wed Mar  7 18:32:20 2007
New Revision: 40040

Added:
   pypy/dist/pypy/lib/distributed/test/test_greensock.py
Modified:
   pypy/dist/pypy/lib/distributed/socklayer.py
Log:
Add a fancy test and a simple helper


Modified: pypy/dist/pypy/lib/distributed/socklayer.py
==============================================================================
--- pypy/dist/pypy/lib/distributed/socklayer.py	(original)
+++ pypy/dist/pypy/lib/distributed/socklayer.py	Wed Mar  7 18:32:20 2007
@@ -1,5 +1,5 @@
 
-#from pypeers.pipe.gsocket import GreenSocket
+import py
 from socket import socket
 from py.__.net.msgstruct import decodemessage, message
 from socket import socket, AF_INET, SOCK_STREAM
@@ -30,7 +30,7 @@
         self.conn.sendall(message('c', marshal.dumps(data)))
         trace("done")
 
-def socket_listener(address=('', 12122)):
+def socket_listener(address=('', 12122), socket=socket):
     s = socket(AF_INET, SOCK_STREAM)
     s.bind(address)
     s.listen(1)
@@ -40,10 +40,22 @@
     sw = SocketWrapper(conn)
     return sw.send, sw.receive
 
-def socket_connecter(address):
+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
+
+def spawn_remote_side(code, gw):
+    """ A very simple wrapper around greenexecnet to allow
+    spawning a remote side of lib/distributed
+    """
+    from distributed import RemoteProtocol
+    extra = str(py.code.Source("""
+    from distributed import remote_loop, RemoteProtocol
+    remote_loop(RemoteProtocol(channel.send, channel.receive, globals()))
+    """))
+    channel = gw.remote_exec(code + "\n" + extra)
+    return RemoteProtocol(channel.send, channel.receive)

Added: pypy/dist/pypy/lib/distributed/test/test_greensock.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/distributed/test/test_greensock.py	Wed Mar  7 18:32:20 2007
@@ -0,0 +1,54 @@
+
+from pypy.conftest import gettestobjspace
+
+class AppTestDistributedGreensock(object):
+    def setup_class(cls):
+        cls.space = gettestobjspace(**{"objspace.std.withtproxy": True,
+                                       "usemodules":("_stackless",)})
+        cls.w_remote_side_code = cls.space.appexec([], """():
+        import py
+        remote_side_code = str(py.code.Source('''
+        class A:
+            def __init__(self, x):
+                self.x = x
+            
+            def __len__(self):
+                return self.x + 8
+
+            def raising(self):
+                1/0
+
+            def method(self, x):
+                return x() + self.x
+
+        a = A(3)
+
+        def count():
+            x = 10
+            # naive counting :)
+            result = 1
+            for i in range(x):
+                result += 1
+            return result
+        '''))
+        return remote_side_code
+        """)
+
+    def test_remote_call(self):
+        from distributed import socklayer
+        from py.__.net.greenexecnet import PopenGateway
+        gw = PopenGateway()
+        rp = socklayer.spawn_remote_side(self.remote_side_code, gw)
+        a = rp.get_remote("a")
+        assert a.method(lambda : 13) == 16
+    
+    def test_remote_counting(self):
+        from distributed import socklayer
+        from py.__.net.greensock2 import allof
+        from py.__.net.greenexecnet import PopenGateway
+        gws = [PopenGateway() for i in range(3)]
+        rps = [socklayer.spawn_remote_side(self.remote_side_code, gw)
+               for gw in gws]
+        counters = [rp.get_remote("count") for rp in rps]
+        assert allof(*counters) == (11, 11, 11)
+



More information about the Pypy-commit mailing list