blob: 4fe767fa9251d58d07e6318e68e5a226abf5cb4b [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
Scott Bakerb1671512019-04-01 19:16:54 -070016import os
17import sys
Matteo Scandolocc94e902018-05-22 15:25:25 -070018from mock import patch, Mock, MagicMock
19
Scott Bakerb1671512019-04-01 19:16:54 -070020test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
21service_dir = os.path.join(test_path, "../../../..")
22xos_dir = os.path.join(test_path, "../../..")
Matteo Scandolo0813b882018-07-16 14:38:01 -040023if not os.path.exists(os.path.join(test_path, "new_base")):
Scott Bakerb1671512019-04-01 19:16:54 -070024 xos_dir = os.path.join(test_path, "../../../../../../orchestration/xos/xos")
25 services_dir = os.path.join(xos_dir, "../../xos_services")
Matteo Scandolo0813b882018-07-16 14:38:01 -040026
Matteo Scandolocc94e902018-05-22 15:25:25 -070027# mocking XOS exception, as they're based in Django
Scott Bakerb1671512019-04-01 19:16:54 -070028
29
Matteo Scandolocc94e902018-05-22 15:25:25 -070030class Exceptions:
31 XOSValidationError = Exception
32 XOSProgrammingError = Exception
33 XOSPermissionDenied = Exception
34
Scott Bakerb1671512019-04-01 19:16:54 -070035
Matteo Scandolocc94e902018-05-22 15:25:25 -070036class XOS:
37 exceptions = Exceptions
38
Scott Bakerb1671512019-04-01 19:16:54 -070039
Matteo Scandolocc94e902018-05-22 15:25:25 -070040class TestRCORDModels(unittest.TestCase):
41 def setUp(self):
Matteo Scandolo0813b882018-07-16 14:38:01 -040042
43 self.sys_path_save = sys.path
44 sys.path.append(xos_dir)
45
Matteo Scandolocc94e902018-05-22 15:25:25 -070046 self.xos = XOS
47
48 self.models_decl = Mock()
49 self.models_decl.RCORDSubscriber_decl = MagicMock
50 self.models_decl.RCORDSubscriber_decl.save = Mock()
51 self.models_decl.RCORDSubscriber_decl.objects = Mock()
52 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = []
53
Luca Preted6700ba2018-09-12 16:40:49 -070054 self.models_decl.RCORDIpAddress_decl = MagicMock
55 self.models_decl.RCORDIpAddress_decl.save = Mock()
56 self.models_decl.RCORDIpAddress_decl.objects = Mock()
57 self.models_decl.RCORDIpAddress_decl.objects.filter.return_value = []
58
Matteo Scandolocc94e902018-05-22 15:25:25 -070059 modules = {
60 'xos.exceptions': self.xos.exceptions,
61 'models_decl': self.models_decl
62 }
63
64 self.module_patcher = patch.dict('sys.modules', modules)
65 self.module_patcher.start()
66
67 self.volt = Mock()
68
Luca Preted6700ba2018-09-12 16:40:49 -070069 from models import RCORDSubscriber, RCORDIpAddress
Matteo Scandolocc94e902018-05-22 15:25:25 -070070
71 self.rcord_subscriber_class = RCORDSubscriber
72
73 self.rcord_subscriber = RCORDSubscriber()
Matteo Scandolo10d94512019-03-04 15:54:43 -080074 self.rcord_subscriber.deleted = False
Scott Bakerb1671512019-04-01 19:16:54 -070075 self.rcord_subscriber.id = None # this is a new model
Matteo Scandoloaa37b422018-05-23 15:36:56 -070076 self.rcord_subscriber.is_new = True
Matteo Scandolocc94e902018-05-22 15:25:25 -070077 self.rcord_subscriber.onu_device = "BRCM1234"
Matteo Scandoloaa37b422018-05-23 15:36:56 -070078 self.rcord_subscriber.c_tag = 111
Matteo Scandoloc348b3f2018-07-29 09:35:11 -070079 self.rcord_subscriber.s_tag = 222
Luca Preted6700ba2018-09-12 16:40:49 -070080 self.rcord_subscriber.ips = Mock()
81 self.rcord_subscriber.ips.all.return_value = []
Matteo Scandolocc94e902018-05-22 15:25:25 -070082 self.rcord_subscriber.mac_address = "00:AA:00:00:00:01"
83 self.rcord_subscriber.owner.leaf_model.access = "voltha"
84 self.rcord_subscriber.owner.provider_services = [self.volt]
85
Luca Preted6700ba2018-09-12 16:40:49 -070086 self.rcord_ip = RCORDIpAddress()
Scott Bakerb1671512019-04-01 19:16:54 -070087 self.rcord_ip.subscriber = 1
Luca Preted6700ba2018-09-12 16:40:49 -070088
Matteo Scandolo0813b882018-07-16 14:38:01 -040089 def tearDown(self):
90 sys.path = self.sys_path_save
Matteo Scandolocc94e902018-05-22 15:25:25 -070091
92 def test_save(self):
93 self.rcord_subscriber.save()
94 self.models_decl.RCORDSubscriber_decl.save.assert_called()
95
Luca Preted6700ba2018-09-12 16:40:49 -070096 def _test_validate_ipv4_address(self):
97 self.rcord_ip.ip = "192.168.0."
Matteo Scandolocc94e902018-05-22 15:25:25 -070098 with self.assertRaises(Exception) as e:
Luca Preted6700ba2018-09-12 16:40:49 -070099 self.rcord_ip.save()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700100
Luca Preted6700ba2018-09-12 16:40:49 -0700101 self.assertEqual(e.exception.message, "The IP specified is not valid: 192.168.0.")
102 self.models_decl.RCORDIpAddress.save.assert_not_called()
103
104 def test_validate_ipv6_address(self):
105 self.rcord_ip.ip = "2001:0db8:85a3:0000:0000:8a2e:03"
106 with self.assertRaises(Exception) as e:
107 self.rcord_ip.save()
108
109 self.assertEqual(e.exception.message, "The IP specified is not valid: 2001:0db8:85a3:0000:0000:8a2e:03")
110 self.models_decl.RCORDIpAddress.save.assert_not_called()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700111
112 def test_validate_mac_address(self):
113 self.rcord_subscriber.mac_address = "invalid"
114 with self.assertRaises(Exception) as e:
115 self.rcord_subscriber.save()
116
Luca Preted6700ba2018-09-12 16:40:49 -0700117 self.assertEqual(e.exception.message, "The MAC address specified is not valid: invalid")
Matteo Scandolocc94e902018-05-22 15:25:25 -0700118 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
119
120 def test_valid_onu_device(self):
121 self.rcord_subscriber.save()
122 self.models_decl.RCORDSubscriber_decl.save.assert_called()
123
124 def test_invalid_onu_device(self):
125 self.volt.leaf_model.has_access_device.return_value = False
126 with self.assertRaises(Exception) as e:
127 self.rcord_subscriber.save()
128
129 self.assertEqual(e.exception.message, "The onu_device you specified (BRCM1234) does not exists")
130 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
131
Matteo Scandolo10d94512019-03-04 15:54:43 -0800132 def test_missing_onu_device_on_delete(self):
133 self.volt.leaf_model.has_access_device.return_value = False
134 self.rcord_subscriber.deleted = True
135 self.rcord_subscriber.save()
136 self.models_decl.RCORDSubscriber_decl.save.assert_called()
137
Matteo Scandoloa1875602018-10-16 07:35:04 -0700138 def test_validate_c_tag_pass(self):
139 """
140 check that other subscriber attached to the same ONU don't have the same c_tag
141 """
142
143 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [self.rcord_subscriber]
144
Matteo Scandoloa1875602018-10-16 07:35:04 -0700145 self.rcord_subscriber.save()
146
147 self.models_decl.RCORDSubscriber_decl.save.assert_called()
148
149 def test_validate_c_tag_fail(self):
Matteo Scandolocc94e902018-05-22 15:25:25 -0700150 """
151 check that other subscriber attached to the same ONU don't have the same c_tag
152 """
153
154 s = Mock()
Matteo Scandoloaa37b422018-05-23 15:36:56 -0700155 s.c_tag = 111
Matteo Scandolocc94e902018-05-22 15:25:25 -0700156 s.onu_device = "BRCM1234"
157
Matteo Scandoloa1875602018-10-16 07:35:04 -0700158 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s, self.rcord_subscriber]
Matteo Scandolocc94e902018-05-22 15:25:25 -0700159
160 with self.assertRaises(Exception) as e:
161 self.rcord_subscriber.save()
162
163 self.assertEqual(e.exception.message, "The c_tag you specified (111) has already been used on device BRCM1234")
164 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
165
HARDIK WINDLASSabe3a9c2019-03-18 16:17:28 +0530166 def test_validate_get_used_s_c_tag_subscriber_id(self):
Matteo Scandoloa1875602018-10-16 07:35:04 -0700167 """
168 check that other subscriber using the same s_tag don't have the same c_tag
169 """
HARDIK WINDLASSabe3a9c2019-03-18 16:17:28 +0530170 s1 = Mock()
171 s1.id = 456
172 s1.c_tag = 999
173 s1.s_tag = 222
174 s1.onu_device = "BRCM1234"
175
176 s2 = Mock()
177 s2.id = 123
178 s2.c_tag = 111
179 s2.s_tag = 222
180 s2.onu_device = "BRCM12345"
181
182 self.rcord_subscriber.get_same_onu_subscribers = Mock()
183 self.rcord_subscriber.get_same_onu_subscribers.return_value = [s1]
184
185 self.rcord_subscriber.get_same_s_c_tag_subscribers = Mock()
186 self.rcord_subscriber.get_same_s_c_tag_subscribers.return_value = [s2]
Matteo Scandoloa1875602018-10-16 07:35:04 -0700187
188 with self.assertRaises(Exception) as e:
189 self.rcord_subscriber.save()
190
Scott Bakerb1671512019-04-01 19:16:54 -0700191 self.assertEqual(e.exception.message,
192 "The c_tag(111) and s_tag(222) pair you specified,has already been used by Subscriber with Id (123)")
Matteo Scandoloa1875602018-10-16 07:35:04 -0700193 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
194
Matteo Scandoloaa37b422018-05-23 15:36:56 -0700195 def test_validate_c_tag_on_update(self):
196 s = Mock()
197 s.c_tag = 111
198 s.onu_device = "BRCM1234"
199 s.id = 1
200
201 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s]
202
203 self.rcord_subscriber.is_new = False
204 self.rcord_subscriber.id = 1
205 self.rcord_subscriber.save()
206
207 self.models_decl.RCORDSubscriber_decl.save.assert_called()
208
209 def test_validate_c_tag_on_update_fail(self):
210 s = Mock()
211 s.c_tag = 222
212 s.onu_device = "BRCM1234"
213 s.id = 2
214
215 self.models_decl.RCORDSubscriber_decl.objects.filter.return_value = [s]
216
217 self.rcord_subscriber.id = 1
218 self.rcord_subscriber.is_new = False
219 self.rcord_subscriber.c_tag = 222
220 with self.assertRaises(Exception) as e:
221 self.rcord_subscriber.save()
222
223 self.assertEqual(e.exception.message, "The c_tag you specified (222) has already been used on device BRCM1234")
224 self.models_decl.RCORDSubscriber_decl.save.assert_not_called()
Matteo Scandolocc94e902018-05-22 15:25:25 -0700225
226 def test_generate_c_tag(self):
227 s = Mock()
228 s.c_tag = "111"
HARDIK WINDLASSabe3a9c2019-03-18 16:17:28 +0530229 s.s_tag = "223"
Matteo Scandolocc94e902018-05-22 15:25:25 -0700230 s.onu_device = "BRCM1234"
231
HARDIK WINDLASSabe3a9c2019-03-18 16:17:28 +0530232 self.rcord_subscriber.get_same_onu_subscribers = Mock()
233 self.rcord_subscriber.get_same_onu_subscribers.return_value = [s]
234
235 self.rcord_subscriber.get_same_s_c_tag_subscribers = Mock()
236 self.rcord_subscriber.get_same_s_c_tag_subscribers.return_value = []
237
Matteo Scandolocc94e902018-05-22 15:25:25 -0700238 self.rcord_subscriber.c_tag = None
239
240 self.rcord_subscriber.save()
241
242 self.models_decl.RCORDSubscriber_decl.save.assert_called()
243 self.assertNotEquals(self.rcord_subscriber.c_tag, "111")
244 self.assertGreater(self.rcord_subscriber.c_tag, 16)
245 self.assertLess(self.rcord_subscriber.c_tag, 4097)
246
Matteo Scandoloc348b3f2018-07-29 09:35:11 -0700247 def test_generate_s_tag(self):
HARDIK WINDLASSabe3a9c2019-03-18 16:17:28 +0530248 self.rcord_subscriber.s_tag = None
Matteo Scandoloc348b3f2018-07-29 09:35:11 -0700249
250 self.rcord_subscriber.save()
251
252 self.models_decl.RCORDSubscriber_decl.save.assert_called()
253 self.assertNotEqual(self.rcord_subscriber.s_tag, None)
254
255 def test_provisioned_s_stag(self):
256 self.rcord_subscriber.save()
257 self.models_decl.RCORDSubscriber_decl.save.assert_called()
258 self.assertEqual(self.rcord_subscriber.s_tag, 222)
259
260
Matteo Scandolocc94e902018-05-22 15:25:25 -0700261if __name__ == '__main__':
262 unittest.main()