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