2020-02-05 22:16:58 +00:00
|
|
|
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package magicsock
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestListen(t *testing.T) {
|
|
|
|
epCh := make(chan string, 16)
|
|
|
|
epFunc := func(endpoints []string) {
|
|
|
|
for _, ep := range endpoints {
|
|
|
|
epCh <- ep
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO(crawshaw): break test dependency on the network
|
|
|
|
// using "gortc.io/stun" (like stunner_test.go).
|
|
|
|
stunServers := DefaultSTUN
|
|
|
|
|
|
|
|
port := pickPort(t)
|
|
|
|
conn, err := Listen(Options{
|
|
|
|
Port: port,
|
|
|
|
STUN: stunServers,
|
|
|
|
EndpointsFunc: epFunc,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
|
|
|
|
go func() {
|
2020-02-18 16:57:11 +00:00
|
|
|
var pkt [64 << 10]byte
|
2020-02-05 22:16:58 +00:00
|
|
|
for {
|
|
|
|
_, _, _, err := conn.ReceiveIPv4(pkt[:])
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
timeout := time.After(10 * time.Second)
|
|
|
|
var endpoints []string
|
|
|
|
suffix := fmt.Sprintf(":%d", port)
|
|
|
|
collectEndpoints:
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case ep := <-epCh:
|
|
|
|
endpoints = append(endpoints, ep)
|
|
|
|
if strings.HasSuffix(ep, suffix) {
|
|
|
|
break collectEndpoints
|
|
|
|
}
|
|
|
|
case <-timeout:
|
|
|
|
t.Fatalf("timeout with endpoints: %v", endpoints)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func pickPort(t *testing.T) uint16 {
|
|
|
|
t.Helper()
|
|
|
|
conn, err := net.ListenPacket("udp4", ":0")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer conn.Close()
|
|
|
|
return uint16(conn.LocalAddr().(*net.UDPAddr).Port)
|
|
|
|
}
|
2020-02-18 21:32:04 +00:00
|
|
|
|
|
|
|
func TestDerpIPConstant(t *testing.T) {
|
2020-03-04 01:46:03 +00:00
|
|
|
if DerpMagicIP != derpMagicIP.String() {
|
|
|
|
t.Errorf("str %q != IP %v", DerpMagicIP, derpMagicIP)
|
|
|
|
}
|
|
|
|
if len(derpMagicIP) != 4 {
|
|
|
|
t.Errorf("derpMagicIP is len %d; want 4", len(derpMagicIP))
|
2020-02-18 21:32:04 +00:00
|
|
|
}
|
|
|
|
}
|