mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
02b2bfcff3
Follow-up for f4989edd96
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2007
200 lines
5.5 KiB
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)
|
|
}
|
|
}
|