Author: laukpe
Date: Fri Sep 26 12:12:01 2008
New Revision: 842

Modified:
   trunk/proto/remote/Remote.py

Log:
1) Better error handling, 2) Check result dict and have empty string as default for other values than status

Modified: trunk/proto/remote/Remote.py
==============================================================================
--- trunk/proto/remote/Remote.py        (original)
+++ trunk/proto/remote/Remote.py        Fri Sep 26 12:12:01 2008
@@ -1,4 +1,6 @@
 import xmlrpclib
+import socket
+import time

 try:
     from robot.errors import RemoteError
@@ -15,27 +17,44 @@
             uri = 'http://' + uri
         self._library = xmlrpclib.Server(uri)

-    def get_keyword_names(self):
-        # TODO: Support also getKeywordNames (and runKeyword etc.)
-        return self._library.get_keyword_names()
+    def get_keyword_names(self, attempts=5):
+        for i in range(attempts):
+            try:
+                return self._library.get_keyword_names()
+            except socket.error, (errno, err):
+                time.sleep(1)
+            except xmlrpclib.Error, err:
+                err = err.faultString
+                break
+        raise RuntimeError('Connecting remote server failed: %s' % err)

     def get_keyword_arguments(self, name):
-        # TODO: Handle errors
-        return self._library.get_keyword_arguments(name)
+        try:
+            return self._library.get_keyword_arguments(name)
+        except (xmlrpclib.Error, socket.error):
+            return ['*args']

     def get_keyword_documentation(self, name):
-        return self._library.get_keyword_documentation(name)
+        try:
+            return self._library.get_keyword_documentation(name)
+        except (xmlrpclib.Error, socket.error):
+            return ''

     def run_keyword(self, name, args):
+        result = _Result(self._run_keyword(name, args))
+        print result.output
+        if result.status != 'PASS':
+            self._raise_failed(result.error, result.traceback)
+        return result.return_
+
+    def _run_keyword(self, name, args):
         args = [ self._handle_argument(arg) for arg in args ]
         try:
-            result = self._library.run_keyword(name, args)
-        except xmlrpclib.Fault, err:
+            return self._library.run_keyword(name, args)
+        except xmlrpclib.Error, err:
             raise RuntimeError(err.faultString)
-        print result['output']
-        if result['status'] != 'PASS':
- self._raise_failed(result['error'], result.get('traceback', ''))
-        return result['return']
+        except socket.error, (errno, err):
+ raise RuntimeError('Connection to remote server broken: %s' % err)

     def _handle_argument(self, arg):
         if isinstance(arg, (basestring, int, long, float, bool)):
@@ -59,3 +78,15 @@
         print '*INFO*', traceback
         raise AssertionError(message)

+
+class _Result:
+
+    def __init__(self, result):
+        try:
+            self.status = result['status']
+            self.output = result.get('output', '')
+            self.return_ = result.get('return', '')
+            self.error = result.get('error', '')
+            self.traceback = result.get('traceback', '')
+        except (KeyError, AttributeError):
+            raise RuntimeError('Invalid result dictionary: %s' % result)

Reply via email to