Rev 10: Use python-svn for testing server. Currently still fails with 'Malformed network data' error in file:///home/jelmer/bzr/bzrsvnserve/

Jelmer Vernooij jelmer at samba.org
Mon Jan 22 13:58:09 GMT 2007


------------------------------------------------------------
revno: 10
revision-id: jelmer at samba.org-20070122135806-vrx4xj1uq5d8v3x1
parent: jelmer at samba.org-20070122131330-os8xa31ka1vyfjml
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: bzrsvnserve
timestamp: Mon 2007-01-22 14:58:06 +0100
message:
  Use python-svn for testing server. Currently still fails with 'Malformed network data' error
modified:
  marshall.py                    marshall.py-20070122110546-ggdrkocyus0pjsqd-1
  svnserver.py                   svnserver.py-20061015150253-0jjovnw1ax00rjlb-1
  tests/test_marshall.py         test_marshall.py-20070122110633-944cvow1y1hg6krp-1
  tests/test_server.py           test_server.py-20070122114402-zcwhr4cxc67jvakf-1
=== modified file 'marshall.py'
--- a/marshall.py	2007-01-22 12:58:40 +0000
+++ b/marshall.py	2007-01-22 13:58:06 +0000
@@ -23,6 +23,9 @@
     def __str__(self):
         return self.txt
 
+    def __repr__(self):
+        return self.txt
+
 # 1. Syntactic structure
 # ----------------------
 # 
@@ -42,6 +45,7 @@
     def __init__(self, msg):
         BzrError.__init__(self, msg)
 
+
 def marshall(x):
     if isinstance(x, int):
         return "%d " % x
@@ -53,6 +57,7 @@
         return "%d:%s " % (len(x), x)
     raise MarshallError("Unable to marshall type %s" % x)
 
+
 def unmarshall(x):
     whitespace = ['\n', ' ']
     if len(x) == 0:

=== modified file 'svnserver.py'
--- a/svnserver.py	2007-01-22 13:13:30 +0000
+++ b/svnserver.py	2007-01-22 13:58:06 +0000
@@ -16,10 +16,14 @@
 
 from bzrlib.branch import Branch
 from bzrlib.errors import BzrError
+from bzrlib.trace import mutter
 
 import os
 
-from marshall import marshall, unmarshall, literal
+from marshall import marshall, unmarshall, literal, MarshallError
+
+SVN_MAJOR_VERSION = 1
+SVN_MINOR_VERSION = 2
 
 class SVNServer:
     def __init__(self, rootdir, recv_fn, send_fn):
@@ -27,10 +31,12 @@
         self.recv_fn = recv_fn
         self.send_fn = send_fn
         self.inbuffer = ""
+        self._stop = False
 
     def send_greeting(self):
-        self.send_msg([literal("success"), [1, 2, [literal("ANONYMOUS")], 
-                        [ literal("edit-pipeline") ] ]])
+        self.send_msg([literal("success"), 
+            [SVN_MAJOR_VERSION, SVN_MINOR_VERSION, [literal("ANONYMOUS")], 
+                        [ ] ]])
 
     def send_mechs(self):
         self.send_msg([literal("success"), [literal("ANONYMOUS")], ""])
@@ -85,6 +91,12 @@
     def serve(self):
         self.send_greeting()
         (version, capabilities, url) = self.recv_msg()
+        self.capabilities = capabilities
+        self.version = version
+        self.url = url
+        mutter("client supports:")
+        mutter("  version %r" % version)
+        mutter("  capabilities %r " % capabilities)
 
         self.send_mechs()
 
@@ -99,19 +111,24 @@
             self.branch.base.replace(self.rootdir, rooturl)]])
 
         # Expect:
-        while not self.instr.closed:
+        while not self._stop:
             ( cmd, args ) = self.recv_msg()
             self.commands[cmd](self, *args)
 
+    def close(self):
+        self._stop = True
+
     def recv_msg(self):
         # FIXME: Blocking read?
         while True:
             try:
                 self.inbuffer += self.recv_fn()
                 (self.inbuffer, ret) = unmarshall(self.inbuffer)
+                mutter('in: %r' % ret)
                 return ret
-            except IndexError:
-                pass
+            except MarshallError, e:
+                mutter('ERROR: %r' % e)
 
     def send_msg(self, data):
+        mutter('out: %r' % data)
         self.send_fn(marshall(data))

=== modified file 'tests/test_marshall.py'
--- a/tests/test_marshall.py	2007-01-22 12:58:40 +0000
+++ b/tests/test_marshall.py	2007-01-22 13:58:06 +0000
@@ -26,6 +26,10 @@
         l = literal("foo bar")
         self.assertEqual("foo bar", l.__str__())
 
+    def test_literal_rep(self):
+        l = literal("foo bar")
+        self.assertEqual("foo bar", l.__repr__())
+
     def test_marshall_error(self):
         e = MarshallError("bla bla")
         self.assertEqual("bla bla", e.__str__())

=== modified file 'tests/test_server.py'
--- a/tests/test_server.py	2007-01-22 13:13:30 +0000
+++ b/tests/test_server.py	2007-01-22 13:58:06 +0000
@@ -21,17 +21,51 @@
 
 from cStringIO import StringIO
 import os
+import socket
+import threading
 
-class TestServer(TestCaseInTempDir):
+class DryTestServer(TestCaseInTempDir):
     def setUp(self):
-        super(TestServer, self).setUp()
+        super(DryTestServer, self).setUp()
         self.branch_path = os.path.join(self.test_dir, 'a')
         self.branch = Branch.initialize(self.branch_path)
         self.outstr = StringIO()
-        self.server = SVNServer(self.branch_path, None, self.outstr.send)
+        self.server = SVNServer(self.branch_path, None, self.outstr.write)
 
     def test_send_greeting(self):
         self.server.send_greeting()
         self.outstr.seek(0)
-        self.assertEqual("( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) ) ",
+        self.assertEqual("( success ( 1 2 ( ANONYMOUS ) ( ) ) ) ",
                          self.outstr.read())
+
+import svn.client, svn.ra
+from svn.core import Pool
+
+class NativeTestServer(TestCaseInTempDir):
+    def setUp(self):
+        super(NativeTestServer, self).setUp()
+        self.branch_path = os.path.join(self.test_dir, 'a')
+        self.branch = Branch.initialize(self.branch_path)
+        self.outstr = StringIO()
+        self.pool = Pool()
+        self.client_ctx = svn.client.create_context(self.pool)
+        self.server = SVNServer(self.branch_path, None, self.outstr.write)
+        server_sock = socket.socket()
+        server_sock.listen(1)
+        addr = server_sock.getsockname()
+        def handle_connection():
+            sock, client_addr = server_sock.accept()
+            self.server = SVNServer(self.branch_path, lambda: sock.recv(1024), sock.send)
+            self.server.serve()
+        self.server_thread = threading.Thread(None, handle_connection, name='svn-smart-server')
+        self.server_thread.setDaemon(True)
+        self.server_thread.start()
+        self.ra = svn.client.open_ra_session("svn://%s:%d/" % addr, 
+                                            self.client_ctx, self.pool)
+
+    def tearDown(self):
+        super(NativeTestServer, self).tearDown()
+        self.server.close()
+
+    def test_get_uuid(self):
+        self.assertEqual("foo", svn.ra.get_uuid(self.ra))




More information about the bazaar-commits mailing list