|
|
@@ -17,113 +17,88 @@
|
|
|
package trie
|
|
|
|
|
|
import (
|
|
|
- "encoding/hex"
|
|
|
+ "bytes"
|
|
|
"testing"
|
|
|
-
|
|
|
- checker "gopkg.in/check.v1"
|
|
|
)
|
|
|
|
|
|
-func TestEncoding(t *testing.T) { checker.TestingT(t) }
|
|
|
-
|
|
|
-type TrieEncodingSuite struct{}
|
|
|
-
|
|
|
-var _ = checker.Suite(&TrieEncodingSuite{})
|
|
|
-
|
|
|
-func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) {
|
|
|
- // even compact encode
|
|
|
- test1 := []byte{1, 2, 3, 4, 5}
|
|
|
- res1 := compactEncode(test1)
|
|
|
- c.Assert(res1, checker.DeepEquals, []byte("\x11\x23\x45"))
|
|
|
-
|
|
|
- // odd compact encode
|
|
|
- test2 := []byte{0, 1, 2, 3, 4, 5}
|
|
|
- res2 := compactEncode(test2)
|
|
|
- c.Assert(res2, checker.DeepEquals, []byte("\x00\x01\x23\x45"))
|
|
|
-
|
|
|
- //odd terminated compact encode
|
|
|
- test3 := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
- res3 := compactEncode(test3)
|
|
|
- c.Assert(res3, checker.DeepEquals, []byte("\x20\x0f\x1c\xb8"))
|
|
|
-
|
|
|
- // even terminated compact encode
|
|
|
- test4 := []byte{15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
- res4 := compactEncode(test4)
|
|
|
- c.Assert(res4, checker.DeepEquals, []byte("\x3f\x1c\xb8"))
|
|
|
-}
|
|
|
-
|
|
|
-func (s *TrieEncodingSuite) TestCompactHexDecode(c *checker.C) {
|
|
|
- exp := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
|
|
- res := compactHexDecode([]byte("verb"))
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *TrieEncodingSuite) TestCompactHexEncode(c *checker.C) {
|
|
|
- exp := []byte("verb")
|
|
|
- res := compactHexEncode([]byte{7, 6, 6, 5, 7, 2, 6, 2, 16})
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *TrieEncodingSuite) TestCompactDecode(c *checker.C) {
|
|
|
- // odd compact decode
|
|
|
- exp := []byte{1, 2, 3, 4, 5}
|
|
|
- res := compactDecode([]byte("\x11\x23\x45"))
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-
|
|
|
- // even compact decode
|
|
|
- exp = []byte{0, 1, 2, 3, 4, 5}
|
|
|
- res = compactDecode([]byte("\x00\x01\x23\x45"))
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-
|
|
|
- // even terminated compact decode
|
|
|
- exp = []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
- res = compactDecode([]byte("\x20\x0f\x1c\xb8"))
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-
|
|
|
- // even terminated compact decode
|
|
|
- exp = []byte{15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
- res = compactDecode([]byte("\x3f\x1c\xb8"))
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
+func TestHexCompact(t *testing.T) {
|
|
|
+ tests := []struct{ hex, compact []byte }{
|
|
|
+ // empty keys, with and without terminator.
|
|
|
+ {hex: []byte{}, compact: []byte{0x00}},
|
|
|
+ {hex: []byte{16}, compact: []byte{0x20}},
|
|
|
+ // odd length, no terminator
|
|
|
+ {hex: []byte{1, 2, 3, 4, 5}, compact: []byte{0x11, 0x23, 0x45}},
|
|
|
+ // even length, no terminator
|
|
|
+ {hex: []byte{0, 1, 2, 3, 4, 5}, compact: []byte{0x00, 0x01, 0x23, 0x45}},
|
|
|
+ // odd length, terminator
|
|
|
+ {hex: []byte{15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x3f, 0x1c, 0xb8}},
|
|
|
+ // even length, terminator
|
|
|
+ {hex: []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x20, 0x0f, 0x1c, 0xb8}},
|
|
|
+ }
|
|
|
+ for _, test := range tests {
|
|
|
+ if c := hexToCompact(test.hex); !bytes.Equal(c, test.compact) {
|
|
|
+ t.Errorf("hexToCompact(%x) -> %x, want %x", test.hex, c, test.compact)
|
|
|
+ }
|
|
|
+ if h := compactToHex(test.compact); !bytes.Equal(h, test.hex) {
|
|
|
+ t.Errorf("compactToHex(%x) -> %x, want %x", test.compact, h, test.hex)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-func (s *TrieEncodingSuite) TestDecodeCompact(c *checker.C) {
|
|
|
- exp, _ := hex.DecodeString("012345")
|
|
|
- res := decodeCompact([]byte{0, 1, 2, 3, 4, 5})
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-
|
|
|
- exp, _ = hex.DecodeString("012345")
|
|
|
- res = decodeCompact([]byte{0, 1, 2, 3, 4, 5, 16})
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
-
|
|
|
- exp, _ = hex.DecodeString("abcdef")
|
|
|
- res = decodeCompact([]byte{10, 11, 12, 13, 14, 15})
|
|
|
- c.Assert(res, checker.DeepEquals, exp)
|
|
|
+func TestHexKeybytes(t *testing.T) {
|
|
|
+ tests := []struct{ key, hexIn, hexOut []byte }{
|
|
|
+ {key: []byte{}, hexIn: []byte{16}, hexOut: []byte{16}},
|
|
|
+ {key: []byte{}, hexIn: []byte{}, hexOut: []byte{16}},
|
|
|
+ {
|
|
|
+ key: []byte{0x12, 0x34, 0x56},
|
|
|
+ hexIn: []byte{1, 2, 3, 4, 5, 6, 16},
|
|
|
+ hexOut: []byte{1, 2, 3, 4, 5, 6, 16},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: []byte{0x12, 0x34, 0x5},
|
|
|
+ hexIn: []byte{1, 2, 3, 4, 0, 5, 16},
|
|
|
+ hexOut: []byte{1, 2, 3, 4, 0, 5, 16},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: []byte{0x12, 0x34, 0x56},
|
|
|
+ hexIn: []byte{1, 2, 3, 4, 5, 6},
|
|
|
+ hexOut: []byte{1, 2, 3, 4, 5, 6, 16},
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, test := range tests {
|
|
|
+ if h := keybytesToHex(test.key); !bytes.Equal(h, test.hexOut) {
|
|
|
+ t.Errorf("keybytesToHex(%x) -> %x, want %x", test.key, h, test.hexOut)
|
|
|
+ }
|
|
|
+ if k := hexToKeybytes(test.hexIn); !bytes.Equal(k, test.key) {
|
|
|
+ t.Errorf("hexToKeybytes(%x) -> %x, want %x", test.hexIn, k, test.key)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-func BenchmarkCompactEncode(b *testing.B) {
|
|
|
-
|
|
|
- testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
+func BenchmarkHexToCompact(b *testing.B) {
|
|
|
+ testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
- compactEncode(testBytes)
|
|
|
+ hexToCompact(testBytes)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func BenchmarkCompactDecode(b *testing.B) {
|
|
|
- testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16}
|
|
|
+func BenchmarkCompactToHex(b *testing.B) {
|
|
|
+ testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
- compactDecode(testBytes)
|
|
|
+ compactToHex(testBytes)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func BenchmarkCompactHexDecode(b *testing.B) {
|
|
|
+func BenchmarkKeybytesToHex(b *testing.B) {
|
|
|
testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
- compactHexDecode(testBytes)
|
|
|
+ keybytesToHex(testBytes)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func BenchmarkDecodeCompact(b *testing.B) {
|
|
|
+func BenchmarkHexToKeybytes(b *testing.B) {
|
|
|
testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16}
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
- decodeCompact(testBytes)
|
|
|
+ hexToKeybytes(testBytes)
|
|
|
}
|
|
|
}
|