github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/storage/mvcc/decoders_test.go (about) 1 // Copyright 2022 zGraph Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package mvcc 16 17 import ( 18 "bytes" 19 "testing" 20 21 "github.com/cockroachdb/pebble" 22 "github.com/stretchr/testify/assert" 23 "github.com/vescale/zgraph/storage/kv" 24 ) 25 26 func TestLockDecoder_Decode(t *testing.T) { 27 tmpDir := t.TempDir() 28 db, err := pebble.Open(tmpDir, &pebble.Options{}) 29 assert.Nil(t, err) 30 31 writes := db.NewBatch() 32 33 // Mock data 34 data := []struct { 35 key []byte 36 val []byte 37 ver kv.Version 38 }{ 39 {key: []byte("test"), val: []byte("test1"), ver: 1}, 40 {key: []byte("test"), val: []byte("test3"), ver: 3}, 41 {key: []byte("test1"), val: []byte("test5"), ver: 5}, 42 {key: []byte("test1"), val: []byte("test7"), ver: 7}, 43 {key: []byte("test2"), val: []byte("test9"), ver: 9}, 44 } 45 wo := &pebble.WriteOptions{} 46 for _, d := range data { 47 v := Value{ 48 Type: ValueTypePut, 49 StartVer: d.ver, 50 CommitVer: d.ver + 1, 51 Value: d.val, 52 } 53 val, err := v.MarshalBinary() 54 assert.Nil(t, err) 55 assert.NotNil(t, val) 56 err = writes.Set(Encode(d.key, d.ver+1), val, wo) 57 assert.Nil(t, err) 58 } 59 60 // Mock lock 61 locks := []struct { 62 key []byte 63 val []byte 64 ver kv.Version 65 }{ 66 {key: []byte("test"), val: []byte("test1"), ver: 1}, 67 {key: []byte("test1"), val: []byte("test5"), ver: 5}, 68 {key: []byte("test2"), val: []byte("test9"), ver: 9}, 69 } 70 for _, d := range locks { 71 l := Lock{ 72 Primary: []byte("test"), 73 StartVer: d.ver, 74 Op: Op_Put, 75 Value: d.val, 76 TTL: 5, 77 } 78 val, err := l.MarshalBinary() 79 assert.Nil(t, err) 80 assert.NotNil(t, val) 81 err = writes.Set(Encode(d.key, LockVer), val, wo) 82 assert.Nil(t, err) 83 } 84 85 err = db.Apply(writes, wo) 86 assert.Nil(t, err) 87 88 iter := db.NewIter(&pebble.IterOptions{ 89 LowerBound: Encode([]byte("test"), LockVer), 90 UpperBound: Encode([]byte("test1"), LockVer), 91 }) 92 ok := iter.First() 93 assert.True(t, ok) 94 assert.True(t, iter.Valid()) 95 assert.Nil(t, iter.Error()) 96 97 decoder := LockDecoder{ExpectKey: []byte("test")} 98 ok, err = decoder.Decode(iter) 99 assert.Nil(t, err) 100 assert.True(t, ok) 101 assert.True(t, bytes.Equal(decoder.Lock.Value, []byte("test1"))) 102 } 103 104 func TestValueDecoder_Decode(t *testing.T) { 105 tmpDir := t.TempDir() 106 db, err := pebble.Open(tmpDir, &pebble.Options{}) 107 assert.Nil(t, err) 108 109 writes := db.NewBatch() 110 111 // Mock data 112 data := []struct { 113 key []byte 114 val []byte 115 ver kv.Version 116 }{ 117 {key: []byte("test"), val: []byte("test1"), ver: 1}, 118 {key: []byte("test"), val: []byte("test3"), ver: 3}, 119 {key: []byte("test1"), val: []byte("test5"), ver: 5}, 120 {key: []byte("test1"), val: []byte("test7"), ver: 7}, 121 {key: []byte("test2"), val: []byte("test9"), ver: 9}, 122 } 123 wo := &pebble.WriteOptions{} 124 for _, d := range data { 125 v := Value{ 126 Type: ValueTypePut, 127 StartVer: d.ver, 128 CommitVer: d.ver + 1, 129 Value: d.val, 130 } 131 val, err := v.MarshalBinary() 132 assert.Nil(t, err) 133 assert.NotNil(t, val) 134 err = writes.Set(Encode(d.key, d.ver+1), val, wo) 135 assert.Nil(t, err) 136 } 137 138 err = db.Apply(writes, wo) 139 assert.Nil(t, err) 140 141 expected := []struct { 142 key []byte 143 val []byte 144 }{ 145 {[]byte("test"), []byte("test3")}, 146 {[]byte("test1"), []byte("test7")}, 147 {[]byte("test2"), []byte("test9")}, 148 } 149 150 for _, e := range expected { 151 iter := db.NewIter(&pebble.IterOptions{ 152 LowerBound: Encode(e.key, LockVer), 153 }) 154 ok := iter.First() 155 assert.True(t, ok) 156 assert.True(t, iter.Valid()) 157 assert.Nil(t, iter.Error()) 158 159 decoder := ValueDecoder{ExpectKey: e.key} 160 ok, err = decoder.Decode(iter) 161 assert.Nil(t, err) 162 assert.True(t, ok) 163 assert.True(t, bytes.Equal(decoder.Value.Value, e.val)) 164 } 165 } 166 167 func TestSkipDecoder_Decode(t *testing.T) { 168 tmpDir := t.TempDir() 169 db, err := pebble.Open(tmpDir, &pebble.Options{}) 170 assert.Nil(t, err) 171 172 writes := db.NewBatch() 173 174 // Mock data 175 data := []struct { 176 key []byte 177 val []byte 178 ver kv.Version 179 }{ 180 {key: []byte("test"), val: []byte("test1"), ver: 1}, 181 {key: []byte("test"), val: []byte("test3"), ver: 3}, 182 {key: []byte("test1"), val: []byte("test5"), ver: 5}, 183 {key: []byte("test1"), val: []byte("test7"), ver: 7}, 184 {key: []byte("test2"), val: []byte("test9"), ver: 9}, 185 } 186 wo := &pebble.WriteOptions{} 187 for _, d := range data { 188 v := Value{ 189 Type: ValueTypePut, 190 StartVer: d.ver, 191 CommitVer: d.ver + 1, 192 Value: d.val, 193 } 194 val, err := v.MarshalBinary() 195 assert.Nil(t, err) 196 assert.NotNil(t, val) 197 err = writes.Set(Encode(d.key, d.ver+1), val, wo) 198 assert.Nil(t, err) 199 } 200 201 err = db.Apply(writes, wo) 202 assert.Nil(t, err) 203 204 expected := []struct { 205 key []byte 206 next []byte 207 }{ 208 {[]byte("test"), []byte("test1")}, 209 {[]byte("test1"), []byte("test2")}, 210 {[]byte("test2"), nil}, 211 } 212 213 for _, e := range expected { 214 iter := db.NewIter(&pebble.IterOptions{ 215 LowerBound: Encode(e.key, LockVer), 216 }) 217 ok := iter.First() 218 assert.True(t, ok) 219 assert.True(t, iter.Valid()) 220 assert.Nil(t, iter.Error()) 221 222 decoder := SkipDecoder{CurrKey: e.key} 223 ok, err = decoder.Decode(iter) 224 assert.Nil(t, err) 225 if e.next != nil { 226 assert.True(t, ok) 227 assert.True(t, bytes.Equal(decoder.CurrKey, e.next)) 228 } 229 } 230 }