init
	
		
			
	
		
	
	
		
	
		
			Some checks are pending
		
		
	
	
		
			
				
	
				CI / build (push) Waiting to run
				
					
					
				
			
		
			
				
	
				CI / deploy (push) Blocked by required conditions
				
					
					
				
			
		
		
	
	
				
					
				
			
		
			Some checks are pending
		
		
	
	CI / build (push) Waiting to run
				CI / deploy (push) Blocked by required conditions
				This commit is contained in:
		
							
								
								
									
										40
									
								
								tests/eui48_test.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								tests/eui48_test.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
import netaddr
 | 
			
		||||
 | 
			
		||||
fn test_eui48_from_string() {
 | 
			
		||||
	expected := netaddr.Eui48.from_octets([u8(0x0a), 0x96, 0x7a, 0x87, 0x4a, 0xe3]!)
 | 
			
		||||
	assert netaddr.Eui48.from_string('0a-96-7a-87-4a-e3')! == expected
 | 
			
		||||
	assert netaddr.Eui48.from_string('0a:96:7a:87:4a:e3')! == expected
 | 
			
		||||
	assert netaddr.Eui48.from_string('0a96.7a87.4ae3')! == expected
 | 
			
		||||
	assert netaddr.Eui48.from_string('0a967a874ae3')! == expected
 | 
			
		||||
	assert netaddr.Eui48.from_string(u64(4123532145345345).hex()) or { netaddr.Eui48{} } == netaddr.Eui48{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui48_format() {
 | 
			
		||||
	mac := netaddr.Eui48.from_octets([u8(0x0a), 0x96, 0x7a, 0x87, 0x4a, 0xe3]!)
 | 
			
		||||
	assert mac.str() == '0a-96-7a-87-4a-e3'
 | 
			
		||||
	assert mac.format(.canonical) == '0a-96-7a-87-4a-e3'
 | 
			
		||||
	assert mac.format(.unix) == '0a:96:7a:87:4a:e3'
 | 
			
		||||
	assert mac.format(.hextets) == '0a96.7a87.4ae3'
 | 
			
		||||
	assert mac.format(.bare) == '0a967a874ae3'
 | 
			
		||||
	assert netaddr.Eui48{}.format(.hextets) == '0000.0000.0000'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui48_tests() {
 | 
			
		||||
	mac := netaddr.Eui48.from_octets([u8(0x10), 0xff, 0xe0, 0x4b, 0xe6, 0xb8]!)
 | 
			
		||||
	assert mac.is_universal()
 | 
			
		||||
	assert mac.is_unicast()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui48_ipv6_link_local() {
 | 
			
		||||
	mac := netaddr.Eui48.from_octets([u8(0x10), 0xff, 0xe0, 0x4b, 0xe6, 0xb8]!)
 | 
			
		||||
	assert mac.ipv6_link_local().str() == 'fe80::12ff:e0ff:fe4b:e6b8'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui48_random() {
 | 
			
		||||
	mac_a := netaddr.Eui48.random()
 | 
			
		||||
	assert mac_a.is_local()
 | 
			
		||||
	assert mac_a.is_unicast()
 | 
			
		||||
	mac_b := netaddr.Eui48.random(oui: [u8(0x02), 0x00, 0x00]!)
 | 
			
		||||
	assert mac_b.is_local()
 | 
			
		||||
	assert mac_b.is_unicast()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								tests/eui64_test.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tests/eui64_test.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
import netaddr
 | 
			
		||||
 | 
			
		||||
fn test_eui48_from_string() {
 | 
			
		||||
	expected := netaddr.Eui64.new(0x0a, 0x96, 0x7a, 0xff, 0xfe, 0x87, 0x4a, 0xe3)
 | 
			
		||||
	assert netaddr.Eui64.from_string('0a-96-7a-ff-fe-87-4a-e3')! == expected
 | 
			
		||||
	assert netaddr.Eui64.from_string('0a:96:7a:ff:fe:87:4a:e3')! == expected
 | 
			
		||||
	assert netaddr.Eui64.from_string('0a96.7aff.fe87.4ae3')! == expected
 | 
			
		||||
	assert netaddr.Eui64.from_string('0a967afffe874ae3')! == expected
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui48_format() {
 | 
			
		||||
	eui := netaddr.Eui64.new(0x0a, 0x96, 0x7a, 0xff, 0xfe, 0x87, 0x4a, 0xe3)
 | 
			
		||||
	assert eui.str() == '0a-96-7a-ff-fe-87-4a-e3'
 | 
			
		||||
	assert eui.format(.canonical) == '0a-96-7a-ff-fe-87-4a-e3'
 | 
			
		||||
	assert eui.format(.unix) == '0a:96:7a:ff:fe:87:4a:e3'
 | 
			
		||||
	assert eui.format(.hextets) == '0a96.7aff.fe87.4ae3'
 | 
			
		||||
	assert eui.format(.bare) == '0a967afffe874ae3'
 | 
			
		||||
	assert netaddr.Eui64{}.format(.hextets) == '0000.0000.0000.0000'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_eui64_modified() {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										224
									
								
								tests/ip6_test.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								tests/ip6_test.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
			
		||||
import math.big
 | 
			
		||||
import netaddr
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_new() {
 | 
			
		||||
	a := netaddr.Ipv6Addr.new(0x2001, 0x0db8, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000,
 | 
			
		||||
		0x0002)!
 | 
			
		||||
	b := netaddr.Ipv6Addr.new(0xfe80, 0x0000, 0x0000, 0x0000, 0xd08e, 0x6658, 0x38bd,
 | 
			
		||||
		0x6391,
 | 
			
		||||
		zone_id: 'wlan0'
 | 
			
		||||
	)!
 | 
			
		||||
	assert a.str() == '2001:db8:8:4::2'
 | 
			
		||||
	assert b.str() == 'fe80::d08e:6658:38bd:6391%wlan0'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_add_segments() {
 | 
			
		||||
	ip := netaddr.Ipv6Addr.new(0x2001, 0x0db8, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000,
 | 
			
		||||
		0x0002)!
 | 
			
		||||
	assert ip.segments() == [u16(0x2001), 0x0db8, 0x0008, 0x0004, 0x0000, 0x0000, 0x0000, 0x0002]!
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_from_to_bigint() {
 | 
			
		||||
	bigint := big.integer_from_string('338288524927261089661396923005694177083')!
 | 
			
		||||
	addr := netaddr.Ipv6Addr.from_bigint(bigint)!
 | 
			
		||||
	assert addr.format(.verbose) == 'fe80:0000:0000:0000:6664:03b4:bd68:ef3b'
 | 
			
		||||
	assert addr.bigint() == bigint
 | 
			
		||||
	addr2 := netaddr.Ipv6Addr.from_string('fe80:0000:0000:0000:6664:03b4:bd68:ef3b')!
 | 
			
		||||
	assert addr2.bigint() == bigint
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_from_string_zeros() {
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('::')!.bigint() == big.zero_int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_from_string() {
 | 
			
		||||
	addrs := {
 | 
			
		||||
		'fe80:0000:0000:0000:0896:7aff:0e87:4ae3': 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
		'fe80:0:0:0:896:7aff:e87:4ae3':            'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
		'fe80::896:7aff:e87:4ae3':                 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
		'fe80::896:7aff:e87:4ae3%1':               'fe80::896:7aff:e87:4ae3%1'
 | 
			
		||||
		'[fe80::896:7aff:e87:4ae3%2]':             'fe80::896:7aff:e87:4ae3%2'
 | 
			
		||||
		'0:0:0:0:0:0:0:0':                         '::'
 | 
			
		||||
		'0000:0000:0000:0000:0000:0000:0000:0000': '::'
 | 
			
		||||
		'::':                                      '::'
 | 
			
		||||
		'::1':                                     '::1'
 | 
			
		||||
		'0:0:ff::':                                '0:0:ff::'
 | 
			
		||||
		'0:0:ff::1':                               '0:0:ff::1'
 | 
			
		||||
		'::ffff:1:2:3:4':                          '::ffff:1:2:3:4'
 | 
			
		||||
		'::192.168.1.1':                           '::192.168.1.1'
 | 
			
		||||
	}
 | 
			
		||||
	for inp, out in addrs {
 | 
			
		||||
		assert netaddr.Ipv6Addr.from_string(inp)!.str() == out
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_format() {
 | 
			
		||||
	addr1 := netaddr.Ipv6Addr.from_string('fe80::896:7aff:e87:4ae3')!
 | 
			
		||||
	assert addr1.format(.dotted) == 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
	assert addr1.format(.compact) == 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
	assert addr1.format(.compact | .dotted) == 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
	assert addr1.format(.verbose) == 'fe80:0000:0000:0000:0896:7aff:0e87:4ae3'
 | 
			
		||||
	assert addr1.format(.verbose | .dotted) == 'fe80:0000:0000:0000:0896:7aff:0e87:4ae3'
 | 
			
		||||
	assert addr1.format(.compact | .verbose | .dotted) == 'fe80::896:7aff:e87:4ae3'
 | 
			
		||||
	addr2 := netaddr.Ipv6Addr.from_string('::ffff:192.168.3.8')!
 | 
			
		||||
	assert addr2.format(.dotted) == '::ffff:192.168.3.8'
 | 
			
		||||
	assert addr2.format(.compact) == '::ffff:c0a8:308'
 | 
			
		||||
	assert addr2.format(.compact | .dotted) == '::ffff:192.168.3.8'
 | 
			
		||||
	assert addr2.format(.verbose) == '0000:0000:0000:0000:0000:ffff:c0a8:0308'
 | 
			
		||||
	assert addr2.format(.verbose | .dotted) == '0000:0000:0000:0000:0000:ffff:192.168.3.8'
 | 
			
		||||
	assert addr2.format(.compact | .verbose | .dotted) == '::ffff:192.168.3.8'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_dns_ptr() {
 | 
			
		||||
	expect := '1.9.3.6.d.b.8.3.8.5.6.6.e.8.0.d.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa'
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('fe80::d08e:6658:38bd:6391')!.reverse_pointer() == expect
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_with_scope() {
 | 
			
		||||
	addr := netaddr.Ipv6Addr.from_string('fe80::896:7aff:e87:4ae3%lan0')!
 | 
			
		||||
	assert addr.zone_id as string == 'lan0'
 | 
			
		||||
	assert addr.str() == 'fe80::896:7aff:e87:4ae3%lan0'
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('fe80::896:7aff:e87:4ae3')!
 | 
			
		||||
		.with_scope('1')!
 | 
			
		||||
		.str() == 'fe80::896:7aff:e87:4ae3%1'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_is_ipv4_compat() {
 | 
			
		||||
	assert !netaddr.Ipv6Addr.from_string('::')!.is_ipv4_compat()
 | 
			
		||||
	assert !netaddr.Ipv6Addr.from_string('::1')!.is_ipv4_compat()
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('::192.168.0.3')!.is_ipv4_compat()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_is_ipv4_mapped() {
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('::ffff:cb00:715a')!.is_ipv4_mapped()
 | 
			
		||||
	assert !netaddr.Ipv6Addr.from_string('::fff:cb00:715a')!.is_ipv4_mapped()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_ipv4() {
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('::ffff:cb00:715a')!.ipv4()!.str() == '203.0.113.90'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_six_to_four() {
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('2002:c001:0203::')!.six_to_four()!.str() == '192.1.2.3'
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('2002:09fe:fdfc::')!.six_to_four()!.str() == '9.254.253.252'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_teredo() {
 | 
			
		||||
	teredo := netaddr.Ipv6Addr.from_string('2001:0000:4136:e378:8000:63bf:3fff:fdd2')!.teredo()!
 | 
			
		||||
	assert teredo.server.str() == '65.54.227.120'
 | 
			
		||||
	assert teredo.flags == 0x8000
 | 
			
		||||
	assert teredo.port == 40_000
 | 
			
		||||
	assert teredo.client.str() == '192.0.2.45'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_teredo_addr_ipv6() {
 | 
			
		||||
	teredo := netaddr.TeredoAddr{
 | 
			
		||||
		server: netaddr.Ipv4Addr.from_string('65.54.227.120')!
 | 
			
		||||
		flags:  0x8000
 | 
			
		||||
		port:   40_000
 | 
			
		||||
		client: netaddr.Ipv4Addr.from_string('192.0.2.45')!
 | 
			
		||||
	}
 | 
			
		||||
	assert teredo.ipv6().str() == '2001:0:4136:e378:8000:63bf:3fff:fdd2'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_addr_tests() {
 | 
			
		||||
	addr := netaddr.Ipv6Addr.from_string('fe80::d08e:6658:38bd:6391')!
 | 
			
		||||
	assert !addr.is_ipv4_mapped()
 | 
			
		||||
	assert !addr.is_ipv4_compat()
 | 
			
		||||
	assert !addr.is_site_local()
 | 
			
		||||
	assert !addr.is_unique_local()
 | 
			
		||||
	assert addr.is_link_local()
 | 
			
		||||
	assert !addr.is_loopback()
 | 
			
		||||
	assert !addr.is_multicast()
 | 
			
		||||
	assert addr.is_unicast()
 | 
			
		||||
	assert addr.is_private()
 | 
			
		||||
	assert !addr.is_global()
 | 
			
		||||
	assert !addr.is_reserved()
 | 
			
		||||
	assert !addr.is_unspecified()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_is_netmask_is_hostmask() {
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('ffff:ffff:ffff:ffff:ffff:ffff:0000:0000')!.is_netmask()
 | 
			
		||||
	assert !netaddr.Ipv6Addr.from_string('ffff:ffff:ffff:ffff:ffff:ffff:0000:ffff')!.is_netmask()
 | 
			
		||||
	assert netaddr.Ipv6Addr.from_string('::ffff:ffff:ffff:ffff')!.is_hostmask()
 | 
			
		||||
	assert !netaddr.Ipv6Addr.from_string('::2a:ffff:ffff:ffff:ffff')!.is_hostmask()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net() {
 | 
			
		||||
	net := netaddr.Ipv6Net.from_string('fe80::/64')!
 | 
			
		||||
	assert net.str() == 'fe80::/64'
 | 
			
		||||
	assert net.network_address.str() == 'fe80::'
 | 
			
		||||
	assert net.network_mask.str() == 'ffff:ffff:ffff:ffff::'
 | 
			
		||||
	assert net.host_mask.str() == '::ffff:ffff:ffff:ffff'
 | 
			
		||||
	assert net.broadcast_address.str() == 'fe80::ffff:ffff:ffff:ffff'
 | 
			
		||||
	assert net.host_address == none
 | 
			
		||||
	assert net.prefix_len == 64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_new() {
 | 
			
		||||
	addr := netaddr.Ipv6Addr.from_string('fe80::')!
 | 
			
		||||
	net := netaddr.Ipv6Net.new(addr, 64)!
 | 
			
		||||
	assert net.str() == 'fe80::/64'
 | 
			
		||||
	assert net.network_address.str() == 'fe80::'
 | 
			
		||||
	assert net.network_mask.str() == 'ffff:ffff:ffff:ffff::'
 | 
			
		||||
	assert net.host_mask.str() == '::ffff:ffff:ffff:ffff'
 | 
			
		||||
	assert net.broadcast_address.str() == 'fe80::ffff:ffff:ffff:ffff'
 | 
			
		||||
	assert net.host_address == none
 | 
			
		||||
	assert net.prefix_len == 64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_from_string() {
 | 
			
		||||
	assert netaddr.Ipv6Net.from_string('fe80:ffff::/64')!.str() == 'fe80:ffff::/64'
 | 
			
		||||
	assert netaddr.Ipv6Net.from_string('fe80:ffff::/ffff:ffff:ffff:ffff::')!.str() == 'fe80:ffff::/64'
 | 
			
		||||
	assert netaddr.Ipv6Net.from_string('fe80:ffff::/::ffff:ffff:ffff:ffff')!.str() == 'fe80:ffff::/64'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_format() {
 | 
			
		||||
	net := netaddr.Ipv6Net.from_string('fe80:ffff::/64')!
 | 
			
		||||
	assert net.format(.compact) == 'fe80:ffff::/64'
 | 
			
		||||
	assert net.format(.with_prefix_len) == 'fe80:ffff::/64'
 | 
			
		||||
	assert net.format(.with_network_mask) == 'fe80:ffff::/ffff:ffff:ffff:ffff::'
 | 
			
		||||
	assert net.format(.with_host_mask) == 'fe80:ffff::/::ffff:ffff:ffff:ffff'
 | 
			
		||||
	assert net.format(.verbose) == 'fe80:ffff:0000:0000:0000:0000:0000:0000/64'
 | 
			
		||||
	assert net.format(.verbose | .with_prefix_len) == 'fe80:ffff:0000:0000:0000:0000:0000:0000/64'
 | 
			
		||||
	assert net.format(.verbose | .with_network_mask) == 'fe80:ffff:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:0000:0000:0000:0000'
 | 
			
		||||
	assert net.format(.verbose | .with_host_mask) == 'fe80:ffff:0000:0000:0000:0000:0000:0000/0000:0000:0000:0000:ffff:ffff:ffff:ffff'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_next() {
 | 
			
		||||
	net := netaddr.Ipv6Net.from_string('fe80::/64')!
 | 
			
		||||
	mut addrs := []netaddr.Ipv6Addr{}
 | 
			
		||||
	limit := 5
 | 
			
		||||
	for i, addr in net {
 | 
			
		||||
		if i >= limit {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		addrs << addr
 | 
			
		||||
	}
 | 
			
		||||
	assert addrs[0].str() == 'fe80::'
 | 
			
		||||
	assert addrs[1].str() == 'fe80::1'
 | 
			
		||||
	assert addrs[2].str() == 'fe80::2'
 | 
			
		||||
	assert addrs[3].str() == 'fe80::3'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_subnets() {
 | 
			
		||||
	net := netaddr.Ipv6Net.from_string('fe80::/48')!
 | 
			
		||||
	subnets := net.subnets(64)!
 | 
			
		||||
	mut networks := []netaddr.Ipv6Net{}
 | 
			
		||||
	limit := 5
 | 
			
		||||
	for i, subnet in subnets {
 | 
			
		||||
		if i >= limit {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		networks << subnet
 | 
			
		||||
	}
 | 
			
		||||
	assert networks[0].str() == 'fe80::/64'
 | 
			
		||||
	assert networks[1].str() == 'fe80:0:0:1::/64'
 | 
			
		||||
	assert networks[2].str() == 'fe80:0:0:2::/64'
 | 
			
		||||
	assert networks[3].str() == 'fe80:0:0:3::/64'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv6_net_supernet() {
 | 
			
		||||
	net := netaddr.Ipv6Net.from_string('fe80:0:0:3::/64')!
 | 
			
		||||
	assert net.supernet(48)!.str() == 'fe80::/48'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										188
									
								
								tests/ip_test.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								tests/ip_test.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,188 @@
 | 
			
		||||
import netaddr
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_addr_from_string() {
 | 
			
		||||
	assert netaddr.Ipv4Addr.from_string('203.0.113.1')!.str() == '203.0.113.1'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_addr_from_u32() {
 | 
			
		||||
	assert netaddr.Ipv4Addr.from_u32(0).u8_array() == []u8{len: 4}
 | 
			
		||||
	assert netaddr.Ipv4Addr.from_u32(0).u8_array_fixed() == [4]u8{}
 | 
			
		||||
	assert netaddr.Ipv4Addr.from_u32(u32(2886733829)).str() == '172.16.16.5'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_addr_tests() {
 | 
			
		||||
	addr := netaddr.Ipv4Addr.from_string('203.0.113.1')!
 | 
			
		||||
	assert !addr.is_link_local()
 | 
			
		||||
	assert !addr.is_loopback()
 | 
			
		||||
	assert !addr.is_multicast()
 | 
			
		||||
	assert addr.is_unicast()
 | 
			
		||||
	assert !addr.is_shared()
 | 
			
		||||
	assert addr.is_private()
 | 
			
		||||
	assert !addr.is_global()
 | 
			
		||||
	assert !addr.is_reserved()
 | 
			
		||||
	assert !addr.is_unspecified()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_addr_ipv6() {
 | 
			
		||||
	addr := netaddr.Ipv4Addr.from_string('203.0.113.90')!
 | 
			
		||||
	assert addr.ipv6().str() == '::ffff:203.0.113.90'
 | 
			
		||||
	assert addr.ipv6(kind: .compat).str() == '::203.0.113.90'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_ipv6_addr_arr() {
 | 
			
		||||
	mut addrs := []netaddr.IpAddr{}
 | 
			
		||||
	addrs << netaddr.Ipv4Addr.from_string('203.0.113.90')!
 | 
			
		||||
	addrs << netaddr.Ipv6Addr.from_string('::1')!
 | 
			
		||||
	assert (addrs[0] as netaddr.Ipv4Addr).str() == '203.0.113.90'
 | 
			
		||||
	assert (addrs[1] as netaddr.Ipv6Addr).str() == '::1'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_compare() {
 | 
			
		||||
	assert netaddr.Ipv4Net.from_string('10.0.0.0/24')! < netaddr.Ipv4Net.from_string('10.10.0.0/24')!
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('198.51.100.0/24')!
 | 
			
		||||
	assert net.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net.prefix_len == 24
 | 
			
		||||
	assert net.network_address.str() == '198.51.100.0'
 | 
			
		||||
	assert net.network_mask.str() == '255.255.255.0'
 | 
			
		||||
	assert net.host_mask.str() == '0.0.0.255'
 | 
			
		||||
	assert net.broadcast_address.str() == '198.51.100.255'
 | 
			
		||||
	assert net.capacity() == 256
 | 
			
		||||
	assert !net.is_global()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_from_string() {
 | 
			
		||||
	net1 := netaddr.Ipv4Net.from_string('198.51.100.0/24')!
 | 
			
		||||
	net2 := netaddr.Ipv4Net.from_string('198.51.100.0/255.255.255.0')!
 | 
			
		||||
	net3 := netaddr.Ipv4Net.from_string('198.51.100.0/0.0.0.255')!
 | 
			
		||||
	assert net1.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net2.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net3.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net1.host_address == none
 | 
			
		||||
	assert net2.host_address == none
 | 
			
		||||
	assert net3.host_address == none
 | 
			
		||||
	assert net3.host_address as netaddr.Ipv4Addr == netaddr.Ipv4Addr{}
 | 
			
		||||
	assert (net3.host_address as netaddr.Ipv4Addr).u8_array_fixed() == [4]u8{}
 | 
			
		||||
	net4 := netaddr.Ipv4Net.from_string('198.51.100.12/24')!
 | 
			
		||||
	net5 := netaddr.Ipv4Net.from_string('198.51.100.12/255.255.255.0')!
 | 
			
		||||
	net6 := netaddr.Ipv4Net.from_string('198.51.100.12/0.0.0.255')!
 | 
			
		||||
	assert net4.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net5.str() == '198.51.100.0/24'
 | 
			
		||||
	assert net6.str() == '198.51.100.0/24'
 | 
			
		||||
	assert (net4.host_address as netaddr.Ipv4Addr).str() == '198.51.100.12'
 | 
			
		||||
	assert (net5.host_address as netaddr.Ipv4Addr).str() == '198.51.100.12'
 | 
			
		||||
	assert (net6.host_address as netaddr.Ipv4Addr).str() == '198.51.100.12'
 | 
			
		||||
	net7 := netaddr.Ipv4Net.from_string('172.16.16.6')!
 | 
			
		||||
	assert net7.str() == '172.16.16.6/32'
 | 
			
		||||
	assert net7.host_address == none
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_from_u32() {
 | 
			
		||||
	net1 := netaddr.Ipv4Net.from_u32(3405803776, 24)!
 | 
			
		||||
	net2 := netaddr.Ipv4Net.from_u32(3405803788, 24)!
 | 
			
		||||
	assert net1.str() == '203.0.113.0/24'
 | 
			
		||||
	assert net1.host_address == none
 | 
			
		||||
	assert net2.str() == '203.0.113.0/24'
 | 
			
		||||
	assert (net2.host_address as netaddr.Ipv4Addr).u32() == u32(3405803788)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_host_bits() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('10.0.10.2/29')!
 | 
			
		||||
	assert net.network_address.str() == '10.0.10.0'
 | 
			
		||||
	assert (net.host_address as netaddr.Ipv4Addr).str() == '10.0.10.2'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_0() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('0.0.0.0/0')!
 | 
			
		||||
	assert net.str() == '0.0.0.0/0'
 | 
			
		||||
	assert net.prefix_len == 0
 | 
			
		||||
	assert net.network_address.str() == '0.0.0.0'
 | 
			
		||||
	assert net.network_mask.str() == '0.0.0.0'
 | 
			
		||||
	assert net.host_mask.str() == '255.255.255.255'
 | 
			
		||||
	assert net.broadcast_address.str() == '255.255.255.255'
 | 
			
		||||
	assert net.host_address == none
 | 
			
		||||
	assert net.capacity() == u64(max_u32) + 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_255() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('255.255.255.255/32')!
 | 
			
		||||
	assert net.str() == '255.255.255.255/32'
 | 
			
		||||
	assert net.prefix_len == 32
 | 
			
		||||
	assert net.network_address.str() == '255.255.255.255'
 | 
			
		||||
	assert net.network_mask.str() == '255.255.255.255'
 | 
			
		||||
	assert net.host_mask.str() == '0.0.0.0'
 | 
			
		||||
	assert net.broadcast_address.str() == '255.255.255.255'
 | 
			
		||||
	assert net.host_address == none
 | 
			
		||||
	assert net.capacity() == 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_next() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('10.0.10.128/30')!
 | 
			
		||||
	mut addrs := []netaddr.Ipv4Addr{}
 | 
			
		||||
	for addr in net {
 | 
			
		||||
		addrs << addr
 | 
			
		||||
	}
 | 
			
		||||
	assert addrs[0].str() == '10.0.10.128'
 | 
			
		||||
	assert addrs[1].str() == '10.0.10.129'
 | 
			
		||||
	assert addrs[2].str() == '10.0.10.130'
 | 
			
		||||
	assert addrs[3].str() == '10.0.10.131'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_subnets() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('10.0.10.0/24')!
 | 
			
		||||
	subnets := net.subnets(26)!
 | 
			
		||||
	mut networks := []netaddr.Ipv4Net{}
 | 
			
		||||
	for subnet in subnets {
 | 
			
		||||
		networks << subnet
 | 
			
		||||
	}
 | 
			
		||||
	assert networks[0].str() == '10.0.10.0/26'
 | 
			
		||||
	assert networks[1].str() == '10.0.10.64/26'
 | 
			
		||||
	assert networks[2].str() == '10.0.10.128/26'
 | 
			
		||||
	assert networks[3].str() == '10.0.10.192/26'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_nth() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('10.0.10.0/24')!
 | 
			
		||||
	assert net.nth(-2)!.str() == '10.0.10.254'
 | 
			
		||||
	assert net.nth(-1)!.str() == '10.0.10.255'
 | 
			
		||||
	assert net.nth(0)!.str() == '10.0.10.0'
 | 
			
		||||
	assert net.nth(1)!.str() == '10.0.10.1'
 | 
			
		||||
	assert (net.nth(99999) or { netaddr.Ipv4Addr{} }).str() == '0.0.0.0'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_supernet() {
 | 
			
		||||
	net := netaddr.Ipv4Net.from_string('10.129.10.0/24')!
 | 
			
		||||
	supernet := net.supernet(10)!
 | 
			
		||||
	assert supernet.str() == '10.128.0.0/10'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_is_subnet_of() {
 | 
			
		||||
	net1 := netaddr.Ipv4Net.from_string('10.10.0.0/16')!
 | 
			
		||||
	net2 := netaddr.Ipv4Net.from_string('10.10.0.0/24')!
 | 
			
		||||
	assert net2.is_subnet_of(net1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_is_supernet_of() {
 | 
			
		||||
	net1 := netaddr.Ipv4Net.from_string('10.10.0.0/16')!
 | 
			
		||||
	net2 := netaddr.Ipv4Net.from_string('10.10.0.0/24')!
 | 
			
		||||
	net3 := netaddr.Ipv4Net.from_string('172.16.16.0/24')!
 | 
			
		||||
	assert net1.is_supernet_of(net2)
 | 
			
		||||
	assert !net1.is_supernet_of(net3)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_ipv4_net_first_last() {
 | 
			
		||||
	net1 := netaddr.Ipv4Net.from_string('10.0.0.0/24')!
 | 
			
		||||
	net2 := netaddr.Ipv4Net.from_string('10.0.0.0/30')!
 | 
			
		||||
	net3 := netaddr.Ipv4Net.from_string('10.0.0.0/31')!
 | 
			
		||||
	net4 := netaddr.Ipv4Net.from_string('10.0.0.0/32')!
 | 
			
		||||
	assert net1.first().str() == '10.0.0.1'
 | 
			
		||||
	assert net1.last().str() == '10.0.0.254'
 | 
			
		||||
	assert net2.first().str() == '10.0.0.1'
 | 
			
		||||
	assert net2.last().str() == '10.0.0.2'
 | 
			
		||||
	assert net3.first().str() == '10.0.0.0'
 | 
			
		||||
	assert net3.last().str() == '10.0.0.1'
 | 
			
		||||
	assert net4.first().str() == '10.0.0.0'
 | 
			
		||||
	assert net4.last().str() == '10.0.0.0'
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user