@@ -8,6 +8,7 @@ package dns_test
8
8
import (
9
9
"context"
10
10
"net"
11
+ "sync"
11
12
"testing"
12
13
"time"
13
14
@@ -28,136 +29,134 @@ func (th *testHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
28
29
w .WriteMsg (m )
29
30
}
30
31
31
- func startServer (t * testing.T , traced bool ) (* dns.Server , func () ) {
32
+ func startServer (t * testing.T , traced bool ) (* dns.Server , string ) {
32
33
var h dns.Handler = & testHandler {}
33
34
if traced {
34
35
h = dnstrace .WrapHandler (h )
35
36
}
36
- addr := getAddr (t ).String ()
37
- server := & dns.Server {
38
- Addr : addr ,
39
- Net : "udp" ,
40
- Handler : h ,
37
+ pc , err := net .ListenPacket ("udp" , "127.0.0.1:0" )
38
+ require .NoError (t , err )
39
+
40
+ srv := & dns.Server {
41
+ PacketConn : pc ,
42
+ ReadTimeout : time .Hour ,
43
+ WriteTimeout : time .Hour ,
44
+ Handler : h ,
41
45
}
42
46
43
- // start the server
47
+ waitLock := sync.Mutex {}
48
+ waitLock .Lock ()
49
+ srv .NotifyStartedFunc = waitLock .Unlock
50
+
44
51
go func () {
45
- err := server .ListenAndServe ()
46
- if err != nil {
47
- t .Error (err )
48
- }
52
+ require .NoError (t , srv .ActivateAndServe ())
49
53
}()
50
- waitTillUDPReady ( addr )
51
- stopServer := func () {
52
- err := server . Shutdown ( )
53
- assert . NoError ( t , err )
54
- }
55
- return server , stopServer
54
+ t . Cleanup ( func () {
55
+ require . NoError ( t , srv . Shutdown ())
56
+ } )
57
+
58
+ waitLock . Lock ()
59
+ return srv , pc . LocalAddr (). String ()
56
60
}
57
61
58
62
func TestExchange (t * testing.T ) {
59
- server , stopServer := startServer (t , false )
60
- defer stopServer ()
63
+ _ , addr := startServer (t , false )
61
64
62
65
mt := mocktracer .Start ()
63
66
defer mt .Stop ()
64
67
65
68
m := newMessage ()
66
69
67
- _ , err := dnstrace .Exchange (m , server . Addr )
68
- assert .NoError (t , err )
70
+ _ , err := dnstrace .Exchange (m , addr )
71
+ require .NoError (t , err )
69
72
70
73
spans := mt .FinishedSpans ()
71
74
require .Len (t , spans , 1 )
72
75
assertClientSpan (t , spans [0 ])
73
76
}
74
77
75
78
func TestExchangeContext (t * testing.T ) {
76
- server , stopServer := startServer (t , false )
77
- defer stopServer ()
79
+ _ , addr := startServer (t , false )
78
80
79
81
mt := mocktracer .Start ()
80
82
defer mt .Stop ()
81
83
82
84
m := newMessage ()
83
85
84
- _ , err := dnstrace .ExchangeContext (context .Background (), m , server . Addr )
85
- assert .NoError (t , err )
86
+ _ , err := dnstrace .ExchangeContext (context .Background (), m , addr )
87
+ require .NoError (t , err )
86
88
87
89
spans := mt .FinishedSpans ()
88
90
require .Len (t , spans , 1 )
89
91
assertClientSpan (t , spans [0 ])
90
92
}
91
93
92
94
func TestExchangeConn (t * testing.T ) {
93
- server , stopServer := startServer (t , false )
94
- defer stopServer ()
95
+ _ , addr := startServer (t , false )
95
96
96
97
mt := mocktracer .Start ()
97
98
defer mt .Stop ()
98
99
99
100
m := newMessage ()
100
101
101
- conn , err := net .Dial ("udp" , server . Addr )
102
+ conn , err := net .Dial ("udp" , addr )
102
103
require .NoError (t , err )
103
104
104
105
_ , err = dnstrace .ExchangeConn (conn , m )
105
- assert .NoError (t , err )
106
+ require .NoError (t , err )
106
107
107
108
spans := mt .FinishedSpans ()
108
109
require .Len (t , spans , 1 )
109
110
assertClientSpan (t , spans [0 ])
110
111
}
111
112
112
113
func TestClient_Exchange (t * testing.T ) {
113
- server , stopServer := startServer (t , false )
114
- defer stopServer ()
114
+ _ , addr := startServer (t , false )
115
115
116
116
mt := mocktracer .Start ()
117
117
defer mt .Stop ()
118
118
119
119
m := newMessage ()
120
-
121
120
client := newTracedClient ()
122
121
123
- _ , _ , err := client .Exchange (m , server . Addr )
124
- assert .NoError (t , err )
122
+ _ , _ , err := client .Exchange (m , addr )
123
+ require .NoError (t , err )
125
124
126
125
spans := mt .FinishedSpans ()
127
126
require .Len (t , spans , 1 )
128
127
assertClientSpan (t , spans [0 ])
129
128
}
130
129
131
130
func TestClient_ExchangeContext (t * testing.T ) {
132
- server , stopServer := startServer (t , false )
133
- defer stopServer ()
131
+ _ , addr := startServer (t , false )
134
132
135
133
mt := mocktracer .Start ()
136
134
defer mt .Stop ()
137
135
138
136
m := newMessage ()
139
-
140
137
client := newTracedClient ()
141
138
142
- _ , _ , err := client .ExchangeContext (context .Background (), m , server . Addr )
143
- assert .NoError (t , err )
139
+ _ , _ , err := client .ExchangeContext (context .Background (), m , addr )
140
+ require .NoError (t , err )
144
141
145
142
spans := mt .FinishedSpans ()
146
143
require .Len (t , spans , 1 )
147
144
assertClientSpan (t , spans [0 ])
148
145
}
149
146
150
147
func TestWrapHandler (t * testing.T ) {
151
- server , stopServer := startServer (t , true )
148
+ _ , addr := startServer (t , true )
152
149
153
150
mt := mocktracer .Start ()
154
151
defer mt .Stop ()
155
152
156
153
m := newMessage ()
157
- _ , err := dns .Exchange (m , server .Addr )
158
- assert .NoError (t , err )
154
+ client := newClient ()
155
+
156
+ _ , _ , err := client .Exchange (m , addr )
157
+ require .NoError (t , err )
159
158
160
- stopServer () // Shutdown server so span is closed after DNS request
159
+ waitForSpans ( mt , 1 )
161
160
162
161
spans := mt .FinishedSpans ()
163
162
require .Len (t , spans , 1 )
@@ -177,8 +176,12 @@ func newMessage() *dns.Msg {
177
176
return m
178
177
}
179
178
179
+ func newClient () * dns.Client {
180
+ return & dns.Client {Net : "udp" }
181
+ }
182
+
180
183
func newTracedClient () * dnstrace.Client {
181
- return & dnstrace.Client {Client : & dns. Client { Net : "udp" } }
184
+ return & dnstrace.Client {Client : newClient () }
182
185
}
183
186
184
187
func assertClientSpan (t * testing.T , s mocktracer.Span ) {
@@ -190,24 +193,15 @@ func assertClientSpan(t *testing.T, s mocktracer.Span) {
190
193
assert .Equal (t , ext .SpanKindClient , s .Tag (ext .SpanKind ))
191
194
}
192
195
193
- func getAddr (t * testing.T ) net.Addr {
194
- li , err := net .Listen ("tcp4" , "127.0.0.1:0" )
195
- if err != nil {
196
- t .Fatal (err )
197
- }
198
- addr := li .Addr ()
199
- li .Close ()
200
- return addr
201
- }
196
+ func waitForSpans (mt mocktracer.Tracer , sz int ) {
197
+ ctx , cancel := context .WithTimeout (context .Background (), time .Second * 5 )
198
+ defer cancel ()
202
199
203
- func waitTillUDPReady (addr string ) {
204
- deadline := time .Now ().Add (time .Second * 10 )
205
- for time .Now ().Before (deadline ) {
206
- m := new (dns.Msg )
207
- m .SetQuestion ("miek.nl." , dns .TypeMX )
208
- _ , err := dns .Exchange (m , addr )
209
- if err == nil {
210
- break
200
+ for len (mt .FinishedSpans ()) < sz {
201
+ select {
202
+ case <- ctx .Done ():
203
+ return
204
+ default :
211
205
}
212
206
time .Sleep (time .Millisecond * 100 )
213
207
}
0 commit comments