Author: laukpe
Date: Wed Jan 21 04:28:24 2009
New Revision: 1307
Modified:
trunk/proto/remote/Remote.py
Log:
moved xmlprc specific code to separate XmlRpcRemoteClient and created
initial structure for RmiRemoteClient
Modified: trunk/proto/remote/Remote.py
==============================================================================
--- trunk/proto/remote/Remote.py (original)
+++ trunk/proto/remote/Remote.py Wed Jan 21 04:28:24 2009
@@ -17,53 +17,41 @@
def __init__(self, uri='http://localhost:8270'):
if '://' not in uri:
uri = 'http://' + uri
- self._library = xmlrpclib.ServerProxy(uri, encoding='UTF-8')
+ if uri.startswith('rmi://'):
+ self._client = RmiRemoteClient(uri)
+ else:
+ self._client = XmlRpcRemoteClient(uri)
def get_keyword_names(self, attempts=5):
for i in range(attempts):
try:
- return self._library.get_keyword_names()
- except socket.error, (errno, err):
+ return self._client.get_keyword_names()
+ except TypeError, 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):
try:
- return self._library.get_keyword_arguments(name)
- except (xmlrpclib.Error, socket.error):
+ return self._client.get_keyword_arguments(name)
+ except TypeError:
return ['*args']
def get_keyword_documentation(self, name):
try:
- return self._library.get_keyword_documentation(name)
- except (xmlrpclib.Error, socket.error):
+ return self._client.get_keyword_documentation(name)
+ except TypeError:
return ''
def run_keyword(self, name, args):
- result = _Result(self._run_keyword(name, args))
+ args = [ self._handle_argument(arg) for arg in args ]
+ result = RemoteResult(self._client.run_keyword(name, args))
sys.stdout.write(result.output)
if result.status != 'PASS':
- self._raise_failed(result.error, result.traceback)
+ raise RemoteError(result.error, result.traceback)
return result.return_
- def _run_keyword(self, name, args):
- args = [ self._handle_argument(arg) for arg in args ]
- try:
- return self._library.run_keyword(name, args)
- except xmlrpclib.Error, err:
- raise RuntimeError(err.faultString)
- except socket.error, (errno, err):
- raise RuntimeError('Connection to remote server broken: %s' %
err)
- except ExpatError, err:
- raise RuntimeError('Processing XML-RPC return value failed. '
- 'Most often this happens when the return
value '
- 'contains characters that are not valid in
XML. '
- 'Original error was: ExpatError: %s' % err)
-
def _handle_argument(self, arg):
+ # TODO: Should handle also basic Java types
if isinstance(arg, (basestring, int, long, float, bool)):
return arg
if isinstance(arg, (tuple, list)):
@@ -78,19 +66,8 @@
return ''
return str(item)
- def _raise_failed(self, message, traceback):
- # Support for RF 2.0.2 and earlier
- if not RemoteError:
- print '*INFO*', traceback
- raise AssertionError(message)
- raise RemoteError(message, traceback)
-
-class _RmlRpcClient:
-
-
-
-class _Result:
+class RemoteResult:
def __init__(self, result):
try:
@@ -100,4 +77,70 @@
self.error = result.get('error', '')
self.traceback = result.get('traceback', '')
except (KeyError, AttributeError):
- raise RuntimeError('Invalid result dictionary: %s' % result)
+ raise RuntimeError('Invalid remote result dictionary: %s' %
result)
+
+
+class XmlRpcRemoteClient:
+
+ def __init__(self, uri):
+ self._server = xmlrpclib.ServerProxy(uri, encoding='UTF-8')
+
+ def get_keyword_names(self):
+ try:
+ return self._server.get_keyword_names()
+ except socket.error, (errno, err):
+ raise TypeError(err)
+ except xmlrpclib.Error, err:
+ raise TypeError(err)
+
+ def get_keyword_arguments(self, name):
+ try:
+ return self._server.get_keyword_arguments(name)
+ except xmlrpclib.Error:
+ return TypeError
+
+ def get_keyword_documentation(self, name):
+ try:
+ return self._server.get_keyword_documentation(name)
+ except xmlrpclib.Error:
+ return TypeError
+
+ def run_keyword(self, name, args):
+ try:
+ return self._server.run_keyword(name, args)
+ except xmlrpclib.Error, err:
+ raise RuntimeError(err.faultString)
+ except socket.error, (errno, err):
+ raise RuntimeError('Connection to remote server broken: %s' %
err)
+ except ExpatError, err:
+ raise RuntimeError('Processing XML-RPC return value failed. '
+ 'Most often this happens when the return
value '
+ 'contains characters that are not valid in
XML. '
+ 'Original error was: ExpatError: %s' % err)
+
+
+if not sys.platform.startswith('java'):
+
+ def RmiRemoteClient(uri):
+ raise RuntimeError('Using RMI requires running tests with Jython')
+
+else:
+
+ # from java.xxx import RMIStuff
+
+ class RmiRemoteClient:
+
+ def __init__(self, uri):
+ pass
+
+ def get_keyword_names(self):
+ return ['test']
+
+ def get_keyword_arguments(self, name):
+ raise TypeError
+
+ def get_keyword_documentation(self, name):
+ raise TypeError
+
+ def run_keyword(self, name, args):
+ return {'status': 'PASS', 'output': 'Hello, world!\n'}