28
28
from xml.dom.minidom import parseString
30
30
from nova.api.openstack import limits
31
from nova.api.openstack.limits import Limit
35
Limit("GET", "/delayed", "^/delayed", 1, limits.PER_MINUTE),
36
Limit("POST", "*", ".*", 7, limits.PER_MINUTE),
37
Limit("POST", "/servers", "^/servers", 3, limits.PER_MINUTE),
38
Limit("PUT", "*", "", 10, limits.PER_MINUTE),
39
Limit("PUT", "/servers", "^/servers", 5, limits.PER_MINUTE),
34
limits.Limit("GET", "/delayed", "^/delayed", 1, limits.PER_MINUTE),
35
limits.Limit("POST", "*", ".*", 7, limits.PER_MINUTE),
36
limits.Limit("POST", "/servers", "^/servers", 3, limits.PER_MINUTE),
37
limits.Limit("PUT", "*", "", 10, limits.PER_MINUTE),
38
limits.Limit("PUT", "/servers", "^/servers", 5, limits.PER_MINUTE),
61
class LimitsControllerTest(BaseLimitTestSuite):
60
class LimitsControllerV10Test(BaseLimitTestSuite):
63
Tests for `limits.LimitsController` class.
62
Tests for `limits.LimitsControllerV10` class.
67
66
"""Run before each test."""
68
67
BaseLimitTestSuite.setUp(self)
69
self.controller = limits.LimitsController()
68
self.controller = limits.LimitsControllerV10()
71
70
def _get_index_request(self, accept_header="application/json"):
72
71
"""Helper to set routing arguments."""
81
80
def _populate_limits(self, request):
82
81
"""Put limit info into a request."""
84
Limit("GET", "*", ".*", 10, 60).display(),
85
Limit("POST", "*", ".*", 5, 60 * 60).display(),
83
limits.Limit("GET", "*", ".*", 10, 60).display(),
84
limits.Limit("POST", "*", ".*", 5, 60 * 60).display(),
87
86
request.environ["nova.limits"] = _limits
171
170
self.assertEqual(expected.toxml(), body.toxml())
173
class LimitsControllerV11Test(BaseLimitTestSuite):
175
Tests for `limits.LimitsControllerV11` class.
179
"""Run before each test."""
180
BaseLimitTestSuite.setUp(self)
181
self.controller = limits.LimitsControllerV11()
183
def _get_index_request(self, accept_header="application/json"):
184
"""Helper to set routing arguments."""
185
request = webob.Request.blank("/")
186
request.accept = accept_header
187
request.environ["wsgiorg.routing_args"] = (None, {
193
def _populate_limits(self, request):
194
"""Put limit info into a request."""
196
limits.Limit("GET", "*", ".*", 10, 60).display(),
197
limits.Limit("POST", "*", ".*", 5, 60 * 60).display(),
198
limits.Limit("GET", "changes-since*", "changes-since",
201
request.environ["nova.limits"] = _limits
204
def test_empty_index_json(self):
205
"""Test getting empty limit details in JSON."""
206
request = self._get_index_request()
207
response = request.get_response(self.controller)
214
body = json.loads(response.body)
215
self.assertEqual(expected, body)
217
def test_index_json(self):
218
"""Test getting limit details in JSON."""
219
request = self._get_index_request()
220
request = self._populate_limits(request)
221
response = request.get_response(self.controller)
246
"regex": "changes-since",
247
"uri": "changes-since*",
263
body = json.loads(response.body)
264
self.assertEqual(expected, body)
174
267
class LimitMiddlewareTest(BaseLimitTestSuite):
176
269
Tests for the `limits.RateLimitingMiddleware` class.
185
278
"""Prepare middleware for use through fake WSGI app."""
186
279
BaseLimitTestSuite.setUp(self)
188
Limit("GET", "*", ".*", 1, 60),
281
limits.Limit("GET", "*", ".*", 1, 60),
190
283
self.app = limits.RateLimitingMiddleware(self._empty_app, _limits)
239
332
def test_GET_no_delay(self):
240
333
"""Test a limit handles 1 GET per second."""
241
limit = Limit("GET", "*", ".*", 1, 1)
334
limit = limits.Limit("GET", "*", ".*", 1, 1)
242
335
delay = limit("GET", "/anything")
243
336
self.assertEqual(None, delay)
244
337
self.assertEqual(0, limit.next_request)
247
340
def test_GET_delay(self):
248
341
"""Test two calls to 1 GET per second limit."""
249
limit = Limit("GET", "*", ".*", 1, 1)
342
limit = limits.Limit("GET", "*", ".*", 1, 1)
250
343
delay = limit("GET", "/anything")
251
344
self.assertEqual(None, delay)