allocator_test.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  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 := 1; 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 < 253; 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, 1),
  240. 1: net.IPv4(127, 0, 0, 2),
  241. 2: net.IPv4(127, 0, 0, 3),
  242. 3: net.IPv4(127, 0, 0, 4),
  243. 4: net.IPv4(127, 0, 0, 5),
  244. 5: net.IPv4(127, 0, 0, 6),
  245. }
  246. gwIP, n, _ := net.ParseCIDR("127.0.0.1/29")
  247. network := &net.IPNet{IP: gwIP, Mask: n.Mask}
  248. // Pool after initialisation (f = free, u = used)
  249. // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  250. // ↑
  251. // Check that we get 6 IPs, from 127.0.0.1–127.0.0.6, in that
  252. // order.
  253. for i := 0; i < 6; i++ {
  254. ip, err := RequestIP(network, nil)
  255. if err != nil {
  256. t.Fatal(err)
  257. }
  258. assertIPEquals(t, expectedIPs[i], ip)
  259. }
  260. // Before loop begin
  261. // 1(f) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  262. // ↑
  263. // After i = 0
  264. // 1(u) - 2(f) - 3(f) - 4(f) - 5(f) - 6(f)
  265. // ↑
  266. // After i = 1
  267. // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(f)
  268. // ↑
  269. // After i = 2
  270. // 1(u) - 2(u) - 3(u) - 4(f) - 5(f) - 6(f)
  271. // ↑
  272. // After i = 3
  273. // 1(u) - 2(u) - 3(u) - 4(u) - 5(f) - 6(f)
  274. // ↑
  275. // After i = 4
  276. // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(f)
  277. // ↑
  278. // After i = 5
  279. // 1(u) - 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
  280. // ↑
  281. // Check that there are no more IPs
  282. ip, err := RequestIP(network, nil)
  283. if err == nil {
  284. t.Fatalf("There shouldn't be any IP addresses at this point, got %s\n", ip)
  285. }
  286. // Release some IPs in non-sequential order
  287. if err := ReleaseIP(network, expectedIPs[3]); err != nil {
  288. t.Fatal(err)
  289. }
  290. // 1(u) - 2(u) - 3(u) - 4(f) - 5(u) - 6(u)
  291. // ↑
  292. if err := ReleaseIP(network, expectedIPs[2]); err != nil {
  293. t.Fatal(err)
  294. }
  295. // 1(u) - 2(u) - 3(f) - 4(f) - 5(u) - 6(u)
  296. // ↑
  297. if err := ReleaseIP(network, expectedIPs[4]); err != nil {
  298. t.Fatal(err)
  299. }
  300. // 1(u) - 2(u) - 3(f) - 4(f) - 5(f) - 6(u)
  301. // ↑
  302. // Make sure that IPs are reused in sequential order, starting
  303. // with the first released IP
  304. newIPs := make([]net.IP, 3)
  305. for i := 0; i < 3; i++ {
  306. ip, err := RequestIP(network, nil)
  307. if err != nil {
  308. t.Fatal(err)
  309. }
  310. newIPs[i] = ip
  311. }
  312. assertIPEquals(t, expectedIPs[2], newIPs[0])
  313. assertIPEquals(t, expectedIPs[3], newIPs[1])
  314. assertIPEquals(t, expectedIPs[4], newIPs[2])
  315. _, err = RequestIP(network, nil)
  316. if err == nil {
  317. t.Fatal("There shouldn't be any IP addresses at this point")
  318. }
  319. }
  320. func TestAllocateFirstIP(t *testing.T) {
  321. defer reset()
  322. network := &net.IPNet{
  323. IP: []byte{192, 168, 0, 0},
  324. Mask: []byte{255, 255, 255, 0},
  325. }
  326. firstIP := network.IP.To4().Mask(network.Mask)
  327. first := big.NewInt(0).Add(ipToBigInt(firstIP), big.NewInt(1))
  328. ip, err := RequestIP(network, nil)
  329. if err != nil {
  330. t.Fatal(err)
  331. }
  332. allocated := ipToBigInt(ip)
  333. if allocated == first {
  334. t.Fatalf("allocated ip should not equal first ip: %d == %d", first, allocated)
  335. }
  336. }
  337. func TestAllocateAllIps(t *testing.T) {
  338. defer reset()
  339. network := &net.IPNet{
  340. IP: []byte{192, 168, 0, 1},
  341. Mask: []byte{255, 255, 255, 0},
  342. }
  343. var (
  344. current, first net.IP
  345. err error
  346. isFirst = true
  347. )
  348. for err == nil {
  349. current, err = RequestIP(network, nil)
  350. if isFirst {
  351. first = current
  352. isFirst = false
  353. }
  354. }
  355. if err != ErrNoAvailableIPs {
  356. t.Fatal(err)
  357. }
  358. if _, err := RequestIP(network, nil); err != ErrNoAvailableIPs {
  359. t.Fatal(err)
  360. }
  361. if err := ReleaseIP(network, first); err != nil {
  362. t.Fatal(err)
  363. }
  364. again, err := RequestIP(network, nil)
  365. if err != nil {
  366. t.Fatal(err)
  367. }
  368. assertIPEquals(t, first, again)
  369. // ensure that alloc.last == alloc.begin won't result in dead loop
  370. if _, err := RequestIP(network, nil); err != ErrNoAvailableIPs {
  371. t.Fatal(err)
  372. }
  373. // Test by making alloc.last the only free ip and ensure we get it back
  374. // #1. first of the range, (alloc.last == ipToInt(first) already)
  375. if err := ReleaseIP(network, first); err != nil {
  376. t.Fatal(err)
  377. }
  378. ret, err := RequestIP(network, nil)
  379. if err != nil {
  380. t.Fatal(err)
  381. }
  382. assertIPEquals(t, first, ret)
  383. // #2. last of the range, note that current is the last one
  384. last := net.IPv4(192, 168, 0, 254)
  385. setLastTo(t, network, last)
  386. ret, err = RequestIP(network, nil)
  387. if err != nil {
  388. t.Fatal(err)
  389. }
  390. assertIPEquals(t, last, ret)
  391. // #3. middle of the range
  392. mid := net.IPv4(192, 168, 0, 7)
  393. setLastTo(t, network, mid)
  394. ret, err = RequestIP(network, nil)
  395. if err != nil {
  396. t.Fatal(err)
  397. }
  398. assertIPEquals(t, mid, ret)
  399. }
  400. // make sure the pool is full when calling setLastTo.
  401. // we don't cheat here
  402. func setLastTo(t *testing.T, network *net.IPNet, ip net.IP) {
  403. if err := ReleaseIP(network, ip); err != nil {
  404. t.Fatal(err)
  405. }
  406. ret, err := RequestIP(network, nil)
  407. if err != nil {
  408. t.Fatal(err)
  409. }
  410. assertIPEquals(t, ip, ret)
  411. if err := ReleaseIP(network, ip); err != nil {
  412. t.Fatal(err)
  413. }
  414. }
  415. func TestAllocateDifferentSubnets(t *testing.T) {
  416. defer reset()
  417. network1 := &net.IPNet{
  418. IP: []byte{192, 168, 0, 1},
  419. Mask: []byte{255, 255, 255, 0},
  420. }
  421. network2 := &net.IPNet{
  422. IP: []byte{127, 0, 0, 1},
  423. Mask: []byte{255, 255, 255, 0},
  424. }
  425. network3 := &net.IPNet{
  426. IP: []byte{0x2a, 0x00, 0x14, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  427. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  428. }
  429. network4 := &net.IPNet{
  430. IP: []byte{0x2a, 0x00, 0x16, 0x32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  431. Mask: []byte{255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, // /64 netmask
  432. }
  433. expectedIPs := []net.IP{
  434. 0: net.IPv4(192, 168, 0, 1),
  435. 1: net.IPv4(192, 168, 0, 2),
  436. 2: net.IPv4(127, 0, 0, 1),
  437. 3: net.IPv4(127, 0, 0, 2),
  438. 4: net.ParseIP("2a00:1450::1"),
  439. 5: net.ParseIP("2a00:1450::2"),
  440. 6: net.ParseIP("2a00:1450::3"),
  441. 7: net.ParseIP("2a00:1632::1"),
  442. 8: net.ParseIP("2a00:1632::2"),
  443. }
  444. ip11, err := RequestIP(network1, nil)
  445. if err != nil {
  446. t.Fatal(err)
  447. }
  448. ip12, err := RequestIP(network1, nil)
  449. if err != nil {
  450. t.Fatal(err)
  451. }
  452. ip21, err := RequestIP(network2, nil)
  453. if err != nil {
  454. t.Fatal(err)
  455. }
  456. ip22, err := RequestIP(network2, nil)
  457. if err != nil {
  458. t.Fatal(err)
  459. }
  460. ip31, err := RequestIP(network3, nil)
  461. if err != nil {
  462. t.Fatal(err)
  463. }
  464. ip32, err := RequestIP(network3, nil)
  465. if err != nil {
  466. t.Fatal(err)
  467. }
  468. ip33, err := RequestIP(network3, nil)
  469. if err != nil {
  470. t.Fatal(err)
  471. }
  472. ip41, err := RequestIP(network4, nil)
  473. if err != nil {
  474. t.Fatal(err)
  475. }
  476. ip42, err := RequestIP(network4, nil)
  477. if err != nil {
  478. t.Fatal(err)
  479. }
  480. assertIPEquals(t, expectedIPs[0], ip11)
  481. assertIPEquals(t, expectedIPs[1], ip12)
  482. assertIPEquals(t, expectedIPs[2], ip21)
  483. assertIPEquals(t, expectedIPs[3], ip22)
  484. assertIPEquals(t, expectedIPs[4], ip31)
  485. assertIPEquals(t, expectedIPs[5], ip32)
  486. assertIPEquals(t, expectedIPs[6], ip33)
  487. assertIPEquals(t, expectedIPs[7], ip41)
  488. assertIPEquals(t, expectedIPs[8], ip42)
  489. }
  490. func TestRegisterBadTwice(t *testing.T) {
  491. defer reset()
  492. network := &net.IPNet{
  493. IP: []byte{192, 168, 1, 1},
  494. Mask: []byte{255, 255, 255, 0},
  495. }
  496. subnet := &net.IPNet{
  497. IP: []byte{192, 168, 1, 8},
  498. Mask: []byte{255, 255, 255, 248},
  499. }
  500. if err := RegisterSubnet(network, subnet); err != nil {
  501. t.Fatal(err)
  502. }
  503. subnet = &net.IPNet{
  504. IP: []byte{192, 168, 1, 16},
  505. Mask: []byte{255, 255, 255, 248},
  506. }
  507. if err := RegisterSubnet(network, subnet); err != ErrNetworkAlreadyRegistered {
  508. t.Fatalf("Expecteded ErrNetworkAlreadyRegistered error, got %v", err)
  509. }
  510. }
  511. func TestRegisterBadRange(t *testing.T) {
  512. defer reset()
  513. network := &net.IPNet{
  514. IP: []byte{192, 168, 1, 1},
  515. Mask: []byte{255, 255, 255, 0},
  516. }
  517. subnet := &net.IPNet{
  518. IP: []byte{192, 168, 1, 1},
  519. Mask: []byte{255, 255, 0, 0},
  520. }
  521. if err := RegisterSubnet(network, subnet); err != ErrBadSubnet {
  522. t.Fatalf("Expected ErrBadSubnet error, got %v", err)
  523. }
  524. }
  525. func TestAllocateFromRange(t *testing.T) {
  526. defer reset()
  527. network := &net.IPNet{
  528. IP: []byte{192, 168, 0, 1},
  529. Mask: []byte{255, 255, 255, 0},
  530. }
  531. // 192.168.1.9 - 192.168.1.14
  532. subnet := &net.IPNet{
  533. IP: []byte{192, 168, 0, 8},
  534. Mask: []byte{255, 255, 255, 248},
  535. }
  536. if err := RegisterSubnet(network, subnet); err != nil {
  537. t.Fatal(err)
  538. }
  539. expectedIPs := []net.IP{
  540. 0: net.IPv4(192, 168, 0, 9),
  541. 1: net.IPv4(192, 168, 0, 10),
  542. 2: net.IPv4(192, 168, 0, 11),
  543. 3: net.IPv4(192, 168, 0, 12),
  544. 4: net.IPv4(192, 168, 0, 13),
  545. 5: net.IPv4(192, 168, 0, 14),
  546. }
  547. for _, ip := range expectedIPs {
  548. rip, err := RequestIP(network, nil)
  549. if err != nil {
  550. t.Fatal(err)
  551. }
  552. assertIPEquals(t, ip, rip)
  553. }
  554. if _, err := RequestIP(network, nil); err != ErrNoAvailableIPs {
  555. t.Fatalf("Expected ErrNoAvailableIPs error, got %v", err)
  556. }
  557. for _, ip := range expectedIPs {
  558. ReleaseIP(network, ip)
  559. rip, err := RequestIP(network, nil)
  560. if err != nil {
  561. t.Fatal(err)
  562. }
  563. assertIPEquals(t, ip, rip)
  564. }
  565. }
  566. func assertIPEquals(t *testing.T, ip1, ip2 net.IP) {
  567. if !ip1.Equal(ip2) {
  568. t.Fatalf("Expected IP %s, got %s", ip1, ip2)
  569. }
  570. }
  571. func BenchmarkRequestIP(b *testing.B) {
  572. network := &net.IPNet{
  573. IP: []byte{192, 168, 0, 1},
  574. Mask: []byte{255, 255, 255, 0},
  575. }
  576. b.ResetTimer()
  577. for i := 0; i < b.N; i++ {
  578. for j := 0; j < 253; j++ {
  579. _, err := RequestIP(network, nil)
  580. if err != nil {
  581. b.Fatal(err)
  582. }
  583. }
  584. reset()
  585. }
  586. }