package node import ( "net" "testing" ) func TestParsePortRange(t *testing.T) { cases := []struct { in string wantMin int wantMax int wantErr bool }{ {"", 0, 0, false}, // 空 = 未配置 {"20000-21000", 20000, 21000, false}, {"20000 - 21000", 20000, 21000, false}, // 两侧空白 {"5900", 5900, 5900, false}, // 单端口 {"abc", 0, 0, true}, {"21000-20000", 0, 0, true}, // 逆序 {"0-100", 0, 0, true}, // 零起点无效 {"65536", 0, 0, true}, // 越界 } for _, c := range cases { r, err := ParsePortRange(c.in) if c.wantErr { if err == nil { t.Errorf("ParsePortRange(%q) 期望报错, 得到 %v", c.in, r) } continue } if err != nil { t.Errorf("ParsePortRange(%q) 意外报错: %v", c.in, err) continue } if r.Min != c.wantMin || r.Max != c.wantMax { t.Errorf("ParsePortRange(%q) = %v, 期望 %d-%d", c.in, r, c.wantMin, c.wantMax) } } } func TestPortRangeListen(t *testing.T) { r, err := ParsePortRange("20000-20002") if err != nil { t.Fatal(err) } // 占满 3 个端口后第 4 次应失败 var ls []net.Listener defer func() { for _, l := range ls { l.Close() } }() for i := 0; i < 3; i++ { l, err := r.listen("127.0.0.1") if err != nil { t.Fatalf("第 %d 次取端口失败: %v", i+1, err) } ls = append(ls, l) port := l.Addr().(*net.TCPAddr).Port if port < 20000 || port > 20002 { t.Fatalf("取得端口 %d 超出范围", port) } } if _, err := r.listen("127.0.0.1"); err == nil { t.Fatal("范围占满后应返回错误") } // 释放后应可再取 ls[0].Close() l, err := r.listen("127.0.0.1") if err != nil { t.Fatalf("释放后再取失败: %v", err) } l.Close() }