3
0

hostmap_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  57. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  58. myNets := []*net.IPNet{myNet}
  59. preferredRanges := []*net.IPNet{localToMe}
  60. m := NewHostMap("test", myNet, preferredRanges)
  61. a := NewUDPAddrFromString("10.127.0.3:11111")
  62. b := NewUDPAddrFromString("1.0.0.1:22222")
  63. y := NewUDPAddrFromString("10.128.0.3:11111")
  64. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), a)
  65. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), b)
  66. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), y)
  67. info, _ := m.QueryVpnIP(ip2int(net.ParseIP("127.0.0.1")))
  68. // There should be three remotes in the host map
  69. assert.Equal(t, 3, len(info.Remotes))
  70. // Adding an identical remote should not change the count
  71. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), y)
  72. assert.Equal(t, 3, len(info.Remotes))
  73. // Adding a fresh remote should add one
  74. y = NewUDPAddrFromString("10.18.0.3:11111")
  75. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), y)
  76. assert.Equal(t, 4, len(info.Remotes))
  77. // Query and reference remote should get the first one (and not nil)
  78. info, _ = m.QueryVpnIP(ip2int(net.ParseIP("127.0.0.1")))
  79. assert.NotNil(t, info.remote)
  80. // Promotion should ensure that the best remote is chosen (y)
  81. info.ForcePromoteBest(myNets)
  82. assert.True(t, myNet.Contains(udp2ip(info.remote)))
  83. }
  84. func TestHostmapdebug(t *testing.T) {
  85. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  86. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  87. preferredRanges := []*net.IPNet{localToMe}
  88. m := NewHostMap("test", myNet, preferredRanges)
  89. a := NewUDPAddrFromString("10.127.0.3:11111")
  90. b := NewUDPAddrFromString("1.0.0.1:22222")
  91. y := NewUDPAddrFromString("10.128.0.3:11111")
  92. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), a)
  93. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), b)
  94. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), y)
  95. //t.Errorf("%s", m.DebugRemotes(1))
  96. }
  97. func TestHostMap_rotateRemote(t *testing.T) {
  98. h := HostInfo{}
  99. // 0 remotes, no panic
  100. h.rotateRemote()
  101. assert.Nil(t, h.remote)
  102. // 1 remote, no panic
  103. h.AddRemote(*NewUDPAddr(ip2int(net.IP{1, 1, 1, 1}), 0))
  104. h.rotateRemote()
  105. assert.Equal(t, udp2ipInt(h.remote), ip2int(net.IP{1, 1, 1, 1}))
  106. h.AddRemote(*NewUDPAddr(ip2int(net.IP{1, 1, 1, 2}), 0))
  107. h.AddRemote(*NewUDPAddr(ip2int(net.IP{1, 1, 1, 3}), 0))
  108. h.AddRemote(*NewUDPAddr(ip2int(net.IP{1, 1, 1, 4}), 0))
  109. // Rotate through those 3
  110. h.rotateRemote()
  111. assert.Equal(t, udp2ipInt(h.remote), ip2int(net.IP{1, 1, 1, 2}))
  112. h.rotateRemote()
  113. assert.Equal(t, udp2ipInt(h.remote), ip2int(net.IP{1, 1, 1, 3}))
  114. h.rotateRemote()
  115. assert.Equal(t, udp2ipInt(h.remote), ip2int(net.IP{1, 1, 1, 4}))
  116. // Finally, we should start over
  117. h.rotateRemote()
  118. assert.Equal(t, udp2ipInt(h.remote), ip2int(net.IP{1, 1, 1, 1}))
  119. }
  120. func BenchmarkHostmappromote2(b *testing.B) {
  121. for n := 0; n < b.N; n++ {
  122. _, myNet, _ := net.ParseCIDR("10.128.0.0/16")
  123. _, localToMe, _ := net.ParseCIDR("192.168.1.0/24")
  124. preferredRanges := []*net.IPNet{localToMe}
  125. m := NewHostMap("test", myNet, preferredRanges)
  126. y := NewUDPAddrFromString("10.128.0.3:11111")
  127. a := NewUDPAddrFromString("10.127.0.3:11111")
  128. g := NewUDPAddrFromString("1.0.0.1:22222")
  129. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), a)
  130. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), g)
  131. m.AddRemote(ip2int(net.ParseIP("127.0.0.1")), y)
  132. }
  133. b.Errorf("hi")
  134. }