forked from pion/mdns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconn_test.go
124 lines (90 loc) · 2.6 KB
/
conn_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// +build !js
package mdns
import (
"context"
"errors"
"net"
"testing"
"time"
"github.com/pion/transport/test"
"golang.org/x/net/ipv4"
)
func check(err error, t *testing.T) {
if err != nil {
t.Fatal(err)
}
}
func createListener(t *testing.T) *net.UDPConn {
addr, err := net.ResolveUDPAddr("udp", DefaultAddress)
check(err, t)
sock, err := net.ListenUDP("udp4", addr)
check(err, t)
return sock
}
func TestValidCommunication(t *testing.T) {
lim := test.TimeOut(time.Second * 10)
defer lim.Stop()
report := test.CheckRoutines(t)
defer report()
aSock := createListener(t)
bSock := createListener(t)
aServer, err := Server(ipv4.NewPacketConn(aSock), &Config{
LocalNames: []string{"pion-mdns-1.local", "pion-mdns-2.local"},
})
check(err, t)
bServer, err := Server(ipv4.NewPacketConn(bSock), &Config{})
check(err, t)
_, _, err = bServer.Query(context.TODO(), "pion-mdns-1.local")
check(err, t)
_, _, err = bServer.Query(context.TODO(), "pion-mdns-2.local")
check(err, t)
check(aServer.Close(), t)
check(bServer.Close(), t)
}
func TestMultipleClose(t *testing.T) {
lim := test.TimeOut(time.Second * 10)
defer lim.Stop()
report := test.CheckRoutines(t)
defer report()
aSock := createListener(t)
server, err := Server(ipv4.NewPacketConn(aSock), &Config{})
check(err, t)
check(server.Close(), t)
check(server.Close(), t)
}
func TestQueryRespectTimeout(t *testing.T) {
lim := test.TimeOut(time.Second * 10)
defer lim.Stop()
report := test.CheckRoutines(t)
defer report()
aSock := createListener(t)
server, err := Server(ipv4.NewPacketConn(aSock), &Config{})
check(err, t)
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
if _, _, err = server.Query(ctx, "invalid-host"); !errors.Is(err, errContextElapsed) {
t.Fatalf("Query expired but returned unexpected error %v", err)
}
if closeErr := server.Close(); closeErr != nil {
t.Fatal(closeErr)
}
}
func TestQueryRespectClose(t *testing.T) {
lim := test.TimeOut(time.Second * 10)
defer lim.Stop()
report := test.CheckRoutines(t)
defer report()
aSock := createListener(t)
server, err := Server(ipv4.NewPacketConn(aSock), &Config{})
check(err, t)
go func() {
time.Sleep(3 * time.Second)
check(server.Close(), t)
}()
if _, _, err = server.Query(context.TODO(), "invalid-host"); !errors.Is(err, errConnectionClosed) {
t.Fatalf("Query on closed server but returned unexpected error %v", err)
}
if _, _, err = server.Query(context.TODO(), "invalid-host"); !errors.Is(err, errConnectionClosed) {
t.Fatalf("Query on closed server but returned unexpected error %v", err)
}
}