@@ -32,74 +32,81 @@ import (
3232
3333func TestValidateTargetURI (t * testing.T ) {
3434 tests := []struct {
35- desc string
36- target string
37- wantErr bool
35+ desc string
36+ target string
3837 }{
3938 {
40- desc : "registered scheme with authority and endpoint" ,
41- target : "dns:///endpoint" ,
42- wantErr : false ,
39+ desc : "registered scheme with authority and endpoint" ,
40+ target : "dns:///endpoint" ,
4341 },
4442 {
45- desc : "uppercase registered scheme is canonicalized to lowercase" ,
46- target : "DNS:///endpoint" ,
47- wantErr : false ,
43+ desc : "uppercase registered scheme is canonicalized to lowercase" ,
44+ target : "DNS:///endpoint" ,
4845 },
4946 {
50- desc : "host:port without scheme falls back to default scheme" ,
51- target : "my-service:50051" ,
52- wantErr : false ,
47+ desc : "host:port without scheme falls back to default scheme" ,
48+ target : "my-service:50051" ,
5349 },
5450 {
55- desc : "dotted host:port without scheme falls back to default scheme" ,
56- target : "trafficdirector.googleapis.com:443" ,
57- wantErr : false ,
51+ desc : "dotted host:port without scheme falls back to default scheme" ,
52+ target : "trafficdirector.googleapis.com:443" ,
5853 },
5954 {
60- desc : "IP:port without scheme falls back to default scheme" ,
61- target : "127.0.0.1:443" ,
62- wantErr : false ,
55+ desc : "IP:port without scheme falls back to default scheme" ,
56+ target : "127.0.0.1:443" ,
6357 },
6458 {
65- desc : "registered-scheme opaque form falls back to default scheme" ,
66- target : "dns:endpoint" ,
67- wantErr : false ,
59+ desc : "registered-scheme opaque form falls back to default scheme" ,
60+ target : "dns:endpoint" ,
6861 },
6962 {
70- desc : "unparseable URI is accepted after default-scheme fallback" ,
71- target : "://bad" ,
72- wantErr : false ,
63+ desc : "unparseable URI is accepted after default-scheme fallback" ,
64+ target : "://bad" ,
7365 },
7466 {
75- desc : "absolute path with empty scheme uses default scheme" ,
76- target : "/var/run/foo.sock" ,
77- wantErr : false ,
67+ desc : "absolute path with empty scheme uses default scheme" ,
68+ target : "/var/run/foo.sock" ,
7869 },
70+ }
71+ for _ , tc := range tests {
72+ t .Run (tc .desc , func (t * testing.T ) {
73+ if err := ValidateTargetURI (tc .target ); err != nil {
74+ t .Fatalf ("ValidateTargetURI(%q) = %v, want nil" , tc .target , err )
75+ }
76+ })
77+ }
78+ }
79+
80+ func TestValidateTargetURI_Error (t * testing.T ) {
81+ tests := []struct {
82+ desc string
83+ target string
84+ wantErr string
85+ }{
7986 {
8087 desc : "invalid percent-escape fails initial and fallback parsing" ,
8188 target : "%zz" ,
82- wantErr : true ,
89+ wantErr : "invalid URL escape" ,
8390 },
8491 {
8592 desc : "empty target is rejected" ,
8693 target : "" ,
87- wantErr : true ,
94+ wantErr : "target URI cannot be empty" ,
8895 },
8996 {
9097 desc : "authority-form URI with unregistered scheme is rejected to surface typos" ,
9198 target : "no-such-scheme:///endpoint" ,
92- wantErr : true ,
99+ wantErr : `uses scheme "no-such-scheme" which has no registered resolver` ,
93100 },
94101 }
95102 for _ , tc := range tests {
96103 t .Run (tc .desc , func (t * testing.T ) {
97104 err := ValidateTargetURI (tc .target )
98- if ( err != nil ) != tc . wantErr {
99- t .Fatalf ("ValidateTargetURI(%q) = %v, wantErr %v " , tc .target , err , tc .wantErr )
105+ if err == nil {
106+ t .Fatalf ("ValidateTargetURI(%q) succeeded, want error containing %q " , tc .target , tc .wantErr )
100107 }
101- if err != nil && ! strings .Contains (err .Error (), tc .target ) && tc . target != "" {
102- t .Errorf ("ValidateTargetURI(%q) error %q does not mention target " , tc .target , err )
108+ if ! strings .Contains (err .Error (), tc .wantErr ) {
109+ t .Fatalf ("ValidateTargetURI(%q) = %v, want error containing %q " , tc .target , err , tc . wantErr )
103110 }
104111 })
105112 }
0 commit comments