| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package iobuf |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| func testAllocatorAlloc(t *testing.T, bytes, reserve uint) { |
| pool := NewPool(iobufSize) |
| defer pool.Close() |
| alloc := NewAllocator(pool, reserve) |
| defer alloc.Release() |
| |
| const count = 1000 |
| var slices [count]*Slice |
| for i := 0; i != count; i++ { |
| slices[i] = alloc.Alloc(bytes) |
| copy(slices[i].Contents, []byte(fmt.Sprintf("slice[%d]", i))) |
| } |
| for i := 0; i != count; i++ { |
| expected := fmt.Sprintf("slice[%d]", i) |
| expectEq(t, expected, string(slices[i].Contents[0:len(expected)])) |
| if slices[i].ExpandFront(reserve + 1) { |
| t.Errorf("slice[%d] should not have a reserved byte %d", i, reserve+1) |
| } |
| if !slices[i].ExpandFront(reserve) { |
| t.Errorf("slice[%d] should have a reserved byte %d", i, reserve) |
| } |
| slices[i].Release() |
| } |
| } |
| |
| func TestAllocatorAllocSmallWitReserve_0(t *testing.T) { testAllocatorAlloc(t, 50, 0) } |
| func TestAllocatorAllocSmallWitReserve_10(t *testing.T) { testAllocatorAlloc(t, 50, 10) } |
| func TestAllocatorAllocSmallWitReserve_100(t *testing.T) { testAllocatorAlloc(t, 50, 100) } |
| |
| func TestAllocatorAllocLargeWitReserve_0(t *testing.T) { testAllocatorAlloc(t, 1000, 0) } |
| func TestAllocatorAllocLargeWitReserve_10(t *testing.T) { testAllocatorAlloc(t, 1000, 10) } |
| func TestAllocatorAllocLargeWitReserve_100(t *testing.T) { testAllocatorAlloc(t, 1000, 100) } |
| |
| func testAllocatorCopy(t *testing.T, reserve uint) { |
| pool := NewPool(iobufSize) |
| defer pool.Close() |
| alloc := NewAllocator(pool, reserve) |
| defer alloc.Release() |
| |
| const count = 1000 |
| var slices [count]*Slice |
| for i := 0; i != count; i++ { |
| slices[i] = alloc.Copy([]byte(fmt.Sprintf("slice[%d]", i))) |
| } |
| for i := 0; i != count; i++ { |
| expectEq(t, fmt.Sprintf("slice[%d]", i), string(slices[i].Contents)) |
| if slices[i].ExpandFront(reserve + 1) { |
| t.Errorf("slice[%d] should not have a reserved byte %d", i, reserve+1) |
| } |
| if !slices[i].ExpandFront(reserve) { |
| t.Errorf("slice[%d] should have a reserved byte %d", i, reserve) |
| } |
| slices[i].Release() |
| } |
| } |
| |
| func TestAllocatorCopyWitReserve_0(t *testing.T) { testAllocatorCopy(t, 0) } |
| func TestAllocatorCopyWitReserve_10(t *testing.T) { testAllocatorCopy(t, 10) } |
| func TestAllocatorCopyWitReserve_100(t *testing.T) { testAllocatorCopy(t, 100) } |
| |
| // Check that the Allocator is unusable after it is closed. |
| func TestAllocatorClose(t *testing.T) { |
| pool := NewPool(iobufSize) |
| defer pool.Close() |
| alloc := NewAllocator(NewPool(iobufSize), 0) |
| |
| slice := alloc.Alloc(10) |
| if slice == nil { |
| t.Fatalf("slice should not be nil") |
| } |
| slice.Release() |
| |
| alloc.Release() |
| slice = alloc.Alloc(10) |
| if slice != nil { |
| t.Errorf("slice should be nil") |
| } |
| } |