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