blob: 406e607253acee7c6472df12a8d2a2ff72ee4903 [file] [log] [blame]
Matteo Scandolocc94e902018-05-22 15:25:25 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15import unittest
Matteo Scandolo0813b882018-07-16 14:38:01 -040016import os, sys
Matteo Scandolocc94e902018-05-22 15:25:25 -070017from mock import patch, Mock, MagicMock
18
Matteo Scandolo0813b882018-07-16 14:38:01 -040019test_path=os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
20service_dir=os.path.join(test_path, "../../../..")
21xos_dir=os.path.join(test_path, "../../..")
22if not os.path.exists(os.path.join(test_path, "new_base")):
23 xos_dir=os.path.join(test_path, "../../../../../../orchestration/xos/xos")
24 services_dir=os.path.join(xos_dir, "../../xos_services")
25
Matteo Scandolocc94e902018-05-22 15:25:25 -070026# mocking XOS exception, as they're based in Django
27class Exceptions:
28 XOSValidationError = Exception
29 XOSProgrammingError = Exception
30 XOSPermissionDenied = Exception
31
32class XOS:
33 exceptions = Exceptions
34
35class TestRCORDModels(unittest.TestCase):
36 def setUp(self):
Matteo Scandolo0813b882018-07-16 14:38:01 -040037
38 self.sys_path_save = sys.path
39 sys.path.append(xos_dir)
40
Matteo Scandolocc94e902018-05-22 15:25:25 -070041 self.xos = XOS
42
43 self.models_decl = Mock()
44 self.models_decl.RCORDSubscriber_decl = MagicMock
45 self.models_decl.RCORDSubscriber_decl.save = Mock()
46 self.models_decl.RCORDSubscriber_decl.objects = Mock()
47 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = []
48
Luca Preted6700ba2018-09-12 16:40:49 -070049 self.models_decl.RCORDIpAddress_decl = MagicMock
50 self.models_decl.RCORDIpAddress_decl.save = Mock()
51 self.models_decl.RCORDIpAddress_decl.objects = Mock()
52 self.models_decl.RCORDIpAddress_decl.objects.filter.return_value = []
53
Matteo Scandolocc94e902018-05-22 15:25:25 -070054
55 modules = {
56 'xos.exceptions': self.xos.exceptions,
57 'models_decl': self.models_decl
58 }
59
60 self.module_patcher = patch.dict('sys.modules', modules)
61 self.module_patcher.start()
62
63 self.volt = Mock()
64
Luca Preted6700ba2018-09-12 16:40:49 -070065 from models import RCORDSubscriber, RCORDIpAddress
Matteo Scandolocc94e902018-05-22 15:25:25 -070066
67 self.rcord_subscriber_class = RCORDSubscriber
68
69 self.rcord_subscriber = RCORDSubscriber()
Matteo Scandolodda227e2019-03-04 15:54:43 -080070 self.rcord_subscriber.deleted = False
Matteo Scandoloaa37b422018-05-23 15:36:56 -070071 self.rcord_subscriber.id = None # this is a new model
72 self.rcord_subscriber.is_new = True
Matteo Scandolocc94e902018-05-22 15:25:25 -070073 self.rcord_subscriber.onu_device = "BRCM1234"
Matteo Scandoloaa37b422018-05-23 15:36:56 -070074 self.rcord_subscriber.c_tag = 111
Matteo Scandoloc348b3f2018-07-29 09:35:11 -070075 self.rcord_subscriber.s_tag = 222
Luca Preted6700ba2018-09-12 16:40:49 -070076 self.rcord_subscriber.ips = Mock()
77 self.rcord_subscriber.ips.all.return_value = []
Matteo Scandolocc94e902018-05-22 15:25:25 -070078 self.rcord_subscriber.mac_address = "00:AA:00:00:00:01"
79 self.rcord_subscriber.owner.leaf_model.access = "voltha"
80 self.rcord_subscriber.owner.provider_services = [self.volt]
81
Luca Preted6700ba2018-09-12 16:40:49 -070082 self.rcord_ip = RCORDIpAddress()
83 self.rcord_ip.subscriber = 1;
84
Matteo Scandolo0813b882018-07-16 14:38:01 -040085 def tearDown(self):
86 sys.path = self.sys_path_save
Matteo Scandolocc94e902018-05-22 15:25:25 -070087
88 def test_save(self):
89 self.rcord_subscriber.save()
90 self.models_decl.RCORDSubscriber_decl.save.assert_called()
91
Luca Preted6700ba2018-09-12 16:40:49 -070092 def _test_validate_ipv4_address(self):
93 self.rcord_ip.ip = "192.168.0."
Matteo Scandolocc94e902018-05-22 15:25:25 -070094 with self.assertRaises(Exception) as e:
Luca Preted6700ba2018-09-12 16:40:49 -070095 self.rcord_ip.save()
Matteo Scandolocc94e902018-05-22 15:25:25 -070096
Luca Preted6700ba2018-09-12 16:40:49 -070097 self.assertEqual(e.exception.message, "The IP specified is not valid: 192.168.0.")
98 self.models_decl.RCORDIpAddress.save.assert_not_called()
99
100 def test_validate_ipv6_address(self):
101 self.rcord_ip.ip = "2001:0db8:85a3:0000:0000:8a2e:03"
102 with self.assertRaises(Exception) as e:
103 self.rcord_ip.save()
104
105 self.assertEqual(e.exception.message, "The IP specified is not valid: 2001:0db8:85a3:0000:0000:8a2e:03")
106 self.models_decl.RCORDIpAddress.save.assert_not_called()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700107
108 def test_validate_mac_address(self):
109 self.rcord_subscriber.mac_address = "invalid"
110 with self.assertRaises(Exception) as e:
111 self.rcord_subscriber.save()
112
Luca Preted6700ba2018-09-12 16:40:49 -0700113 self.assertEqual(e.exception.message, "The MAC address specified is not valid: invalid")
Matteo Scandolocc94e902018-05-22 15:25:25 -0700114 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
115
116 def test_valid_onu_device(self):
117 self.rcord_subscriber.save()
118 self.models_decl.RCORDSubscriber_decl.save.assert_called()
119
120 def test_invalid_onu_device(self):
121 self.volt.leaf_model.has_access_device.return_value = False
122 with self.assertRaises(Exception) as e:
123 self.rcord_subscriber.save()
124
125 self.assertEqual(e.exception.message, "The onu_device you specified (BRCM1234) does not exists")
126 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
127
Matteo Scandolodda227e2019-03-04 15:54:43 -0800128 def test_missing_onu_device_on_delete(self):
129 self.volt.leaf_model.has_access_device.return_value = False
130 self.rcord_subscriber.deleted = True
131 self.rcord_subscriber.save()
132 self.models_decl.RCORDSubscriber_decl.save.assert_called()
133
Matteo Scandoloa1875602018-10-16 07:35:04 -0700134 def test_validate_c_tag_pass(self):
135 """
136 check that other subscriber attached to the same ONU don't have the same c_tag
137 """
138
139 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [self.rcord_subscriber]
140
Matteo Scandoloa1875602018-10-16 07:35:04 -0700141 self.rcord_subscriber.save()
142
143 self.models_decl.RCORDSubscriber_decl.save.assert_called()
144
145 def test_validate_c_tag_fail(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -0700146 """
147 check that other subscriber attached to the same ONU don't have the same c_tag
148 """
149
150 s = Mock()
Matteo Scandoloaa37b422018-05-23 15:36:56 -0700151 s.c_tag = 111
Matteo Scandolocc94e902018-05-22 15:25:25 -0700152 s.onu_device = "BRCM1234"
153
Matteo Scandoloa1875602018-10-16 07:35:04 -0700154 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s, self.rcord_subscriber]
Matteo Scandolocc94e902018-05-22 15:25:25 -0700155
156 with self.assertRaises(Exception) as e:
157 self.rcord_subscriber.save()
158
159 self.assertEqual(e.exception.message, "The c_tag you specified (111) has already been used on device BRCM1234")
160 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
161
Matteo Scandoloa1875602018-10-16 07:35:04 -0700162 def _test_validate_c_tag_on_same_s_tag(self):
163 """
164 check that other subscriber using the same s_tag don't have the same c_tag
165 """
166 s = Mock()
167 s.id = 123
168 s.c_tag = 111
169 s.s_tag = 222
170 s.onu_device = "BRCM1234"
171
172 with self.assertRaises(Exception) as e:
173 self.rcord_subscriber.save()
174
175 self.assertEqual(e.exception.message, "The c_tag you specified (111) has already been used by Subscriber with id 123 and the same s_tag: 222")
176 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
177
178
Matteo Scandoloaa37b422018-05-23 15:36:56 -0700179 def test_validate_c_tag_on_update(self):
180 s = Mock()
181 s.c_tag = 111
182 s.onu_device = "BRCM1234"
183 s.id = 1
184
185 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s]
186
187 self.rcord_subscriber.is_new = False
188 self.rcord_subscriber.id = 1
189 self.rcord_subscriber.save()
190
191 self.models_decl.RCORDSubscriber_decl.save.assert_called()
192
193 def test_validate_c_tag_on_update_fail(self):
194 s = Mock()
195 s.c_tag = 222
196 s.onu_device = "BRCM1234"
197 s.id = 2
198
199 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s]
200
201 self.rcord_subscriber.id = 1
202 self.rcord_subscriber.is_new = False
203 self.rcord_subscriber.c_tag = 222
204 with self.assertRaises(Exception) as e:
205 self.rcord_subscriber.save()
206
207 self.assertEqual(e.exception.message, "The c_tag you specified (222) has already been used on device BRCM1234")
208 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700209
210 def test_generate_c_tag(self):
211 s = Mock()
212 s.c_tag = "111"
213 s.onu_device = "BRCM1234"
214
215 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s]
216 self.rcord_subscriber.c_tag = None
217
218 self.rcord_subscriber.save()
219
220 self.models_decl.RCORDSubscriber_decl.save.assert_called()
221 self.assertNotEquals(self.rcord_subscriber.c_tag, "111")
222 self.assertGreater(self.rcord_subscriber.c_tag, 16)
223 self.assertLess(self.rcord_subscriber.c_tag, 4097)
224
Matteo Scandoloc348b3f2018-07-29 09:35:11 -0700225 def test_generate_s_tag(self):
226 self.rcord_subscriber.c_tag = None
227
228 self.rcord_subscriber.save()
229
230 self.models_decl.RCORDSubscriber_decl.save.assert_called()
231 self.assertNotEqual(self.rcord_subscriber.s_tag, None)
232
233 def test_provisioned_s_stag(self):
234 self.rcord_subscriber.save()
235 self.models_decl.RCORDSubscriber_decl.save.assert_called()
236 self.assertEqual(self.rcord_subscriber.s_tag, 222)
237
238
Matteo Scandolocc94e902018-05-22 15:25:25 -0700239
240if __name__ == '__main__':
241 unittest.main()