~sandy-walsh/nova/zones

« back to all changes in this revision

Viewing changes to nova/tests/api/openstack/test_common.py

  • Committer: Sandy Walsh
  • Date: 2011-02-17 21:39:03 UTC
  • mfrom: (635.1.60 nova)
  • Revision ID: sandy.walsh@rackspace.com-20110217213903-swehe88wea8inxow
changed from 003-004 migration

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 
2
 
 
3
# Copyright 2010 OpenStack LLC.
 
4
# All Rights Reserved.
 
5
#
 
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
 
9
#
 
10
#         http://www.apache.org/licenses/LICENSE-2.0
 
11
#
 
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
 
16
#    under the License.
 
17
 
 
18
"""
 
19
Test suites for 'common' code used throughout the OpenStack HTTP API.
 
20
"""
 
21
 
 
22
import unittest
 
23
 
 
24
from webob import Request
 
25
 
 
26
from nova.api.openstack.common import limited
 
27
 
 
28
 
 
29
class LimiterTest(unittest.TestCase):
 
30
    """
 
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.
 
34
    """
 
35
 
 
36
    def setUp(self):
 
37
        """
 
38
        Run before each test.
 
39
        """
 
40
        self.tiny = range(1)
 
41
        self.small = range(10)
 
42
        self.medium = range(1000)
 
43
        self.large = range(10000)
 
44
 
 
45
    def test_limiter_offset_zero(self):
 
46
        """
 
47
        Test offset key works with 0.
 
48
        """
 
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])
 
54
 
 
55
    def test_limiter_offset_medium(self):
 
56
        """
 
57
        Test offset key works with a medium sized number.
 
58
        """
 
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])
 
64
 
 
65
    def test_limiter_offset_over_max(self):
 
66
        """
 
67
        Test offset key works with a number over 1000 (max_limit).
 
68
        """
 
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])
 
74
 
 
75
    def test_limiter_offset_blank(self):
 
76
        """
 
77
        Test offset key works with a blank offset.
 
78
        """
 
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])
 
84
 
 
85
    def test_limiter_offset_bad(self):
 
86
        """
 
87
        Test offset key works with a BAD offset.
 
88
        """
 
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])
 
94
 
 
95
    def test_limiter_nothing(self):
 
96
        """
 
97
        Test request with no offset or limit
 
98
        """
 
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])
 
104
 
 
105
    def test_limiter_limit_zero(self):
 
106
        """
 
107
        Test limit of zero.
 
108
        """
 
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])
 
114
 
 
115
    def test_limiter_limit_medium(self):
 
116
        """
 
117
        Test limit of 10.
 
118
        """
 
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])
 
124
 
 
125
    def test_limiter_limit_over_max(self):
 
126
        """
 
127
        Test limit of 3000.
 
128
        """
 
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])
 
134
 
 
135
    def test_limiter_limit_and_offset(self):
 
136
        """
 
137
        Test request with both limit and offset.
 
138
        """
 
139
        items = range(2000)
 
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), [])
 
148
 
 
149
    def test_limiter_custom_max_limit(self):
 
150
        """
 
151
        Test a max_limit other than 1000.
 
152
        """
 
153
        items = range(2000)
 
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), [])