package uidallocator
import (
"testing"
"k8s.io/kubernetes/pkg/registry/service/allocator"
"k8s.io/kubernetes/pkg/util/sets"
"github.com/openshift/origin/pkg/security/uid"
)
func TestAllocate(t *testing.T) {
ranger, _ := uid.NewRange(0, 9, 2)
r := New(ranger, func(max int, rangeSpec string) allocator.Interface {
return allocator.NewContiguousAllocationMap(max, rangeSpec)
})
if f := r.Free(); f != 5 {
t.Errorf("unexpected free %d", f)
}
found := sets.NewString()
count := 0
for r.Free() > 0 {
block, err := r.AllocateNext()
if err != nil {
t.Fatalf("error @ %d: %v", count, err)
}
count++
if !ranger.Contains(block) {
t.Fatalf("allocated %s which is outside of %s", block, ranger)
}
if found.Has(block.String()) {
t.Fatalf("allocated %s twice @ %d", block, count)
}
found.Insert(block.String())
}
if _, err := r.AllocateNext(); err != ErrFull {
t.Fatal(err)
}
released := uid.Block{Start: 2, End: 3}
if err := r.Release(released); err != nil {
t.Fatal(err)
}
if f := r.Free(); f != 1 {
t.Errorf("unexpected free %d", f)
}
block, err := r.AllocateNext()
if err != nil {
t.Fatal(err)
}
if released != block {
t.Errorf("unexpected %s : %s", block, released)
}
if err := r.Release(released); err != nil {
t.Fatal(err)
}
if err := r.Allocate(uid.Block{Start: 11, End: 11}); err != ErrNotInRange {
t.Fatal(err)
}
if err := r.Allocate(uid.Block{Start: 8, End: 11}); err != ErrNotInRange {
t.Fatal(err)
}
if f := r.Free(); f != 1 {
t.Errorf("unexpected free %d", f)
}
if err := r.Allocate(released); err != nil {
t.Fatal(err)
}
if f := r.Free(); f != 0 {
t.Errorf("unexpected free %d", f)
}
}