func TestSpaceAllocate(t *testing.T) { const ( testAddr1 = "10.0.3.4" testAddr2 = "10.0.3.5" testAddrx = "10.0.3.19" testAddry = "10.0.9.19" containerID = "deadbeef" size = 20 ) var ( start = ip(testAddr1) ) space1 := makeSpace(start, size) require.Equal(t, address.Offset(20), space1.NumFreeAddresses()) space1.assertInvariants() _, addr1 := space1.Allocate(address.NewRange(start, size)) require.Equal(t, testAddr1, addr1.String(), "address") require.Equal(t, address.Offset(19), space1.NumFreeAddresses()) space1.assertInvariants() _, addr2 := space1.Allocate(address.NewRange(start, size)) require.False(t, addr2.String() == testAddr1, "address") require.Equal(t, address.Offset(18), space1.NumFreeAddresses()) require.Equal(t, address.Offset(13), space1.NumFreeAddressesInRange(address.Range{Start: ip(testAddr1), End: ip(testAddrx)})) require.Equal(t, address.Offset(18), space1.NumFreeAddressesInRange(address.Range{Start: ip(testAddr1), End: ip(testAddry)})) space1.assertInvariants() space1.Free(addr2) space1.assertInvariants() wt.AssertErrorInterface(t, (*error)(nil), space1.Free(addr2), "double free") wt.AssertErrorInterface(t, (*error)(nil), space1.Free(ip(testAddrx)), "address not allocated") wt.AssertErrorInterface(t, (*error)(nil), space1.Free(ip(testAddry)), "wrong out of range") space1.assertInvariants() }
func TestLowlevel(t *testing.T) { a := []address.Address{} a = add(a, 100, 200) require.Equal(t, []address.Address{100, 200}, a) require.True(t, !contains(a, 99), "") require.True(t, contains(a, 100), "") require.True(t, contains(a, 199), "") require.True(t, !contains(a, 200), "") a = add(a, 700, 800) require.Equal(t, []address.Address{100, 200, 700, 800}, a) a = add(a, 300, 400) require.Equal(t, []address.Address{100, 200, 300, 400, 700, 800}, a) a = add(a, 400, 500) require.Equal(t, []address.Address{100, 200, 300, 500, 700, 800}, a) a = add(a, 600, 700) require.Equal(t, []address.Address{100, 200, 300, 500, 600, 800}, a) a = add(a, 500, 600) require.Equal(t, []address.Address{100, 200, 300, 800}, a) a = subtract(a, 500, 600) require.Equal(t, []address.Address{100, 200, 300, 500, 600, 800}, a) a = subtract(a, 600, 700) require.Equal(t, []address.Address{100, 200, 300, 500, 700, 800}, a) a = subtract(a, 400, 500) require.Equal(t, []address.Address{100, 200, 300, 400, 700, 800}, a) a = subtract(a, 300, 400) require.Equal(t, []address.Address{100, 200, 700, 800}, a) a = subtract(a, 700, 800) require.Equal(t, []address.Address{100, 200}, a) a = subtract(a, 100, 200) require.Equal(t, []address.Address{}, a) s := New() require.Equal(t, address.Offset(0), s.NumFreeAddresses()) ok, got := s.Allocate(address.NewRange(0, 1000)) require.False(t, ok, "allocate in empty space should fail") s.Add(100, 100) require.Equal(t, address.Offset(100), s.NumFreeAddresses()) ok, got = s.Allocate(address.NewRange(0, 1000)) require.True(t, ok && got == 100, "allocate") require.Equal(t, address.Offset(99), s.NumFreeAddresses()) require.NoError(t, s.Claim(150)) require.Equal(t, address.Offset(98), s.NumFreeAddresses()) require.NoError(t, s.Free(100)) require.Equal(t, address.Offset(99), s.NumFreeAddresses()) wt.AssertErrorInterface(t, (*error)(nil), s.Free(0), "free not allocated") wt.AssertErrorInterface(t, (*error)(nil), s.Free(100), "double free") r, ok := s.Donate(address.NewRange(0, 1000)) require.True(t, ok && r.Start == 125 && r.Size() == 25, "donate") // test Donate when addresses are scarce s = New() r, ok = s.Donate(address.NewRange(0, 1000)) require.True(t, !ok, "donate on empty space should fail") s.Add(0, 3) require.NoError(t, s.Claim(0)) require.NoError(t, s.Claim(2)) r, ok = s.Donate(address.NewRange(0, 1000)) require.True(t, ok && r.Start == 1 && r.End == 2, "donate") r, ok = s.Donate(address.NewRange(0, 1000)) require.True(t, !ok, "donate should fail") }