16
16
17
17
18
18
from horizon import test
19
- from horizon .utils import validators
19
+ from django .core .exceptions import ValidationError
20
+ from horizon .utils import fields
20
21
21
22
22
23
class ValidatorsTests (test .TestCase ):
@@ -27,16 +28,144 @@ def test_validate_ipv4_cidr(self):
27
28
"10.144.11.107/4" ,
28
29
"255.255.255.255/0" ,
29
30
"0.1.2.3/16" ,
30
- "0.0.0.0/32" )
31
- BAD_CIDRS = ("255.255.255.256" ,
32
- "256.255.255.255" ,
33
- "1.2.3.4.5" ,
34
- "0.0.0.0" ,
31
+ "0.0.0.0/32" ,
32
+ # short form
33
+ "128.0/16" ,
34
+ "128/4" )
35
+ BAD_CIDRS = ("255.255.255.256\\ " ,
36
+ "256.255.255.255$" ,
37
+ "1.2.3.4.5/41" ,
38
+ "0.0.0.0/99" ,
35
39
"127.0.0.1/" ,
36
40
"127.0.0.1/33" ,
37
41
"127.0.0.1/-1" ,
38
- "127.0.0.1/100" )
42
+ "127.0.0.1/100" ,
43
+ # some valid IPv6 addresses
44
+ "fe80::204:61ff:254.157.241.86/4" ,
45
+ "fe80::204:61ff:254.157.241.86/0" ,
46
+ "2001:0DB8::CD30:0:0:0:0/60" ,
47
+ "2001:0DB8::CD30:0/90" )
48
+ ip = fields .IPField (mask = True , version = fields .IPv4 )
39
49
for cidr in GOOD_CIDRS :
40
- self .assertTrue ( validators . ipv4_cidr_re . match (cidr ))
50
+ self .assertIsNone ( ip . validate (cidr ))
41
51
for cidr in BAD_CIDRS :
42
- self .assertFalse (validators .ipv4_cidr_re .match (cidr ))
52
+ self .assertRaises (ValidationError , ip .validate , cidr )
53
+
54
+ def test_validate_ipv6_cidr (self ):
55
+ GOOD_CIDRS = ("::ffff:0:0/56" ,
56
+ "2001:0db8::1428:57ab/17" ,
57
+ "FEC0::/10" ,
58
+ "fe80::204:61ff:254.157.241.86/4" ,
59
+ "fe80::204:61ff:254.157.241.86/0" ,
60
+ "2001:0DB8::CD30:0:0:0:0/60" ,
61
+ "2001:0DB8::CD30:0/90" ,
62
+ "::1/128" )
63
+ BAD_CIDRS = ("1111:2222:3333:4444:::/" ,
64
+ "::2222:3333:4444:5555:6666:7777:8888:\\ " ,
65
+ ":1111:2222:3333:4444::6666:1.2.3.4/1000" ,
66
+ "1111:2222::4444:5555:6666::8888@" ,
67
+ "1111:2222::4444:5555:6666:8888/" ,
68
+ "::ffff:0:0/129" ,
69
+ "1.2.3.4:1111:2222::5555//22" ,
70
+ "fe80::204:61ff:254.157.241.86/200" ,
71
+ # some valid IPv4 addresses
72
+ "10.144.11.107/4" ,
73
+ "255.255.255.255/0" ,
74
+ "0.1.2.3/16" )
75
+ ip = fields .IPField (mask = True , version = fields .IPv6 )
76
+ for cidr in GOOD_CIDRS :
77
+ self .assertIsNone (ip .validate (cidr ))
78
+ for cidr in BAD_CIDRS :
79
+ self .assertRaises (ValidationError , ip .validate , cidr )
80
+
81
+ def test_validate_mixed_cidr (self ):
82
+ GOOD_CIDRS = ("::ffff:0:0/56" ,
83
+ "2001:0db8::1428:57ab/17" ,
84
+ "FEC0::/10" ,
85
+ "fe80::204:61ff:254.157.241.86/4" ,
86
+ "fe80::204:61ff:254.157.241.86/0" ,
87
+ "2001:0DB8::CD30:0:0:0:0/60" ,
88
+ "0.0.0.0/16" ,
89
+ "10.144.11.107/4" ,
90
+ "255.255.255.255/0" ,
91
+ "0.1.2.3/16" ,
92
+ # short form
93
+ "128.0/16" ,
94
+ "10/4" )
95
+ BAD_CIDRS = ("1111:2222:3333:4444::://" ,
96
+ "::2222:3333:4444:5555:6666:7777:8888:" ,
97
+ ":1111:2222:3333:4444::6666:1.2.3.4/1/1" ,
98
+ "1111:2222::4444:5555:6666::8888\\ 2" ,
99
+ "1111:2222::4444:5555:6666:8888/" ,
100
+ "1111:2222::4444:5555:6666::8888/130" ,
101
+ "127.0.0.1/" ,
102
+ "127.0.0.1/33" ,
103
+ "127.0.0.1/-1" )
104
+ ip = fields .IPField (mask = True , version = fields .IPv4 | fields .IPv6 )
105
+ for cidr in GOOD_CIDRS :
106
+ self .assertIsNone (ip .validate (cidr ))
107
+ for cidr in BAD_CIDRS :
108
+ self .assertRaises (ValidationError , ip .validate , cidr )
109
+
110
+ def test_validate_IPs (self ):
111
+ GOOD_IPS_V4 = ("0.0.0.0" ,
112
+ "10.144.11.107" ,
113
+ "169.144.11.107" ,
114
+ "172.100.11.107" ,
115
+ "255.255.255.255" ,
116
+ "0.1.2.3" )
117
+ GOOD_IPS_V6 = ("" ,
118
+ "::ffff:0:0" ,
119
+ "2001:0db8::1428:57ab" ,
120
+ "FEC0::" ,
121
+ "fe80::204:61ff:254.157.241.86" ,
122
+ "fe80::204:61ff:254.157.241.86" ,
123
+ "2001:0DB8::CD30:0:0:0:0" )
124
+ BAD_IPS_V4 = ("1111:2222:3333:4444:::" ,
125
+ "::2222:3333:4444:5555:6666:7777:8888:" ,
126
+ ":1111:2222:3333:4444::6666:1.2.3.4" ,
127
+ "1111:2222::4444:5555:6666::8888" ,
128
+ "1111:2222::4444:5555:6666:8888/" ,
129
+ "1111:2222::4444:5555:6666::8888/130" ,
130
+ "127.0.0.1/" ,
131
+ "127.0.0.1/33" ,
132
+ "127.0.0.1/-1" )
133
+ BAD_IPS_V6 = ("1111:2222:3333:4444:::" ,
134
+ "::2222:3333:4444:5555:6666:7777:8888:" ,
135
+ ":1111:2222:3333:4444::6666:1.2.3.4" ,
136
+ "1111:2222::4444:5555:6666::8888" ,
137
+ "1111:2222::4444:5555:6666:8888/" ,
138
+ "1111:2222::4444:5555:6666::8888/130" )
139
+ ipv4 = fields .IPField (required = True , version = fields .IPv4 )
140
+ ipv6 = fields .IPField (required = False , version = fields .IPv6 )
141
+ ipmixed = fields .IPField (required = False ,
142
+ version = fields .IPv4 | fields .IPv6 )
143
+
144
+ for ip_addr in GOOD_IPS_V4 :
145
+ self .assertIsNone (ipv4 .validate (ip_addr ))
146
+ self .assertIsNone (ipmixed .validate (ip_addr ))
147
+
148
+ for ip_addr in GOOD_IPS_V6 :
149
+ self .assertIsNone (ipv6 .validate (ip_addr ))
150
+ self .assertIsNone (ipmixed .validate (ip_addr ))
151
+
152
+ for ip_addr in BAD_IPS_V4 :
153
+ self .assertRaises (ValidationError , ipv4 .validate , ip_addr )
154
+ self .assertRaises (ValidationError , ipmixed .validate , ip_addr )
155
+
156
+ for ip_addr in BAD_IPS_V6 :
157
+ self .assertRaises (ValidationError , ipv6 .validate , ip_addr )
158
+ self .assertRaises (ValidationError , ipmixed .validate , ip_addr )
159
+
160
+ self .assertRaises (ValidationError , ipv4 .validate , "" ) # required=True
161
+
162
+ iprange = fields .IPField (required = False ,
163
+ mask = True ,
164
+ mask_range_from = 10 ,
165
+ version = fields .IPv4 | fields .IPv6 )
166
+ self .assertRaises (ValidationError , iprange .validate ,
167
+ "fe80::204:61ff:254.157.241.86/6" )
168
+ self .assertRaises (ValidationError , iprange .validate ,
169
+ "169.144.11.107/8" )
170
+ self .assertIsNone (iprange .validate ("fe80::204:61ff:254.157.241.86/36" ))
171
+ self .assertIsNone (iprange .validate ("169.144.11.107/18" ))
0 commit comments