regions_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package allregions
  2. import (
  3. "net"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. )
  7. var (
  8. addr0 = net.TCPAddr{
  9. IP: net.ParseIP("123.4.5.0"),
  10. Port: 8000,
  11. Zone: "",
  12. }
  13. addr1 = net.TCPAddr{
  14. IP: net.ParseIP("123.4.5.1"),
  15. Port: 8000,
  16. Zone: "",
  17. }
  18. addr2 = net.TCPAddr{
  19. IP: net.ParseIP("123.4.5.2"),
  20. Port: 8000,
  21. Zone: "",
  22. }
  23. addr3 = net.TCPAddr{
  24. IP: net.ParseIP("123.4.5.3"),
  25. Port: 8000,
  26. Zone: "",
  27. }
  28. )
  29. func makeRegions() Regions {
  30. r1 := NewRegion([]*net.TCPAddr{&addr0, &addr1})
  31. r2 := NewRegion([]*net.TCPAddr{&addr2, &addr3})
  32. return Regions{region1: r1, region2: r2}
  33. }
  34. func TestRegions_AddrUsedBy(t *testing.T) {
  35. rs := makeRegions()
  36. addr1 := rs.GetUnusedAddr(nil, 1)
  37. assert.Equal(t, addr1, rs.AddrUsedBy(1))
  38. addr2 := rs.GetUnusedAddr(nil, 2)
  39. assert.Equal(t, addr2, rs.AddrUsedBy(2))
  40. addr3 := rs.GetUnusedAddr(nil, 3)
  41. assert.Equal(t, addr3, rs.AddrUsedBy(3))
  42. }
  43. func TestRegions_Giveback_Region1(t *testing.T) {
  44. rs := makeRegions()
  45. rs.region1.Use(&addr0, 0)
  46. rs.region1.Use(&addr1, 1)
  47. rs.region2.Use(&addr2, 2)
  48. rs.region2.Use(&addr3, 3)
  49. assert.Equal(t, 0, rs.AvailableAddrs())
  50. rs.GiveBack(&addr0)
  51. assert.Equal(t, &addr0, rs.GetUnusedAddr(nil, 3))
  52. }
  53. func TestRegions_Giveback_Region2(t *testing.T) {
  54. rs := makeRegions()
  55. rs.region1.Use(&addr0, 0)
  56. rs.region1.Use(&addr1, 1)
  57. rs.region2.Use(&addr2, 2)
  58. rs.region2.Use(&addr3, 3)
  59. assert.Equal(t, 0, rs.AvailableAddrs())
  60. rs.GiveBack(&addr2)
  61. assert.Equal(t, &addr2, rs.GetUnusedAddr(nil, 2))
  62. }
  63. func TestRegions_GetUnusedAddr_OneAddrLeft(t *testing.T) {
  64. rs := makeRegions()
  65. rs.region1.Use(&addr0, 0)
  66. rs.region1.Use(&addr1, 1)
  67. rs.region2.Use(&addr2, 2)
  68. assert.Equal(t, 1, rs.AvailableAddrs())
  69. assert.Equal(t, &addr3, rs.GetUnusedAddr(nil, 3))
  70. }
  71. func TestRegions_GetUnusedAddr_Excluding_Region1(t *testing.T) {
  72. rs := makeRegions()
  73. rs.region1.Use(&addr0, 0)
  74. rs.region1.Use(&addr1, 1)
  75. assert.Equal(t, 2, rs.AvailableAddrs())
  76. assert.Equal(t, &addr3, rs.GetUnusedAddr(&addr2, 3))
  77. }
  78. func TestRegions_GetUnusedAddr_Excluding_Region2(t *testing.T) {
  79. rs := makeRegions()
  80. rs.region2.Use(&addr2, 0)
  81. rs.region2.Use(&addr3, 1)
  82. assert.Equal(t, 2, rs.AvailableAddrs())
  83. assert.Equal(t, &addr1, rs.GetUnusedAddr(&addr0, 1))
  84. }
  85. func TestNewNoResolveBalancesRegions(t *testing.T) {
  86. type args struct {
  87. addrs []*net.TCPAddr
  88. }
  89. tests := []struct {
  90. name string
  91. args args
  92. }{
  93. {
  94. name: "one address",
  95. args: args{addrs: []*net.TCPAddr{&addr0}},
  96. },
  97. {
  98. name: "two addresses",
  99. args: args{addrs: []*net.TCPAddr{&addr0, &addr1}},
  100. },
  101. }
  102. for _, tt := range tests {
  103. t.Run(tt.name, func(t *testing.T) {
  104. regions := NewNoResolve(tt.args.addrs)
  105. RegionsIsBalanced(t, regions)
  106. })
  107. }
  108. }
  109. func RegionsIsBalanced(t *testing.T, rs *Regions) {
  110. delta := rs.region1.AvailableAddrs() - rs.region2.AvailableAddrs()
  111. assert.True(t, abs(delta) <= 1)
  112. }
  113. func abs(x int) int {
  114. if x >= 0 {
  115. return x
  116. }
  117. return -x
  118. }