TestInterface.test_repr()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
"""Interface tests."""
2 1
import logging
3 1
import pickle
4 1
from unittest.mock import MagicMock, Mock
5
6 1
import pytest
7 1
from pyof.v0x04.common.port import PortFeatures
8
9 1
from kytos.core.common import EntityStatus
10 1
from kytos.core.exceptions import (KytosSetTagRangeError,
11
                                   KytosTagsAreNotAvailable,
12
                                   KytosTagsNotInTagRanges,
13
                                   KytosTagtypeNotSupported)
14 1
from kytos.core.interface import TAG, UNI, Interface
15 1
from kytos.core.switch import Switch
16
17 1
logging.basicConfig(level=logging.CRITICAL)
18
19
20 1
class TestTAG():
21
    """TAG tests."""
22
23 1
    def setup_method(self):
24
        """Create TAG object."""
25 1
        self.tag = TAG('vlan', 123)
26
27 1
    async def test_from_dict(self):
28
        """Test from_dict method."""
29 1
        tag_dict = {'tag_type': 'vlan_qinq', 'value': 456}
30 1
        tag = self.tag.from_dict(tag_dict)
31
32 1
        assert tag.tag_type == 'vlan_qinq'
33 1
        assert tag.value == 456
34
35 1
    async def test_as_dict(self):
36
        """Test as_dict method."""
37 1
        assert self.tag.as_dict() == {'tag_type': 'vlan', 'value': 123}
38
39 1
    async def test_from_json(self):
40
        """Test from_json method."""
41 1
        tag_json = '{"tag_type": "vlan_qinq", "value": 456}'
42 1
        tag = self.tag.from_json(tag_json)
43
44 1
        assert tag.tag_type == "vlan_qinq"
45 1
        assert tag.value == 456
46
47 1
    async def test_as_json(self):
48
        """Test as_json method."""
49 1
        assert self.tag.as_json() == '{"tag_type": "vlan", "value": 123}'
50
51 1
    async def test__repr__(self):
52
        """Test __repr__ method."""
53 1
        assert repr(self.tag) == "TAG('vlan', 123)"
54
55
56
# pylint: disable=protected-access, too-many-public-methods
57 1
class TestInterface():
58
    """Test Interfaces."""
59
60 1
    def setup_method(self):
61
        """Create interface object."""
62 1
        self.iface = self._get_v0x04_iface()
63
64 1
    async def test_repr(self):
65
        """Test repr() output."""
66 1
        expected = "Interface('name', 42, Switch('dpid'))"
67 1
        assert repr(self.iface) == expected
68
69 1
    @staticmethod
70 1
    def _get_v0x04_iface(*args, **kwargs):
71
        """Create a v0x04 interface object with optional extra arguments."""
72 1
        switch = Switch('dpid')
73 1
        switch.connection = Mock()
74 1
        switch.connection.protocol.version = 0x04
75 1
        switch.update_lastseen()
76 1
        return Interface('name', 42, switch, *args, **kwargs)
77
78 1
    async def test_speed_feature_none(self):
79
        """When port's current features is None."""
80 1
        self.iface.features = None
81 1
        assert self.iface.speed is None
82 1
        assert '' == self.iface.get_hr_speed()
83
84 1
    async def test_speed_feature_zero(self):
85
        """When port's current features is 0. E.g. port 65534."""
86 1
        self.iface.features = 0
87 1
        assert self.iface.speed is None
88 1
        assert '' == self.iface.get_hr_speed()
89
90 1
    async def test_1_tera_speed(self):
91
        """1Tb link."""
92 1
        self.iface.features = PortFeatures.OFPPF_1TB_FD
93 1
        assert 10**12 / 8 == self.iface.speed
94 1
        assert '1 Tbps' == self.iface.get_hr_speed()
95
96 1
    async def test_100_giga_speed(self):
97
        """100Gb link."""
98 1
        self.iface.features = PortFeatures.OFPPF_100GB_FD
99 1
        assert 100 * 10**9 / 8 == self.iface.speed
100 1
        assert '100 Gbps' == self.iface.get_hr_speed()
101
102 1
    async def test_40_giga_speed(self):
103
        """40Gb link."""
104 1
        self.iface.features = PortFeatures.OFPPF_40GB_FD
105 1
        assert 40 * 10**9 / 8 == self.iface.speed
106 1
        assert '40 Gbps' == self.iface.get_hr_speed()
107
108 1
    async def test_10_giga_speed(self):
109
        """10Gb link."""
110 1
        self.iface.features = PortFeatures.OFPPF_10GB_FD
111 1
        assert 10 * 10**9 / 8 == self.iface.speed
112 1
        assert '10 Gbps' == self.iface.get_hr_speed()
113
114 1
    async def test_1_giga_speed(self):
115
        """1Gb link."""
116 1
        self.iface.features = PortFeatures.OFPPF_1GB_FD
117 1
        assert 10**9 / 8 == self.iface.speed
118 1
        assert '1 Gbps' == self.iface.get_hr_speed()
119
120 1
    async def test_100_mega_speed(self):
121
        """100Mb link."""
122 1
        self.iface.features = PortFeatures.OFPPF_100MB_FD
123 1
        assert 100 * 10**6 / 8 == self.iface.speed
124 1
        assert '100 Mbps' == self.iface.get_hr_speed()
125
126 1
    async def test_10_mega_speed(self):
127
        """10Mb link."""
128 1
        self.iface.features = PortFeatures.OFPPF_10MB_FD
129 1
        assert 10 * 10**6 / 8 == self.iface.speed
130 1
        assert '10 Mbps' == self.iface.get_hr_speed()
131
132 1
    async def test_speed_setter(self):
133
        """Should return speed that was set and not features'."""
134 1
        expected_speed = 12345
135 1
        self.iface.set_custom_speed(expected_speed)
136 1
        actual_speed = self.iface.speed
137 1
        assert expected_speed == actual_speed
138
139 1
    async def test_speed_in_constructor(self):
140
        """Custom speed should override features'."""
141 1
        expected_speed = 6789
142 1
        iface = self._get_v0x04_iface(speed=expected_speed)
143 1
        assert expected_speed == iface.speed
144
145 1
    async def test_speed_removing_features(self):
146
        """Should return custom speed again when features becomes None."""
147 1
        custom_speed = 101112
148 1
        of_speed = 10 * 10**6 / 8
149 1
        iface = self._get_v0x04_iface(speed=custom_speed,
150
                                      features=PortFeatures.OFPPF_10MB_FD)
151 1
        assert of_speed == iface.speed
152 1
        iface.features = None
153 1
        assert custom_speed == iface.speed
154
155 1
    async def test_interface_available_tags_tag_ranges(self):
156
        """Test available_tags and tag_ranges on Interface class."""
157 1
        default_available = {'vlan': [[1, 4094]]}
158 1
        default_tag_ranges = {'vlan': [[1, 4094]]}
159 1
        default_special_vlans = {'vlan': ["untagged", "any"]}
160 1
        default_special_tags = {'vlan': ["untagged", "any"]}
161 1
        assert self.iface.available_tags == default_available
162 1
        assert self.iface.tag_ranges == default_tag_ranges
163 1
        assert self.iface.special_available_tags == default_special_vlans
164 1
        assert self.iface.special_tags == default_special_tags
165
166 1
        custom_available = {'vlan': [[10, 200], [210, 4094]]}
167 1
        custom_tag_ranges = {'vlan': [[1, 100], [200, 4094]]}
168 1
        custom_special_vlans = {'vlan': ["any"]}
169 1
        custom_special_tags = {'vlan': ["any"]}
170 1
        self.iface.set_available_tags_tag_ranges(
171
            custom_available, custom_tag_ranges,
172
            custom_special_vlans, custom_special_tags
173
        )
174 1
        assert self.iface.available_tags == custom_available
175 1
        assert self.iface.tag_ranges == custom_tag_ranges
176 1
        assert self.iface.special_available_tags == custom_special_vlans
177 1
        assert self.iface.special_tags == custom_special_tags
178
179 1
    async def test_interface_is_tag_available(self):
180
        """Test is_tag_available on Interface class."""
181 1
        max_range = 4095
182 1
        for tag in range(1, max_range):
183 1
            next_tag = self.iface.is_tag_available(tag)
184 1
            assert next_tag
185
186
        # test lower limit
187 1
        assert self.iface.is_tag_available(0) is False
188
        # test upper limit
189 1
        assert self.iface.is_tag_available(max_range) is False
190
191 1
    async def test_interface_use_tags(self, controller):
192
        """Test all use_tags on Interface class."""
193 1
        self.iface._notify_interface_tags = MagicMock()
194 1
        tags = [100, 200]
195
        # check use tag for the first time
196 1
        self.iface.use_tags(controller, tags)
197 1
        assert self.iface._notify_interface_tags.call_count == 1
198
199
        # check use tag for the second time
200 1
        with pytest.raises(KytosTagsAreNotAvailable):
201 1
            self.iface.use_tags(controller, tags)
202 1
        assert self.iface._notify_interface_tags.call_count == 1
203
204
        # check use tag after returning the tag to the pool as list
205 1
        self.iface.make_tags_available(controller, [tags])
206 1
        self.iface.use_tags(controller, [tags])
207 1
        assert self.iface._notify_interface_tags.call_count == 3
208
209 1
        with pytest.raises(KytosTagsAreNotAvailable):
210 1
            self.iface.use_tags(controller, [tags])
211 1
        assert self.iface._notify_interface_tags.call_count == 3
212
213 1
        with pytest.raises(KytosTagsAreNotAvailable):
214 1
            self.iface.use_tags(controller, [tags], use_lock=False)
215 1
        assert self.iface._notify_interface_tags.call_count == 3
216
217 1
        self.iface.use_tags(controller, "untagged")
218 1
        assert "untagged" not in self.iface.special_available_tags["vlan"]
219
220 1
    async def test_get_endpoint(self):
221
        """Test get_endpoint method."""
222 1
        endpoint = ('endpoint', 'time')
223 1
        self.iface.endpoints = [endpoint]
224
225 1
        return_endpoint = self.iface.get_endpoint('endpoint')
226
227 1
        assert return_endpoint == endpoint
228
229 1
    async def test_add_endpoint(self):
230
        """Test add_endpoint method."""
231 1
        self.iface.add_endpoint('endpoint')
232
233 1
        assert len(self.iface.endpoints) == 1
234
235 1
    async def test_delete_endpoint(self):
236
        """Test delete_endpoint method."""
237 1
        endpoint = ('endpoint', 'time')
238 1
        self.iface.endpoints = [endpoint]
239
240 1
        self.iface.delete_endpoint('endpoint')
241
242 1
        assert len(self.iface.endpoints) == 0
243
244 1
    async def test_update_endpoint(self):
245
        """Test update_endpoint method."""
246 1
        endpoint = ('endpoint', 'time')
247 1
        self.iface.endpoints = [endpoint]
248
249 1
        self.iface.update_endpoint('endpoint')
250
251 1
        assert len(self.iface.endpoints) == 1
252
253 1
    async def test_update_link__none(self):
254
        """Test update_link method when this interface is not in link
255
           endpoints."""
256 1
        link = MagicMock()
257 1
        link.endpoint_a = MagicMock()
258 1
        link.endpoint_b = MagicMock()
259
260 1
        result = self.iface.update_link(link)
261
262 1
        assert result is False
263
264 1
    async def test_update_link__endpoint_a(self):
265
        """Test update_link method when this interface is the endpoint a."""
266 1
        interface = MagicMock()
267 1
        interface.link = None
268 1
        link = MagicMock()
269 1
        link.endpoint_a = self.iface
270 1
        link.endpoint_b = interface
271
272 1
        self.iface.update_link(link)
273
274 1
        assert self.iface.link == link
275 1
        assert interface.link == link
276
277 1
    async def test_update_link__endpoint_b(self):
278
        """Test update_link method when this interface is the endpoint b."""
279 1
        interface = MagicMock()
280 1
        interface.link = None
281 1
        link = MagicMock()
282 1
        link.endpoint_a = interface
283 1
        link.endpoint_b = self.iface
284
285 1
        self.iface.update_link(link)
286
287 1
        assert self.iface.link == link
288 1
        assert interface.link == link
289
290 1
    @staticmethod
291 1
    async def test_pickleable_id() -> None:
292
        """Test to make sure the id is pickleable."""
293 1
        switch = Switch("dpid1")
294 1
        interface = Interface("s1-eth1", 1, switch)
295 1
        pickled = pickle.dumps(interface.as_dict())
296 1
        intf_dict = pickle.loads(pickled)
297 1
        assert intf_dict["id"] == interface.id
298
299 1
    async def test_status_funcs(self) -> None:
300
        """Test status_funcs."""
301 1
        self.iface.enable()
302 1
        self.iface.activate()
303 1
        assert self.iface.is_active()
304 1
        Interface.register_status_func(
305
            "some_napp_some_func",
306
            lambda iface: EntityStatus.DOWN
307
        )
308 1
        Interface.register_status_reason_func(
309
            "some_napp_some_func",
310
            lambda iface: {'test_status'}
311
        )
312 1
        assert self.iface.status == EntityStatus.DOWN
313 1
        assert self.iface.status_reason == {'test_status'}
314 1
        Interface.register_status_func(
315
            "some_napp_some_func",
316
            lambda iface: None
317
        )
318 1
        Interface.register_status_reason_func(
319
            "some_napp_some_func",
320
            lambda iface: set()
321
        )
322 1
        assert self.iface.status == EntityStatus.UP
323 1
        assert self.iface.status_reason == set()
324
325 1
    async def test_default_tag_values(self) -> None:
326
        """Test default_tag_values property"""
327 1
        expected = {
328
            "vlan": [[1, 4094]],
329
            "vlan_qinq": [[1, 4094]],
330
            "mpls": [[1, 1048575]],
331
        }
332 1
        assert self.iface.default_tag_values == expected
333
334 1
    async def test_make_tags_available(self, controller) -> None:
335
        """Test make_tags_available"""
336 1
        available = {'vlan': [[300, 3000]]}
337 1
        tag_ranges = {'vlan': [[20, 20], [200, 3000]]}
338 1
        special_available_tags = {'vlan': []}
339 1
        special_tags = {'vlan': ["any"]}
340 1
        self.iface._notify_interface_tags = MagicMock()
341 1
        self.iface.set_available_tags_tag_ranges(
342
            available, tag_ranges,
343
            special_available_tags, special_tags
344
        )
345 1
        assert self.iface.available_tags == available
346 1
        assert self.iface.tag_ranges == tag_ranges
347
348 1
        with pytest.raises(KytosTagsNotInTagRanges):
349 1
            self.iface.make_tags_available(controller, [1, 20])
350 1
        assert self.iface._notify_interface_tags.call_count == 0
351
352 1
        with pytest.raises(KytosTagsNotInTagRanges):
353 1
            self.iface.make_tags_available(controller, [[1, 20]])
354 1
        assert self.iface._notify_interface_tags.call_count == 0
355
356 1
        assert not self.iface.make_tags_available(controller, [250, 280])
357 1
        assert self.iface._notify_interface_tags.call_count == 1
358
359 1
        with pytest.raises(KytosTagsNotInTagRanges):
360 1
            self.iface.make_tags_available(controller, [1, 1], use_lock=False)
361
362 1
        assert self.iface.make_tags_available(controller, 300) == [[300, 300]]
363
364 1
        with pytest.raises(KytosTagsNotInTagRanges):
365 1
            self.iface.make_tags_available(controller, "untagged")
366
367 1
        assert self.iface.make_tags_available(controller, "any") is None
368 1
        assert "any" in self.iface.special_available_tags["vlan"]
369 1
        assert self.iface.make_tags_available(controller, "any") == "any"
370
371 1
    async def test_set_tag_ranges(self, controller) -> None:
372
        """Test set_tag_ranges"""
373 1
        tag_ranges = [[20, 20], [200, 3000]]
374 1
        with pytest.raises(KytosTagtypeNotSupported):
375 1
            self.iface.set_tag_ranges(tag_ranges, 'vlan_qinq')
376
377 1
        self.iface.set_tag_ranges(tag_ranges, 'vlan')
378 1
        self.iface.use_tags(controller, [200, 250])
379 1
        ava_expected = [[20, 20], [251, 3000]]
380 1
        assert self.iface.tag_ranges['vlan'] == tag_ranges
381 1
        assert self.iface.available_tags['vlan'] == ava_expected
382
383 1
        tag_ranges = [[20, 20], [400, 1000]]
384 1
        with pytest.raises(KytosSetTagRangeError):
385 1
            self.iface.set_tag_ranges(tag_ranges, 'vlan')
386
387 1
    async def test_remove_tag_ranges(self) -> None:
388
        """Test remove_tag_ranges"""
389 1
        tag_ranges = [[20, 20], [200, 3000]]
390 1
        self.iface.set_tag_ranges(tag_ranges, 'vlan')
391 1
        assert self.iface.tag_ranges['vlan'] == tag_ranges
392
393 1
        with pytest.raises(KytosTagtypeNotSupported):
394 1
            self.iface.remove_tag_ranges('vlan_qinq')
395
396 1
        self.iface.remove_tag_ranges('vlan')
397 1
        default = [[1, 4094]]
398 1
        assert self.iface.tag_ranges['vlan'] == default
399
400 1
    def test_set_special_tags(self) -> None:
401
        """Test set_special_tags"""
402 1
        self.iface.special_available_tags["vlan"] = ["untagged"]
403 1
        tag_type = "error"
404 1
        special_tags = ["untagged", "any"]
405 1
        with pytest.raises(KytosTagtypeNotSupported):
406 1
            self.iface.set_special_tags(tag_type, special_tags)
407
408 1
        tag_type = "vlan"
409 1
        special_tags = ["untagged"]
410 1
        with pytest.raises(KytosSetTagRangeError):
411 1
            self.iface.set_special_tags(tag_type, special_tags)
412
413 1
        special_tags = ["any"]
414 1
        self.iface.set_special_tags(tag_type, special_tags)
415 1
        assert self.iface.special_available_tags["vlan"] == []
416 1
        assert self.iface.special_tags["vlan"] == ["any"]
417
418 1
    async def test_remove_tags(self) -> None:
419
        """Test _remove_tags"""
420 1
        available_tag = [[20, 20], [200, 3000]]
421 1
        tag_ranges = [[1, 4095]]
422 1
        self.iface.set_available_tags_tag_ranges(
423
            {'vlan': available_tag},
424
            {'vlan': tag_ranges},
425
            {'vlan': ["untagged", "any"]},
426
            {'vlan': ["untagged", "any"]}
427
        )
428 1
        ava_expected = [[20, 20], [241, 3000]]
429 1
        assert self.iface._remove_tags([200, 240])
430 1
        assert self.iface.available_tags['vlan'] == ava_expected
431 1
        ava_expected = [[241, 3000]]
432 1
        assert self.iface._remove_tags([20, 20])
433 1
        assert self.iface.available_tags['vlan'] == ava_expected
434 1
        ava_expected = [[241, 250], [400, 3000]]
435 1
        assert self.iface._remove_tags([251, 399])
436 1
        assert self.iface.available_tags['vlan'] == ava_expected
437 1
        assert self.iface._remove_tags([200, 240]) is False
438 1
        ava_expected = [[241, 250], [400, 499]]
439 1
        assert self.iface._remove_tags([500, 3000])
440 1
        assert self.iface.available_tags['vlan'] == ava_expected
441
442 1
    async def test_remove_tags_empty(self) -> None:
443
        """Test _remove_tags when available_tags is empty"""
444 1
        available_tag = []
445 1
        tag_ranges = [[1, 4095]]
446 1
        parameters = {
447
            "available_tag": {'vlan': available_tag},
448
            "tag_ranges": {'vlan': tag_ranges},
449
            "special_available_tags": {'vlan': ["untagged", "any"]},
450
            "special_tags": {'vlan': ["untagged", "any"]}
451
        }
452 1
        self.iface.set_available_tags_tag_ranges(**parameters)
453 1
        assert self.iface._remove_tags([4, 6]) is False
454 1
        assert self.iface.available_tags['vlan'] == []
455
456 1
    async def test_add_tags(self) -> None:
457
        """Test _add_tags"""
458 1
        available_tag = [[7, 10], [20, 30]]
459 1
        tag_ranges = [[1, 4095]]
460 1
        parameters = {
461
            "available_tag": {'vlan': available_tag},
462
            "tag_ranges": {'vlan': tag_ranges},
463
            "special_available_tags": {'vlan': ["untagged", "any"]},
464
            "special_tags": {'vlan': ["untagged", "any"]}
465
        }
466 1
        self.iface.set_available_tags_tag_ranges(**parameters)
467 1
        ava_expected = [[4, 10], [20, 30]]
468 1
        assert self.iface._add_tags([4, 6])
469 1
        assert self.iface.available_tags['vlan'] == ava_expected
470
471 1
        ava_expected = [[1, 2], [4, 10], [20, 30]]
472 1
        assert self.iface._add_tags([1, 2])
473 1
        assert self.iface.available_tags['vlan'] == ava_expected
474
475 1
        ava_expected = [[1, 2], [4, 10], [20, 35]]
476 1
        assert self.iface._add_tags([31, 35])
477 1
        assert self.iface.available_tags['vlan'] == ava_expected
478
479 1
        ava_expected = [[1, 2], [4, 10], [20, 35], [90, 90]]
480 1
        assert self.iface._add_tags([90, 90])
481 1
        assert self.iface.available_tags['vlan'] == ava_expected
482
483 1
        ava_expected = [[1, 2], [4, 10], [20, 90]]
484 1
        assert self.iface._add_tags([36, 89])
485 1
        assert self.iface.available_tags['vlan'] == ava_expected
486
487 1
        ava_expected = [[1, 2], [4, 12], [20, 90]]
488 1
        assert self.iface._add_tags([11, 12])
489 1
        assert self.iface.available_tags['vlan'] == ava_expected
490
491 1
        ava_expected = [[1, 2], [4, 12], [17, 90]]
492 1
        assert self.iface._add_tags([17, 19])
493 1
        assert self.iface.available_tags['vlan'] == ava_expected
494
495 1
        ava_expected = [[1, 2], [4, 12], [15, 15], [17, 90]]
496 1
        assert self.iface._add_tags([15, 15])
497 1
        assert self.iface.available_tags['vlan'] == ava_expected
498
499 1
        assert self.iface._add_tags([35, 98]) is False
500
501 1
    async def test_add_tags_empty(self) -> None:
502
        """Test _add_tags when available_tags is empty"""
503 1
        available_tag = []
504 1
        tag_ranges = [[1, 4095]]
505 1
        parameters = {
506
            "available_tag": {'vlan': available_tag},
507
            "tag_ranges": {'vlan': tag_ranges},
508
            "special_available_tags": {'vlan': ["untagged", "any"]},
509
            "special_tags": {'vlan': ["untagged", "any"]}
510
        }
511 1
        self.iface.set_available_tags_tag_ranges(**parameters)
512 1
        assert self.iface._add_tags([4, 6])
513 1
        assert self.iface.available_tags['vlan'] == [[4, 6]]
514
515 1
    async def test_notify_interface_tags(self, controller) -> None:
516
        """Test _notify_interface_tags"""
517 1
        name = "kytos/core.interface_tags"
518 1
        content = {"interface": self.iface}
519 1
        self.iface._notify_interface_tags(controller)
520 1
        event = controller.buffers.app.put.call_args[0][0]
521 1
        assert event.name == name
522 1
        assert event.content == content
523
524 1
    def test_all_tags_available(self) -> None:
525
        """Test all_tags_available"""
526 1
        self.iface.available_tags = {"vlan": [[1, 1000]]}
527 1
        self.iface.tag_ranges = {"vlan": [[1, 20], [22, 1000]]}
528 1
        self.iface.special_available_tags = {"vlan": []}
529 1
        self.iface.special_tags = {"vlan": ["any"]}
530 1
        assert self.iface.all_tags_available() is False
531
532 1
        self.iface.tag_ranges = {"vlan": [[1, 1000]]}
533 1
        self.iface.special_available_tags = {"vlan": ["any"]}
534 1
        assert self.iface.all_tags_available()
535
536 1
        self.iface.special_available_tags = {"vlan": ["untagged", "any"]}
537 1
        self.iface.special_tags = {"vlan": ["any", "untagged"]}
538 1
        assert self.iface.all_tags_available()
539
540
541 1
class TestUNI():
542
    """UNI tests."""
543
544 1
    def setup_method(self):
545
        """Create UNI object."""
546 1
        switch = MagicMock()
547 1
        switch.id = '00:00:00:00:00:00:00:01'
548 1
        interface = Interface('name', 1, switch)
549 1
        user_tag = TAG('vlan', 123)
550 1
        self.uni = UNI(interface, user_tag)
551
552 1
    async def test__eq__(self):
553
        """Test __eq__ method."""
554 1
        user_tag = TAG('vlan', 456)
555 1
        interface = Interface('name', 2, MagicMock())
556 1
        other = UNI(interface, user_tag)
557
558 1
        assert (self.uni == other) is False
559
560 1
    async def test_is_valid(self):
561
        """Test is_valid method for a valid, invalid and none tag."""
562 1
        assert self.uni.is_valid()
563
564 1
        with pytest.raises(ValueError):
565 1
            TAG("some_type", 123)
566
567 1
        self.uni.user_tag = None
568 1
        assert self.uni.is_valid()
569
570 1
    async def test_is_reserved_valid_tag(self):
571
        """Test _is_reserved_valid_tag method for string TAG."""
572 1
        self.uni.user_tag = TAG("vlan", "untagged")
573 1
        assert self.uni.is_valid()
574
575 1
        self.uni.user_tag = TAG("vlan", "any")
576 1
        assert self.uni.is_valid()
577
578 1
        self.uni.user_tag = TAG("vlan", "2/4094")
579 1
        assert self.uni.is_valid() is False
580
581 1
    async def test_as_dict(self):
582
        """Test as_dict method."""
583 1
        expected_dict = {'interface_id': '00:00:00:00:00:00:00:01:1',
584
                         'tag': {'tag_type': 'vlan', 'value': 123}}
585 1
        assert self.uni.as_dict() == expected_dict
586
587 1
    async def test_as_json(self):
588
        """Test as_json method."""
589 1
        expected_json = '{"interface_id": "00:00:00:00:00:00:00:01:1", ' + \
590
                        '"tag": {"tag_type": "vlan", "value": 123}}'
591
        assert self.uni.as_json() == expected_json
592