1/* 2 * 3 * Copyright 2020 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19package grpcutil 20 21import ( 22 "testing" 23 24 "google.golang.org/grpc/resolver" 25) 26 27func TestParseTarget(t *testing.T) { 28 for _, test := range []resolver.Target{ 29 {Scheme: "dns", Authority: "", Endpoint: "google.com"}, 30 {Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com"}, 31 {Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com/?a=b"}, 32 {Scheme: "passthrough", Authority: "", Endpoint: "/unix/socket/address"}, 33 } { 34 str := test.Scheme + "://" + test.Authority + "/" + test.Endpoint 35 got := ParseTarget(str, false) 36 if got != test { 37 t.Errorf("ParseTarget(%q, false) = %+v, want %+v", str, got, test) 38 } 39 got = ParseTarget(str, true) 40 if got != test { 41 t.Errorf("ParseTarget(%q, true) = %+v, want %+v", str, got, test) 42 } 43 } 44} 45 46func TestParseTargetString(t *testing.T) { 47 for _, test := range []struct { 48 targetStr string 49 want resolver.Target 50 wantWithDialer resolver.Target 51 }{ 52 {targetStr: "", want: resolver.Target{Scheme: "", Authority: "", Endpoint: ""}}, 53 {targetStr: ":///", want: resolver.Target{Scheme: "", Authority: "", Endpoint: ""}}, 54 {targetStr: "a:///", want: resolver.Target{Scheme: "a", Authority: "", Endpoint: ""}}, 55 {targetStr: "://a/", want: resolver.Target{Scheme: "", Authority: "a", Endpoint: ""}}, 56 {targetStr: ":///a", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a"}}, 57 {targetStr: "a://b/", want: resolver.Target{Scheme: "a", Authority: "b", Endpoint: ""}}, 58 {targetStr: "a:///b", want: resolver.Target{Scheme: "a", Authority: "", Endpoint: "b"}}, 59 {targetStr: "://a/b", want: resolver.Target{Scheme: "", Authority: "a", Endpoint: "b"}}, 60 {targetStr: "a://b/c", want: resolver.Target{Scheme: "a", Authority: "b", Endpoint: "c"}}, 61 {targetStr: "dns:///google.com", want: resolver.Target{Scheme: "dns", Authority: "", Endpoint: "google.com"}}, 62 {targetStr: "dns://a.server.com/google.com", want: resolver.Target{Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com"}}, 63 {targetStr: "dns://a.server.com/google.com/?a=b", want: resolver.Target{Scheme: "dns", Authority: "a.server.com", Endpoint: "google.com/?a=b"}}, 64 65 {targetStr: "/", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "/"}}, 66 {targetStr: "google.com", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "google.com"}}, 67 {targetStr: "google.com/?a=b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "google.com/?a=b"}}, 68 {targetStr: "/unix/socket/address", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "/unix/socket/address"}}, 69 70 // If we can only parse part of the target. 71 {targetStr: "://", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "://"}}, 72 {targetStr: "unix://domain", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "unix://domain"}}, 73 {targetStr: "unix://a/b/c", want: resolver.Target{Scheme: "unix", Authority: "a", Endpoint: "/b/c"}}, 74 {targetStr: "a:b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a:b"}}, 75 {targetStr: "a/b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a/b"}}, 76 {targetStr: "a:/b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a:/b"}}, 77 {targetStr: "a//b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a//b"}}, 78 {targetStr: "a://b", want: resolver.Target{Scheme: "", Authority: "", Endpoint: "a://b"}}, 79 80 // Unix cases without custom dialer. 81 // unix:[local_path], unix:[/absolute], and unix://[/absolute] have different 82 // behaviors with a custom dialer, to prevent behavior changes with custom dialers. 83 {targetStr: "unix:a/b/c", want: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "a/b/c"}, wantWithDialer: resolver.Target{Scheme: "", Authority: "", Endpoint: "unix:a/b/c"}}, 84 {targetStr: "unix:/a/b/c", want: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "/a/b/c"}, wantWithDialer: resolver.Target{Scheme: "", Authority: "", Endpoint: "unix:/a/b/c"}}, 85 {targetStr: "unix:///a/b/c", want: resolver.Target{Scheme: "unix", Authority: "", Endpoint: "/a/b/c"}}, 86 87 {targetStr: "unix-abstract:a/b/c", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a/b/c"}}, 88 {targetStr: "unix-abstract:a b", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a b"}}, 89 {targetStr: "unix-abstract:a:b", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a:b"}}, 90 {targetStr: "unix-abstract:a-b", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "a-b"}}, 91 {targetStr: "unix-abstract:/ a///://::!@#$%^&*()b", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "/ a///://::!@#$%^&*()b"}}, 92 {targetStr: "unix-abstract:passthrough:abc", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "passthrough:abc"}}, 93 {targetStr: "unix-abstract:unix:///abc", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "unix:///abc"}}, 94 {targetStr: "unix-abstract:///a/b/c", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "/a/b/c"}}, 95 {targetStr: "unix-abstract://authority/a/b/c", want: resolver.Target{Scheme: "unix-abstract", Authority: "authority", Endpoint: "/a/b/c"}}, 96 {targetStr: "unix-abstract:///", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "/"}}, 97 {targetStr: "unix-abstract://authority", want: resolver.Target{Scheme: "unix-abstract", Authority: "", Endpoint: "//authority"}}, 98 99 {targetStr: "passthrough:///unix:///a/b/c", want: resolver.Target{Scheme: "passthrough", Authority: "", Endpoint: "unix:///a/b/c"}}, 100 } { 101 got := ParseTarget(test.targetStr, false) 102 if got != test.want { 103 t.Errorf("ParseTarget(%q, false) = %+v, want %+v", test.targetStr, got, test.want) 104 } 105 wantWithDialer := test.wantWithDialer 106 if wantWithDialer == (resolver.Target{}) { 107 wantWithDialer = test.want 108 } 109 got = ParseTarget(test.targetStr, true) 110 if got != wantWithDialer { 111 t.Errorf("ParseTarget(%q, true) = %+v, want %+v", test.targetStr, got, wantWithDialer) 112 } 113 } 114} 115