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  }