Statistics
| Branch: | Tag: | Revision:

root / logic / tests.py @ 35079ab2

History | View | Annotate | Download (6.5 kB)

1 b8033991 Georgios Gousios
# vim: set fileencoding=utf-8 :
2 09c936a7 Vassilios Karakoidas
#
3 09c936a7 Vassilios Karakoidas
# Unit Tests for logic
4 09c936a7 Vassilios Karakoidas
#
5 09c936a7 Vassilios Karakoidas
# Provides automated tests for logic module
6 09c936a7 Vassilios Karakoidas
#
7 09c936a7 Vassilios Karakoidas
# Copyright 2010 Greek Research and Technology Network
8 09c936a7 Vassilios Karakoidas
#
9 92c53da1 Vassilios Karakoidas
10 420f2c20 Georgios Gousios
from synnefo.db.models import *
11 03805fc8 Vangelis Koukis
from synnefo.logic import backend
12 420f2c20 Georgios Gousios
from synnefo.logic import credits
13 420f2c20 Georgios Gousios
from synnefo.logic import users
14 92c53da1 Vassilios Karakoidas
from django.test import TestCase
15 8af3b61f Georgios Gousios
import time
16 44193110 Georgios Gousios
17 44193110 Georgios Gousios
import hashlib
18 92c53da1 Vassilios Karakoidas
19 8d97deff Vassilios Karakoidas
class CostsTestCase(TestCase):
20 8d97deff Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
21 8d97deff Vassilios Karakoidas
22 8d97deff Vassilios Karakoidas
    def test_get_costs(self):
23 8d97deff Vassilios Karakoidas
        """Test the Flavor cost-related methods method"""
24 8d97deff Vassilios Karakoidas
        # first an easy test, a Flavor with only one FlavorCost entry
25 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30001)
26 8d97deff Vassilios Karakoidas
27 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=1, day=1)
28 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2010, month=1, day=2)
29 8d97deff Vassilios Karakoidas
30 8d97deff Vassilios Karakoidas
        # we now that the cost should be 5*24 (inactive) and 10*24 (active)
31 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
32 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
33 8d97deff Vassilios Karakoidas
34 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 1, 'get_cost_active() should have returned 1 entry (%d)' %(len(r_active),))
35 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 1, 'get_cost_inactive() should have returned 1 entry (%d)'% (len(r_inactive),))
36 8d97deff Vassilios Karakoidas
37 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))
38 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))
39 8d97deff Vassilios Karakoidas
40 8d97deff Vassilios Karakoidas
        # The second test, will involve a more complex cost example
41 8d97deff Vassilios Karakoidas
        # The overall cost will be calculated by two FlavorCost entries
42 8d97deff Vassilios Karakoidas
43 8d97deff Vassilios Karakoidas
        flavor = Flavor.objects.get(pk=30000)
44 8d97deff Vassilios Karakoidas
45 8d97deff Vassilios Karakoidas
        start_date = datetime.datetime(year=2010, month=12, day=31)
46 8d97deff Vassilios Karakoidas
        end_date = datetime.datetime(year=2011, month=01, day=2)
47 8d97deff Vassilios Karakoidas
48 8d97deff Vassilios Karakoidas
        # this is more complicated, active costs are 5*24 + 10*24 = 360
49 8d97deff Vassilios Karakoidas
        # and inactive costs are 2*24 + 5*24 = 168
50 8d97deff Vassilios Karakoidas
51 8d97deff Vassilios Karakoidas
        r_active = credits.get_cost_active(flavor, start_date, end_date)
52 8d97deff Vassilios Karakoidas
        r_inactive = credits.get_cost_inactive(flavor, start_date, end_date)
53 8d97deff Vassilios Karakoidas
54 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_active), 2, 'get_cost_active() should have returned 2 entries (%d)' %(len(r_active),))
55 8d97deff Vassilios Karakoidas
        self.assertEqual(len(r_inactive), 2, 'get_cost_inactive() should have returned 2 entries (%d)'% (len(r_inactive),))
56 8d97deff Vassilios Karakoidas
57 8d97deff Vassilios Karakoidas
        ta_cost = sum([x[1] for x in r_active])
58 8d97deff Vassilios Karakoidas
        tia_cost = sum([x[1] for x in r_inactive])
59 8d97deff Vassilios Karakoidas
60 8d97deff Vassilios Karakoidas
        self.assertEqual(360, ta_cost, 'get_cost_active() is not working properly (%d!=%d)' % (ta_cost, 360))
61 8d97deff Vassilios Karakoidas
        self.assertEqual(168, tia_cost, 'get_cost_inactive() is not working properly (%d!=%d)' % (tia_cost, 168))
62 92c53da1 Vassilios Karakoidas
63 8d97deff Vassilios Karakoidas
        
64 92c53da1 Vassilios Karakoidas
class ChargeTestCase(TestCase):
65 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
66 92c53da1 Vassilios Karakoidas
67 92c53da1 Vassilios Karakoidas
    def test_charge_method(self):
68 92c53da1 Vassilios Karakoidas
        """Test VirtualMachine.charge() method"""
69 92c53da1 Vassilios Karakoidas
70 92c53da1 Vassilios Karakoidas
        # Since we have tested the costs, with this test
71 92c53da1 Vassilios Karakoidas
        # we must ensure the following:
72 92c53da1 Vassilios Karakoidas
        # 1. The vm.charged is updated
73 92c53da1 Vassilios Karakoidas
        # 2. Users credits are decreased
74 92c53da1 Vassilios Karakoidas
75 92c53da1 Vassilios Karakoidas
        vm_started = VirtualMachine.objects.get(pk=30000)
76 92c53da1 Vassilios Karakoidas
77 92c53da1 Vassilios Karakoidas
        initial_date = vm_started.charged
78 92c53da1 Vassilios Karakoidas
        initial_credits = vm_started.owner.credit
79 92c53da1 Vassilios Karakoidas
80 92c53da1 Vassilios Karakoidas
        credits.charge(vm_started)
81 92c53da1 Vassilios Karakoidas
82 92c53da1 Vassilios Karakoidas
        self.assertTrue(vm_started.charged > initial_date, 'Initial charged date should not be greater')
83 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))
84 92c53da1 Vassilios Karakoidas
85 92c53da1 Vassilios Karakoidas
86 8d97deff Vassilios Karakoidas
class DebitAccountTestCase(TestCase):
87 92c53da1 Vassilios Karakoidas
    fixtures = [ 'db_test_data' ]
88 92c53da1 Vassilios Karakoidas
89 8d97deff Vassilios Karakoidas
    def test_debit_account(self):
90 92c53da1 Vassilios Karakoidas
        """Test a SynnefoUser object"""
91 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
92 92c53da1 Vassilios Karakoidas
        v_machine = VirtualMachine.objects.get(pk=30000)
93 92c53da1 Vassilios Karakoidas
94 92c53da1 Vassilios Karakoidas
        # charge the user
95 92c53da1 Vassilios Karakoidas
        credits.debit_account(s_user, 10, v_machine, "This should be a structured debit message!")
96 92c53da1 Vassilios Karakoidas
97 92c53da1 Vassilios Karakoidas
        # should have only one debit object
98 92c53da1 Vassilios Karakoidas
        d_list = Debit.objects.all()
99 92c53da1 Vassilios Karakoidas
100 8d97deff Vassilios Karakoidas
        self.assertEqual(len(d_list), 1, 'debit_account() writes more than one or zero (%d) debit entries!' % ( len(d_list), ))
101 92c53da1 Vassilios Karakoidas
102 92c53da1 Vassilios Karakoidas
        # retrieve the user, now he/she should have zero credits
103 92c53da1 Vassilios Karakoidas
        s_user = SynnefoUser.objects.get(pk=30000)
104 92c53da1 Vassilios Karakoidas
105 92c53da1 Vassilios Karakoidas
        self.assertEqual(0, s_user.credit, 'SynnefoUser (pk=30000) should have zero credits (%d)' % ( s_user.credit, ))
106 420f2c20 Georgios Gousios
107 420f2c20 Georgios Gousios
class AuthTestCase(TestCase):
108 420f2c20 Georgios Gousios
    fixtures = [ 'db_test_data' ]
109 44193110 Georgios Gousios
110 44193110 Georgios Gousios
    def _register_user(self):
111 420f2c20 Georgios Gousios
        users.register_student ("Jimmy Page", "jpage", "jpage@zoso.com")
112 938e89ab Georgios Gousios
        self.user = SynnefoUser.objects.get(name = "jpage")
113 44193110 Georgios Gousios
114 44193110 Georgios Gousios
    def test_register(self):
115 44193110 Georgios Gousios
        """ test user registration
116 44193110 Georgios Gousios
        """
117 938e89ab Georgios Gousios
        self._register_user()
118 938e89ab Georgios Gousios
        self.assertNotEquals(self.user, None)
119 dd53338a Georgios Gousios
120 44193110 Georgios Gousios
        #Check hash generation
121 44193110 Georgios Gousios
        md5 = hashlib.md5()
122 938e89ab Georgios Gousios
        md5.update(self.user.uniq)
123 938e89ab Georgios Gousios
        md5.update(self.user.name)
124 8af3b61f Georgios Gousios
        md5.update(time.asctime())
125 44193110 Georgios Gousios
126 8af3b61f Georgios Gousios
        self.assertEquals(self.user.auth_token, md5.hexdigest())
127 44193110 Georgios Gousios
128 44193110 Georgios Gousios
    def test_del_user(self):
129 44193110 Georgios Gousios
        """ test user deletion
130 44193110 Georgios Gousios
        """
131 8af3b61f Georgios Gousios
        self._register_user()
132 8af3b61f Georgios Gousios
        self.assertNotEquals(self.user, None)
133 8af3b61f Georgios Gousios
        
134 8af3b61f Georgios Gousios
        users.delete_user(self.user)
135 44193110 Georgios Gousios
136 dd53338a Georgios Gousios
        self.assertRaises(SynnefoUser.DoesNotExist, SynnefoUser.objects.get, name = "jpage")
137 03805fc8 Vangelis Koukis
138 03805fc8 Vangelis Koukis
139 03805fc8 Vangelis Koukis
class ProcessNetStatusTestCase(TestCase):
140 03805fc8 Vangelis Koukis
    fixtures = ['db_test_data']
141 03805fc8 Vangelis Koukis
    def test_set_ipv4(self):
142 03805fc8 Vangelis Koukis
        """Test reception of a net status notification"""
143 03805fc8 Vangelis Koukis
        msg = {'instance': 'instance-name',
144 03805fc8 Vangelis Koukis
               'type':     'ganeti-net-status',
145 03805fc8 Vangelis Koukis
               'nics': [
146 03805fc8 Vangelis Koukis
                   {'ip': '192.168.33.1', 'mac': 'aa:00:00:58:1e:b9'}
147 03805fc8 Vangelis Koukis
               ]
148 03805fc8 Vangelis Koukis
        }
149 03805fc8 Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30000)
150 03805fc8 Vangelis Koukis
        backend.process_net_status(vm, msg['nics'])
151 03805fc8 Vangelis Koukis
        self.assertEquals(vm.ipfour, '192.168.33.1')
152 03805fc8 Vangelis Koukis
153 03805fc8 Vangelis Koukis
    def test_set_empty_ipv4(self):
154 03805fc8 Vangelis Koukis
        """Test reception of a net status notification with no IPv4 assigned"""
155 03805fc8 Vangelis Koukis
        msg = {'instance': 'instance-name',
156 03805fc8 Vangelis Koukis
               'type':     'ganeti-net-status',
157 03805fc8 Vangelis Koukis
               'nics': [
158 03805fc8 Vangelis Koukis
                   {'ip': '', 'mac': 'aa:00:00:58:1e:b9'}
159 03805fc8 Vangelis Koukis
               ]
160 03805fc8 Vangelis Koukis
        }
161 03805fc8 Vangelis Koukis
        vm = VirtualMachine.objects.get(pk=30000)
162 03805fc8 Vangelis Koukis
        backend.process_net_status(vm, msg['nics'])
163 03805fc8 Vangelis Koukis
        self.assertEquals(vm.ipfour, '0.0.0.0')
164 ec63ae8a Georgios Gousios
165 ec63ae8a Georgios Gousios
166 b8033991 Georgios Gousios
class UsersTestCase(TestCase):
167 b8033991 Georgios Gousios
168 b8033991 Georgios Gousios
    def test_create_uname(self):
169 b8033991 Georgios Gousios
        username = users.create_uname("Donald Knuth")
170 b8033991 Georgios Gousios
        self.assertEquals(username, "knuthd")
171 b8033991 Georgios Gousios
172 b8033991 Georgios Gousios
        username = users.create_uname("Nemichandra Siddhanta Chakravati")
173 b8033991 Georgios Gousios
        self.assertEquals(username, "chakravn")
174 b8033991 Georgios Gousios
175 b8033991 Georgios Gousios
        username = users.create_uname(u'Γεώργιος Παπαγεωργίου')
176 b8033991 Georgios Gousios
        self.assertEquals(username, u'παπαγεωγ')