Author: laukpe
Date: Fri Sep 19 03:26:48 2008
New Revision: 764

Added:
   trunk/proto/xmlrpc/test/util.py
- copied, changed from r763, /trunk/proto/xmlrpc/test/XmlRpcServerHandler.py
Removed:
   trunk/proto/xmlrpc/test/XmlRpcServerHandler.py
   trunk/proto/xmlrpc/test/port.py
Modified:
   trunk/proto/xmlrpc/RobotRemoteLibrary.py
   trunk/proto/xmlrpc/python/RobotRemoteServer.py
   trunk/proto/xmlrpc/python/test.sh
   trunk/proto/xmlrpc/test/remote_library.html

Log:
1) more cleanup, 2) clean way to shut down the server remotely (no more hanging processes)

Modified: trunk/proto/xmlrpc/RobotRemoteLibrary.py
==============================================================================
--- trunk/proto/xmlrpc/RobotRemoteLibrary.py    (original)
+++ trunk/proto/xmlrpc/RobotRemoteLibrary.py    Fri Sep 19 03:26:48 2008
@@ -11,7 +11,8 @@
         self._library = xmlrpclib.Server(uri)  #.robotframework

     def get_keyword_names(self):
-        return self._library.get_keyword_names()
+        # TODO: Support also getKeywordNames (and runKeyword etc.)
+        return self._library.get_keyword_names() + ['Stop Remote Server']

 #    def get_keyword_arguments(self, name):
         # TODO: Handle errors
@@ -21,6 +22,10 @@
  #       return self._library.get_keyword_documentation(name)

     def run_keyword(self, name, args):
+        if name == 'Stop Remote Server':
+            self._library.stop()
+            del self._library  # Needed?
+            return
         try:
             result = self._library.run_keyword(name, args)
         except xmlrpclib.Fault, err:

Modified: trunk/proto/xmlrpc/python/RobotRemoteServer.py
==============================================================================
--- trunk/proto/xmlrpc/python/RobotRemoteServer.py      (original)
+++ trunk/proto/xmlrpc/python/RobotRemoteServer.py      Fri Sep 19 03:26:48 2008
@@ -1,30 +1,41 @@
 import sys
-from SimpleXMLRPCServer import SimpleXMLRPCServer
-from StringIO import StringIO
 from datetime import datetime
+from StringIO import StringIO
 from types import MethodType, FunctionType
+from SimpleXMLRPCServer import SimpleXMLRPCServer
+try:
+    import signal
+except ImportError:
+    signal = None


 class RobotRemoteServer(SimpleXMLRPCServer):

-    _supported_types = (datetime, int, long, float, bool, basestring,
-                        tuple, dict, list)
-    # TODO: What about tuple/dict/list containing non-supported types?
-    # Same issue also with the ruby version.
+    _supported_types = (basestring, int, long, float, bool,
+                        datetime, tuple, dict, list)

     def __init__(self, library, port=8270):
-        SimpleXMLRPCServer.__init__(self, ('localhost', int(port)),
-                                    allow_none=True)
-        # TODO: allow_none doesn't seem to be available in Python 2.3
+        # Cannot use allow_none attribute since it's been added in 2.5
+        SimpleXMLRPCServer.__init__(self, ('localhost', int(port)))
         self._library = library
         self.register_function(self.get_keyword_names)
         self.register_function(self.run_keyword)
         self.register_function(self.stop)
-        self.register_introspection_functions()
+ # May want to enable this later. May also want to use DocXMLRPCServer.
+        # self.register_introspection_functions()
+        if signal:
+            signal.signal(signal.SIGHUP, lambda signum, frame: self.stop())
+            signal.signal(signal.SIGINT, lambda signum, frame: self.stop())
         self.serve_forever()

+    def serve_forever(self):
+        self._shutdown = False
+        while not self._shutdown:
+            self.handle_request()
+
     def stop(self):
-        self.server_close()
+        self._shutdown = True
+        return True

     def get_keyword_names(self):
         return [ attr for attr in dir(self._library) if attr[0] != '_'
@@ -44,7 +55,12 @@
         return result

     def _convert_value_for_xmlrpc(self, return_value):
-        if isinstance(return_value, self._supported_types):
+        # Can't set 'allow_none' in init because it's only in Python 2.5
+        if return_value is None:
+            return ''
+        # TODO: What about tuple/dict/list containing non-supported types?
+        # Same issue also with the ruby version.
+        elif isinstance(return_value, self._supported_types):
             return return_value
         else:
             return str(return_value)

Modified: trunk/proto/xmlrpc/python/test.sh
==============================================================================
--- trunk/proto/xmlrpc/python/test.sh   (original)
+++ trunk/proto/xmlrpc/python/test.sh   Fri Sep 19 03:26:48 2008
@@ -1,14 +1,14 @@
 #!/bin/bash

-base=$(dirname $0)
-cd $base/..
+cd $(dirname $0)/..

 python python/examplelibrary.py 2> /dev/null &
 sleep 1
+
pybot --log none --report none --output logs/output.xml test/remote_library.html
+
 ../../tools/statuschecker/statuschecker.py logs/output.xml
 rebot --outputdir logs logs/output.xml
-rc=$?
-python test/XmlRpcServerHandler.py stop
-echo $rc tests failed
+
+echo $? tests failed


Modified: trunk/proto/xmlrpc/test/remote_library.html
==============================================================================
--- trunk/proto/xmlrpc/test/remote_library.html (original)
+++ trunk/proto/xmlrpc/test/remote_library.html Fri Sep 19 03:26:48 2008
@@ -96,9 +96,9 @@

     <tr>

-      <td></td>
+      <td>Suite Teardown</td>

-      <td></td>
+      <td>Stop Remote Server</td>

       <td></td>


Copied: trunk/proto/xmlrpc/test/util.py (from r763, /trunk/proto/xmlrpc/test/XmlRpcServerHandler.py)
==============================================================================
--- /trunk/proto/xmlrpc/test/XmlRpcServerHandler.py     (original)
+++ trunk/proto/xmlrpc/test/util.py     Fri Sep 19 03:26:48 2008
@@ -11,7 +11,7 @@
     server.stop()  #.robotframework.stop()
     print "Stopped server at %s" % url

-def test_xmlrpc_server(port=8072, attempts=1):
+def test_xmlrpc_server(port=8270, attempts=1):
     url = 'http://localhost:%s' % port
     attempts = int(attempts)
     for i in range(attempts):

Reply via email to