root / logic / tests.py @ e6209aa2
History | View | Annotate | Download (7.9 kB)
1 | b8033991 | Georgios Gousios | # vim: set fileencoding=utf-8 :
|
---|---|---|---|
2 | 48130e66 | Georgios Gousios | # Copyright 2011 GRNET S.A. All rights reserved.
|
3 | 09c936a7 | Vassilios Karakoidas | #
|
4 | 48130e66 | Georgios Gousios | # Redistribution and use in source and binary forms, with or without
|
5 | 48130e66 | Georgios Gousios | # modification, are permitted provided that the following conditions
|
6 | 48130e66 | Georgios Gousios | # are met:
|
7 | 09c936a7 | Vassilios Karakoidas | #
|
8 | 48130e66 | Georgios Gousios | # 1. Redistributions of source code must retain the above copyright
|
9 | 48130e66 | Georgios Gousios | # notice, this list of conditions and the following disclaimer.
|
10 | 48130e66 | Georgios Gousios | #
|
11 | 48130e66 | Georgios Gousios | # 2. Redistributions in binary form must reproduce the above copyright
|
12 | 48130e66 | Georgios Gousios | # notice, this list of conditions and the following disclaimer in the
|
13 | 48130e66 | Georgios Gousios | # documentation and/or other materials provided with the distribution.
|
14 | 09c936a7 | Vassilios Karakoidas | #
|
15 | 48130e66 | Georgios Gousios | # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
16 | 48130e66 | Georgios Gousios | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17 | 48130e66 | Georgios Gousios | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
18 | 48130e66 | Georgios Gousios | # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
19 | 48130e66 | Georgios Gousios | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20 | 48130e66 | Georgios Gousios | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
21 | 48130e66 | Georgios Gousios | # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
22 | 48130e66 | Georgios Gousios | # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
23 | 48130e66 | Georgios Gousios | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
24 | 48130e66 | Georgios Gousios | # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
25 | 48130e66 | Georgios Gousios | # SUCH DAMAGE.
|
26 | 09c936a7 | Vassilios Karakoidas | #
|
27 | 48130e66 | Georgios Gousios | # The views and conclusions contained in the software and documentation are
|
28 | 48130e66 | Georgios Gousios | # those of the authors and should not be interpreted as representing official
|
29 | 48130e66 | Georgios Gousios | # policies, either expressed or implied, of GRNET S.A.
|
30 | 48130e66 | Georgios Gousios | |
31 | 48130e66 | Georgios Gousios | # Provides automated tests for logic module
|
32 | 92c53da1 | Vassilios Karakoidas | |
33 | 420f2c20 | Georgios Gousios | from synnefo.db.models import * |
34 | 03805fc8 | Vangelis Koukis | from synnefo.logic import backend |
35 | 420f2c20 | Georgios Gousios | from synnefo.logic import credits |
36 | 420f2c20 | Georgios Gousios | from synnefo.logic import users |
37 | 92c53da1 | Vassilios Karakoidas | from django.test import TestCase |
38 | 8af3b61f | Georgios Gousios | import time |
39 | 44193110 | Georgios Gousios | |
40 | 44193110 | Georgios Gousios | import hashlib |
41 | 92c53da1 | Vassilios Karakoidas | |
42 | 8d97deff | Vassilios Karakoidas | class CostsTestCase(TestCase): |
43 | 8d97deff | Vassilios Karakoidas | fixtures = [ 'db_test_data' ]
|
44 | 8d97deff | Vassilios Karakoidas | |
45 | 8d97deff | Vassilios Karakoidas | def test_get_costs(self): |
46 | 8d97deff | Vassilios Karakoidas | """Test the Flavor cost-related methods method"""
|
47 | 8d97deff | Vassilios Karakoidas | # first an easy test, a Flavor with only one FlavorCost entry
|
48 | 8d97deff | Vassilios Karakoidas | flavor = Flavor.objects.get(pk=30001)
|
49 | 8d97deff | Vassilios Karakoidas | |
50 | 8d97deff | Vassilios Karakoidas | start_date = datetime.datetime(year=2010, month=1, day=1) |
51 | 8d97deff | Vassilios Karakoidas | end_date = datetime.datetime(year=2010, month=1, day=2) |
52 | 8d97deff | Vassilios Karakoidas | |
53 | 8d97deff | Vassilios Karakoidas | # we now that the cost should be 5*24 (inactive) and 10*24 (active)
|
54 | 8d97deff | Vassilios Karakoidas | r_active = credits.get_cost_active(flavor, start_date, end_date) |
55 | 8d97deff | Vassilios Karakoidas | r_inactive = credits.get_cost_inactive(flavor, start_date, end_date) |
56 | 8d97deff | Vassilios Karakoidas | |
57 | 8d97deff | Vassilios Karakoidas | self.assertEqual(len(r_active), 1, 'get_cost_active() should have returned 1 entry (%d)' %(len(r_active),)) |
58 | 8d97deff | Vassilios Karakoidas | self.assertEqual(len(r_inactive), 1, 'get_cost_inactive() should have returned 1 entry (%d)'% (len(r_inactive),)) |
59 | 8d97deff | Vassilios Karakoidas | |
60 | 8d97deff | Vassilios Karakoidas | self.assertEqual(10*24, r_active[0][1], 'get_cost_active() is not working properly (%d!=%d)' % (r_active[0][1], 10*24)) |
61 | 8d97deff | Vassilios Karakoidas | self.assertEqual(5*24, r_inactive[0][1], 'get_cost_inactive() is not working properly (%d!=%d)' % (r_inactive[0][1], 5*24)) |
62 | 8d97deff | Vassilios Karakoidas | |
63 | 8d97deff | Vassilios Karakoidas | # The second test, will involve a more complex cost example
|
64 | 8d97deff | Vassilios Karakoidas | # The overall cost will be calculated by two FlavorCost entries
|
65 | 8d97deff | Vassilios Karakoidas | |
66 | 8d97deff | Vassilios Karakoidas | flavor = Flavor.objects.get(pk=30000)
|
67 | 8d97deff | Vassilios Karakoidas | |
68 | 8d97deff | Vassilios Karakoidas | start_date = datetime.datetime(year=2010, month=12, day=31) |
69 | 8d97deff | Vassilios Karakoidas | end_date = datetime.datetime(year=2011, month=01, day=2) |
70 | 8d97deff | Vassilios Karakoidas | |
71 | 8d97deff | Vassilios Karakoidas | # this is more complicated, active costs are 5*24 + 10*24 = 360
|
72 | 8d97deff | Vassilios Karakoidas | # and inactive costs are 2*24 + 5*24 = 168
|
73 | 8d97deff | Vassilios Karakoidas | |
74 | 8d97deff | Vassilios Karakoidas | r_active = credits.get_cost_active(flavor, start_date, end_date) |
75 | 8d97deff | Vassilios Karakoidas | r_inactive = credits.get_cost_inactive(flavor, start_date, end_date) |
76 | 8d97deff | Vassilios Karakoidas | |
77 | 8d97deff | Vassilios Karakoidas | self.assertEqual(len(r_active), 2, 'get_cost_active() should have returned 2 entries (%d)' %(len(r_active),)) |
78 | 8d97deff | Vassilios Karakoidas | self.assertEqual(len(r_inactive), 2, 'get_cost_inactive() should have returned 2 entries (%d)'% (len(r_inactive),)) |
79 | 8d97deff | Vassilios Karakoidas | |
80 | 8d97deff | Vassilios Karakoidas | ta_cost = sum([x[1] for x in r_active]) |
81 | 8d97deff | Vassilios Karakoidas | tia_cost = sum([x[1] for x in r_inactive]) |
82 | 8d97deff | Vassilios Karakoidas | |
83 | 8d97deff | Vassilios Karakoidas | self.assertEqual(360, ta_cost, 'get_cost_active() is not working properly (%d!=%d)' % (ta_cost, 360)) |
84 | 8d97deff | Vassilios Karakoidas | self.assertEqual(168, tia_cost, 'get_cost_inactive() is not working properly (%d!=%d)' % (tia_cost, 168)) |
85 | 92c53da1 | Vassilios Karakoidas | |
86 | 8d97deff | Vassilios Karakoidas | |
87 | 92c53da1 | Vassilios Karakoidas | class ChargeTestCase(TestCase): |
88 | 92c53da1 | Vassilios Karakoidas | fixtures = [ 'db_test_data' ]
|
89 | 92c53da1 | Vassilios Karakoidas | |
90 | 92c53da1 | Vassilios Karakoidas | def test_charge_method(self): |
91 | 92c53da1 | Vassilios Karakoidas | """Test VirtualMachine.charge() method"""
|
92 | 92c53da1 | Vassilios Karakoidas | |
93 | 92c53da1 | Vassilios Karakoidas | # Since we have tested the costs, with this test
|
94 | 92c53da1 | Vassilios Karakoidas | # we must ensure the following:
|
95 | 92c53da1 | Vassilios Karakoidas | # 1. The vm.charged is updated
|
96 | 92c53da1 | Vassilios Karakoidas | # 2. Users credits are decreased
|
97 | 92c53da1 | Vassilios Karakoidas | |
98 | 92c53da1 | Vassilios Karakoidas | vm_started = VirtualMachine.objects.get(pk=30000)
|
99 | 92c53da1 | Vassilios Karakoidas | |
100 | 92c53da1 | Vassilios Karakoidas | initial_date = vm_started.charged |
101 | 92c53da1 | Vassilios Karakoidas | initial_credits = vm_started.owner.credit |
102 | 92c53da1 | Vassilios Karakoidas | |
103 | 92c53da1 | Vassilios Karakoidas | credits.charge(vm_started) |
104 | 92c53da1 | Vassilios Karakoidas | |
105 | 92c53da1 | Vassilios Karakoidas | self.assertTrue(vm_started.charged > initial_date, 'Initial charged date should not be greater') |
106 | 92c53da1 | Vassilios Karakoidas | self.assertTrue(initial_credits > vm_started.owner.credit, 'The user should have less credits now! (%d>%d)' % (initial_credits, vm_started.owner.credit)) |
107 | 92c53da1 | Vassilios Karakoidas | |
108 | 92c53da1 | Vassilios Karakoidas | |
109 | 8d97deff | Vassilios Karakoidas | class DebitAccountTestCase(TestCase): |
110 | 92c53da1 | Vassilios Karakoidas | fixtures = [ 'db_test_data' ]
|
111 | 92c53da1 | Vassilios Karakoidas | |
112 | 8d97deff | Vassilios Karakoidas | def test_debit_account(self): |
113 | 92c53da1 | Vassilios Karakoidas | """Test a SynnefoUser object"""
|
114 | 92c53da1 | Vassilios Karakoidas | s_user = SynnefoUser.objects.get(pk=30000)
|
115 | 92c53da1 | Vassilios Karakoidas | v_machine = VirtualMachine.objects.get(pk=30000)
|
116 | 92c53da1 | Vassilios Karakoidas | |
117 | 92c53da1 | Vassilios Karakoidas | # charge the user
|
118 | 92c53da1 | Vassilios Karakoidas | credits.debit_account(s_user, 10, v_machine, "This should be a structured debit message!") |
119 | 92c53da1 | Vassilios Karakoidas | |
120 | 92c53da1 | Vassilios Karakoidas | # should have only one debit object
|
121 | 92c53da1 | Vassilios Karakoidas | d_list = Debit.objects.all() |
122 | 92c53da1 | Vassilios Karakoidas | |
123 | 8d97deff | Vassilios Karakoidas | self.assertEqual(len(d_list), 1, 'debit_account() writes more than one or zero (%d) debit entries!' % ( len(d_list), )) |
124 | 92c53da1 | Vassilios Karakoidas | |
125 | 92c53da1 | Vassilios Karakoidas | # retrieve the user, now he/she should have zero credits
|
126 | 92c53da1 | Vassilios Karakoidas | s_user = SynnefoUser.objects.get(pk=30000)
|
127 | 92c53da1 | Vassilios Karakoidas | |
128 | 92c53da1 | Vassilios Karakoidas | self.assertEqual(0, s_user.credit, 'SynnefoUser (pk=30000) should have zero credits (%d)' % ( s_user.credit, )) |
129 | 420f2c20 | Georgios Gousios | |
130 | 420f2c20 | Georgios Gousios | class AuthTestCase(TestCase): |
131 | 420f2c20 | Georgios Gousios | fixtures = [ 'db_test_data' ]
|
132 | 44193110 | Georgios Gousios | |
133 | 44193110 | Georgios Gousios | def _register_user(self): |
134 | 420f2c20 | Georgios Gousios | users.register_student ("Jimmy Page", "jpage", "jpage@zoso.com") |
135 | 938e89ab | Georgios Gousios | self.user = SynnefoUser.objects.get(name = "jpage") |
136 | 44193110 | Georgios Gousios | |
137 | 44193110 | Georgios Gousios | def test_register(self): |
138 | 44193110 | Georgios Gousios | """ test user registration
|
139 | 44193110 | Georgios Gousios | """
|
140 | 938e89ab | Georgios Gousios | self._register_user()
|
141 | 938e89ab | Georgios Gousios | self.assertNotEquals(self.user, None) |
142 | dd53338a | Georgios Gousios | |
143 | 44193110 | Georgios Gousios | #Check hash generation
|
144 | 44193110 | Georgios Gousios | md5 = hashlib.md5() |
145 | 938e89ab | Georgios Gousios | md5.update(self.user.uniq)
|
146 | 938e89ab | Georgios Gousios | md5.update(self.user.name)
|
147 | 8af3b61f | Georgios Gousios | md5.update(time.asctime()) |
148 | 44193110 | Georgios Gousios | |
149 | 8af3b61f | Georgios Gousios | self.assertEquals(self.user.auth_token, md5.hexdigest()) |
150 | 44193110 | Georgios Gousios | |
151 | 44193110 | Georgios Gousios | def test_del_user(self): |
152 | 44193110 | Georgios Gousios | """ test user deletion
|
153 | 44193110 | Georgios Gousios | """
|
154 | 8af3b61f | Georgios Gousios | self._register_user()
|
155 | 8af3b61f | Georgios Gousios | self.assertNotEquals(self.user, None) |
156 | 8af3b61f | Georgios Gousios | |
157 | 8af3b61f | Georgios Gousios | users.delete_user(self.user)
|
158 | 44193110 | Georgios Gousios | |
159 | dd53338a | Georgios Gousios | self.assertRaises(SynnefoUser.DoesNotExist, SynnefoUser.objects.get, name = "jpage") |
160 | 03805fc8 | Vangelis Koukis | |
161 | 03805fc8 | Vangelis Koukis | |
162 | 03805fc8 | Vangelis Koukis | class ProcessNetStatusTestCase(TestCase): |
163 | 03805fc8 | Vangelis Koukis | fixtures = ['db_test_data']
|
164 | 03805fc8 | Vangelis Koukis | def test_set_ipv4(self): |
165 | 03805fc8 | Vangelis Koukis | """Test reception of a net status notification"""
|
166 | 03805fc8 | Vangelis Koukis | msg = {'instance': 'instance-name', |
167 | 03805fc8 | Vangelis Koukis | 'type': 'ganeti-net-status', |
168 | 03805fc8 | Vangelis Koukis | 'nics': [
|
169 | 03805fc8 | Vangelis Koukis | {'ip': '192.168.33.1', 'mac': 'aa:00:00:58:1e:b9'} |
170 | 03805fc8 | Vangelis Koukis | ] |
171 | 03805fc8 | Vangelis Koukis | } |
172 | 03805fc8 | Vangelis Koukis | vm = VirtualMachine.objects.get(pk=30000)
|
173 | 03805fc8 | Vangelis Koukis | backend.process_net_status(vm, msg['nics'])
|
174 | f533f224 | Vangelis Koukis | self.assertEquals(vm.nics.all()[0].ipv4, '192.168.33.1') |
175 | 03805fc8 | Vangelis Koukis | |
176 | 03805fc8 | Vangelis Koukis | def test_set_empty_ipv4(self): |
177 | 03805fc8 | Vangelis Koukis | """Test reception of a net status notification with no IPv4 assigned"""
|
178 | 03805fc8 | Vangelis Koukis | msg = {'instance': 'instance-name', |
179 | 03805fc8 | Vangelis Koukis | 'type': 'ganeti-net-status', |
180 | 03805fc8 | Vangelis Koukis | 'nics': [
|
181 | 03805fc8 | Vangelis Koukis | {'ip': '', 'mac': 'aa:00:00:58:1e:b9'} |
182 | 03805fc8 | Vangelis Koukis | ] |
183 | 03805fc8 | Vangelis Koukis | } |
184 | 03805fc8 | Vangelis Koukis | vm = VirtualMachine.objects.get(pk=30000)
|
185 | 03805fc8 | Vangelis Koukis | backend.process_net_status(vm, msg['nics'])
|
186 | f533f224 | Vangelis Koukis | self.assertEquals(vm.nics.all()[0].ipv4, '') |
187 | ec63ae8a | Georgios Gousios | |
188 | ec63ae8a | Georgios Gousios | |
189 | b8033991 | Georgios Gousios | class UsersTestCase(TestCase): |
190 | b8033991 | Georgios Gousios | |
191 | b8033991 | Georgios Gousios | def test_create_uname(self): |
192 | b8033991 | Georgios Gousios | username = users.create_uname("Donald Knuth")
|
193 | b8033991 | Georgios Gousios | self.assertEquals(username, "knuthd") |
194 | b8033991 | Georgios Gousios | |
195 | b8033991 | Georgios Gousios | username = users.create_uname("Nemichandra Siddhanta Chakravati")
|
196 | b8033991 | Georgios Gousios | self.assertEquals(username, "chakravn") |
197 | b8033991 | Georgios Gousios | |
198 | b8033991 | Georgios Gousios | username = users.create_uname(u'Γεώργιος Παπαγεωργίου')
|
199 | b8033991 | Georgios Gousios | self.assertEquals(username, u'παπαγεωγ') |