Completed
Push — develop ( f91ec9...875570 )
by A
49s
created

sts.TestPortRange.test_range_properties()   A

Complexity

Conditions 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 10
rs 9.4286
1
# -*- coding: utf-8 -*-
2
#
3
# Copyright (c) 2014-2015 Scaleway and Contributors. All Rights Reserved.
4
#                         Kevin Deldycke <[email protected]>
5
#
6
# Licensed under the BSD 2-Clause License (the "License"); you may not use this
7
# file except in compliance with the License. You may obtain a copy of the
8
# License at http://opensource.org/licenses/BSD-2-Clause
9
10
from __future__ import (unicode_literals, print_function, absolute_import,
11
                        division)
12
13
import unittest
14
15
from port_range import PortRange
16
17
18
class TestPortRange(unittest.TestCase):
19
20
    def test_cidr_parsing(self):
21
        self.assertEqual(PortRange('1027/15').bounds, (1027, 1028))
22
        self.assertEqual(PortRange(' 1027 / 15 ').bounds, (1027, 1028))
23
24
    def test_range_parsing(self):
25
        self.assertEqual(PortRange('42-4242').bounds, (42, 4242))
26
        self.assertEqual(PortRange('42').bounds, (42, 42))
27
        self.assertEqual(PortRange(42).bounds, (42, 42))
28
        self.assertEqual(PortRange([42]).bounds, (42, 42))
29
        self.assertEqual(PortRange(['42']).bounds, (42, 42))
30
        self.assertEqual(PortRange([42, 4242]).bounds, (42, 4242))
31
        self.assertEqual(PortRange([4242, 42]).bounds, (42, 4242))
32
        self.assertEqual(PortRange([None, 42]).bounds, (42, 42))
33
        self.assertEqual(PortRange([42, None]).bounds, (42, 42))
34
        self.assertEqual(PortRange([42, None, 32, 3]).bounds, (32, 42))
35
        self.assertEqual(PortRange((4242, 42)).bounds, (42, 4242))
36
        self.assertEqual(PortRange(set([4242, 42])).bounds, (42, 4242))
37
38
    def test_cidr_properties(self):
39
        port = PortRange('1027/15')
40
        self.assertEqual(port.base, 1027)
41
        self.assertEqual(port.prefix, 15)
42
        self.assertEqual(port.mask, 1)
43
        self.assertEqual(port.offset, 3)
44
        self.assertEqual(port.port_from, 1027)
45
        self.assertEqual(port.port_to, 1028)
46
        self.assertEqual(port.bounds, (1027, 1028))
47
48
    def test_range_properties(self):
49
        port = PortRange([4242, 42])
50
        self.assertEqual(str(port), '42-4242')
51
        self.assertEqual(port.base, 42)
52
        self.assertEqual(port.prefix, None)
53
        self.assertEqual(port.mask, None)
54
        self.assertEqual(port.offset, 10)
55
        self.assertEqual(port.port_from, 42)
56
        self.assertEqual(port.port_to, 4242)
57
        self.assertEqual(port.bounds, (42, 4242))
58
59
    def test_normalization(self):
60
        port = PortRange(' 0001234 ')
61
        self.assertEqual(str(port), '1234')
62
        self.assertEqual(port.base, 1234)
63
        self.assertEqual(port.prefix, 16)
64
        self.assertEqual(port.mask, 0)
65
        self.assertEqual(port.offset, 210)
66
        self.assertEqual(port.port_from, 1234)
67
        self.assertEqual(port.port_to, 1234)
68
        self.assertEqual(port.bounds, (1234, 1234))
69
        # Upper bound cap
70
        self.assertEqual(PortRange('64666/3').bounds, (64666, 65535))
71
72
    def test_output_string(self):
73
        self.assertEqual(str(PortRange('1027/15')), '1027/15')
74
        self.assertEqual(str(PortRange([42, 4242])), '42-4242')
75
        self.assertEqual(str(PortRange(42)), '42')
76
        self.assertEqual(str(PortRange([1027, 1028])), '1027/15')
77
78
    def test_cidr_string_rendering(self):
79
        self.assertEqual(PortRange([32768, 65535]).cidr_string, '32768/1')
80
        self.assertEqual(PortRange([32767, 65534]).cidr_string, '32767/1')
81
        with self.assertRaises(ValueError):
82
            PortRange([32767, 65535]).cidr_string
83
84
    def test_validation(self):
85
        # Test empty params
86
        self.assertRaises(ValueError, PortRange, None)
87
        self.assertRaises(ValueError, PortRange, [None])
88
        self.assertRaises(ValueError, PortRange, [None, None])
89
        # Invalid int
90
        self.assertRaises(ValueError, PortRange, ' A233 ')
91
        # Test negative values
92
        self.assertRaises(ValueError, PortRange, '-24/3')
93
        self.assertRaises(ValueError, PortRange, '1024/-3')
94
        # Test maximums and minimums
95
        self.assertRaises(ValueError, PortRange, '1024/0')
96
        self.assertRaises(ValueError, PortRange, '1024/17')
97
        self.assertRaises(ValueError, PortRange, '66666')
98
        self.assertRaises(ValueError, PortRange, '0')
99
100
    def test_strict_mode(self):
101
        # Test power of two port base
102
        PortRange('257', strict=True)
103
        PortRange('257/16', strict=True)
104
        self.assertRaises(ValueError, PortRange, '257/4', strict=True)
105
        # Test overflowing upper bound
106
        self.assertRaises(ValueError, PortRange, '65535/8', strict=True)
107
108
    def test_computation(self):
109
        self.assertEqual(PortRange('2/3').bounds, (2, 8193))
110
        self.assertEqual(PortRange('7/3').bounds, (7, 8198))
111