Statistics
| Branch: | Tag: | Revision:

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'παπαγεωγ')