Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / quotaholder_app / tests.py @ aba462a2

History | View | Annotate | Download (10.3 kB)

1
# Copyright 2012, 2013 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 django.test import TestCase
35

    
36
from snf_django.utils.testing import assertGreater, assertIn, assertRaises
37
import astakos.quotaholder_app.callpoint as qh
38
from astakos.quotaholder_app.exception import (
39
    InvalidDataError,
40
    NoCommissionError,
41
    NoQuantityError,
42
    NoCapacityError,
43
    NoHoldingError,
44
    DuplicateError)
45

    
46

    
47
class QuotaholderTest(TestCase):
48

    
49
    def issue_commission(self, provisions, name="", force=False):
50
        return qh.issue_commission(clientkey=self.client,
51
                                   name=name,
52
                                   force=force,
53
                                   provisions=provisions)
54

    
55
    def test_010_qh(self):
56
        holder = 'h0'
57
        source = 'system'
58
        resource1 = 'r1'
59
        resource2 = 'r2'
60
        limit1 = 10
61
        limit2 = 20
62

    
63
        qh.set_quota([((holder, source, resource1), limit1),
64
                      ((holder, source, resource1), limit2)])
65

    
66
        r = qh.get_quota(holders=[holder], sources=[source],
67
                         resources=[resource1, resource2])
68
        self.assertEqual(r, {(holder, source, resource1): (limit2, 0, 0)})
69

    
70
        r = qh.get_quota()
71
        self.assertEqual(r, {(holder, source, resource1): (limit2, 0, 0)})
72

    
73
        # issueing commissions
74

    
75
        qh.set_quota([((holder, source, resource1), limit1),
76
                      ((holder, source, resource2), limit2)])
77

    
78
        s1 = self.issue_commission([((holder, source, resource1), limit1/2),
79
                                    ((holder, source, resource2), limit2)],
80
                                   name="initial")
81
        assertGreater(s1, 0)
82

    
83
        r = qh.get_commission(self.client, s1)
84
        provisions = [
85
            {'holder': holder,
86
             'source': source,
87
             'resource': resource1,
88
             'quantity': limit1/2,
89
             },
90
            {'holder': holder,
91
             'source': source,
92
             'resource': resource2,
93
             'quantity': limit2,
94
             }
95
        ]
96
        self.assertEqual(r['serial'], s1)
97
        ps = r['provisions']
98
        for p in ps:
99
            assertIn(p, provisions)
100

    
101
        with assertRaises(NoCommissionError):
102
            qh.get_commission(self.client, s1+1)
103

    
104
        # commission exceptions
105

    
106
        with assertRaises(NoCapacityError) as cm:
107
            self.issue_commission([((holder, source, resource1), 1),
108
                                   ((holder, source, resource2), 1)])
109

    
110
        e = cm.exception
111
        provision = e.data['provision']
112
        self.assertEqual(provision['holder'], holder)
113
        self.assertEqual(provision['source'], source)
114
        self.assertEqual(provision['resource'], resource2)
115
        self.assertEqual(provision['quantity'], 1)
116
        self.assertEqual(e.data['usage'], limit2)
117
        self.assertEqual(e.data['limit'], limit2)
118

    
119
        with assertRaises(NoQuantityError) as cm:
120
            self.issue_commission([((holder, source, resource1), -1)])
121

    
122
        e = cm.exception
123
        provision = e.data['provision']
124
        self.assertEqual(provision['holder'], holder)
125
        self.assertEqual(provision['source'], source)
126
        self.assertEqual(provision['resource'], resource1)
127
        self.assertEqual(provision['quantity'], -1)
128
        self.assertEqual(e.data['usage'], 0)
129
        self.assertEqual(e.data['limit'], 0)
130

    
131
        with assertRaises(NoHoldingError) as cm:
132
            self.issue_commission([((holder, source, resource1), 1),
133
                                   (('nonex', source, resource1), 1)])
134

    
135
        e = cm.exception
136
        provision = e.data['provision']
137
        self.assertEqual(provision['holder'], 'nonex')
138
        self.assertEqual(provision['source'], source)
139
        self.assertEqual(provision['resource'], resource1)
140
        self.assertEqual(provision['quantity'], 1)
141

    
142
        with assertRaises(DuplicateError) as cm:
143
            self.issue_commission([((holder, source, resource1), 1),
144
                                   ((holder, source, resource1), 2)])
145

    
146
        e = cm.exception
147
        provision = e.data['provision']
148
        self.assertEqual(provision['holder'], holder)
149
        self.assertEqual(provision['source'], source)
150
        self.assertEqual(provision['resource'], resource1)
151
        self.assertEqual(provision['quantity'], 2)
152

    
153
        with assertRaises(InvalidDataError):
154
            self.issue_commission([((holder, source, resource1), 1),
155
                                   ((holder, source, resource1), "nan")])
156

    
157
        r = qh.get_quota(holders=[holder])
158
        quotas = {(holder, source, resource1): (limit1, 0, limit1/2),
159
                  (holder, source, resource2): (limit2, 0, limit2),
160
                  }
161
        self.assertEqual(r, quotas)
162

    
163
        # resolve commission
164

    
165
        r = qh.get_pending_commissions(clientkey=self.client)
166
        self.assertEqual(len(r), 1)
167
        serial = r[0]
168
        r = qh.resolve_pending_commission(self.client, serial)
169
        self.assertEqual(r, True)
170
        r = qh.get_pending_commissions(clientkey=self.client)
171
        self.assertEqual(r, [])
172
        r = qh.resolve_pending_commission(self.client, serial)
173
        self.assertEqual(r, False)
174

    
175
        r = qh.get_quota(holders=[holder])
176
        quotas = {(holder, source, resource1): (limit1, limit1/2, limit1/2),
177
                  (holder, source, resource2): (limit2, limit2, limit2),
178
                  }
179
        self.assertEqual(r, quotas)
180

    
181
        # resolve commissions
182

    
183
        serial = self.issue_commission([((holder, source, resource1), 1),
184
                                        ((holder, source, resource2), -1)])
185

    
186
        r = qh.get_quota(holders=[holder])
187
        quotas = {(holder, source, resource1): (limit1, limit1/2, limit1/2+1),
188
                  (holder, source, resource2): (limit2, limit2-1, limit2),
189
                  }
190
        self.assertEqual(r, quotas)
191

    
192
        r = qh.resolve_pending_commission(self.client, serial, accept=False)
193
        self.assertEqual(r, True)
194

    
195
        serial1 = self.issue_commission([((holder, source, resource1), 1),
196
                                         ((holder, source, resource2), -1)])
197

    
198
        serial2 = self.issue_commission([((holder, source, resource1), 1),
199
                                         ((holder, source, resource2), -1)])
200

    
201
        serial3 = self.issue_commission([((holder, source, resource1), 1),
202
                                         ((holder, source, resource2), -1)])
203

    
204
        r = qh.resolve_pending_commissions(clientkey=self.client,
205
                                           accept_set=[serial1, serial2, 0],
206
                                           reject_set=[serial2, serial3])
207
        self.assertEqual(r, ([serial1], [serial3], [0], [serial2]))
208

    
209
        r = qh.get_pending_commissions(clientkey=self.client)
210
        self.assertEqual(r, [serial2])
211

    
212
        # forced commission
213

    
214
        r = qh.get_quota(holders=[holder])
215
        quotas = {
216
            (holder, source, resource1): (limit1, limit1/2+1, limit1/2+2),
217
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
218
        }
219
        self.assertEqual(r, quotas)
220

    
221
        with assertRaises(NoCapacityError):
222
            self.issue_commission(
223
                [((holder, source, resource1), limit1/2+1)])
224

    
225
        serial = self.issue_commission(
226
            [((holder, source, resource1), limit1/2+1)],
227
            force=True)
228

    
229
        r = qh.resolve_pending_commission(self.client, serial, accept=True)
230
        self.assertEqual(r, True)
231

    
232
        r = qh.get_quota(holders=[holder])
233
        quotas = {
234
            (holder, source, resource1): (limit1, limit1+2, limit1+3),
235
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
236
        }
237
        self.assertEqual(r, quotas)
238

    
239
        # release off upper limit
240

    
241
        serial = self.issue_commission([((holder, source, resource1), -1)])
242
        r = qh.resolve_pending_commission(self.client, serial)
243
        self.assertEqual(r, True)
244

    
245
        r = qh.get_quota(holders=[holder], resources=[resource1])
246
        quotas = {
247
            (holder, source, resource1): (limit1, limit1+1, limit1+2),
248
        }
249
        self.assertEqual(r, quotas)
250

    
251
        # add resource limit
252

    
253
        qh.add_resource_limit(sources=[source], resources=[resource1], diff=1)
254
        r = qh.get_quota(holders=[holder])
255
        quotas = {
256
            (holder, source, resource1): (limit1+1, limit1+1, limit1+2),
257
            (holder, source, resource2): (limit2, limit2-2, limit2-1),
258
        }
259
        self.assertEqual(r, quotas)
260

    
261
        qh.add_resource_limit(holders=[holder, "nonex"], diff=10)
262
        r = qh.get_quota(holders=[holder, "nonex"])
263
        quotas = {
264
            (holder, source, resource1): (limit1+11, limit1+1, limit1+2),
265
            (holder, source, resource2): (limit2+10, limit2-2, limit2-1),
266
        }
267
        self.assertEqual(r, quotas)
268

    
269
    def test_020_empty_provisions(self):
270
        serial = self.issue_commission([])
271
        r = qh.resolve_pending_commission(self.client, serial)
272
        self.assertEqual(r, True)