allocator_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package ipallocator
  2. import (
  3. "fmt"
  4. "net"
  5. "testing"
  6. )
  7. func reset() {
  8. allocatedIPs = networkSet{}
  9. availableIPS = networkSet{}
  10. }
  11. func TestRequestNewIps(t *testing.T) {
  12. defer reset()
  13. network := &net.IPNet{
  14. IP: []byte{192, 168, 0, 1},
  15. Mask: []byte{255, 255, 255, 0},
  16. }
  17. for i := 2; i < 10; i++ {
  18. ip, err := RequestIP(network, nil)
  19. if err != nil {
  20. t.Fatal(err)
  21. }
  22. if expected := fmt.Sprintf("192.168.0.%d", i); ip.String() != expected {
  23. t.Fatalf("Expected ip %s got %s", expected, ip.String())
  24. }
  25. }
  26. }
  27. func TestReleaseIp(t *testing.T) {
  28. defer reset()
  29. network := &net.IPNet{
  30. IP: []byte{192, 168, 0, 1},
  31. Mask: []byte{255, 255, 255, 0},
  32. }
  33. ip, err := RequestIP(network, nil)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. if err := ReleaseIP(network, ip); err != nil {
  38. t.Fatal(err)
  39. }
  40. }
  41. func TestGetReleasedIp(t *testing.T) {
  42. defer reset()
  43. network := &net.IPNet{
  44. IP: []byte{192, 168, 0, 1},
  45. Mask: []byte{255, 255, 255, 0},
  46. }
  47. ip, err := RequestIP(network, nil)
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. value := ip.String()
  52. if err := ReleaseIP(network, ip); err != nil {
  53. t.Fatal(err)
  54. }
  55. ip, err = RequestIP(network, nil)
  56. if err != nil {
  57. t.Fatal(err)
  58. }
  59. if ip.String() != value {
  60. t.Fatalf("Expected to receive same ip %s got %s", value, ip.String())
  61. }
  62. }
  63. func TestRequesetSpecificIp(t *testing.T) {
  64. defer reset()
  65. network := &net.IPNet{
  66. IP: []byte{192, 168, 0, 1},
  67. Mask: []byte{255, 255, 255, 0},
  68. }
  69. ip := net.ParseIP("192.168.1.5")
  70. if _, err := RequestIP(network, &ip); err != nil {
  71. t.Fatal(err)
  72. }
  73. }
  74. func TestConversion(t *testing.T) {
  75. ip := net.ParseIP("127.0.0.1")
  76. i := ipToInt(&ip)
  77. if i == 0 {
  78. t.Fatal("converted to zero")
  79. }
  80. conv := intToIP(i)
  81. if !ip.Equal(*conv) {
  82. t.Error(conv.String())
  83. }
  84. }
  85. func TestIPAllocator(t *testing.T) {
  86. expectedIPs := []net.IP{
  87. 0: net.IPv4(127, 0, 0, 2),
  88. 1: net.IPv4(127, 0, 0, 3),
  89. 2: net.IPv4(127, 0, 0, 4),
  90. 3: net.IPv4(127, 0, 0, 5),
  91. 4: net.IPv4(127, 0, 0, 6),
  92. }
  93. gwIP, n, _ := net.ParseCIDR("127.0.0.1/29")
  94. network := &net.IPNet{IP: gwIP, Mask: n.Mask}
  95. // Pool after initialisation (f = free, u = used)
  96. // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  97. // ↑
  98. // Check that we get 5 IPs, from 127.0.0.2–127.0.0.6, in that
  99. // order.
  100. for i := 0; i < 5; i++ {
  101. ip, err := RequestIP(network, nil)
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. assertIPEquals(t, &expectedIPs[i], ip)
  106. }
  107. // Before loop begin
  108. // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  109. // ↑
  110. // After i = 0
  111. // 2(u) - 3(f) - 4(f) - 5(f) - 6(f)
  112. // ↑
  113. // After i = 1
  114. // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  115. // ↑
  116. // After i = 2
  117. // 2(u) - 3(u) - 4(u) - 5(f) - 6(f)
  118. // ↑
  119. // After i = 3
  120. // 2(u) - 3(u) - 4(u) - 5(u) - 6(f)
  121. // ↑
  122. // After i = 4
  123. // 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
  124. // ↑
  125. // Check that there are no more IPs
  126. ip, err := RequestIP(network, nil)
  127. if err == nil {
  128. t.Fatalf("There shouldn't be any IP addresses at this point, got %s\n", ip)
  129. }
  130. // Release some IPs in non-sequential order
  131. if err := ReleaseIP(network, &expectedIPs[3]); err != nil {
  132. t.Fatal(err)
  133. }
  134. // 2(u) - 3(u) - 4(u) - 5(f) - 6(u)
  135. // ↑
  136. if err := ReleaseIP(network, &expectedIPs[2]); err != nil {
  137. t.Fatal(err)
  138. }
  139. // 2(u) - 3(u) - 4(f) - 5(f) - 6(u)
  140. // ↑
  141. if err := ReleaseIP(network, &expectedIPs[4]); err != nil {
  142. t.Fatal(err)
  143. }
  144. // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  145. // ↑
  146. // Make sure that IPs are reused in sequential order, starting
  147. // with the first released IP
  148. newIPs := make([]*net.IP, 3)
  149. for i := 0; i < 3; i++ {
  150. ip, err := RequestIP(network, nil)
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. newIPs[i] = ip
  155. }
  156. // Before loop begin
  157. // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  158. // ↑
  159. // After i = 0
  160. // 2(u) - 3(u) - 4(f) - 5(u) - 6(f)
  161. // ↑
  162. // After i = 1
  163. // 2(u) - 3(u) - 4(f) - 5(u) - 6(u)
  164. // ↑
  165. // After i = 2
  166. // 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
  167. // ↑
  168. // Reordered these because the new set will always return the
  169. // lowest ips first and not in the order that they were released
  170. assertIPEquals(t, &expectedIPs[2], newIPs[0])
  171. assertIPEquals(t, &expectedIPs[3], newIPs[1])
  172. assertIPEquals(t, &expectedIPs[4], newIPs[2])
  173. _, err = RequestIP(network, nil)
  174. if err == nil {
  175. t.Fatal("There shouldn't be any IP addresses at this point")
  176. }
  177. }
  178. func TestAllocateFirstIP(t *testing.T) {
  179. defer reset()
  180. network := &net.IPNet{
  181. IP: []byte{192, 168, 0, 0},
  182. Mask: []byte{255, 255, 255, 0},
  183. }
  184. firstIP := network.IP.To4().Mask(network.Mask)
  185. first := ipToInt(&firstIP) + 1
  186. ip, err := RequestIP(network, nil)
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. allocated := ipToInt(ip)
  191. if allocated == first {
  192. t.Fatalf("allocated ip should not equal first ip: %d == %d", first, allocated)
  193. }
  194. }
  195. func assertIPEquals(t *testing.T, ip1, ip2 *net.IP) {
  196. if !ip1.Equal(*ip2) {
  197. t.Fatalf("Expected IP %s, got %s", ip1, ip2)
  198. }
  199. }