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
+

Reply via email to