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  }