@@ -7,22 +7,9 @@ import (
77 "strings"
88 "testing"
99 "time"
10+ "unicode/utf8"
1011)
1112
12- func TestParseListLine (t * testing.T ) {
13- tt , err := parseListLine ("59.43.247.1 HK CN2 pace=fast" , "icmp" )
14- if err != nil || tt .Name != "HK CN2" || tt .Pace != "fast" {
15- t .Fatalf ("icmp line: %+v %v" , tt , err )
16- }
17- tt , err = parseListLine ("10.0.0.5:443 gw interval=30" , "tcp" )
18- if err != nil || tt .Host != "10.0.0.5" || tt .Port != 443 || tt .IntervalSec != 30 {
19- t .Fatalf ("tcp line: %+v %v" , tt , err )
20- }
21- if _ , err := parseListLine ("noport name" , "tcp" ); err == nil {
22- t .Fatal ("tcp without port should fail" )
23- }
24- }
25-
2613func TestProbeParams (t * testing.T ) {
2714 g := ProbeCfg {IntervalSec : 60 , Packets : 20 }
2815 if iv , pk := probeParams (TargetCfg {Pace : "fast" }, g ); iv .Seconds () != 15 || pk != 30 {
@@ -69,22 +56,65 @@ func BenchmarkCalcStats24h(b *testing.B) {
6956 }
7057}
7158
72- func FuzzParseListLine (f * testing.F ) {
73- f .Add ("1.2.3.4 name pace=fast" , "icmp" )
74- f .Add ("10.0.0.5:443 gw interval=30" , "tcp" )
75- f .Add ("host:99999 x" , "tcp" )
76- f .Add ("::1 v6" , "icmp" )
77- f .Fuzz (func (t * testing.T , line , typ string ) {
78- if typ != "icmp" && typ != "tcp" {
79- typ = "icmp"
59+ // normalizeTarget is the only gate between the web API and the targets table.
60+ func TestNormalizeTarget (t * testing.T ) {
61+ ok := []TargetCfg {
62+ {Host : " 59.43.247.1 " , Name : "HK CN2" , Pace : "fast" },
63+ {Type : "tcp" , Host : "10.0.0.5" , Port : 443 , IntervalSec : 30 },
64+ {Host : "example.com" , Pace : "normal" },
65+ }
66+ for _ , c := range ok {
67+ if err := normalizeTarget (& c ); err != nil {
68+ t .Fatalf ("%+v: %v" , c , err )
8069 }
81- if len (line ) == 0 || line [0 ] == '#' {
70+ }
71+ c := TargetCfg {Type : "tcp" , Host : "10.0.0.5" , Port : 443 }
72+ normalizeTarget (& c )
73+ if c .Name != "10.0.0.5:443" {
74+ t .Fatalf ("tcp default name: %q" , c .Name )
75+ }
76+ c = TargetCfg {Host : "1.1.1.1" , Pace : "normal" }
77+ normalizeTarget (& c )
78+ if c .Pace != "" || c .Name != "1.1.1.1" || c .Type != "icmp" {
79+ t .Fatalf ("defaults: %+v" , c )
80+ }
81+ bad := []TargetCfg {
82+ {Host : "" },
83+ {Host : "a b" },
84+ {Type : "tcp" , Host : "h" },
85+ {Type : "tcp" , Host : "h" , Port : 70000 },
86+ {Type : "udp" , Host : "h" },
87+ {Host : "h" , Pace : "turbo" },
88+ {Host : "h" , IntervalSec : - 1 },
89+ {Host : "h" , Name : strings .Repeat ("x" , 65 )},
90+ {Host : "h" , Name : "a\x00 b" },
91+ }
92+ for _ , c := range bad {
93+ if err := normalizeTarget (& c ); err == nil {
94+ t .Fatalf ("accepted %+v" , c )
95+ }
96+ }
97+ }
98+
99+ func FuzzNormalizeTarget (f * testing.F ) {
100+ f .Add ("icmp" , "1.1.1.1" , 0 , "" , "fast" , 0 )
101+ f .Add ("tcp" , "10.0.0.5" , 443 , "gw" , "" , 30 )
102+ f .Add ("" , " " , - 1 , "\x00 " , "normal" , 99999 )
103+ f .Fuzz (func (t * testing.T , typ , host string , port int , name , pace string , iv int ) {
104+ c := TargetCfg {Type : typ , Host : host , Port : port , Name : name , Pace : pace , IntervalSec : iv }
105+ if normalizeTarget (& c ) != nil {
82106 return
83107 }
84- // 只要求不 panic、不接受空 host
85- tt , err := parseListLine (line , typ )
86- if err == nil && tt .Host == "" {
87- t .Fatalf ("accepted empty host: %q" , line )
108+ // whatever gets in must be something the prober can run and the UI can show
109+ switch {
110+ case c .Host == "" || strings .ContainsAny (c .Host , " \t \n " ):
111+ t .Fatalf ("bad host accepted: %q" , c .Host )
112+ case c .Type != "icmp" && c .Type != "tcp" :
113+ t .Fatalf ("bad type accepted: %q" , c .Type )
114+ case c .Type == "tcp" && (c .Port < 1 || c .Port > 65535 ):
115+ t .Fatalf ("bad port accepted: %d" , c .Port )
116+ case c .Name == "" || utf8 .RuneCountInString (c .Name ) > 64 :
117+ t .Fatalf ("bad name accepted: %q" , c .Name )
88118 }
89119 })
90120}
0 commit comments