VictoriaMetrics/lib/bytesutil/bytesutil_test.go

200 lines
5.5 KiB
Go

package bytesutil
import (
"bytes"
"testing"
)
func TestRoundToNearestPow2(t *testing.T) {
f := func(n, resultExpected int) {
t.Helper()
result := roundToNearestPow2(n)
if result != resultExpected {
t.Fatalf("unexpected roundtoNearestPow2(%d); got %d; want %d", n, result, resultExpected)
}
}
f(1, 1)
f(2, 2)
f(3, 4)
f(4, 4)
f(5, 8)
f(6, 8)
f(7, 8)
f(8, 8)
f(9, 16)
f(10, 16)
f(16, 16)
f(17, 32)
f(32, 32)
f(33, 64)
f(64, 64)
}
func TestResizeNoCopyNoOverallocate(t *testing.T) {
for i := 0; i < 1000; i++ {
b := ResizeNoCopyNoOverallocate(nil, i)
if len(b) != i {
t.Fatalf("invalid b size; got %d; want %d", len(b), i)
}
if cap(b) != i {
t.Fatalf("invalid cap(b); got %d; want %d", cap(b), i)
}
b1 := ResizeNoCopyNoOverallocate(b, i)
if len(b1) != len(b) || (len(b) > 0 && &b1[0] != &b[0]) {
t.Fatalf("invalid b1; got %x; want %x", &b1[0], &b[0])
}
if cap(b1) != i {
t.Fatalf("invalid cap(b1); got %d; want %d", cap(b1), i)
}
b2 := ResizeNoCopyNoOverallocate(b[:0], i)
if len(b2) != len(b) || (len(b) > 0 && &b2[0] != &b[0]) {
t.Fatalf("invalid b2; got %x; want %x", &b2[0], &b[0])
}
if cap(b2) != i {
t.Fatalf("invalid cap(b2); got %d; want %d", cap(b2), i)
}
if i > 0 {
b[0] = 123
b3 := ResizeNoCopyNoOverallocate(b, i+1)
if len(b3) != i+1 {
t.Fatalf("invalid b3 len; got %d; want %d", len(b3), i+1)
}
if cap(b3) != i+1 {
t.Fatalf("invalid cap(b3); got %d; want %d", cap(b3), i+1)
}
if &b3[0] == &b[0] {
t.Fatalf("b3 must be newly allocated")
}
if b3[0] != 0 {
t.Fatalf("b3[0] must be zeroed; got %d", b3[0])
}
}
}
}
func TestResizeNoCopyMayOverallocate(t *testing.T) {
for i := 0; i < 1000; i++ {
b := ResizeNoCopyMayOverallocate(nil, i)
if len(b) != i {
t.Fatalf("invalid b size; got %d; want %d", len(b), i)
}
capExpected := roundToNearestPow2(i)
if cap(b) != capExpected {
t.Fatalf("invalid cap(b); got %d; want %d", cap(b), capExpected)
}
b1 := ResizeNoCopyMayOverallocate(b, i)
if len(b1) != len(b) || (len(b) > 0 && &b1[0] != &b[0]) {
t.Fatalf("invalid b1; got %x; want %x", &b1[0], &b[0])
}
if cap(b1) != capExpected {
t.Fatalf("invalid cap(b1); got %d; want %d", cap(b1), capExpected)
}
b2 := ResizeNoCopyMayOverallocate(b[:0], i)
if len(b2) != len(b) || (len(b) > 0 && &b2[0] != &b[0]) {
t.Fatalf("invalid b2; got %x; want %x", &b2[0], &b[0])
}
if cap(b2) != capExpected {
t.Fatalf("invalid cap(b2); got %d; want %d", cap(b2), capExpected)
}
if i > 0 {
b3 := ResizeNoCopyMayOverallocate(b, i+1)
if len(b3) != i+1 {
t.Fatalf("invalid b3 len; got %d; want %d", len(b3), i+1)
}
capExpected = roundToNearestPow2(i + 1)
if cap(b3) != capExpected {
t.Fatalf("invalid cap(b3); got %d; want %d", cap(b3), capExpected)
}
}
}
}
func TestResizeWithCopyNoOverallocate(t *testing.T) {
for i := 0; i < 1000; i++ {
b := ResizeWithCopyNoOverallocate(nil, i)
if len(b) != i {
t.Fatalf("invalid b size; got %d; want %d", len(b), i)
}
if cap(b) != i {
t.Fatalf("invalid cap(b); got %d; want %d", cap(b), i)
}
b1 := ResizeWithCopyNoOverallocate(b, i)
if len(b1) != len(b) || (len(b) > 0 && &b1[0] != &b[0]) {
t.Fatalf("invalid b1; got %x; want %x", &b1[0], &b[0])
}
if cap(b1) != i {
t.Fatalf("invalid cap(b1); got %d; want %d", cap(b1), i)
}
b2 := ResizeWithCopyNoOverallocate(b[:0], i)
if len(b2) != len(b) || (len(b) > 0 && &b2[0] != &b[0]) {
t.Fatalf("invalid b2; got %x; want %x", &b2[0], &b[0])
}
if cap(b2) != i {
t.Fatalf("invalid cap(b2); got %d; want %d", cap(b2), i)
}
if i > 0 {
b[0] = 123
b3 := ResizeWithCopyNoOverallocate(b, i+1)
if len(b3) != i+1 {
t.Fatalf("invalid b3 len; got %d; want %d", len(b3), i+1)
}
if cap(b3) != i+1 {
t.Fatalf("invalid cap(b3); got %d; want %d", cap(b3), i+1)
}
if &b3[0] == &b[0] {
t.Fatalf("b3 must be newly allocated for i=%d", i)
}
if b3[0] != b[0] || b3[0] != 123 {
t.Fatalf("b3[0] must equal b[0]; got %d; want %d", b3[0], b[0])
}
}
}
}
func TestResizeWithCopyMayOverallocate(t *testing.T) {
for i := 0; i < 1000; i++ {
b := ResizeWithCopyMayOverallocate(nil, i)
if len(b) != i {
t.Fatalf("invalid b size; got %d; want %d", len(b), i)
}
capExpected := roundToNearestPow2(i)
if cap(b) != capExpected {
t.Fatalf("invalid cap(b); got %d; want %d", cap(b), capExpected)
}
b1 := ResizeWithCopyMayOverallocate(b, i)
if len(b1) != len(b) || (len(b) > 0 && &b1[0] != &b[0]) {
t.Fatalf("invalid b1; got %x; want %x", &b1[0], &b[0])
}
if cap(b1) != capExpected {
t.Fatalf("invalid cap(b1); got %d; want %d", cap(b1), capExpected)
}
b2 := ResizeWithCopyMayOverallocate(b[:0], i)
if len(b2) != len(b) || (len(b) > 0 && &b2[0] != &b[0]) {
t.Fatalf("invalid b2; got %x; want %x", &b2[0], &b[0])
}
if cap(b2) != capExpected {
t.Fatalf("invalid cap(b2); got %d; want %d", cap(b2), capExpected)
}
if i > 0 {
b[0] = 123
b3 := ResizeWithCopyMayOverallocate(b, i+1)
if len(b3) != i+1 {
t.Fatalf("invalid b3 len; got %d; want %d", len(b3), i+1)
}
capExpected = roundToNearestPow2(i + 1)
if cap(b3) != capExpected {
t.Fatalf("invalid cap(b3); got %d; want %d", cap(b3), capExpected)
}
if b3[0] != b[0] || b3[0] != 123 {
t.Fatalf("b3[0] must equal b[0]; got %d; want %d", b3[0], b[0])
}
}
}
}
func TestToUnsafeString(t *testing.T) {
s := "str"
if !bytes.Equal([]byte("str"), ToUnsafeBytes(s)) {
t.Fatalf(`[]bytes(%s) doesnt equal to %s `, s, s)
}
}