mirror of
https://github.com/netsampler/goflow2.git
synced 2024-05-06 15:54:52 +00:00
139 lines
3.0 KiB
Go
139 lines
3.0 KiB
Go
package utils
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func testBinaryRead(buf BytesBuffer, data any) error {
|
|
order := binary.BigEndian
|
|
return BinaryRead(buf, order, data)
|
|
}
|
|
|
|
func testBinaryReadComparison(buf BytesBuffer, data any) error {
|
|
order := binary.BigEndian
|
|
return binary.Read(buf, order, data)
|
|
}
|
|
|
|
type benchFct func(buf BytesBuffer, data any) error
|
|
|
|
func TestBinaryReadInteger(t *testing.T) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
var dest uint32
|
|
err := testBinaryRead(buf, &dest)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, uint32(0x1020304), dest)
|
|
}
|
|
|
|
func TestBinaryReadBytes(t *testing.T) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
dest := make([]byte, 4)
|
|
err := testBinaryRead(buf, dest)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestBinaryReadUints(t *testing.T) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4})
|
|
dest := make([]uint32, 4)
|
|
err := testBinaryRead(buf, dest)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, uint32(0x1020304), dest[0])
|
|
}
|
|
|
|
type testBuf struct {
|
|
buf []byte
|
|
off int
|
|
}
|
|
|
|
func newTestBuf(data []byte) *testBuf {
|
|
return &testBuf{
|
|
buf: data,
|
|
}
|
|
}
|
|
|
|
func (b *testBuf) Next(n int) []byte {
|
|
if n > len(b.buf) {
|
|
return b.buf
|
|
}
|
|
return b.buf[0:n]
|
|
}
|
|
|
|
func (b *testBuf) Reset() {
|
|
b.off = 0
|
|
}
|
|
|
|
func (b *testBuf) Read(p []byte) (int, error) {
|
|
if len(b.buf) == 0 || b.off >= len(b.buf) {
|
|
return 0, io.EOF
|
|
}
|
|
|
|
n := copy(p, b.buf[b.off:])
|
|
b.off += n
|
|
return n, nil
|
|
}
|
|
|
|
func benchBinaryRead(b *testing.B, buf *testBuf, dest any, cmp bool) {
|
|
var fct benchFct
|
|
if cmp {
|
|
fct = testBinaryReadComparison
|
|
} else {
|
|
fct = testBinaryRead
|
|
}
|
|
for n := 0; n < b.N; n++ {
|
|
fct(buf, dest)
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBinaryReadIntegerBase(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
var dest uint32
|
|
benchBinaryRead(b, buf, &dest, false)
|
|
}
|
|
|
|
func BenchmarkBinaryReadIntegerComparison(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
var dest uint32
|
|
benchBinaryRead(b, buf, &dest, true)
|
|
}
|
|
|
|
func BenchmarkBinaryReadByteBase(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
var dest byte
|
|
benchBinaryRead(b, buf, &dest, false)
|
|
}
|
|
|
|
func BBenchmarkBinaryReadByteComparison(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
var dest byte
|
|
benchBinaryRead(b, buf, &dest, true)
|
|
}
|
|
|
|
func BenchmarkBinaryReadBytesBase(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
dest := make([]byte, 4)
|
|
benchBinaryRead(b, buf, dest, false)
|
|
}
|
|
|
|
func BenchmarkBinaryReadBytesComparison(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4})
|
|
dest := make([]byte, 4)
|
|
benchBinaryRead(b, buf, dest, true)
|
|
}
|
|
|
|
func BenchmarkBinaryReadUintsBase(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4})
|
|
dest := make([]uint32, 4)
|
|
benchBinaryRead(b, buf, dest, false)
|
|
}
|
|
|
|
func BenchmarkBinaryReadUintsComparison(b *testing.B) {
|
|
buf := newTestBuf([]byte{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4})
|
|
dest := make([]uint32, 4)
|
|
benchBinaryRead(b, buf, dest, true)
|
|
}
|