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)