1// +build !js
2
3package ice
4
5import (
6	"net"
7	"strconv"
8	"testing"
9	"time"
10
11	"github.com/pion/transport/test"
12	"github.com/pion/turn/v2"
13	"github.com/stretchr/testify/assert"
14)
15
16func optimisticAuthHandler(username string, realm string, srcAddr net.Addr) (key []byte, ok bool) {
17	return turn.GenerateAuthKey("username", "pion.ly", "password"), true
18}
19
20func TestRelayOnlyConnection(t *testing.T) {
21	// Limit runtime in case of deadlocks
22	lim := test.TimeOut(time.Second * 30)
23	defer lim.Stop()
24
25	report := test.CheckRoutines(t)
26	defer report()
27
28	serverPort := randomPort(t)
29	serverListener, err := net.ListenPacket("udp", "127.0.0.1:"+strconv.Itoa(serverPort))
30	assert.NoError(t, err)
31
32	server, err := turn.NewServer(turn.ServerConfig{
33		Realm:       "pion.ly",
34		AuthHandler: optimisticAuthHandler,
35		PacketConnConfigs: []turn.PacketConnConfig{
36			{
37				PacketConn:            serverListener,
38				RelayAddressGenerator: &turn.RelayAddressGeneratorNone{Address: "127.0.0.1"},
39			},
40		},
41	})
42	assert.NoError(t, err)
43
44	cfg := &AgentConfig{
45		NetworkTypes: supportedNetworkTypes(),
46		Urls: []*URL{
47			{
48				Scheme:   SchemeTypeTURN,
49				Host:     "127.0.0.1",
50				Username: "username",
51				Password: "password",
52				Port:     serverPort,
53				Proto:    ProtoTypeUDP,
54			},
55		},
56		CandidateTypes: []CandidateType{CandidateTypeRelay},
57	}
58
59	aAgent, err := NewAgent(cfg)
60	if err != nil {
61		t.Fatal(err)
62	}
63
64	aNotifier, aConnected := onConnected()
65	if err = aAgent.OnConnectionStateChange(aNotifier); err != nil {
66		t.Fatal(err)
67	}
68
69	bAgent, err := NewAgent(cfg)
70	if err != nil {
71		t.Fatal(err)
72	}
73
74	bNotifier, bConnected := onConnected()
75	if err = bAgent.OnConnectionStateChange(bNotifier); err != nil {
76		t.Fatal(err)
77	}
78
79	connect(aAgent, bAgent)
80	<-aConnected
81	<-bConnected
82
83	assert.NoError(t, aAgent.Close())
84	assert.NoError(t, bAgent.Close())
85	assert.NoError(t, server.Close())
86}
87