annotate test/wsgi_liveserver.py @ 8472:224ccb8b49ca

refactor: change some classes to use __slots__ Speed up access to and reduce size of some low level classes. A few classes in security.py, rest.py are heavily used. But for all, it prevents adding random properties to lower level classes that people shouldn't be mucking with. While doing this I found some test cases accessing an invalid property name and this change caused the cases to crash. admin.py: Use new method Role.props_dict() and Permission.props_dict() where original code just referenced __dict__ when printing Role/Permission. mlink_expr.py: Add slots to multiple classes. Classes Binary and Unary set real properties/attributes. Classes that inherit from them (Equals, Empty, Not, Or, And) define empty slots tuple to eliminate need for __dict__. Class Expression also gets a slot. rate_limit.py: RateLimit and Gcra classes get slots. A couple of pep8 fixes: sort imports, remove trailing spaces on a line, remove unused noqa comment. rest.py: Add slots to class SimulateFieldStorageFromJson and FsValue classes. The memory savings from this could be useful as well as speedier access to the attributes. security.py: Add slots to Permission class. To prevent conflict between slot limit_perm_to_props_only and the class variable of the same name, rename the class variable to limit_perm_to_props_only_default. Also define method props_dict() to allow other code to get a dict to iterate over when checking permissions. Add slots to class Role along with props_dict() method. Add slots to class Security. Also have to add explicit __dict__ slot to support test override of the hasPermission() method. Add props_dict() method, currently unused, but added for symmetry. support.py: TruthDict and PrioList gets slots. test/test_cgi.py: Fix incorrect setting of permission property. Was setting permissions. So testing may not have been doing what we thought it was. Multiple places found with this typo. Remove setting of permissions in some places where it should have no effect on the test and looks like it was just copypasta. test/test_xmlrpc.py Remove setting of permissions in some places where it should have no effect on the test and looks like it was just copypasta.
author John Rouillard <rouilj@ieee.org>
date Mon, 03 Nov 2025 00:13:04 -0500
parents 3630246c5c36
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6383
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
2 """
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
3 wsgi-liveserver provides a simple LiverServerTestCase class that can be used to
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
4 help start a web server in the background to serve a WSGI compliant application
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
5 for use with testing. Generally it will be used in conjuction with something
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
6 like Selenium to perform a series of functional tests using a browser.
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
7
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
8 Licensed under the GNU GPL v3
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
9
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
10 Copyright (c) 2013 John Kristensen (unless explicitly stated otherwise).
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
11 """
8248
f6923d2ba9a5 test: issue2551366. Probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 6383
diff changeset
12 import errno
f6923d2ba9a5 test: issue2551366. Probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 6383
diff changeset
13 import socket
6383
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
14 import threading
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
15 import unittest
8257
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
16 from wsgiref.simple_server import WSGIRequestHandler, make_server
6383
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
17
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
18 __author__ = 'John Kristensen'
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
19 __version__ = '0.3.1'
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
20 __license__ = 'GPLv3'
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
21
8250
c7f63e9cd131 test: add comment that I modified wsgi_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8249
diff changeset
22 """
c7f63e9cd131 test: add comment that I modified wsgi_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8249
diff changeset
23 Classmethod probe_ports() added by John Rouillard 2024.
c7f63e9cd131 test: add comment that I modified wsgi_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8249
diff changeset
24 """
6383
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
25
8257
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
26
6383
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
27 class QuietHandler(WSGIRequestHandler):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
28 def log_request(*args, **kwargs):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
29 pass
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
30
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
31
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
32 class LiveServerTestCase(unittest.TestCase):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
33
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
34 port_range = (8080, 8090)
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
35
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
36 def create_app(self):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
37 """Create your wsgi app and return it."""
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
38 raise NotImplementedError
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
39
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
40 def __call__(self, result=None):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
41 """
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
42 Do some custom setup stuff and then hand off to TestCase to do its
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
43 thing.
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
44 """
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
45 try:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
46 self._pre_setup()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
47 super(LiveServerTestCase, self).__call__(result)
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
48 finally:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
49 self._post_teardown()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
50
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
51 def url_base(self):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
52 """Return the url of the test server."""
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
53 return 'http://{0}:{1}'.format(self.host, self.port)
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
54
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
55 def _pre_setup(self):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
56 """Setup and start the test server in the background."""
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
57 self._server = None
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
58
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
59 self.host = 'localhost'
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
60 self.port = self.port_range[0]
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
61 self._thread = None
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
62
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
63 # Get the app
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
64 self.app = self.create_app()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
65
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
66 # Cycle through the port range to find a free port
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
67 while self._server is None and self.port <= self.port_range[1]:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
68 try:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
69 self._server = make_server(self.host, self.port, self.app,
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
70 handler_class=QuietHandler)
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
71 except socket.error:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
72 self.port += 1
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
73
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
74 # No free port, raise an exception
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
75 if self._server is None:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
76 raise socket.error('Ports {0}-{1} are all already in use'.format(
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
77 *self.port_range))
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
78
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
79 # Start the test server in the background
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
80 self._thread = threading.Thread(target=self._server.serve_forever)
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
81 self._thread.start()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
82
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
83 def _post_teardown(self):
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
84 """Stop the test server."""
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
85 if self._thread is not None:
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
86 self._server.shutdown()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
87 self._server.server_close()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
88 self._thread.join()
e9760702bf0c Add live server test to suite.
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
89 del self._server
8248
f6923d2ba9a5 test: issue2551366. Probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 6383
diff changeset
90
8249
d317a41dfcf3 test: make probe_ports a class method under python2.
John Rouillard <rouilj@ieee.org>
parents: 8248
diff changeset
91 @classmethod
d317a41dfcf3 test: make probe_ports a class method under python2.
John Rouillard <rouilj@ieee.org>
parents: 8248
diff changeset
92 def probe_ports(cls, start=port_range[0], end=port_range[1]):
8257
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
93
8248
f6923d2ba9a5 test: issue2551366. Probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 6383
diff changeset
94 port = start
8257
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
95
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
96 while port <= end:
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
97 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
98 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
99
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
100 try:
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
101 s.connect(('127.0.0.1', port))
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
102 except socket.error as e:
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
103 if not hasattr(e, 'args') or e.args[0] != errno.ECONNREFUSED:
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
104 raise
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
105 return port
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
106 else:
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
107 s.close()
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
108 port += 1
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
109
3630246c5c36 test: issue2551366. fix probe for open port in test_liveserver.py
John Rouillard <rouilj@ieee.org>
parents: 8250
diff changeset
110 return None

Roundup Issue Tracker: http://roundup-tracker.org/