allocator_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. package ipallocator
  2. import (
  3. "fmt"
  4. "math/big"
  5. "net"
  6. "testing"
  7. )
  8. func reset() {
  9. allocatedIPs = networkSet{}
  10. }
  11. func TestConversion(t *testing.T) {
  12. ip := net.ParseIP("127.0.0.1")
  13. i := ipToBigInt(ip)
  14. if i.Cmp(big.NewInt(0x7f000001)) != 0 {
  15. t.Fatal("incorrect conversion")
  16. }
  17. conv := bigIntToIP(i)
  18. if !ip.Equal(conv) {
  19. t.Error(conv.String())
  20. }
  21. }
  22. func TestConversionIPv6(t *testing.T) {
  23. ip := net.ParseIP("2a00:1450::1")
  24. ip2 := net.ParseIP("2a00:1450::2")
  25. ip3 := net.ParseIP("2a00:1450::1:1")
  26. i := ipToBigInt(ip)
  27. val, success := big.NewInt(0).SetString("2a001450000000000000000000000001", 16)
  28. if !success {
  29. t.Fatal("Hex-String to BigInt conversion failed.")
  30. }
  31. if i.Cmp(val) != 0 {
  32. t.Fatal("incorrent conversion")
  33. }
  34. conv := bigIntToIP(i)
  35. conv2 := bigIntToIP(big.NewInt(0).Add(i, big.NewInt(1)))
  36. conv3 := bigIntToIP(big.NewInt(0).Add(i, big.NewInt(0x10000)))
  37. if !ip.Equal(conv) {
  38. t.Error("2a00:1450::1 should be equal to " + conv.String())
  39. }
  40. if !ip2.Equal(conv2) {
  41. t.Error("2a00:1450::2 should be equal to " + conv2.String())
  42. }
  43. if !ip3.Equal(conv3) {
  44. t.Error("2a00:1450::1:1 should be equal to " + conv3.String())
  45. }
  46. }
  47. func TestRequestNewIps(t *testing.T) {
  48. defer reset()
  49. network := &net.IPNet{
  50. IP: []byte{192, 168, 0, 1},
  51. Mask: []byte{255, 255, 255, 0},
  52. }
  53. var ip net.IP
  54. var err error
  55. for i := 2; i < 10; i++ {
  56. ip, err = RequestIP(network, nil)
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. if expected := fmt.Sprintf("192.168.0.%d", i); ip.String() != expected {
  61. t.Fatalf("Expected ip %s got %s", expected, ip.String())
  62. }
  63. }
  64. value := bigIntToIP(big.NewInt(0).Add(ipToBigInt(ip), big.NewInt(1))).String()
  65. if err := ReleaseIP(network, ip); err != nil {
  66. t.Fatal(err)
  67. }
  68. ip, err = RequestIP(network, nil)
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. if ip.String() != value {
  73. t.Fatalf("Expected to receive the next ip %s got %s", value, ip.String())
  74. }
  75. }
  76. func TestRequestNewIpV6(t *testing.T) {
  77. defer reset()
  78. network := &net.IPNet{
  79. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  80. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  81. }
  82. var ip net.IP
  83. var err error
  84. for i := 1; i < 10; i++ {
  85. ip, err = RequestIP(network, nil)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. if expected := fmt.Sprintf("2a00:1450::%d", i); ip.String() != expected {
  90. t.Fatalf("Expected ip %s got %s", expected, ip.String())
  91. }
  92. }
  93. value := bigIntToIP(big.NewInt(0).Add(ipToBigInt(ip), big.NewInt(1))).String()
  94. if err := ReleaseIP(network, ip); err != nil {
  95. t.Fatal(err)
  96. }
  97. ip, err = RequestIP(network, nil)
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. if ip.String() != value {
  102. t.Fatalf("Expected to receive the next ip %s got %s", value, ip.String())
  103. }
  104. }
  105. func TestReleaseIp(t *testing.T) {
  106. defer reset()
  107. network := &net.IPNet{
  108. IP: []byte{192, 168, 0, 1},
  109. Mask: []byte{255, 255, 255, 0},
  110. }
  111. ip, err := RequestIP(network, nil)
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. if err := ReleaseIP(network, ip); err != nil {
  116. t.Fatal(err)
  117. }
  118. }
  119. func TestReleaseIpV6(t *testing.T) {
  120. defer reset()
  121. network := &net.IPNet{
  122. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  123. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  124. }
  125. ip, err := RequestIP(network, nil)
  126. if err != nil {
  127. t.Fatal(err)
  128. }
  129. if err := ReleaseIP(network, ip); err != nil {
  130. t.Fatal(err)
  131. }
  132. }
  133. func TestGetReleasedIp(t *testing.T) {
  134. defer reset()
  135. network := &net.IPNet{
  136. IP: []byte{192, 168, 0, 1},
  137. Mask: []byte{255, 255, 255, 0},
  138. }
  139. ip, err := RequestIP(network, nil)
  140. if err != nil {
  141. t.Fatal(err)
  142. }
  143. value := ip.String()
  144. if err := ReleaseIP(network, ip); err != nil {
  145. t.Fatal(err)
  146. }
  147. for i := 0; i < 252; i++ {
  148. _, err = RequestIP(network, nil)
  149. if err != nil {
  150. t.Fatal(err)
  151. }
  152. err = ReleaseIP(network, ip)
  153. if err != nil {
  154. t.Fatal(err)
  155. }
  156. }
  157. ip, err = RequestIP(network, nil)
  158. if err != nil {
  159. t.Fatal(err)
  160. }
  161. if ip.String() != value {
  162. t.Fatalf("Expected to receive same ip %s got %s", value, ip.String())
  163. }
  164. }
  165. func TestGetReleasedIpV6(t *testing.T) {
  166. defer reset()
  167. network := &net.IPNet{
  168. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  169. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0},
  170. }
  171. ip, err := RequestIP(network, nil)
  172. if err != nil {
  173. t.Fatal(err)
  174. }
  175. value := ip.String()
  176. if err := ReleaseIP(network, ip); err != nil {
  177. t.Fatal(err)
  178. }
  179. for i := 0; i < 253; i++ {
  180. _, err = RequestIP(network, nil)
  181. if err != nil {
  182. t.Fatal(err)
  183. }
  184. err = ReleaseIP(network, ip)
  185. if err != nil {
  186. t.Fatal(err)
  187. }
  188. }
  189. ip, err = RequestIP(network, nil)
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. if ip.String() != value {
  194. t.Fatalf("Expected to receive same ip %s got %s", value, ip.String())
  195. }
  196. }
  197. func TestRequestSpecificIp(t *testing.T) {
  198. defer reset()
  199. network := &net.IPNet{
  200. IP: []byte{192, 168, 0, 1},
  201. Mask: []byte{255, 255, 255, 224},
  202. }
  203. ip := net.ParseIP("192.168.0.5")
  204. // Request a "good" IP.
  205. if _, err := RequestIP(network, ip); err != nil {
  206. t.Fatal(err)
  207. }
  208. // Request the same IP again.
  209. if _, err := RequestIP(network, ip); err != ErrIPAlreadyAllocated {
  210. t.Fatalf("Got the same IP twice: %#v", err)
  211. }
  212. // Request an out of range IP.
  213. if _, err := RequestIP(network, net.ParseIP("192.168.0.42")); err != ErrIPOutOfRange {
  214. t.Fatalf("Got an out of range IP: %#v", err)
  215. }
  216. }
  217. func TestRequestSpecificIpV6(t *testing.T) {
  218. defer reset()
  219. network := &net.IPNet{
  220. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  221. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  222. }
  223. ip := net.ParseIP("2a00:1450::5")
  224. // Request a "good" IP.
  225. if _, err := RequestIP(network, ip); err != nil {
  226. t.Fatal(err)
  227. }
  228. // Request the same IP again.
  229. if _, err := RequestIP(network, ip); err != ErrIPAlreadyAllocated {
  230. t.Fatalf("Got the same IP twice: %#v", err)
  231. }
  232. // Request an out of range IP.
  233. if _, err := RequestIP(network, net.ParseIP("2a00:1500::1")); err != ErrIPOutOfRange {
  234. t.Fatalf("Got an out of range IP: %#v", err)
  235. }
  236. }
  237. func TestIPAllocator(t *testing.T) {
  238. expectedIPs := []net.IP{
  239. 0: net.IPv4(127, 0, 0, 2),
  240. 1: net.IPv4(127, 0, 0, 3),
  241. 2: net.IPv4(127, 0, 0, 4),
  242. 3: net.IPv4(127, 0, 0, 5),
  243. 4: net.IPv4(127, 0, 0, 6),
  244. }
  245. gwIP, n, _ := net.ParseCIDR("127.0.0.1/29")
  246. network := &net.IPNet{IP: gwIP, Mask: n.Mask}
  247. // Pool after initialisation (f = free, u = used)
  248. // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  249. // ↑
  250. // Check that we get 5 IPs, from 127.0.0.2–127.0.0.6, in that
  251. // order.
  252. for i := 0; i < 5; i++ {
  253. ip, err := RequestIP(network, nil)
  254. if err != nil {
  255. t.Fatal(err)
  256. }
  257. assertIPEquals(t, expectedIPs[i], ip)
  258. }
  259. // Before loop begin
  260. // 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  261. // ↑
  262. // After i = 0
  263. // 2(u) - 3(f) - 4(f) - 5(f) - 6(f)
  264. // ↑
  265. // After i = 1
  266. // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  267. // ↑
  268. // After i = 2
  269. // 2(u) - 3(u) - 4(u) - 5(f) - 6(f)
  270. // ↑
  271. // After i = 3
  272. // 2(u) - 3(u) - 4(u) - 5(u) - 6(f)
  273. // ↑
  274. // After i = 4
  275. // 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
  276. // ↑
  277. // Check that there are no more IPs
  278. ip, err := RequestIP(network, nil)
  279. if err == nil {
  280. t.Fatalf("There shouldn't be any IP addresses at this point, got %s\n", ip)
  281. }
  282. // Release some IPs in non-sequential order
  283. if err := ReleaseIP(network, expectedIPs[3]); err != nil {
  284. t.Fatal(err)
  285. }
  286. // 2(u) - 3(u) - 4(u) - 5(f) - 6(u)
  287. // ↑
  288. if err := ReleaseIP(network, expectedIPs[2]); err != nil {
  289. t.Fatal(err)
  290. }
  291. // 2(u) - 3(u) - 4(f) - 5(f) - 6(u)
  292. // ↑
  293. if err := ReleaseIP(network, expectedIPs[4]); err != nil {
  294. t.Fatal(err)
  295. }
  296. // 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  297. // ↑
  298. // Make sure that IPs are reused in sequential order, starting
  299. // with the first released IP
  300. newIPs := make([]net.IP, 3)
  301. for i := 0; i < 3; i++ {
  302. ip, err := RequestIP(network, nil)
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. newIPs[i] = ip
  307. }
  308. assertIPEquals(t, expectedIPs[2], newIPs[0])
  309. assertIPEquals(t, expectedIPs[3], newIPs[1])
  310. assertIPEquals(t, expectedIPs[4], newIPs[2])
  311. _, err = RequestIP(network, nil)
  312. if err == nil {
  313. t.Fatal("There shouldn't be any IP addresses at this point")
  314. }
  315. }
  316. func TestAllocateFirstIP(t *testing.T) {
  317. defer reset()
  318. network := &net.IPNet{
  319. IP: []byte{192, 168, 0, 0},
  320. Mask: []byte{255, 255, 255, 0},
  321. }
  322. firstIP := network.IP.To4().Mask(network.Mask)
  323. first := big.NewInt(0).Add(ipToBigInt(firstIP), big.NewInt(1))
  324. ip, err := RequestIP(network, nil)
  325. if err != nil {
  326. t.Fatal(err)
  327. }
  328. allocated := ipToBigInt(ip)
  329. if allocated == first {
  330. t.Fatalf("allocated ip should not equal first ip: %d == %d", first, allocated)
  331. }
  332. }
  333. func TestAllocateAllIps(t *testing.T) {
  334. defer reset()
  335. network := &net.IPNet{
  336. IP: []byte{192, 168, 0, 1},
  337. Mask: []byte{255, 255, 255, 0},
  338. }
  339. var (
  340. current, first net.IP
  341. err error
  342. isFirst = true
  343. )
  344. for err == nil {
  345. current, err = RequestIP(network, nil)
  346. if isFirst {
  347. first = current
  348. isFirst = false
  349. }
  350. }
  351. if err != ErrNoAvailableIPs {
  352. t.Fatal(err)
  353. }
  354. if _, err := RequestIP(network, nil); err != ErrNoAvailableIPs {
  355. t.Fatal(err)
  356. }
  357. if err := ReleaseIP(network, first); err != nil {
  358. t.Fatal(err)
  359. }
  360. again, err := RequestIP(network, nil)
  361. if err != nil {
  362. t.Fatal(err)
  363. }
  364. assertIPEquals(t, first, again)
  365. }
  366. func TestAllocateDifferentSubnets(t *testing.T) {
  367. defer reset()
  368. network1 := &net.IPNet{
  369. IP: []byte{192, 168, 0, 1},
  370. Mask: []byte{255, 255, 255, 0},
  371. }
  372. network2 := &net.IPNet{
  373. IP: []byte{127, 0, 0, 1},
  374. Mask: []byte{255, 255, 255, 0},
  375. }
  376. network3 := &net.IPNet{
  377. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  378. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  379. }
  380. network4 := &net.IPNet{
  381. IP: []byte{0x2a, 0x00, 0x16, 0x32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  382. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  383. }
  384. expectedIPs := []net.IP{
  385. 0: net.IPv4(192, 168, 0, 2),
  386. 1: net.IPv4(192, 168, 0, 3),
  387. 2: net.IPv4(127, 0, 0, 2),
  388. 3: net.IPv4(127, 0, 0, 3),
  389. 4: net.ParseIP("2a00:1450::1"),
  390. 5: net.ParseIP("2a00:1450::2"),
  391. 6: net.ParseIP("2a00:1450::3"),
  392. 7: net.ParseIP("2a00:1632::1"),
  393. 8: net.ParseIP("2a00:1632::2"),
  394. }
  395. ip11, err := RequestIP(network1, nil)
  396. if err != nil {
  397. t.Fatal(err)
  398. }
  399. ip12, err := RequestIP(network1, nil)
  400. if err != nil {
  401. t.Fatal(err)
  402. }
  403. ip21, err := RequestIP(network2, nil)
  404. if err != nil {
  405. t.Fatal(err)
  406. }
  407. ip22, err := RequestIP(network2, nil)
  408. if err != nil {
  409. t.Fatal(err)
  410. }
  411. ip31, err := RequestIP(network3, nil)
  412. if err != nil {
  413. t.Fatal(err)
  414. }
  415. ip32, err := RequestIP(network3, nil)
  416. if err != nil {
  417. t.Fatal(err)
  418. }
  419. ip33, err := RequestIP(network3, nil)
  420. if err != nil {
  421. t.Fatal(err)
  422. }
  423. ip41, err := RequestIP(network4, nil)
  424. if err != nil {
  425. t.Fatal(err)
  426. }
  427. ip42, err := RequestIP(network4, nil)
  428. if err != nil {
  429. t.Fatal(err)
  430. }
  431. assertIPEquals(t, expectedIPs[0], ip11)
  432. assertIPEquals(t, expectedIPs[1], ip12)
  433. assertIPEquals(t, expectedIPs[2], ip21)
  434. assertIPEquals(t, expectedIPs[3], ip22)
  435. assertIPEquals(t, expectedIPs[4], ip31)
  436. assertIPEquals(t, expectedIPs[5], ip32)
  437. assertIPEquals(t, expectedIPs[6], ip33)
  438. assertIPEquals(t, expectedIPs[7], ip41)
  439. assertIPEquals(t, expectedIPs[8], ip42)
  440. }
  441. func TestRegisterBadTwice(t *testing.T) {
  442. defer reset()
  443. network := &net.IPNet{
  444. IP: []byte{192, 168, 1, 1},
  445. Mask: []byte{255, 255, 255, 0},
  446. }
  447. subnet := &net.IPNet{
  448. IP: []byte{192, 168, 1, 8},
  449. Mask: []byte{255, 255, 255, 248},
  450. }
  451. if err := RegisterSubnet(network, subnet); err != nil {
  452. t.Fatal(err)
  453. }
  454. subnet = &net.IPNet{
  455. IP: []byte{192, 168, 1, 16},
  456. Mask: []byte{255, 255, 255, 248},
  457. }
  458. if err := RegisterSubnet(network, subnet); err != ErrNetworkAlreadyRegistered {
  459. t.Fatalf("Expecteded ErrNetworkAlreadyRegistered error, got %v", err)
  460. }
  461. }
  462. func TestRegisterBadRange(t *testing.T) {
  463. defer reset()
  464. network := &net.IPNet{
  465. IP: []byte{192, 168, 1, 1},
  466. Mask: []byte{255, 255, 255, 0},
  467. }
  468. subnet := &net.IPNet{
  469. IP: []byte{192, 168, 1, 1},
  470. Mask: []byte{255, 255, 0, 0},
  471. }
  472. if err := RegisterSubnet(network, subnet); err != ErrBadSubnet {
  473. t.Fatalf("Expected ErrBadSubnet error, got %v", err)
  474. }
  475. }
  476. func TestAllocateFromRange(t *testing.T) {
  477. defer reset()
  478. network := &net.IPNet{
  479. IP: []byte{192, 168, 0, 1},
  480. Mask: []byte{255, 255, 255, 0},
  481. }
  482. // 192.168.1.9 - 192.168.1.14
  483. subnet := &net.IPNet{
  484. IP: []byte{192, 168, 0, 8},
  485. Mask: []byte{255, 255, 255, 248},
  486. }
  487. if err := RegisterSubnet(network, subnet); err != nil {
  488. t.Fatal(err)
  489. }
  490. expectedIPs := []net.IP{
  491. 0: net.IPv4(192, 168, 0, 9),
  492. 1: net.IPv4(192, 168, 0, 10),
  493. 2: net.IPv4(192, 168, 0, 11),
  494. 3: net.IPv4(192, 168, 0, 12),
  495. 4: net.IPv4(192, 168, 0, 13),
  496. 5: net.IPv4(192, 168, 0, 14),
  497. }
  498. for _, ip := range expectedIPs {
  499. rip, err := RequestIP(network, nil)
  500. if err != nil {
  501. t.Fatal(err)
  502. }
  503. assertIPEquals(t, ip, rip)
  504. }
  505. if _, err := RequestIP(network, nil); err != ErrNoAvailableIPs {
  506. t.Fatalf("Expected ErrNoAvailableIPs error, got %v", err)
  507. }
  508. for _, ip := range expectedIPs {
  509. ReleaseIP(network, ip)
  510. rip, err := RequestIP(network, nil)
  511. if err != nil {
  512. t.Fatal(err)
  513. }
  514. assertIPEquals(t, ip, rip)
  515. }
  516. }
  517. func assertIPEquals(t *testing.T, ip1, ip2 net.IP) {
  518. if !ip1.Equal(ip2) {
  519. t.Fatalf("Expected IP %s, got %s", ip1, ip2)
  520. }
  521. }
  522. func BenchmarkRequestIP(b *testing.B) {
  523. network := &net.IPNet{
  524. IP: []byte{192, 168, 0, 1},
  525. Mask: []byte{255, 255, 255, 0},
  526. }
  527. b.ResetTimer()
  528. for i := 0; i < b.N; i++ {
  529. for j := 0; j < 253; j++ {
  530. _, err := RequestIP(network, nil)
  531. if err != nil {
  532. b.Fatal(err)
  533. }
  534. }
  535. reset()
  536. }
  537. }