package netx import ( `math` `net` `net/netip` "testing" ) func TestFuncsIP(t *testing.T) { var err error var ip net.IP var addr netip.Addr var ipFamily uint16 var tgtFamily uint16 var addrFamily uint16 // IPv4 on even indexes, IPv6 on odd. for idx, s := range []string{ "203.0.113.10", "2001:db8::203:0:113:10", } { if ip = net.ParseIP(s); ip == nil { t.Fatalf("ip %s not valid", s) } if addr, err = netip.ParseAddr(s); err != nil { t.Fatalf("addr %s not valid", s) } ipFamily = GetIpFamily(ip) addrFamily = GetAddrFamily(addr) if ipFamily == AFUnspec { t.Fatalf("GetIpFamily: Failed on IP %s (unspecified family)", s) } if addrFamily == AFUnspec { t.Fatalf("GetAddrFamily: Failed on IP %s (unspecified family)", s) } switch idx%2 == 0 { case true: tgtFamily = AFInet case false: tgtFamily = AFInet6 } if ipFamily != tgtFamily { t.Fatalf("GetIpFamily: Failed on IP %s (expected %d, got %d)", s, AFInet, tgtFamily) } if addrFamily != tgtFamily { t.Fatalf("GetAddrFamily: Failed on IP %s (expected %d, got %d)", s, AFInet, tgtFamily) } } } func TestFuncsMask(t *testing.T) { var err error var cidr uint8 var mask uint32 var maskStr string var ipMask net.IPMask var cidrTgt uint8 = 32 var maskTgt uint32 = math.MaxUint32 var maskStrTgt string = "255.255.255.255" var ipMaskTgt net.IPMask = net.IPMask{255, 255, 255, 255} // To CIDR if cidr, err = Mask4ToCidr(maskTgt); err != nil { t.Fatal(err) } else if cidr != cidrTgt { t.Fatalf("Mask4ToCidr: cidr %d != cidrTgt %d", cidr, cidrTgt) } if cidr, err = IPMask4ToCidr(ipMaskTgt); err != nil { t.Fatal(err) } else if cidr != cidrTgt { t.Fatalf("IPMask4ToCidr: cidr %d != cidrTgt %d", cidr, cidrTgt) } if cidr, err = Mask4StrToCidr(maskStrTgt); err != nil { t.Fatal(err) } else if cidr != cidrTgt { t.Fatalf("Mask4StrToCidr cidr %d != cidrTgt %d", cidr, cidrTgt) } // To net.IPMask if ipMask, err = Cidr4ToIPMask(cidrTgt); err != nil { t.Fatal(err) } else if ipMaskTgt.String() != ipMask.String() { t.Fatalf("Cidr4ToIPMask ipMask %s != ipMaskTgt %s", ipMask.String(), ipMaskTgt.String()) } if ipMask, err = Mask4ToIPMask(maskTgt); err != nil { t.Fatal(err) } else if ipMaskTgt.String() != ipMask.String() { t.Fatalf("Mask4ToIPMask ipMask %s != ipMaskTgt %s", ipMask.String(), ipMaskTgt.String()) } if ipMask, err = Mask4StrToIPMask(maskStrTgt); err != nil { t.Fatal(err) } else if ipMaskTgt.String() != ipMask.String() { t.Fatalf("Mask4StrToIPMask ipMask %s != ipMaskTgt %s", ipMask.String(), ipMaskTgt.String()) } // To bitmask if mask, err = Cidr4ToMask(cidrTgt); err != nil { t.Fatal(err) } else if mask != maskTgt { t.Fatalf("Cidr4ToMask mask %d != maskTgt %d", mask, maskTgt) } if mask, err = IPMask4ToMask(ipMaskTgt); err != nil { t.Fatal(err) } else if mask != maskTgt { t.Fatalf("IPMask4ToMask mask %d != maskTgt %d", mask, maskTgt) } if mask, err = Mask4StrToMask(maskStrTgt); err != nil { t.Fatal(err) } else if mask != maskTgt { t.Fatalf("Mask4StrToMask mask %d != maskTgt %d", mask, maskTgt) } // To string if maskStr, err = Cidr4ToStr(cidrTgt); err != nil { t.Fatal(err) } else if maskStr != maskStrTgt { t.Fatalf("Cidr4ToStr maskStr %s != maskStrTgt %s", maskStr, maskStrTgt) } if maskStr, err = IPMask4ToStr(ipMaskTgt); err != nil { t.Fatal(err) } else if maskStr != maskStrTgt { t.Fatalf("IPMask4ToStr maskStr %s != maskStrTgt %s", maskStr, maskStrTgt) } if maskStr, err = Mask4ToStr(maskTgt); err != nil { t.Fatal(err) } else if maskStr != maskStrTgt { t.Fatalf("Mask4ToStr maskStr %s != maskStrTgt %s", maskStr, maskStrTgt) } }