...
1
18
19 package dns_test
20
21 import (
22 "context"
23 "net"
24 "sync"
25
26 "google.golang.org/grpc/internal/testutils"
27 )
28
29
30 type testNetResolver struct {
31
32
33
34 lookupHostCh *testutils.Channel
35
36 mu sync.Mutex
37 hostLookupTable map[string][]string
38 srvLookupTable map[string][]*net.SRV
39 txtLookupTable map[string][]string
40 }
41
42 func (tr *testNetResolver) LookupHost(ctx context.Context, host string) ([]string, error) {
43 if tr.lookupHostCh != nil {
44 if err := tr.lookupHostCh.SendContext(ctx, nil); err != nil {
45 return nil, err
46 }
47 }
48
49 tr.mu.Lock()
50 defer tr.mu.Unlock()
51
52 if addrs, ok := tr.hostLookupTable[host]; ok {
53 return addrs, nil
54 }
55
56 return nil, &net.DNSError{
57 Err: "hostLookup error",
58 Name: host,
59 Server: "fake",
60 IsTemporary: true,
61 }
62 }
63
64 func (tr *testNetResolver) UpdateHostLookupTable(table map[string][]string) {
65 tr.mu.Lock()
66 tr.hostLookupTable = table
67 tr.mu.Unlock()
68 }
69
70 func (tr *testNetResolver) LookupSRV(ctx context.Context, service, proto, name string) (string, []*net.SRV, error) {
71 tr.mu.Lock()
72 defer tr.mu.Unlock()
73
74 cname := "_" + service + "._" + proto + "." + name
75 if srvs, ok := tr.srvLookupTable[cname]; ok {
76 return cname, srvs, nil
77 }
78 return "", nil, &net.DNSError{
79 Err: "srvLookup error",
80 Name: cname,
81 Server: "fake",
82 IsTemporary: true,
83 }
84 }
85
86 func (tr *testNetResolver) LookupTXT(ctx context.Context, host string) ([]string, error) {
87 tr.mu.Lock()
88 defer tr.mu.Unlock()
89
90 if sc, ok := tr.txtLookupTable[host]; ok {
91 return sc, nil
92 }
93 return nil, &net.DNSError{
94 Err: "txtLookup error",
95 Name: host,
96 Server: "fake",
97 IsTemporary: true,
98 }
99 }
100
101 func (tr *testNetResolver) UpdateTXTLookupTable(table map[string][]string) {
102 tr.mu.Lock()
103 tr.txtLookupTable = table
104 tr.mu.Unlock()
105 }
106
107
108
109
110 func txtRecordServiceConfig(cfg string) []string {
111
112
113 b := append([]byte("grpc_config="), []byte(cfg)...)
114
115
116
117 var r []string
118 for i := 0; i < len(b); i += txtBytesLimit {
119 if i+txtBytesLimit > len(b) {
120 r = append(r, string(b[i:]))
121 } else {
122 r = append(r, string(b[i:i+txtBytesLimit]))
123 }
124 }
125 return r
126 }
127
View as plain text