2024-05-12 14:33:29 +00:00
|
|
|
package logstorage
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestArena(t *testing.T) {
|
|
|
|
values := []string{"foo", "bar", "", "adsfjkljsdfdsf", "dsfsopq", "io234"}
|
|
|
|
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
a := getArena()
|
2024-05-20 02:08:30 +00:00
|
|
|
if n := len(a.b); n != 0 {
|
|
|
|
t.Fatalf("unexpected non-zero length of empty arena: %d", n)
|
2024-05-12 14:33:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// add values to arena
|
|
|
|
valuesCopy := make([]string, len(values))
|
|
|
|
valuesLen := 0
|
|
|
|
for j, v := range values {
|
|
|
|
vCopy := a.copyString(v)
|
|
|
|
if vCopy != v {
|
|
|
|
t.Fatalf("unexpected value; got %q; want %q", vCopy, v)
|
|
|
|
}
|
|
|
|
valuesCopy[j] = vCopy
|
|
|
|
valuesLen += len(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
// verify that the values returned from arena match the original values
|
|
|
|
for j, v := range values {
|
|
|
|
vCopy := valuesCopy[j]
|
|
|
|
if vCopy != v {
|
|
|
|
t.Fatalf("unexpected value; got %q; want %q", vCopy, v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-20 02:08:30 +00:00
|
|
|
if n := len(a.b); n != valuesLen {
|
2024-05-12 14:33:29 +00:00
|
|
|
t.Fatalf("unexpected arena size; got %d; want %d", n, valuesLen)
|
|
|
|
}
|
2024-05-20 02:08:30 +00:00
|
|
|
if n := a.sizeBytes(); n < valuesLen {
|
|
|
|
t.Fatalf("unexpected arena capacity; got %d; want at least %d", n, valuesLen)
|
|
|
|
}
|
2024-05-12 14:33:29 +00:00
|
|
|
|
|
|
|
// Try allocating slices with different lengths
|
|
|
|
bs := make([]string, 100)
|
|
|
|
for j := range bs {
|
|
|
|
b := a.newBytes(j)
|
|
|
|
if len(b) != j {
|
|
|
|
t.Fatalf("unexpected len(b); got %d; want %d", len(b), j)
|
|
|
|
}
|
|
|
|
valuesLen += j
|
2024-05-20 02:08:30 +00:00
|
|
|
if n := len(a.b); n != valuesLen {
|
2024-05-12 14:33:29 +00:00
|
|
|
t.Fatalf("unexpected arena size; got %d; want %d", n, valuesLen)
|
|
|
|
}
|
2024-05-20 02:08:30 +00:00
|
|
|
if n := a.sizeBytes(); n < valuesLen {
|
|
|
|
t.Fatalf("unexpected arena capacity; got %d; want at least %d", n, valuesLen)
|
|
|
|
}
|
2024-05-12 14:33:29 +00:00
|
|
|
for k := range b {
|
|
|
|
b[k] = byte(k)
|
|
|
|
}
|
|
|
|
bs[j] = bytesutil.ToUnsafeString(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// verify that the allocated slices didn't change
|
|
|
|
for j, v := range bs {
|
|
|
|
b := make([]byte, j)
|
|
|
|
for k := 0; k < j; k++ {
|
|
|
|
b[k] = byte(k)
|
|
|
|
}
|
|
|
|
if v != string(b) {
|
|
|
|
t.Fatalf("unexpected value at index %d; got %X; want %X", j, v, b)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// verify that the values returned from arena match the original values
|
|
|
|
for j, v := range values {
|
|
|
|
vCopy := valuesCopy[j]
|
|
|
|
if vCopy != v {
|
|
|
|
t.Fatalf("unexpected value; got %q; want %q", vCopy, v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
putArena(a)
|
|
|
|
}
|
|
|
|
}
|