Author: laukpe
Date: Fri Sep 19 01:26:23 2008
New Revision: 762
Added:
trunk/proto/xmlrpc/python/examplelibrary.py
- copied, changed from r642, /trunk/proto/xmlrpc/python/MyLibrary.py
trunk/proto/xmlrpc/test_python.sh (contents, props changed)
trunk/proto/xmlrpc/test_ruby.sh
- copied unchanged from r642, /trunk/proto/xmlrpc/run.sh
Removed:
trunk/proto/xmlrpc/python/MyLibrary.py
trunk/proto/xmlrpc/run.sh
Modified:
trunk/proto/xmlrpc/RobotXmlRpc.py
trunk/proto/xmlrpc/python/RobotXMLRPCServer.py
trunk/proto/xmlrpc/test/XmlRpcServerHandler.py
Log:
bigbang commit
Modified: trunk/proto/xmlrpc/RobotXmlRpc.py
==============================================================================
--- trunk/proto/xmlrpc/RobotXmlRpc.py (original)
+++ trunk/proto/xmlrpc/RobotXmlRpc.py Fri Sep 19 01:26:23 2008
@@ -8,17 +8,17 @@
def __init__(self, uri):
if '://' not in uri:
uri = 'http://' + uri
- self._library = xmlrpclib.Server(uri).robotframework
+ self._library = xmlrpclib.Server(uri) #.robotframework
def get_keyword_names(self):
return self._library.get_keyword_names()
- def get_keyword_arguments(self, name):
+# def get_keyword_arguments(self, name):
# TODO: Handle errors
- return self._library.get_keyword_arguments(name)
+# return self._library.get_keyword_arguments(name)
- def get_keyword_documentation(self, name):
- return self._library.get_keyword_documentation(name)
+ # def get_keyword_documentation(self, name):
+ # return self._library.get_keyword_documentation(name)
def run_keyword(self, name, args):
try:
Modified: trunk/proto/xmlrpc/python/RobotXMLRPCServer.py
==============================================================================
--- trunk/proto/xmlrpc/python/RobotXMLRPCServer.py (original)
+++ trunk/proto/xmlrpc/python/RobotXMLRPCServer.py Fri Sep 19 01:26:23 2008
@@ -1,28 +1,41 @@
+import sys
from SimpleXMLRPCServer import SimpleXMLRPCServer
-from types import *
from StringIO import StringIO
from datetime import datetime
+from types import MethodType, FunctionType
-SUPPORTED_TYPES = [datetime(1,1,1).__class__, IntType, FloatType,
- BooleanType, StringType, TupleType, DictType, ListType]
-
-class RobotXMLRPCServer(SimpleXMLRPCServer):
+class RobotXmlRpcServer(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.
+
def __init__(self, library, port=8080):
- SimpleXMLRPCServer.__init__(self, ('localhost', port))
- self.library = library
+ SimpleXMLRPCServer.__init__(self, ('localhost', int(port)),
+ allow_none=True)
+ # TODO: allow_none doesn't seem to be available in Python 2.3
+ 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()
+ self.serve_forever()
+
+ def stop(self):
+ self.server_close()
def get_keyword_names(self):
- print dir(library)
- return dir(library)
+ return [ attr for attr in dir(self._library) if attr[0] != '_'
+ and isinstance(getattr(self._library, attr),
+ (MethodType, FunctionType)) ]
def run_keyword(self, name, args):
self._redirect_stdout()
result = {'status':'PASS', 'return':'', 'message':'', 'output':''}
try:
- method = getattr(name, self.library)
- return_value = self.library.method(*args)
+ return_value = getattr(self._library, name)(*args)
result['return'] = self._convert_value_for_xmlrpc(return_value)
except Exception, exception:
result['status'] = 'FAIL'
@@ -31,27 +44,17 @@
return result
def _convert_value_for_xmlrpc(self, return_value):
- # Because ruby's xmlrpc does not support sending nil values,
- # those have to be converter to empty strings
- # if return_value == nil
- # return ''
- # end
- if SUPPORTED_TYPES.count(return_value.__class__) > 0:
+ if isinstance(return_value, self._supported_types):
return return_value
else:
return str(return_value)
def _redirect_stdout(self):
- self.io = StringIO
- sys.stdout = self.io
- sys.stderr = self.io
+ # TODO: What about stderr?
+ sys.stdout = StringIO()
def _restore_stdout(self):
+ output = sys.stdout.read()
+ sys.stdout.close()
sys.stdout = sys.__stdout__
- sys.stderr = sys.__stderr__
- result = self.io.read()
- self.io.close()
- return result
-
- def stop(self):
- self.server_close()
+ return output
Copied: trunk/proto/xmlrpc/python/examplelibrary.py (from r642,
/trunk/proto/xmlrpc/python/MyLibrary.py)
==============================================================================
--- /trunk/proto/xmlrpc/python/MyLibrary.py (original)
+++ trunk/proto/xmlrpc/python/examplelibrary.py Fri Sep 19 01:26:23 2008
@@ -2,75 +2,87 @@
import sys
import types
-class MyLibrary:
-
- def divide(self, a, b):
- return a / b
+
+class PythonLibraryExample:
+
+ def do_nothing(self):
+ pass
- def raise_failure(self, message):
+ def failure(self, message):
raise AssertionError(message)
-
- def logging(self, message, message_level='INFO'):
- print '*' + message_level + '* ' + message
-
- def return_nothing(self):
- return None
-
- def return_multiple_values(self, value1, value2):
- return value1, value2
-
- def check_argument_is_boolean_type_true(self, arg):
- self.arguments_type_should_be(arg, True.__class__)
- return arg
-
- def return_true():
- return True
- def check_argument_is_string_type(self, arg):
- self.arguments_type_should_be(arg, types.StringType)
- return arg
-
- def arguments_type_should_be(self, arg, type):
- if not arg.__class__ == type:
- raise Exception, 'Arguments type should be '+ type +' but
was ' + arg.__class__
+ def error(self):
+ 1/0
- def should_be_list(self, arg):
- if arg != ['a','b','c']:
- raise AsserionError, "Given list is not ['a', 'b', 'c']"
- return arg
+ def logging(self, message, level='INFO'):
+ print '*%s* %s' % (level, message)
+
+ def one_argument(self, arg):
+ print 'arg: %s' % arg
+
+ def two_arguments(self, arg1, arg2):
+ print '*INFO* arg1: %s' % arg1
+ print '*INFO* arg2: %s' % arg2
+
+ def arguments_with_default_values(self, arg1, arg2='two', arg3=42):
+ print '%s | %s | %s' % (arg1, arg2, arg3)
+
+ def variable_number_of_arguments(self, *args):
+ return ' '.join(args)
+
+ def required_defaults_and_varargs(self, req, default='world',
*varargs):
+ return ' '.join((req, default) + varargs)
+
+ def argument_should_be_string(self, arg):
+ self.argument_type_should_be(arg, basestring)
+
+ def argument_should_be_integer(self, arg):
+ self.argument_type_should_be(arg, int)
+
+ def argument_should_be_float(self, arg):
+ self.argument_type_should_be(arg, float)
+
+ def argument_should_be_boolean(self, arg):
+ self.argument_type_should_be(arg, bool)
+
+ def argument_type_should_be(self, arg, type_):
+ if not isinstance(arg, type_):
+ raise AssertionError('Argument type should be %s but was %s'
+ % (type_, type(arg)))
+
+ def return_string(self):
+ return 'Hello, world!'
+
+ def return_integer(self):
+ return 42
- def should_be_dictionary(self, arg):
- if arg != {'a':1, 'b':'Hello', 'c':['a', 1]}:
- raise AssertionError, "Given argument is not {'a'=>
1, 'b'=>'Hello', 'c' => ['a', 1]}"
- return arg
+ def return_float(self):
+ return -0.5
+ def return_boolean(self):
+ return true
+
+ def return_multiple_values(self, given):
+ return 'first', 2, -3.14, given
+
def return_object(self):
- return MyObject()
+ return MyObjectToReturn()
+
+ def _private_method(self):
+ pass
+
+ def __private_method(self):
+ pass
+
+class MyObjectToReturn:
+ def __str__(self):
+ return "String representation of MyObjectToReturn"
-class MyObject:
- def __str__(self):
- return "String representation of MyObject"
-
-#METHODS FOR STARTING THE LIBRARY FROM COMMAND LINE
-
-def start(port):
- sys.path.append(os.path.abspath(os.path.dirname(__file__)))
- from RobotXMLRPCServer import RobotXMLRPCServer
-
- server = RobotXMLRPCServer(MyLibrary(), port)
- server.register_function(server.get_keyword_names)
- server.register_function(server.run_keyword)
- server.register_introspection_functions()
- server.serve_forever()
-
-def help():
- print """
- Usage: %s port"
-""" % (__file__)
if __name__ == '__main__':
- if len(sys.argv) != 2:
- help()
+ if len(sys.argv) == 2:
+ from RobotXMLRPCServer import RobotXmlRpcServer
+ RobotXmlRpcServer(PythonLibraryExample(), sys.argv[1])
else:
- start(int(sys.argv[1]))
+ print 'Usage: %s port' % sys.argv[0]
Modified: trunk/proto/xmlrpc/test/XmlRpcServerHandler.py
==============================================================================
--- trunk/proto/xmlrpc/test/XmlRpcServerHandler.py (original)
+++ trunk/proto/xmlrpc/test/XmlRpcServerHandler.py Fri Sep 19 01:26:23 2008
@@ -8,7 +8,7 @@
def stop_xmlrpc_server(port):
url = 'http://localhost:%s' % port
server = xmlrpclib.ServerProxy(url)
- server.robotframework.stop()
+ server.stop() #.robotframework.stop()
print "Stopped server at %s" % url
def test_xmlrpc_server(port, attempts=1):
Added: trunk/proto/xmlrpc/test_python.sh
==============================================================================
--- (empty file)
+++ trunk/proto/xmlrpc/test_python.sh Fri Sep 19 01:26:23 2008
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+cd python
+python examplelibrary.py 1234 2> /dev/null &
+cd ..
+sleep 1
+pybot --variable PORT:1234 --log none --report none --output
logs/output.xml test/xmlrpc.html
+../../tools/statuschecker/statuschecker.py logs/output.xml
+rebot --outputdir logs logs/output.xml
+rc=$?
+python test/XmlRpcServerHandler.py stop 1234
+echo $rc tests failed
+