github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/core/ledger/kvledger/txmgmt/privacyenabledstate/test_exports.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package privacyenabledstate 8 9 import ( 10 "io/ioutil" 11 "os" 12 "testing" 13 "time" 14 15 "github.com/osdi23p228/fabric/common/metrics/disabled" 16 "github.com/osdi23p228/fabric/core/ledger" 17 "github.com/osdi23p228/fabric/core/ledger/kvledger/bookkeeping" 18 testmock "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate/mock" 19 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb" 20 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb/statecouchdb" 21 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb" 22 "github.com/osdi23p228/fabric/core/ledger/mock" 23 "github.com/stretchr/testify/require" 24 ) 25 26 // TestEnv - an interface that a test environment implements 27 type TestEnv interface { 28 StartExternalResource() 29 Init(t testing.TB) 30 GetDBHandle(id string) *DB 31 GetName() string 32 DBValueFormat() byte 33 DecodeDBValue(dbVal []byte) statedb.VersionedValue 34 Cleanup() 35 StopExternalResource() 36 } 37 38 // Tests will be run against each environment in this array 39 // For example, to skip CouchDB tests, remove &CouchDBLockBasedEnv{} 40 var testEnvs = []TestEnv{&LevelDBTestEnv{}, &CouchDBTestEnv{}} 41 42 ///////////// LevelDB Environment ////////////// 43 44 // LevelDBTestEnv implements TestEnv interface for leveldb based storage 45 type LevelDBTestEnv struct { 46 t testing.TB 47 provider *DBProvider 48 bookkeeperTestEnv *bookkeeping.TestEnv 49 dbPath string 50 } 51 52 // Init implements corresponding function from interface TestEnv 53 func (env *LevelDBTestEnv) Init(t testing.TB) { 54 dbPath, err := ioutil.TempDir("", "cstestenv") 55 if err != nil { 56 t.Fatalf("Failed to create level db storage directory: %s", err) 57 } 58 env.bookkeeperTestEnv = bookkeeping.NewTestEnv(t) 59 dbProvider, err := NewDBProvider( 60 env.bookkeeperTestEnv.TestProvider, 61 &disabled.Provider{}, 62 &mock.HealthCheckRegistry{}, 63 &StateDBConfig{ 64 &ledger.StateDBConfig{}, 65 dbPath, 66 }, 67 []string{"lscc", "_lifecycle"}, 68 ) 69 require.NoError(t, err) 70 env.t = t 71 env.provider = dbProvider 72 env.dbPath = dbPath 73 } 74 75 // StartExternalResource will be an empty implementation for levelDB test environment. 76 func (env *LevelDBTestEnv) StartExternalResource() { 77 // empty implementation 78 } 79 80 // StopExternalResource will be an empty implementation for levelDB test environment. 81 func (env *LevelDBTestEnv) StopExternalResource() { 82 // empty implementation 83 } 84 85 // GetDBHandle implements corresponding function from interface TestEnv 86 func (env *LevelDBTestEnv) GetDBHandle(id string) *DB { 87 db, err := env.provider.GetDBHandle(id, nil) 88 require.NoError(env.t, err) 89 return db 90 } 91 92 // GetName implements corresponding function from interface TestEnv 93 func (env *LevelDBTestEnv) GetName() string { 94 return "levelDBTestEnv" 95 } 96 97 // DBValueFormat returns the format used by the stateleveldb for dbvalue 98 func (env *LevelDBTestEnv) DBValueFormat() byte { 99 return stateleveldb.TestEnvDBValueformat 100 } 101 102 // DecodeDBValue decodes the dbvalue bytes for tests 103 func (env *LevelDBTestEnv) DecodeDBValue(dbVal []byte) statedb.VersionedValue { 104 vv, err := stateleveldb.TestEnvDBValueDecoder(dbVal) 105 require.NoError(env.t, err) 106 return *vv 107 } 108 109 // Cleanup implements corresponding function from interface TestEnv 110 func (env *LevelDBTestEnv) Cleanup() { 111 env.provider.Close() 112 env.bookkeeperTestEnv.Cleanup() 113 os.RemoveAll(env.dbPath) 114 } 115 116 ///////////// CouchDB Environment ////////////// 117 118 // CouchDBTestEnv implements TestEnv interface for couchdb based storage 119 type CouchDBTestEnv struct { 120 couchAddress string 121 t testing.TB 122 provider *DBProvider 123 bookkeeperTestEnv *bookkeeping.TestEnv 124 redoPath string 125 couchCleanup func() 126 couchDBConfig *ledger.CouchDBConfig 127 } 128 129 // StartExternalResource starts external couchDB resources. 130 func (env *CouchDBTestEnv) StartExternalResource() { 131 if env.couchAddress != "" { 132 return 133 } 134 env.couchAddress, env.couchCleanup = statecouchdb.StartCouchDB(env.t.(*testing.T), nil) 135 } 136 137 // StopExternalResource stops external couchDB resources. 138 func (env *CouchDBTestEnv) StopExternalResource() { 139 if env.couchAddress != "" { 140 env.couchCleanup() 141 } 142 } 143 144 // Init implements corresponding function from interface TestEnv 145 func (env *CouchDBTestEnv) Init(t testing.TB) { 146 redoPath, err := ioutil.TempDir("", "pestate") 147 if err != nil { 148 t.Fatalf("Failed to create redo log directory: %s", err) 149 } 150 151 env.t = t 152 env.StartExternalResource() 153 154 stateDBConfig := &StateDBConfig{ 155 StateDBConfig: &ledger.StateDBConfig{ 156 StateDatabase: "CouchDB", 157 CouchDB: &ledger.CouchDBConfig{ 158 Address: env.couchAddress, 159 Username: "admin", 160 Password: "adminpw", 161 MaxRetries: 3, 162 MaxRetriesOnStartup: 20, 163 RequestTimeout: 35 * time.Second, 164 InternalQueryLimit: 1000, 165 MaxBatchUpdateSize: 1000, 166 RedoLogPath: redoPath, 167 }, 168 }, 169 LevelDBPath: "", 170 } 171 172 env.bookkeeperTestEnv = bookkeeping.NewTestEnv(t) 173 dbProvider, err := NewDBProvider( 174 env.bookkeeperTestEnv.TestProvider, 175 &disabled.Provider{}, 176 &mock.HealthCheckRegistry{}, 177 stateDBConfig, 178 []string{"lscc", "_lifecycle"}, 179 ) 180 require.NoError(t, err) 181 env.provider = dbProvider 182 env.redoPath = redoPath 183 env.couchDBConfig = stateDBConfig.CouchDB 184 } 185 186 // GetDBHandle implements corresponding function from interface TestEnv 187 func (env *CouchDBTestEnv) GetDBHandle(id string) *DB { 188 db, err := env.provider.GetDBHandle(id, &testmock.ChannelInfoProvider{}) 189 require.NoError(env.t, err) 190 return db 191 } 192 193 // GetName implements corresponding function from interface TestEnv 194 func (env *CouchDBTestEnv) GetName() string { 195 return "couchDBTestEnv" 196 } 197 198 // DBValueFormat returns the format used by the stateleveldb for dbvalue 199 // Not yet implemented 200 func (env *CouchDBTestEnv) DBValueFormat() byte { 201 return byte(0) //To be implemented 202 } 203 204 // DecodeDBValue decodes the dbvalue bytes for tests 205 // Not yet implemented 206 func (env *CouchDBTestEnv) DecodeDBValue(dbVal []byte) statedb.VersionedValue { 207 return statedb.VersionedValue{} //To be implemented 208 } 209 210 // Cleanup implements corresponding function from interface TestEnv 211 func (env *CouchDBTestEnv) Cleanup() { 212 if env.provider != nil { 213 require.NoError(env.t, statecouchdb.DropApplicationDBs(env.couchDBConfig)) 214 } 215 os.RemoveAll(env.redoPath) 216 env.bookkeeperTestEnv.Cleanup() 217 env.provider.Close() 218 }