github.com/jaegerpicker/docker@v0.7.7-0.20150325003727-22dba32b4dab/daemon/networkdriver/ipallocator/allocator_test.go (about)

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