ceremonyclient/pebble/sstable/unsafe_test.go
Cassandra Heart 2e2a1e4789
v1.2.0 (#31)
2024-01-03 01:31:42 -06:00

76 lines
1.5 KiB
Go

// Copyright 2018 The LevelDB-Go and Pebble 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 sstable
import (
"encoding/binary"
"fmt"
"io"
"testing"
"time"
"unsafe"
"github.com/stretchr/testify/require"
"golang.org/x/exp/rand"
)
func TestGetBytes(t *testing.T) {
const size = (1 << 31) - 1
// No need to actually allocate a huge slice, which can cause OOM on small
// machines (like the GitHub CI runners).
block := make([]byte, 100)
data := getBytes(unsafe.Pointer(&block[0]), size)
require.EqualValues(t, size, len(data))
}
func TestDecodeVarint(t *testing.T) {
vals := []uint32{
0,
1,
1 << 7,
1 << 8,
1 << 14,
1 << 15,
1 << 20,
1 << 21,
1 << 28,
1 << 29,
1 << 31,
}
buf := make([]byte, 5)
for _, v := range vals {
binary.PutUvarint(buf, uint64(v))
u, _ := decodeVarint(unsafe.Pointer(&buf[0]))
if v != u {
fmt.Printf("%d %d\n", v, u)
}
}
}
func BenchmarkDecodeVarint(b *testing.B) {
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))
vals := make([]unsafe.Pointer, 10000)
for i := range vals {
buf := make([]byte, 5)
binary.PutUvarint(buf, uint64(rng.Uint32()))
vals[i] = unsafe.Pointer(&buf[0])
}
b.ResetTimer()
var ptr unsafe.Pointer
for i, n := 0, 0; i < b.N; i += n {
n = len(vals)
if n > b.N-i {
n = b.N - i
}
for j := 0; j < n; j++ {
_, ptr = decodeVarint(vals[j])
}
}
if testing.Verbose() {
fmt.Fprint(io.Discard, ptr)
}
}