summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_xmlrpc.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-08-16 23:48:43 (GMT)
committerGuido van Rossum <guido@python.org>2007-08-16 23:48:43 (GMT)
commitaf554a0e17ceb0e6a3cc0c07e9cf6db2f80c1ad9 (patch)
tree7719b2787d82dd1cc7afad76ad989fc9b1f1504f /Lib/test/test_xmlrpc.py
parent10c17ba299513184e39c85fc5c3ecaf2fd13187e (diff)
downloadcpython-af554a0e17ceb0e6a3cc0c07e9cf6db2f80c1ad9.zip
cpython-af554a0e17ceb0e6a3cc0c07e9cf6db2f80c1ad9.tar.gz
cpython-af554a0e17ceb0e6a3cc0c07e9cf6db2f80c1ad9.tar.bz2
First merge from the trunk straight into the py3k branch. I'm not
using the message generated by svnmerge, because it contains a lot of stuff about the Doc tree, which I'm not merging this time due to the way the Doc tree was initially added. I am however adding roman.py which was added later to Doc/tools. I'll try to diff the two Doc trees separately to see if there's stuff I missed.
Diffstat (limited to 'Lib/test/test_xmlrpc.py')
-rw-r--r--Lib/test/test_xmlrpc.py104
1 files changed, 102 insertions, 2 deletions
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 75a439f..4a15de5 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -4,6 +4,8 @@ import sys
import time
import unittest
import xmlrpclib
+import SimpleXMLRPCServer
+import threading
from test import test_support
alist = [{'astring': 'foo@bar.baz.spam',
@@ -239,10 +241,108 @@ class BinaryTestCase(unittest.TestCase):
self.assertEqual(str(t2), d)
+PORT = None
+
+def http_server(evt, numrequests):
+ class TestInstanceClass:
+ def div(self, x, y):
+ '''This is the div function'''
+ return x // y
+
+
+ serv = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0),
+ logRequests=False, bind_and_activate=False)
+
+ try:
+ serv.socket.settimeout(3)
+ serv.server_bind()
+ global PORT
+ PORT = serv.socket.getsockname()[1]
+ serv.server_activate()
+ serv.register_introspection_functions()
+ serv.register_multicall_functions()
+ serv.register_function(pow)
+ serv.register_function(lambda x,y: x+y, 'add')
+ serv.register_instance(TestInstanceClass())
+
+ # handle up to 'numrequests' requests
+ while numrequests > 0:
+ serv.handle_request()
+ numrequests -= 1
+
+ except socket.timeout:
+ pass
+ finally:
+ serv.socket.close()
+ PORT = None
+ evt.set()
+
+
+class HTTPTestCase(unittest.TestCase):
+ def setUp(self):
+ self.evt = threading.Event()
+ # start server thread to handle just one request
+ threading.Thread(target=http_server, args=(self.evt,2)).start()
+
+ # wait for port to be assigned to server
+ n = 1000
+ while n > 0 and PORT is None:
+ time.sleep(0.001)
+ n -= 1
+
+ time.sleep(0.5)
+
+ def tearDown(self):
+ # wait on the server thread to terminate
+ self.evt.wait()
+
+ def test_simple1(self):
+ p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+ self.assertEqual(p.pow(6,8), 6**8)
+
+ def test_introspection1(self):
+ p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+ meth = p.system.listMethods()
+ expected_methods = set(['pow', 'div', 'add', 'system.listMethods',
+ 'system.methodHelp', 'system.methodSignature', 'system.multicall'])
+ self.assertEqual(set(meth), expected_methods)
+
+ def test_introspection2(self):
+ p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+ divhelp = p.system.methodHelp('div')
+ self.assertEqual(divhelp, 'This is the div function')
+
+ def test_introspection3(self):
+ # the SimpleXMLRPCServer doesn't support signatures, but
+ # at least check that we can try
+ p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+ divsig = p.system.methodSignature('div')
+ self.assertEqual(divsig, 'signatures not supported')
+
+ def test_multicall(self):
+ p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
+ multicall = xmlrpclib.MultiCall(p)
+ multicall.add(2,3)
+ multicall.pow(6,8)
+ multicall.div(127,42)
+ add_result, pow_result, div_result = multicall()
+ self.assertEqual(add_result, 2+3)
+ self.assertEqual(pow_result, 6**8)
+ self.assertEqual(div_result, 127//42)
+
+
def test_main():
- test_support.run_unittest(XMLRPCTestCase, HelperTestCase,
- DateTimeTestCase, BinaryTestCase, FaultTestCase)
+ xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
+ BinaryTestCase, FaultTestCase]
+
+ # The test cases against a SimpleXMLRPCServer raise a socket error
+ # 10035 (WSAEWOULDBLOCK) in the server thread handle_request call when
+ # run on Windows. This only happens on the first test to run, but it
+ # fails every time and so these tests are skipped on win32 platforms.
+ if sys.platform != 'win32':
+ xmlrpc_tests.append(HTTPTestCase)
+ test_support.run_unittest(*xmlrpc_tests)
if __name__ == "__main__":
test_main()