8
8
"bytes"
9
9
"encoding/json"
10
10
"errors"
11
+ "fmt"
11
12
"internal/testenv"
12
13
"os/exec"
13
14
"reflect"
@@ -18,6 +19,7 @@ import (
18
19
)
19
20
20
21
var nslookupTestServers = []string {"mail.golang.com" , "gmail.com" }
22
+ var lookupTestIPs = []string {"8.8.8.8" , "1.1.1.1" }
21
23
22
24
func toJson (v interface {}) string {
23
25
data , _ := json .Marshal (v )
@@ -124,6 +126,54 @@ func TestNSLookupTXT(t *testing.T) {
124
126
}
125
127
}
126
128
129
+ func TestLookupLocalPTR (t * testing.T ) {
130
+ testenv .MustHaveExternalNetwork (t )
131
+
132
+ addr , err := localIP ()
133
+ if err != nil {
134
+ t .Errorf ("failed to get local ip: %s" , err )
135
+ }
136
+ names , err := LookupAddr (addr .String ())
137
+ if err != nil {
138
+ t .Errorf ("failed %s: %s" , addr , err )
139
+ }
140
+ if len (names ) == 0 {
141
+ t .Errorf ("no results" )
142
+ }
143
+ expected , err := lookupPTR (addr .String ())
144
+ if err != nil {
145
+ t .Logf ("skipping failed lookup %s test: %s" , addr .String (), err )
146
+ }
147
+ sort .Strings (expected )
148
+ sort .Strings (names )
149
+ if ! reflect .DeepEqual (expected , names ) {
150
+ t .Errorf ("different results %s:\t exp:%v\t got:%v" , addr , toJson (expected ), toJson (names ))
151
+ }
152
+ }
153
+
154
+ func TestLookupPTR (t * testing.T ) {
155
+ testenv .MustHaveExternalNetwork (t )
156
+
157
+ for _ , addr := range lookupTestIPs {
158
+ names , err := LookupAddr (addr )
159
+ if err != nil {
160
+ t .Errorf ("failed %s: %s" , addr , err )
161
+ }
162
+ if len (names ) == 0 {
163
+ t .Errorf ("no results" )
164
+ }
165
+ expected , err := lookupPTR (addr )
166
+ if err != nil {
167
+ t .Logf ("skipping failed lookup %s test: %s" , addr , err )
168
+ }
169
+ sort .Strings (expected )
170
+ sort .Strings (names )
171
+ if ! reflect .DeepEqual (expected , names ) {
172
+ t .Errorf ("different results %s:\t exp:%v\t got:%v" , addr , toJson (expected ), toJson (names ))
173
+ }
174
+ }
175
+ }
176
+
127
177
type byPrefAndHost []* MX
128
178
129
179
func (s byPrefAndHost ) Len () int { return len (s ) }
@@ -230,3 +280,38 @@ func nslookupTXT(name string) (txt []string, err error) {
230
280
}
231
281
return
232
282
}
283
+
284
+ func ping (name string ) (string , error ) {
285
+ cmd := exec .Command ("ping" , "-n" , "1" , "-a" , name )
286
+ stdoutStderr , err := cmd .CombinedOutput ()
287
+ if err != nil {
288
+ return "" , fmt .Errorf ("%v: %v" , err , string (stdoutStderr ))
289
+ }
290
+ r := strings .ReplaceAll (string (stdoutStderr ), "\r \n " , "\n " )
291
+ return r , nil
292
+ }
293
+
294
+ func lookupPTR (name string ) (ptr []string , err error ) {
295
+ var r string
296
+ if r , err = ping (name ); err != nil {
297
+ return
298
+ }
299
+ ptr = make ([]string , 0 , 10 )
300
+ rx := regexp .MustCompile (`(?m)^Pinging\s+([a-zA-Z0-9.\-]+)\s+\[.*$` )
301
+ for _ , ans := range rx .FindAllStringSubmatch (r , - 1 ) {
302
+ ptr = append (ptr , ans [1 ]+ "." )
303
+ }
304
+ return
305
+ }
306
+
307
+ func localIP () (ip IP , err error ) {
308
+ conn , err := Dial ("udp" , "golang.org:80" )
309
+ if err != nil {
310
+ return nil , err
311
+ }
312
+ defer conn .Close ()
313
+
314
+ localAddr := conn .LocalAddr ().(* UDPAddr )
315
+
316
+ return localAddr .IP , nil
317
+ }
0 commit comments