go-ceph/internal/cutil/splitbuf_test.go
John Mulligan e5d1a53060 cutil: add SplitBuffer and SplitSparseBuffer helper functions
Add SplitBuffer and SplitSparseBuffer functions for extracting a list
of strings from a single buffer, typically returned in C code, from
a single Go buffer. The SplitBuffer variant will return empty strings
if multiple nulls are found in sequence, assuming that the C code
packs data between on single null byte (expect the final byte).
The SplitSparseBuffer variant assumes that the C code may not
tightly pack the data with single null bytes and thus will not
return any empty strings (unless the input buffer is empty
or only contains nulls).
Most of the code in the go-ceph codebase is doing the latter but
probably should have been doing the former. Thus both approaches
are provided.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
2020-07-23 16:38:39 -04:00

71 lines
1.3 KiB
Go

package cutil
import (
"testing"
"github.com/stretchr/testify/assert"
)
var tbl = []struct {
val []byte
res1 []string
res2 []string
}{
// simple inputs
{
val: []byte("foo\x00bar\x00baz\x00"),
res1: []string{"foo", "bar", "baz"},
res2: []string{"foo", "bar", "baz"},
},
// no trailing null bytes
{
val: []byte("meow mix"),
res1: []string{"meow mix"},
res2: []string{"meow mix"},
},
// one item
{
val: []byte("fancy feast\x00"),
res1: []string{"fancy feast"},
res2: []string{"fancy feast"},
},
// nuttin dare
{
val: []byte(""),
res1: []string{},
res2: []string{},
},
// almost nuttin
{
val: []byte("\x00"),
res1: []string{},
res2: []string{},
},
// how multiple adjacent nulls are handled
{
val: []byte("kibbles\x00\x00and\x00bits"),
res1: []string{"kibbles", "and", "bits"},
res2: []string{"kibbles", "", "and", "bits"},
},
{
val: []byte("dinki\x00\x00\x00di\x00\x00"),
res1: []string{"dinki", "di"},
res2: []string{"dinki", "", "", "di", ""},
},
// starting with a null
{
val: []byte("\x00caesar\x00"),
res1: []string{"caesar"},
res2: []string{"", "caesar"},
},
}
func TestSplitBufStrings(t *testing.T) {
for _, x := range tbl {
assert.Equal(t, x.res1, SplitSparseBuffer(x.val))
}
for _, x := range tbl {
assert.Equal(t, x.res2, SplitBuffer(x.val))
}
}