allocator_test.go 15 KB

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