agent_udpmux_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. //go:build !js
  4. // +build !js
  5. package ice
  6. import (
  7. "net"
  8. "testing"
  9. "time"
  10. "github.com/pion/logging"
  11. "github.com/pion/transport/v2/test"
  12. "github.com/stretchr/testify/require"
  13. )
  14. // TestMuxAgent is an end to end test over UDP mux, ensuring two agents could connect over mux
  15. func TestMuxAgent(t *testing.T) {
  16. report := test.CheckRoutines(t)
  17. defer report()
  18. lim := test.TimeOut(time.Second * 30)
  19. defer lim.Stop()
  20. const muxPort = 7686
  21. caseAddrs := map[string]*net.UDPAddr{
  22. "unspecified": {Port: muxPort},
  23. "ipv4Loopback": {IP: net.IPv4(127, 0, 0, 1), Port: muxPort},
  24. }
  25. for subTest, addr := range caseAddrs {
  26. muxAddr := addr
  27. t.Run(subTest, func(t *testing.T) {
  28. c, err := net.ListenUDP("udp", muxAddr)
  29. require.NoError(t, err)
  30. loggerFactory := logging.NewDefaultLoggerFactory()
  31. udpMux := NewUDPMuxDefault(UDPMuxParams{
  32. Logger: loggerFactory.NewLogger("ice"),
  33. UDPConn: c,
  34. })
  35. muxedA, err := NewAgent(&AgentConfig{
  36. UDPMux: udpMux,
  37. CandidateTypes: []CandidateType{CandidateTypeHost},
  38. NetworkTypes: []NetworkType{
  39. NetworkTypeUDP4,
  40. },
  41. })
  42. require.NoError(t, err)
  43. a, err := NewAgent(&AgentConfig{
  44. CandidateTypes: []CandidateType{CandidateTypeHost},
  45. NetworkTypes: supportedNetworkTypes(),
  46. })
  47. require.NoError(t, err)
  48. conn, muxedConn := connect(a, muxedA)
  49. pair := muxedA.getSelectedPair()
  50. require.NotNil(t, pair)
  51. require.Equal(t, muxPort, pair.Local.Port())
  52. // Send a packet to Mux
  53. data := []byte("hello world")
  54. _, err = conn.Write(data)
  55. require.NoError(t, err)
  56. buf := make([]byte, 1024)
  57. n, err := muxedConn.Read(buf)
  58. require.NoError(t, err)
  59. require.Equal(t, data, buf[:n])
  60. // Send a packet from Mux
  61. _, err = muxedConn.Write(data)
  62. require.NoError(t, err)
  63. n, err = conn.Read(buf)
  64. require.NoError(t, err)
  65. require.Equal(t, data, buf[:n])
  66. // Close it down
  67. require.NoError(t, conn.Close())
  68. require.NoError(t, muxedConn.Close())
  69. require.NoError(t, udpMux.Close())
  70. // Expect error when reading from closed mux
  71. _, err = muxedConn.Read(data)
  72. require.Error(t, err)
  73. // Expect error when writing to closed mux
  74. _, err = muxedConn.Write(data)
  75. require.Error(t, err)
  76. })
  77. }
  78. }