83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package address
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
"testing/quick"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func isPower2(x Count) bool {
|
|
if x == 0 {
|
|
return false
|
|
}
|
|
for ; x > 1; x /= 2 {
|
|
if x&1 != 0 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func TestBiggestPow2AlignedRange(t *testing.T) {
|
|
require.Equal(t, NewRange(0, 1), NewRange(0, 1).BiggestCIDRRange())
|
|
require.Equal(t, NewRange(1, 1), NewRange(1, 2).BiggestCIDRRange())
|
|
require.Equal(t, NewRange(2, 2), NewRange(1, 3).BiggestCIDRRange())
|
|
require.Equal(t, NewRange(0, 0x40000000), NewRange(0, 0x7fffffff).BiggestCIDRRange())
|
|
require.Equal(t, NewRange(0xfffffffe, 1), NewRange(0xfffffffe, 1).BiggestCIDRRange())
|
|
prop := func(start Address, size Offset) bool {
|
|
if size > Offset(0xffffffff)-Offset(start) { // out of range
|
|
return true
|
|
}
|
|
r := NewRange(start, size)
|
|
result := r.BiggestCIDRRange()
|
|
return r.Contains(result.Start) &&
|
|
r.Contains(result.End-1) &&
|
|
isPower2(result.Size()) &&
|
|
result.Size() > r.Size()/4 &&
|
|
Count(result.Start)%result.Size() == 0
|
|
}
|
|
require.NoError(t, quick.Check(prop, &quick.Config{MaxCount: 1000000}))
|
|
}
|
|
|
|
func ip(s string) Address {
|
|
addr, _ := ParseIP(s)
|
|
return addr
|
|
}
|
|
|
|
func cidr(s string) CIDR {
|
|
c, err := ParseCIDR(s)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return c
|
|
}
|
|
|
|
func TestCIDRs(t *testing.T) {
|
|
start := ip("10.0.0.1")
|
|
end := ip("10.0.0.9")
|
|
r := NewRange(start, Subtract(end, start))
|
|
require.Equal(t,
|
|
[]CIDR{cidr("10.0.0.1/32"), cidr("10.0.0.2/31"), cidr("10.0.0.4/30"), cidr("10.0.0.8/32")},
|
|
r.CIDRs())
|
|
}
|
|
|
|
func TestCIDRStartAndEnd(t *testing.T) {
|
|
cidr, _ := ParseCIDR("10.0.0.0/24")
|
|
require.Equal(t, ip("10.0.0.0"), cidr.Start(), "")
|
|
require.Equal(t, ip("10.0.1.0"), cidr.End(), "")
|
|
}
|
|
|
|
func TestConversions(t *testing.T) {
|
|
addrStr := "10.2.3.0"
|
|
cidrStr := addrStr + "/24"
|
|
addr := ip(addrStr)
|
|
require.Equal(t, addr.String(), addrStr)
|
|
require.Equal(t, addr.IP4(), net.ParseIP(addrStr).To4())
|
|
cidr, _ := ParseCIDR(cidrStr)
|
|
require.Equal(t, cidr.String(), cidrStr)
|
|
_, ipnet, _ := net.ParseCIDR(cidrStr)
|
|
require.Equal(t, cidr.IPNet(), ipnet)
|
|
}
|