mirror of
				https://github.com/kubenetworks/kubevpn.git
				synced 2025-10-31 18:52:50 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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()
 | |
| 	}
 | |
| }
 | 
