package handler import ( "net" "reflect" "sort" "testing" "time" "github.com/google/gopacket/routing" "github.com/libp2p/go-netroute" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestRoute(t *testing.T) { var r routing.Router var err error r, err = netroute.New() if err != nil { t.Fatal(err) } iface, gateway, src, err := r.Route(net.ParseIP("8.8.8.8")) if err != nil { t.Fatal(err) } t.Logf("iface: %s, gateway: %s, src: %s", iface.Name, gateway, src) } func TestRemoveCIDRsContainingIPs(t *testing.T) { tests := []struct { name string cidrStrings []string ipStrings []string expectedCIDRs []string expectPanic bool }{ { name: "Normal case - some overlaps", cidrStrings: []string{ "10.140.45.0/24", "10.140.44.0/24", "10.31.0.0/24", "10.31.1.0/24", "10.31.2.0/24", "10.31.3.0/24", "10.140.47.0/24", "10.140.46.0/24", }, ipStrings: []string{ "10.140.45.1", "10.140.46.220", "10.140.45.180", "10.140.45.152", "10.140.46.183", "10.140.45.52", "10.140.47.148", "10.140.46.214", }, expectedCIDRs: []string{ "10.140.44.0/24", "10.31.0.0/24", "10.31.1.0/24", "10.31.2.0/24", "10.31.3.0/24", }, expectPanic: false, }, { name: "Empty CIDR list", cidrStrings: []string{}, ipStrings: []string{ "10.140.45.1", }, expectedCIDRs: []string{}, expectPanic: false, }, { name: "Empty IP list", cidrStrings: []string{ "10.140.45.0/24", "10.140.44.0/24", }, ipStrings: []string{}, expectedCIDRs: []string{ "10.140.45.0/24", "10.140.44.0/24", }, expectPanic: false, }, { name: "All CIDRs removed", cidrStrings: []string{ "10.140.45.0/24", "10.140.46.0/24", }, ipStrings: []string{ "10.140.45.1", "10.140.46.220", }, expectedCIDRs: []string{}, expectPanic: false, }, { name: "Overlapping CIDRs", cidrStrings: []string{ "10.140.45.0/24", "10.140.45.0/25", "10.140.45.128/25", }, ipStrings: []string{ "10.140.45.1", "10.140.45.129", }, expectedCIDRs: []string{}, expectPanic: false, }, { name: "Invalid CIDR format", cidrStrings: []string{ "10.140.45.0/24", "invalid-cidr", }, ipStrings: []string{ "10.140.45.1", }, expectedCIDRs: nil, // Panic expected expectPanic: true, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { defer func() { if r := recover(); r != nil { if !test.expectPanic { t.Errorf("unexpected panic: %v", r) } } else if test.expectPanic { t.Errorf("expected panic but got none") } }() var cidrs []*net.IPNet for _, cidr := range test.cidrStrings { _, ipNet, err := net.ParseCIDR(cidr) if err != nil { if test.expectPanic { panic(err) } t.Fatalf("failed to parse CIDR %s: %v", cidr, err) } cidrs = append(cidrs, ipNet) } var ipList []net.IP for _, ip := range test.ipStrings { parsedIP := net.ParseIP(ip) if parsedIP == nil { t.Fatalf("failed to parse IP %s", ip) } ipList = append(ipList, parsedIP) } c := &ConnectOptions{ cidrs: cidrs, } c.removeCIDRsContainingIPs(ipList) if !test.expectPanic { if len(c.cidrs) != len(test.expectedCIDRs) { t.Fatalf("unexpected number of remaining CIDRs: got %d, want %d", len(c.cidrs), len(test.expectedCIDRs)) } for i, cidr := range c.cidrs { if cidr.String() != test.expectedCIDRs[i] { t.Errorf("unexpected CIDR at index %d: got %s, want %s", i, cidr.String(), test.expectedCIDRs[i]) } } } }) } } func TestSort(t *testing.T) { list := v1.PodList{ Items: []v1.Pod{ { ObjectMeta: metav1.ObjectMeta{ Name: "a", DeletionTimestamp: nil, }, }, { ObjectMeta: metav1.ObjectMeta{ Name: "b", DeletionTimestamp: &metav1.Time{ Time: time.Now(), }, }, }, { ObjectMeta: metav1.ObjectMeta{ Name: "c", DeletionTimestamp: nil, }, }, { ObjectMeta: metav1.ObjectMeta{ Name: "d", DeletionTimestamp: nil, }, }, }, } sort.SliceStable(list.Items, func(i, j int) bool { return list.Items[i].DeletionTimestamp != nil }) var names []string for _, item := range list.Items { names = append(names, item.Name) } equal := reflect.DeepEqual(names, []string{"b", "a", "c", "d"}) if !equal { t.Fatal() } }