hostmap_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package nebula
  2. import (
  3. "net"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. )
  7. /*
  8. func TestHostInfoDestProbe(t *testing.T) {
  9. a, _ := net.ResolveUDPAddr("udp", "1.0.0.1:22222")
  10. d := NewHostInfoDest(a)
  11. // 999 probes that all return should give a 100% success rate
  12. for i := 0; i < 999; i++ {
  13. meh := d.Probe()
  14. d.ProbeReceived(meh)
  15. }
  16. assert.Equal(t, d.Grade(), float64(1))
  17. // 999 probes of which only half return should give a 50% success rate
  18. for i := 0; i < 999; i++ {
  19. meh := d.Probe()
  20. if i%2 == 0 {
  21. d.ProbeReceived(meh)
  22. }
  23. }
  24. assert.Equal(t, d.Grade(), float64(.5))
  25. // 999 probes of which none return should give a 0% success rate
  26. for i := 0; i < 999; i++ {
  27. d.Probe()
  28. }
  29. assert.Equal(t, d.Grade(), float64(0))
  30. // 999 probes of which only 1/4 return should give a 25% success rate
  31. for i := 0; i < 999; i++ {
  32. meh := d.Probe()
  33. if i%4 == 0 {
  34. d.ProbeReceived(meh)
  35. }
  36. }
  37. assert.Equal(t, d.Grade(), float64(.25))
  38. // 999 probes of which only half return and are duplicates should give a 50% success rate
  39. for i := 0; i < 999; i++ {
  40. meh := d.Probe()
  41. if i%2 == 0 {
  42. d.ProbeReceived(meh)
  43. d.ProbeReceived(meh)
  44. }
  45. }
  46. assert.Equal(t, d.Grade(), float64(.5))
  47. // 999 probes of which only way old replies return should give a 0% success rate
  48. for i := 0; i < 999; i++ {
  49. meh := d.Probe()
  50. d.ProbeReceived(meh - 101)
  51. }
  52. assert.Equal(t, d.Grade(), float64(0))
  53. }
  54. */
  55. func TestHostmap(t *testing.T) {
  56. l := NewTestLogger()
  57. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  58. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  59. myNets := []*net.IPNet{myNet}
  60. preferredRanges := []*net.IPNet{localToMe}
  61. m := NewHostMap(l, "test", myNet, preferredRanges)
  62. a := NewUDPAddrFromString("10.127.0.3:11111")
  63. b := NewUDPAddrFromString("1.0.0.1:22222")
  64. y := NewUDPAddrFromString("10.128.0.3:11111")
  65. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), a)
  66. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), b)
  67. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), y)
  68. info, _ := m.QueryVpnIP(ip2int(net.ParseIP("10.128.1.1")))
  69. // There should be three remotes in the host map
  70. assert.Equal(t, 3, len(info.Remotes))
  71. // Adding an identical remote should not change the count
  72. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), y)
  73. assert.Equal(t, 3, len(info.Remotes))
  74. // Adding a fresh remote should add one
  75. y = NewUDPAddrFromString("10.18.0.3:11111")
  76. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), y)
  77. assert.Equal(t, 4, len(info.Remotes))
  78. // Query and reference remote should get the first one (and not nil)
  79. info, _ = m.QueryVpnIP(ip2int(net.ParseIP("10.128.1.1")))
  80. assert.NotNil(t, info.remote)
  81. // Promotion should ensure that the best remote is chosen (y)
  82. info.ForcePromoteBest(myNets)
  83. assert.True(t, myNet.Contains(info.remote.IP))
  84. }
  85. func TestHostmapdebug(t *testing.T) {
  86. l := NewTestLogger()
  87. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  88. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  89. preferredRanges := []*net.IPNet{localToMe}
  90. m := NewHostMap(l, "test", myNet, preferredRanges)
  91. a := NewUDPAddrFromString("10.127.0.3:11111")
  92. b := NewUDPAddrFromString("1.0.0.1:22222")
  93. y := NewUDPAddrFromString("10.128.0.3:11111")
  94. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), a)
  95. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), b)
  96. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), y)
  97. //t.Errorf("%s", m.DebugRemotes(1))
  98. }
  99. func TestHostMap_rotateRemote(t *testing.T) {
  100. h := HostInfo{}
  101. // 0 remotes, no panic
  102. h.rotateRemote()
  103. assert.Nil(t, h.remote)
  104. // 1 remote, no panic
  105. h.AddRemote(NewUDPAddr(net.IP{1, 1, 1, 1}, 0))
  106. h.rotateRemote()
  107. assert.Equal(t, h.remote.IP, net.IP{1, 1, 1, 1})
  108. h.AddRemote(NewUDPAddr(net.IP{1, 1, 1, 2}, 0))
  109. h.AddRemote(NewUDPAddr(net.IP{1, 1, 1, 3}, 0))
  110. h.AddRemote(NewUDPAddr(net.IP{1, 1, 1, 4}, 0))
  111. //TODO: ensure we are copying and not storing the slice!
  112. // Rotate through those 3
  113. h.rotateRemote()
  114. assert.Equal(t, h.remote.IP, net.IP{1, 1, 1, 2})
  115. h.rotateRemote()
  116. assert.Equal(t, h.remote.IP, net.IP{1, 1, 1, 3})
  117. h.rotateRemote()
  118. assert.Equal(t, h.remote, &udpAddr{IP: net.IP{1, 1, 1, 4}, Port: 0})
  119. // Finally, we should start over
  120. h.rotateRemote()
  121. assert.Equal(t, h.remote, &udpAddr{IP: net.IP{1, 1, 1, 1}, Port: 0})
  122. }
  123. func BenchmarkHostmappromote2(b *testing.B) {
  124. l := NewTestLogger()
  125. for n := 0; n < b.N; n++ {
  126. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  127. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  128. preferredRanges := []*net.IPNet{localToMe}
  129. m := NewHostMap(l, "test", myNet, preferredRanges)
  130. y := NewUDPAddrFromString("10.128.0.3:11111")
  131. a := NewUDPAddrFromString("10.127.0.3:11111")
  132. g := NewUDPAddrFromString("1.0.0.1:22222")
  133. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), a)
  134. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), g)
  135. m.AddRemote(ip2int(net.ParseIP("10.128.1.1")), y)
  136. }
  137. }