1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
13 "github.com/syndtr/goleveldb/leveldb/comparer"
16 var defaultIComparer = &iComparer{comparer.DefaultComparer}
18 func ikey(key string, seq uint64, kt keyType) internalKey {
19 return makeInternalKey(nil, []byte(key), uint64(seq), kt)
22 func shortSep(a, b []byte) []byte {
23 dst := make([]byte, len(a))
24 dst = defaultIComparer.Separator(dst[:0], a, b)
31 func shortSuccessor(b []byte) []byte {
32 dst := make([]byte, len(b))
33 dst = defaultIComparer.Successor(dst[:0], b)
40 func testSingleKey(t *testing.T, key string, seq uint64, kt keyType) {
41 ik := ikey(key, seq, kt)
43 if !bytes.Equal(ik.ukey(), []byte(key)) {
44 t.Errorf("user key does not equal, got %v, want %v", string(ik.ukey()), key)
47 rseq, rt := ik.parseNum()
49 t.Errorf("seq number does not equal, got %v, want %v", rseq, seq)
52 t.Errorf("type does not equal, got %v, want %v", rt, kt)
55 if rukey, rseq, rt, kerr := parseInternalKey(ik); kerr == nil {
56 if !bytes.Equal(rukey, []byte(key)) {
57 t.Errorf("user key does not equal, got %v, want %v", string(ik.ukey()), key)
60 t.Errorf("seq number does not equal, got %v, want %v", rseq, seq)
63 t.Errorf("type does not equal, got %v, want %v", rt, kt)
66 t.Errorf("key error: %v", kerr)
70 func TestInternalKey_EncodeDecode(t *testing.T) {
71 keys := []string{"", "k", "hello", "longggggggggggggggggggggg"}
74 (1 << 8) - 1, 1 << 8, (1 << 8) + 1,
75 (1 << 16) - 1, 1 << 16, (1 << 16) + 1,
76 (1 << 32) - 1, 1 << 32, (1 << 32) + 1,
78 for _, key := range keys {
79 for _, seq := range seqs {
80 testSingleKey(t, key, seq, keyTypeVal)
81 testSingleKey(t, "hello", 1, keyTypeDel)
86 func assertBytes(t *testing.T, want, got []byte) {
87 if !bytes.Equal(got, want) {
88 t.Errorf("assert failed, got %v, want %v", got, want)
92 func TestInternalKeyShortSeparator(t *testing.T) {
93 // When user keys are same
94 assertBytes(t, ikey("foo", 100, keyTypeVal),
95 shortSep(ikey("foo", 100, keyTypeVal),
96 ikey("foo", 99, keyTypeVal)))
97 assertBytes(t, ikey("foo", 100, keyTypeVal),
98 shortSep(ikey("foo", 100, keyTypeVal),
99 ikey("foo", 101, keyTypeVal)))
100 assertBytes(t, ikey("foo", 100, keyTypeVal),
101 shortSep(ikey("foo", 100, keyTypeVal),
102 ikey("foo", 100, keyTypeVal)))
103 assertBytes(t, ikey("foo", 100, keyTypeVal),
104 shortSep(ikey("foo", 100, keyTypeVal),
105 ikey("foo", 100, keyTypeDel)))
107 // When user keys are misordered
108 assertBytes(t, ikey("foo", 100, keyTypeVal),
109 shortSep(ikey("foo", 100, keyTypeVal),
110 ikey("bar", 99, keyTypeVal)))
112 // When user keys are different, but correctly ordered
113 assertBytes(t, ikey("g", uint64(keyMaxSeq), keyTypeSeek),
114 shortSep(ikey("foo", 100, keyTypeVal),
115 ikey("hello", 200, keyTypeVal)))
117 // When start user key is prefix of limit user key
118 assertBytes(t, ikey("foo", 100, keyTypeVal),
119 shortSep(ikey("foo", 100, keyTypeVal),
120 ikey("foobar", 200, keyTypeVal)))
122 // When limit user key is prefix of start user key
123 assertBytes(t, ikey("foobar", 100, keyTypeVal),
124 shortSep(ikey("foobar", 100, keyTypeVal),
125 ikey("foo", 200, keyTypeVal)))
128 func TestInternalKeyShortestSuccessor(t *testing.T) {
129 assertBytes(t, ikey("g", uint64(keyMaxSeq), keyTypeSeek),
130 shortSuccessor(ikey("foo", 100, keyTypeVal)))
131 assertBytes(t, ikey("\xff\xff", 100, keyTypeVal),
132 shortSuccessor(ikey("\xff\xff", 100, keyTypeVal)))