Issue #6615: logging: Used weak references in internal handler list. Thanks to flox...
[python.git] / Lib / test / test_docxmlrpc.py
blob2c13cec922c81c9c3147b201d751e156b7db6ccd
1 from DocXMLRPCServer import DocXMLRPCServer
2 import httplib
3 from test import test_support
4 import threading
5 import time
6 import unittest
7 import xmlrpclib
9 PORT = None
11 def server(evt, numrequests):
12 serv = DocXMLRPCServer(("localhost", 0), logRequests=False)
14 try:
15 global PORT
16 PORT = serv.socket.getsockname()[1]
18 # Add some documentation
19 serv.set_server_title("DocXMLRPCServer Test Documentation")
20 serv.set_server_name("DocXMLRPCServer Test Docs")
21 serv.set_server_documentation(
22 """This is an XML-RPC server's documentation, but the server can be used by
23 POSTing to /RPC2. Try self.add, too.""")
25 # Create and register classes and functions
26 class TestClass(object):
27 def test_method(self, arg):
28 """Test method's docs. This method truly does very little."""
29 self.arg = arg
31 serv.register_introspection_functions()
32 serv.register_instance(TestClass())
34 def add(x, y):
35 """Add two instances together. This follows PEP008, but has nothing
36 to do with RFC1952. Case should matter: pEp008 and rFC1952. Things
37 that start with http and ftp should be auto-linked, too:
38 http://google.com.
39 """
40 return x + y
42 serv.register_function(add)
43 serv.register_function(lambda x, y: x-y)
45 while numrequests > 0:
46 serv.handle_request()
47 numrequests -= 1
48 except socket.timeout:
49 pass
50 finally:
51 serv.server_close()
52 PORT = None
53 evt.set()
55 class DocXMLRPCHTTPGETServer(unittest.TestCase):
56 def setUp(self):
57 self._threads = test_support.threading_setup()
58 # Enable server feedback
59 DocXMLRPCServer._send_traceback_header = True
61 self.evt = threading.Event()
62 threading.Thread(target=server, args=(self.evt, 1)).start()
64 # wait for port to be assigned
65 n = 1000
66 while n > 0 and PORT is None:
67 time.sleep(0.001)
68 n -= 1
70 self.client = httplib.HTTPConnection("localhost:%d" % PORT)
72 def tearDown(self):
73 self.client.close()
75 self.evt.wait()
77 # Disable server feedback
78 DocXMLRPCServer._send_traceback_header = False
79 test_support.threading_cleanup(*self._threads)
81 def test_valid_get_response(self):
82 self.client.request("GET", "/")
83 response = self.client.getresponse()
85 self.assertEqual(response.status, 200)
86 self.assertEqual(response.getheader("Content-type"), "text/html")
88 # Server throws an exception if we don't start to read the data
89 response.read()
91 def test_invalid_get_response(self):
92 self.client.request("GET", "/spam")
93 response = self.client.getresponse()
95 self.assertEqual(response.status, 404)
96 self.assertEqual(response.getheader("Content-type"), "text/plain")
98 response.read()
100 def test_lambda(self):
101 """Test that lambda functionality stays the same. The output produced
102 currently is, I suspect invalid because of the unencoded brackets in the
103 HTML, "<lambda>".
105 The subtraction lambda method is tested.
107 self.client.request("GET", "/")
108 response = self.client.getresponse()
110 self.assertTrue(
111 """<dl><dt><a name="-&lt;lambda&gt;"><strong>&lt;lambda&gt;</strong></a>(x, y)</dt></dl>"""
112 in response.read())
114 def test_autolinking(self):
115 """Test that the server correctly automatically wraps references to PEPS
116 and RFCs with links, and that it linkifies text starting with http or
117 ftp protocol prefixes.
119 The documentation for the "add" method contains the test material.
121 self.client.request("GET", "/")
122 response = self.client.getresponse()
124 self.assertTrue( # This is ugly ... how can it be made better?
125 """<dl><dt><a name="-add"><strong>add</strong></a>(x, y)</dt><dd><tt>Add&nbsp;two&nbsp;instances&nbsp;together.&nbsp;This&nbsp;follows&nbsp;<a href="http://www.python.org/dev/peps/pep-0008/">PEP008</a>,&nbsp;but&nbsp;has&nbsp;nothing<br>\nto&nbsp;do&nbsp;with&nbsp;<a href="http://www.rfc-editor.org/rfc/rfc1952.txt">RFC1952</a>.&nbsp;Case&nbsp;should&nbsp;matter:&nbsp;pEp008&nbsp;and&nbsp;rFC1952.&nbsp;&nbsp;Things<br>\nthat&nbsp;start&nbsp;with&nbsp;http&nbsp;and&nbsp;ftp&nbsp;should&nbsp;be&nbsp;auto-linked,&nbsp;too:<br>\n<a href="http://google.com">http://google.com</a>.</tt></dd></dl>"""
126 in response.read())
128 def test_system_methods(self):
129 """Test the precense of three consecutive system.* methods.
131 This also tests their use of parameter type recognition and the systems
132 related to that process.
134 self.client.request("GET", "/")
135 response = self.client.getresponse()
137 self.assertTrue(
138 """<dl><dt><a name="-system.listMethods"><strong>system.listMethods</strong></a>()</dt><dd><tt><a href="#-system.listMethods">system.listMethods</a>()&nbsp;=&gt;&nbsp;[\'add\',&nbsp;\'subtract\',&nbsp;\'multiple\']<br>\n&nbsp;<br>\nReturns&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;methods&nbsp;supported&nbsp;by&nbsp;the&nbsp;server.</tt></dd></dl>\n <dl><dt><a name="-system.methodHelp"><strong>system.methodHelp</strong></a>(method_name)</dt><dd><tt><a href="#-system.methodHelp">system.methodHelp</a>(\'add\')&nbsp;=&gt;&nbsp;"Adds&nbsp;two&nbsp;integers&nbsp;together"<br>\n&nbsp;<br>\nReturns&nbsp;a&nbsp;string&nbsp;containing&nbsp;documentation&nbsp;for&nbsp;the&nbsp;specified&nbsp;method.</tt></dd></dl>\n <dl><dt><a name="-system.methodSignature"><strong>system.methodSignature</strong></a>(method_name)</dt><dd><tt><a href="#-system.methodSignature">system.methodSignature</a>(\'add\')&nbsp;=&gt;&nbsp;[double,&nbsp;int,&nbsp;int]<br>\n&nbsp;<br>\nReturns&nbsp;a&nbsp;list&nbsp;describing&nbsp;the&nbsp;signature&nbsp;of&nbsp;the&nbsp;method.&nbsp;In&nbsp;the<br>\nabove&nbsp;example,&nbsp;the&nbsp;add&nbsp;method&nbsp;takes&nbsp;two&nbsp;integers&nbsp;as&nbsp;arguments<br>\nand&nbsp;returns&nbsp;a&nbsp;double&nbsp;result.<br>\n&nbsp;<br>\nThis&nbsp;server&nbsp;does&nbsp;NOT&nbsp;support&nbsp;system.methodSignature.</tt></dd></dl>"""
139 in response.read())
141 def test_autolink_dotted_methods(self):
142 """Test that selfdot values are made strong automatically in the
143 documentation."""
144 self.client.request("GET", "/")
145 response = self.client.getresponse()
147 self.assertTrue("""Try&nbsp;self.<strong>add</strong>,&nbsp;too.""" in
148 response.read())
150 def test_main():
151 test_support.run_unittest(DocXMLRPCHTTPGETServer)
153 if __name__ == '__main__':
154 test_main()