mdns_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. "context"
  8. "regexp"
  9. "testing"
  10. "time"
  11. "github.com/pion/transport/v2/test"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestMulticastDNSOnlyConnection(t *testing.T) {
  15. report := test.CheckRoutines(t)
  16. defer report()
  17. // Limit runtime in case of deadlocks
  18. lim := test.TimeOut(time.Second * 30)
  19. defer lim.Stop()
  20. cfg := &AgentConfig{
  21. NetworkTypes: []NetworkType{NetworkTypeUDP4},
  22. CandidateTypes: []CandidateType{CandidateTypeHost},
  23. MulticastDNSMode: MulticastDNSModeQueryAndGather,
  24. }
  25. aAgent, err := NewAgent(cfg)
  26. if err != nil {
  27. t.Fatal(err)
  28. }
  29. aNotifier, aConnected := onConnected()
  30. if err = aAgent.OnConnectionStateChange(aNotifier); err != nil {
  31. t.Fatal(err)
  32. }
  33. bAgent, err := NewAgent(cfg)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. bNotifier, bConnected := onConnected()
  38. if err = bAgent.OnConnectionStateChange(bNotifier); err != nil {
  39. t.Fatal(err)
  40. }
  41. connect(aAgent, bAgent)
  42. <-aConnected
  43. <-bConnected
  44. assert.NoError(t, aAgent.Close())
  45. assert.NoError(t, bAgent.Close())
  46. }
  47. func TestMulticastDNSMixedConnection(t *testing.T) {
  48. report := test.CheckRoutines(t)
  49. defer report()
  50. // Limit runtime in case of deadlocks
  51. lim := test.TimeOut(time.Second * 30)
  52. defer lim.Stop()
  53. aAgent, err := NewAgent(&AgentConfig{
  54. NetworkTypes: []NetworkType{NetworkTypeUDP4},
  55. CandidateTypes: []CandidateType{CandidateTypeHost},
  56. MulticastDNSMode: MulticastDNSModeQueryAndGather,
  57. })
  58. if err != nil {
  59. t.Fatal(err)
  60. }
  61. aNotifier, aConnected := onConnected()
  62. if err = aAgent.OnConnectionStateChange(aNotifier); err != nil {
  63. t.Fatal(err)
  64. }
  65. bAgent, err := NewAgent(&AgentConfig{
  66. NetworkTypes: []NetworkType{NetworkTypeUDP4},
  67. CandidateTypes: []CandidateType{CandidateTypeHost},
  68. MulticastDNSMode: MulticastDNSModeQueryOnly,
  69. })
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. bNotifier, bConnected := onConnected()
  74. if err = bAgent.OnConnectionStateChange(bNotifier); err != nil {
  75. t.Fatal(err)
  76. }
  77. connect(aAgent, bAgent)
  78. <-aConnected
  79. <-bConnected
  80. assert.NoError(t, aAgent.Close())
  81. assert.NoError(t, bAgent.Close())
  82. }
  83. func TestMulticastDNSStaticHostName(t *testing.T) {
  84. report := test.CheckRoutines(t)
  85. defer report()
  86. lim := test.TimeOut(time.Second * 30)
  87. defer lim.Stop()
  88. _, err := NewAgent(&AgentConfig{
  89. NetworkTypes: []NetworkType{NetworkTypeUDP4},
  90. CandidateTypes: []CandidateType{CandidateTypeHost},
  91. MulticastDNSMode: MulticastDNSModeQueryAndGather,
  92. MulticastDNSHostName: "invalidHostName",
  93. })
  94. assert.Equal(t, err, ErrInvalidMulticastDNSHostName)
  95. agent, err := NewAgent(&AgentConfig{
  96. NetworkTypes: []NetworkType{NetworkTypeUDP4},
  97. CandidateTypes: []CandidateType{CandidateTypeHost},
  98. MulticastDNSMode: MulticastDNSModeQueryAndGather,
  99. MulticastDNSHostName: "validName.local",
  100. })
  101. assert.NoError(t, err)
  102. correctHostName, resolveFunc := context.WithCancel(context.Background())
  103. assert.NoError(t, agent.OnCandidate(func(c Candidate) {
  104. if c != nil && c.Address() == "validName.local" {
  105. resolveFunc()
  106. }
  107. }))
  108. assert.NoError(t, agent.GatherCandidates())
  109. <-correctHostName.Done()
  110. assert.NoError(t, agent.Close())
  111. }
  112. func TestGenerateMulticastDNSName(t *testing.T) {
  113. name, err := generateMulticastDNSName()
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. isMDNSName := regexp.MustCompile(
  118. `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}.local+$`,
  119. ).MatchString
  120. if !isMDNSName(name) {
  121. t.Fatalf("mDNS name must be UUID v4 + \".local\" suffix, got %s", name)
  122. }
  123. }