Skip to content

Commit 77b9c2b

Browse files
committed
Add ensure helper, tests
1 parent e90adac commit 77b9c2b

File tree

3 files changed

+55
-8
lines changed

3 files changed

+55
-8
lines changed

crockford.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,26 @@ func AppendRandom(e *base32.Encoding, dst []byte) []byte {
104104
// AppendMD5 appends 26 encoded bytes generated by MD5 hashing src onto dst.
105105
func AppendMD5(e *base32.Encoding, dst, src []byte) []byte {
106106
//16 bytes -> 26 base32 characters
107-
var (
108-
buf [16]byte
109-
enc [26]byte
110-
)
107+
var buf [md5.Size]byte
108+
111109
h := md5.New()
112110
h.Write(src)
113111
h.Sum(buf[:0])
114112

115113
// Ensure dst has 26 bytes capacity
116-
dst = append(dst, enc[:]...)
117-
e.Encode(dst[len(dst)-26:], buf[:])
118-
return dst
114+
ret, tar := ensure(26, dst)
115+
e.Encode(tar, buf[:])
116+
return ret
117+
}
118+
119+
func ensure(size int, b []byte) (ret, tar []byte) {
120+
ret = b
121+
newLen := len(b) + size
122+
if cap(b) >= newLen {
123+
ret = b[:newLen]
124+
} else {
125+
ret = append(b, make([]byte, size)...)
126+
}
127+
tar = ret[len(b):newLen]
128+
return
119129
}

crockford_test.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package crockford_test
22

33
import (
4+
"bytes"
45
"testing"
56

67
"github.com/carlmjohnson/crockford"
@@ -15,6 +16,38 @@ func EqBytes(t *testing.T) func(want string, got []byte) {
1516
}
1617
}
1718

19+
func TestEnsure(t *testing.T) {
20+
cases := map[string]struct {
21+
size int
22+
b []byte
23+
}{
24+
"0-nil": {0, nil},
25+
"4-nil": {4, nil},
26+
"0-sliced": {4, []byte("1234")[:0]},
27+
"2-sliced": {2, []byte("1234")[:2]},
28+
"overflow": {2, []byte("1234")},
29+
}
30+
for name, tc := range cases {
31+
t.Run(name, func(t *testing.T) {
32+
ret, tar := crockford.Ensure(tc.size, tc.b)
33+
if len(tar) != tc.size {
34+
t.Fatalf("bad target: %q", tar)
35+
}
36+
if len(ret) != len(tc.b)+tc.size {
37+
t.Fatalf("bad return: %q", ret)
38+
}
39+
if cap(tc.b)-len(tc.b) >= tc.size {
40+
if bytes.ContainsAny(tar, "\x00") {
41+
t.Fatalf("overwrote existing cap: %q", ret)
42+
}
43+
}
44+
if !bytes.HasPrefix(ret, tc.b) {
45+
t.Fatalf("lost prefix: %q", ret)
46+
}
47+
})
48+
}
49+
}
50+
1851
func TestAppendMD5(t *testing.T) {
1952
cases := map[string]struct {
2053
in string
@@ -41,10 +74,11 @@ func TestAppendMD5(t *testing.T) {
4174

4275
r := testing.Benchmark(func(b *testing.B) {
4376
for i := 0; i < b.N; i++ {
77+
dst = dst[:0]
4478
dst = crockford.AppendMD5(crockford.Lower, dst, in)
4579
}
4680
})
47-
if r.AllocsPerOp() > 0 {
81+
if r.AllocsPerOp() != 0 {
4882
t.Errorf("benchmark regression %q: %v", dst, r.MemString())
4983
}
5084
})

export_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package crockford
2+
3+
var Ensure = ensure

0 commit comments

Comments
 (0)