1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2010 OpenStack LLC.
6
# Licensed under the Apache License, Version 2.0 (the "License"); you may
7
# not use this file except in compliance with the License. You may obtain
8
# a copy of the License at
10
# http://www.apache.org/licenses/LICENSE-2.0
12
# Unless required by applicable law or agreed to in writing, software
13
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
# License for the specific language governing permissions and limitations
19
Test suites for 'common' code used throughout the OpenStack HTTP API.
24
from webob import Request
26
from nova.api.openstack.common import limited
29
class LimiterTest(unittest.TestCase):
31
Unit tests for the `nova.api.openstack.common.limited` method which takes
32
in a list of items and, depending on the 'offset' and 'limit' GET params,
33
returns a subset or complete set of the given items.
41
self.small = range(10)
42
self.medium = range(1000)
43
self.large = range(10000)
45
def test_limiter_offset_zero(self):
47
Test offset key works with 0.
49
req = Request.blank('/?offset=0')
50
self.assertEqual(limited(self.tiny, req), self.tiny)
51
self.assertEqual(limited(self.small, req), self.small)
52
self.assertEqual(limited(self.medium, req), self.medium)
53
self.assertEqual(limited(self.large, req), self.large[:1000])
55
def test_limiter_offset_medium(self):
57
Test offset key works with a medium sized number.
59
req = Request.blank('/?offset=10')
60
self.assertEqual(limited(self.tiny, req), [])
61
self.assertEqual(limited(self.small, req), self.small[10:])
62
self.assertEqual(limited(self.medium, req), self.medium[10:])
63
self.assertEqual(limited(self.large, req), self.large[10:1010])
65
def test_limiter_offset_over_max(self):
67
Test offset key works with a number over 1000 (max_limit).
69
req = Request.blank('/?offset=1001')
70
self.assertEqual(limited(self.tiny, req), [])
71
self.assertEqual(limited(self.small, req), [])
72
self.assertEqual(limited(self.medium, req), [])
73
self.assertEqual(limited(self.large, req), self.large[1001:2001])
75
def test_limiter_offset_blank(self):
77
Test offset key works with a blank offset.
79
req = Request.blank('/?offset=')
80
self.assertEqual(limited(self.tiny, req), self.tiny)
81
self.assertEqual(limited(self.small, req), self.small)
82
self.assertEqual(limited(self.medium, req), self.medium)
83
self.assertEqual(limited(self.large, req), self.large[:1000])
85
def test_limiter_offset_bad(self):
87
Test offset key works with a BAD offset.
89
req = Request.blank(u'/?offset=\u0020aa')
90
self.assertEqual(limited(self.tiny, req), self.tiny)
91
self.assertEqual(limited(self.small, req), self.small)
92
self.assertEqual(limited(self.medium, req), self.medium)
93
self.assertEqual(limited(self.large, req), self.large[:1000])
95
def test_limiter_nothing(self):
97
Test request with no offset or limit
99
req = Request.blank('/')
100
self.assertEqual(limited(self.tiny, req), self.tiny)
101
self.assertEqual(limited(self.small, req), self.small)
102
self.assertEqual(limited(self.medium, req), self.medium)
103
self.assertEqual(limited(self.large, req), self.large[:1000])
105
def test_limiter_limit_zero(self):
109
req = Request.blank('/?limit=0')
110
self.assertEqual(limited(self.tiny, req), self.tiny)
111
self.assertEqual(limited(self.small, req), self.small)
112
self.assertEqual(limited(self.medium, req), self.medium)
113
self.assertEqual(limited(self.large, req), self.large[:1000])
115
def test_limiter_limit_medium(self):
119
req = Request.blank('/?limit=10')
120
self.assertEqual(limited(self.tiny, req), self.tiny)
121
self.assertEqual(limited(self.small, req), self.small)
122
self.assertEqual(limited(self.medium, req), self.medium[:10])
123
self.assertEqual(limited(self.large, req), self.large[:10])
125
def test_limiter_limit_over_max(self):
129
req = Request.blank('/?limit=3000')
130
self.assertEqual(limited(self.tiny, req), self.tiny)
131
self.assertEqual(limited(self.small, req), self.small)
132
self.assertEqual(limited(self.medium, req), self.medium)
133
self.assertEqual(limited(self.large, req), self.large[:1000])
135
def test_limiter_limit_and_offset(self):
137
Test request with both limit and offset.
140
req = Request.blank('/?offset=1&limit=3')
141
self.assertEqual(limited(items, req), items[1:4])
142
req = Request.blank('/?offset=3&limit=0')
143
self.assertEqual(limited(items, req), items[3:1003])
144
req = Request.blank('/?offset=3&limit=1500')
145
self.assertEqual(limited(items, req), items[3:1003])
146
req = Request.blank('/?offset=3000&limit=10')
147
self.assertEqual(limited(items, req), [])
149
def test_limiter_custom_max_limit(self):
151
Test a max_limit other than 1000.
154
req = Request.blank('/?offset=1&limit=3')
155
self.assertEqual(limited(items, req, max_limit=2000), items[1:4])
156
req = Request.blank('/?offset=3&limit=0')
157
self.assertEqual(limited(items, req, max_limit=2000), items[3:])
158
req = Request.blank('/?offset=3&limit=2500')
159
self.assertEqual(limited(items, req, max_limit=2000), items[3:])
160
req = Request.blank('/?offset=3000&limit=10')
161
self.assertEqual(limited(items, req, max_limit=2000), [])