Statistics
| Branch: | Tag: | Revision:

root / snf-quotaholder-app / quotaholder_django / test / simpletests.py @ 763b4da1

History | View | Annotate | Download (10.6 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from config import QHTestCase
35
from config import run_test_case
36
from config import rand_string
37
from config import printf
38

    
39
from synnefo.lib.commissioning import CallError
40
from synnefo.lib.quotaholder.api import InvalidDataError, NoEntityError
41
from synnefo.lib.quotaholder.api.quotaholder import (
42
    Name, Key, Quantity, Capacity, ImportLimit, ExportLimit, Resource, Flags,
43
    Imported, Exported, Returned, Released)
44

    
45
DEFAULT_IMPORTED = 0
46
DEFAULT_EXPORTED = 0
47
DEFAULT_RETURNED = 0
48
DEFAULT_RELEASED = 0
49
DEFAULT_HOLDING = (0, 0, 0, 0)
50

    
51
class QHAPITest(QHTestCase):
52

    
53
    @classmethod
54
    def setUpClass(self):
55
        QHTestCase.setUpClass()
56
        e = self.rand_entity()
57
        k = Key.random()
58
        r = self.qh.create_entity(create_entity=[(e, 'system', k, '')])
59
        self.e_name = e
60
        self.e_key = k
61
        self.client = self.rand_entity()
62

    
63
    @classmethod
64
    def rand_name(self, exclude=[]):
65
        for i in range(1,100):
66
            r = Name().random()
67
            if r not in exclude:
68
                exclude.append(r)
69
                return r
70
        else:
71
            m = 'Could not make a unique random name'
72
            raise Exception(m)
73

    
74
    used_entities = ['system']
75

    
76
    @classmethod
77
    def rand_entity(self):
78
        return self.rand_name(self.used_entities)
79

    
80
    used_policies = []
81

    
82
    @classmethod
83
    def rand_policy(self):
84
        return self.rand_name(self.used_policies)
85

    
86
    used_resources = []
87

    
88
    @classmethod
89
    def rand_resource(self):
90
        return self.rand_name(self.used_resources)
91

    
92
    def rand_limits(self):
93
        q = Capacity.random() # Nonnegative
94
        c = Capacity.random()
95
        il = ImportLimit.random()
96
        el = ExportLimit.random()
97
        return q, c, il, el
98

    
99
    def rand_policy_limits(self):
100
        p = self.rand_policy()
101
        limits = self.rand_limits()
102
        return p, limits
103

    
104
    def rand_flags(self):
105
        return Flags.random()
106

    
107
    def rand_counters(self):
108
        return (Imported.random(), Exported.random(),
109
                Returned.random(), Released.random())
110

    
111
    def new_entity(self, parent='system', parent_key=''):
112
        e = self.rand_entity()
113
        k = Key.random()
114
        r = self.qh.create_entity(create_entity=[(e, parent, k, parent_key)])
115
        self.assertEqual(r, [])
116
        return e, k
117

    
118
    def new_policy(self):
119
        p, limits = self.rand_policy_limits()
120
        r = self.qh.set_limits(set_limits=[(p,) + limits])
121
        self.assertEqual(r, [])
122
        return p, limits
123

    
124
    def test_001_list_entities(self):
125
        r = self.qh.list_entities(entity='system', key='')
126
        self.assertEqual(r, ['system', self.e_name])
127

    
128
        with self.assertRaises(NoEntityError):
129
            self.qh.list_entities(entity='doesnotexist', key='')
130

    
131
        with self.assertRaises(InvalidDataError):
132
            self.qh.list_entities(entity='system; SELECT ALL', key='')
133

    
134
    def test_002_create_entity(self):
135
        e = self.rand_entity()
136
        k = Key.random()
137
        r = self.qh.create_entity(
138
            create_entity=[(self.e_name, 'system', self.e_key, ''),
139
                           (e, self.e_name, k, self.e_key),
140
                           (e, self.e_name, k, self.e_key)])
141
        self.assertEqual(r, [0,2])
142

    
143
    def test_003_release_entity(self):
144
        e, k = self.new_entity()
145
        r = self.qh.release_entity(release_entity=[(e, k)])
146
        self.assertEqual(r, [])
147

    
148
    def test_004_set_entity_key(self):
149
        e, k = self.new_entity()
150
        k1 = Key.random()
151
        k2 = Key.random()
152
        r = self.qh.set_entity_key(set_entity_key=[(e, k1, k2)])
153
        self.assertEqual(r, [e])
154
        r = self.qh.set_entity_key(set_entity_key=[(e, k, k2)])
155
        self.assertEqual(r, [])
156
        r = self.qh.release_entity(release_entity=[(e, k)])
157
        self.assertEqual(r, [e])
158

    
159
    def test_005_get_entity(self):
160
        e = self.rand_entity()
161
        k = Key.random()
162
        r = self.qh.get_entity(get_entity=[(self.e_name, self.e_key), (e, k)])
163
        self.assertEqual(r, [(self.e_name, 'system')])
164

    
165
    def test_006_get_set_limits(self):
166

    
167
        p1, limits1 = self.rand_policy_limits()
168
        limits2 = self.rand_limits()
169
        r = self.qh.set_limits(set_limits=[(p1,) + limits1,
170
                                           (p1,) + limits2])
171
        self.assertEqual(r, [])
172

    
173
        p2, _ = self.rand_policy_limits()
174
        r = self.qh.get_limits(get_limits=[p1, p2])
175
        self.assertEqual(r, [(p1,) + limits2])
176

    
177
    def test_007_get_set_holding(self):
178
        e, k = self.new_entity()
179
        resource = self.rand_resource()
180

    
181
        p0 = self.rand_policy()
182
        f0 = self.rand_flags()
183
        p1, _ = self.new_policy()
184
        f1 = self.rand_flags()
185
        p2, _ = self.new_policy()
186
        f2 = self.rand_flags()
187
        r = self.qh.set_holding(set_holding=[(e, resource, k, p0, f0),
188
                                             (e, resource, k, p1, f1),
189
                                             (e, resource, k, p2, f2)])
190
        self.assertEqual(r, [(e, resource, p0)])
191

    
192
        resource1 = self.rand_resource()
193
        r = self.qh.get_holding(get_holding=[(e, resource, k),
194
                                             (e, resource1, k)])
195
        self.assertEqual(r, [(e, resource, p2) + DEFAULT_HOLDING + (f2,)])
196

    
197
    def test_008_get_set_quota(self):
198
        e, k = self.new_entity()
199
        resource = self.rand_resource()
200
        limits = self.rand_limits()
201
        limits1 = self.rand_limits()
202
        f = self.rand_flags()
203
        r = self.qh.set_quota(set_quota=[(e, resource, k) + limits + (f,),
204
                                         (e, resource, k) + limits1 + (f,)])
205
        self.assertEqual(r, [])
206

    
207
        resource2 = self.rand_resource()
208
        r = self.qh.get_quota(get_quota=[(e, resource, k),
209
                                         (e, resource2, k)])
210
        self.assertEqual(r, [(e, resource) + limits1 +
211
                             DEFAULT_HOLDING + (f,)])
212

    
213
    def new_quota(self, entity, key, resource):
214
        limits = self.rand_limits()
215
        f = self.rand_flags()
216
        r = self.qh.set_quota(
217
            set_quota=[(entity, resource, key) + limits + (f,)])
218
        self.assertEqual(r, [])
219
        return limits
220

    
221
    def test_009_issue_commission(self):
222
        e0, k0 = self.new_entity()
223
        e1, k1 = self.new_entity()
224
        resource = self.rand_resource()
225
        q0, c0, il0, el0 = self.new_quota(e0, k0, resource)
226
        q1, c1, il1, el1 = self.new_quota(e1, k1, resource)
227

    
228
        most = max(0, min(c0, il0, q1, el1))
229
        print 'limits', (c0, il0, q1, el1)
230
        r = self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
231
                                     name='something',
232
                                     provisions=[(e1, resource, most)])
233
        self.assertEqual(r, 1)
234

    
235
        with self.assertRaises(CallError):
236
            self.qh.issue_commission(clientkey=self.client, target=e0, key=k0,
237
                                     name='something',
238
                                     provisions=[(e1, resource, 1)])
239

    
240

    
241
    def test_010_pending_commissions(self):
242
        r = self.qh.get_pending_commissions(clientkey=self.client)
243
        self.assertEqual(r, [1])
244
        r = self.qh.resolve_pending_commissions(clientkey=self.client,
245
                                                max_serial=1, accept_set=[1])
246
        r = self.qh.get_pending_commissions(clientkey=self.client)
247
        self.assertEqual(r, [])
248

    
249
    def test_011_release_empty(self):
250
        e, k = self.new_entity()
251
        e0, k0 = self.rand_entity(), Key.random()
252
        r = self.qh.release_entity(release_entity=[(e, k), (e0, k0)])
253
        self.assertEqual(r, [e0])
254
        r = self.qh.get_entity(get_entity=[(e, k)])
255
        self.assertEqual(r, [])
256

    
257
    def test_012_release_nonempty(self):
258
        e, k = self.new_entity()
259
        e1, k1 = self.new_entity(e, k)
260
        r = self.qh.release_entity(release_entity=[(e, k), (e1, k1)])
261
        self.assertEqual(r, [e])
262
        r = self.qh.get_entity(get_entity=[(e1, k1)])
263
        self.assertEqual(r, [])
264
        r = self.qh.release_entity(release_entity=[(e, k)])
265
        self.assertEqual(r, [])
266

    
267
    def test_013_release_nonempty(self):
268
        e, k = self.new_entity()
269
        resource = self.rand_resource()
270
        limits = self.new_quota(e, k, resource)
271
        r = self.qh.release_entity(release_entity=[(e, k)])
272
        self.assertEqual(r, [e])
273
        r = self.qh.release_holding(release_holding=[(e, resource, k)])
274
        self.assertEqual(r, [])
275
        r = self.qh.release_entity(release_entity=[(e, k)])
276
        self.assertEqual(r, [])
277

    
278
    def test_014_reset_holding(self):
279
        e0, k0 = self.new_entity()
280
        e1, k1 = self.new_entity()
281
        resource = self.rand_resource()
282
        p, _ = self.new_policy()
283
        f = self.rand_flags()
284
        r = self.qh.set_holding(set_holding=[(e1, resource, k1, p, f)])
285

    
286
        counters = self.rand_counters()
287
        r = self.qh.reset_holding(
288
            reset_holding=[(e0, resource, k0) + counters,
289
                           (e1, resource, k1) + counters])
290
        self.assertEqual(r, [0])
291
        r = self.qh.get_holding(get_holding=[(e1, resource, k1)])
292
        self.assertEqual(r, [(e1, resource, p) + counters + (f,)])
293

    
294

    
295
if __name__ == "__main__":
296
    import sys
297
    printf("Using {0}", sys.executable)
298
    run_test_case(QHAPITest)