@@ -128,6 +128,85 @@ def test_record_ipnetwork() -> None:
128128 assert "::1" not in data
129129
130130
131+ def test_record_ipinterface () -> None :
132+ TestRecord = RecordDescriptor (
133+ "test/ipinterface" ,
134+ [
135+ ("net.ipinterface" , "interface" ),
136+ ],
137+ )
138+
139+ # ipv4
140+ r = TestRecord ("192.168.0.0/24" )
141+ assert r .interface == "192.168.0.0/24"
142+ assert "bad.ip" not in r .interface .network
143+ assert "192.168.0.1" in r .interface .network
144+ assert isinstance (r .interface , net .ipinterface )
145+ assert repr (r .interface ) == "net.ipinterface('192.168.0.0/24')"
146+ assert hash (r .interface ) == hash (net .ipinterface ("192.168.0.0/24" ))
147+
148+ r = TestRecord ("192.168.1.1" )
149+ assert r .interface .ip == "192.168.1.1"
150+ assert r .interface .network == "192.168.1.1/32"
151+ assert r .interface == "192.168.1.1/32"
152+ assert r .interface .netmask == "255.255.255.255"
153+
154+ r = TestRecord ("192.168.1.24/255.255.255.0" )
155+ assert r .interface == "192.168.1.24/24"
156+ assert r .interface .ip == "192.168.1.24"
157+ assert r .interface .network == "192.168.1.0/24"
158+ assert r .interface .netmask == "255.255.255.0"
159+
160+ # ipv6 - https://en.wikipedia.org/wiki/IPv6_address
161+ r = TestRecord ("::1" )
162+ assert r .interface == "::1"
163+ assert r .interface == "::1/128"
164+
165+ r = TestRecord ("64:ff9b::2/96" )
166+ assert r .interface == "64:ff9b::2/96"
167+ assert r .interface .ip == "64:ff9b::2"
168+ assert r .interface .network == "64:ff9b::/96"
169+ assert r .interface .netmask == "ffff:ffff:ffff:ffff:ffff:ffff::"
170+
171+ # instantiate from different types
172+ assert TestRecord (1 ).interface == "0.0.0.1/32"
173+ assert TestRecord (0x7F0000FF ).interface == "127.0.0.255/32"
174+ assert TestRecord (b"\x7f \xff \xff \xff " ).interface == "127.255.255.255/32"
175+
176+ # Test whether it functions in a set
177+ data = {TestRecord (x ).interface for x in ["192.168.0.0/24" , "192.168.0.0/24" , "::1" , "::1" ]}
178+ assert len (data ) == 2
179+ assert net .ipinterface ("::1" ) in data
180+ assert net .ipinterface ("192.168.0.0/24" ) in data
181+ assert "::1" not in data
182+
183+
184+ def test_record_ipinterface_types () -> None :
185+ TestRecord = RecordDescriptor (
186+ "test/ipinterface" ,
187+ [
188+ (
189+ "net.ipinterface" ,
190+ "interface" ,
191+ )
192+ ],
193+ )
194+
195+ r = TestRecord ("192.168.0.255/24" )
196+ _if = r .interface
197+ assert isinstance (_if , net .ipinterface )
198+ assert isinstance (_if .ip , net .ipaddress )
199+ assert isinstance (_if .network , net .ipnetwork )
200+ assert isinstance (_if .netmask , net .ipaddress )
201+
202+ r = TestRecord ("64:ff9b::/96" )
203+ _if = r .interface
204+ assert isinstance (_if , net .ipinterface )
205+ assert isinstance (_if .ip , net .ipaddress )
206+ assert isinstance (_if .network , net .ipnetwork )
207+ assert isinstance (_if .netmask , net .ipaddress )
208+
209+
131210@pytest .mark .parametrize ("PSelector" , [Selector , CompiledSelector ])
132211def test_selector_ipaddress (PSelector : type [Selector ]) -> None :
133212 TestRecord = RecordDescriptor (
0 commit comments