github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package stateleveldb 8 9 import ( 10 "testing" 11 12 "github.com/osdi23p228/fabric/core/ledger/internal/version" 13 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb" 14 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb/commontests" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestBasicRW(t *testing.T) { 19 env := NewTestVDBEnv(t) 20 defer env.Cleanup() 21 commontests.TestBasicRW(t, env.DBProvider) 22 } 23 24 func TestMultiDBBasicRW(t *testing.T) { 25 env := NewTestVDBEnv(t) 26 defer env.Cleanup() 27 commontests.TestMultiDBBasicRW(t, env.DBProvider) 28 } 29 30 func TestDeletes(t *testing.T) { 31 env := NewTestVDBEnv(t) 32 defer env.Cleanup() 33 commontests.TestDeletes(t, env.DBProvider) 34 } 35 36 func TestIterator(t *testing.T) { 37 env := NewTestVDBEnv(t) 38 defer env.Cleanup() 39 commontests.TestIterator(t, env.DBProvider) 40 t.Run("test-iter-error-path", func(t *testing.T) { 41 db, err := env.DBProvider.GetDBHandle("testiterator", nil) 42 require.NoError(t, err) 43 env.DBProvider.Close() 44 itr, err := db.GetStateRangeScanIterator("ns1", "", "") 45 require.EqualError(t, err, "internal leveldb error while obtaining db iterator: leveldb: closed") 46 require.Nil(t, itr) 47 }) 48 } 49 50 func TestDataKeyEncoding(t *testing.T) { 51 testDataKeyEncoding(t, "ledger1", "ns", "key") 52 testDataKeyEncoding(t, "ledger2", "ns", "") 53 } 54 55 func testDataKeyEncoding(t *testing.T, dbName string, ns string, key string) { 56 dataKey := encodeDataKey(ns, key) 57 t.Logf("dataKey=%#v", dataKey) 58 ns1, key1 := decodeDataKey(dataKey) 59 require.Equal(t, ns, ns1) 60 require.Equal(t, key, key1) 61 } 62 63 // TestQueryOnLevelDB tests queries on levelDB. 64 func TestQueryOnLevelDB(t *testing.T) { 65 env := NewTestVDBEnv(t) 66 defer env.Cleanup() 67 db, err := env.DBProvider.GetDBHandle("testquery", nil) 68 require.NoError(t, err) 69 db.Open() 70 defer db.Close() 71 batch := statedb.NewUpdateBatch() 72 jsonValue1 := `{"asset_name": "marble1","color": "blue","size": 1,"owner": "tom"}` 73 batch.Put("ns1", "key1", []byte(jsonValue1), version.NewHeight(1, 1)) 74 75 savePoint := version.NewHeight(2, 22) 76 db.ApplyUpdates(batch, savePoint) 77 78 // query for owner=jerry, use namespace "ns1" 79 // As queries are not supported in levelDB, call to ExecuteQuery() 80 // should return a error message 81 itr, err := db.ExecuteQuery("ns1", `{"selector":{"owner":"jerry"}}`) 82 require.Error(t, err, "ExecuteQuery not supported for leveldb") 83 require.Nil(t, itr) 84 } 85 86 func TestGetStateMultipleKeys(t *testing.T) { 87 env := NewTestVDBEnv(t) 88 defer env.Cleanup() 89 commontests.TestGetStateMultipleKeys(t, env.DBProvider) 90 } 91 92 func TestGetVersion(t *testing.T) { 93 env := NewTestVDBEnv(t) 94 defer env.Cleanup() 95 commontests.TestGetVersion(t, env.DBProvider) 96 } 97 98 func TestUtilityFunctions(t *testing.T) { 99 env := NewTestVDBEnv(t) 100 defer env.Cleanup() 101 102 db, err := env.DBProvider.GetDBHandle("testutilityfunctions", nil) 103 require.NoError(t, err) 104 105 // BytesKeySupported should be true for goleveldb 106 byteKeySupported := db.BytesKeySupported() 107 require.True(t, byteKeySupported) 108 109 // ValidateKeyValue should return nil for a valid key and value 110 require.NoError(t, db.ValidateKeyValue("testKey", []byte("testValue")), "leveldb should accept all key-values") 111 } 112 113 func TestValueAndMetadataWrites(t *testing.T) { 114 env := NewTestVDBEnv(t) 115 defer env.Cleanup() 116 commontests.TestValueAndMetadataWrites(t, env.DBProvider) 117 } 118 119 func TestPaginatedRangeQuery(t *testing.T) { 120 env := NewTestVDBEnv(t) 121 defer env.Cleanup() 122 commontests.TestPaginatedRangeQuery(t, env.DBProvider) 123 } 124 125 func TestRangeQuerySpecialCharacters(t *testing.T) { 126 env := NewTestVDBEnv(t) 127 defer env.Cleanup() 128 commontests.TestRangeQuerySpecialCharacters(t, env.DBProvider) 129 } 130 131 func TestApplyUpdatesWithNilHeight(t *testing.T) { 132 env := NewTestVDBEnv(t) 133 defer env.Cleanup() 134 commontests.TestApplyUpdatesWithNilHeight(t, env.DBProvider) 135 } 136 137 func TestFullScanIterator(t *testing.T) { 138 env := NewTestVDBEnv(t) 139 defer env.Cleanup() 140 commontests.TestFullScanIterator( 141 t, 142 env.DBProvider, 143 byte(1), 144 func(dbVal []byte) (*statedb.VersionedValue, error) { 145 return decodeValue(dbVal) 146 }, 147 ) 148 } 149 150 func TestFullScanIteratorErrorPropagation(t *testing.T) { 151 var env *TestVDBEnv 152 var cleanup func() 153 var vdbProvider *VersionedDBProvider 154 var vdb *versionedDB 155 156 initEnv := func() { 157 env = NewTestVDBEnv(t) 158 vdbProvider = env.DBProvider 159 db, err := vdbProvider.GetDBHandle("TestFullScanIteratorErrorPropagation", nil) 160 require.NoError(t, err) 161 vdb = db.(*versionedDB) 162 cleanup = func() { 163 env.Cleanup() 164 } 165 } 166 167 reInitEnv := func() { 168 env.Cleanup() 169 initEnv() 170 } 171 172 initEnv() 173 defer cleanup() 174 175 // error from function GetFullScanIterator 176 vdbProvider.Close() 177 _, _, err := vdb.GetFullScanIterator( 178 func(string) bool { 179 return false 180 }, 181 ) 182 require.Contains(t, err.Error(), "internal leveldb error while obtaining db iterator:") 183 184 // error from function Next 185 reInitEnv() 186 itr, _, err := vdb.GetFullScanIterator( 187 func(string) bool { 188 return false 189 }, 190 ) 191 require.NoError(t, err) 192 itr.Close() 193 _, _, err = itr.Next() 194 require.Contains(t, err.Error(), "internal leveldb error while retrieving data from db iterator:") 195 }