github.com/ewagmig/fabric@v2.1.1+incompatible/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/hyperledger/fabric/common/metrics/disabled" 16 "github.com/hyperledger/fabric/core/ledger" 17 "github.com/hyperledger/fabric/core/ledger/kvledger/bookkeeping" 18 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/statecouchdb" 19 "github.com/hyperledger/fabric/core/ledger/mock" 20 "github.com/hyperledger/fabric/core/ledger/util/couchdb" 21 "github.com/hyperledger/fabric/core/ledger/util/couchdbtest" 22 "github.com/stretchr/testify/assert" 23 ) 24 25 // TestEnv - an interface that a test environment implements 26 type TestEnv interface { 27 StartExternalResource() 28 Init(t testing.TB) 29 GetDBHandle(id string) DB 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{&levelDBCommonStorageTestEnv{}, &couchDBCommonStorageTestEnv{}} 38 var testEnvs = []TestEnv{&LevelDBCommonStorageTestEnv{}, &CouchDBCommonStorageTestEnv{}} 39 40 ///////////// LevelDB Environment ////////////// 41 42 // LevelDBCommonStorageTestEnv implements TestEnv interface for leveldb based storage 43 type LevelDBCommonStorageTestEnv struct { 44 t testing.TB 45 provider DBProvider 46 bookkeeperTestEnv *bookkeeping.TestEnv 47 dbPath string 48 } 49 50 // Init implements corresponding function from interface TestEnv 51 func (env *LevelDBCommonStorageTestEnv) Init(t testing.TB) { 52 dbPath, err := ioutil.TempDir("", "cstestenv") 53 if err != nil { 54 t.Fatalf("Failed to create level db storage directory: %s", err) 55 } 56 env.bookkeeperTestEnv = bookkeeping.NewTestEnv(t) 57 dbProvider, err := NewCommonStorageDBProvider( 58 env.bookkeeperTestEnv.TestProvider, 59 &disabled.Provider{}, 60 &mock.HealthCheckRegistry{}, 61 &StateDBConfig{ 62 &ledger.StateDBConfig{}, 63 dbPath, 64 }, 65 []string{"lscc", "_lifecycle"}, 66 ) 67 assert.NoError(t, err) 68 env.t = t 69 env.provider = dbProvider 70 env.dbPath = dbPath 71 } 72 73 // StartExternalResource will be an empty implementation for levelDB test environment. 74 func (env *LevelDBCommonStorageTestEnv) StartExternalResource() { 75 // empty implementation 76 } 77 78 // StopExternalResource will be an empty implementation for levelDB test environment. 79 func (env *LevelDBCommonStorageTestEnv) StopExternalResource() { 80 // empty implementation 81 } 82 83 // GetDBHandle implements corresponding function from interface TestEnv 84 func (env *LevelDBCommonStorageTestEnv) GetDBHandle(id string) DB { 85 db, err := env.provider.GetDBHandle(id) 86 assert.NoError(env.t, err) 87 return db 88 } 89 90 // GetName implements corresponding function from interface TestEnv 91 func (env *LevelDBCommonStorageTestEnv) GetName() string { 92 return "levelDBCommonStorageTestEnv" 93 } 94 95 // Cleanup implements corresponding function from interface TestEnv 96 func (env *LevelDBCommonStorageTestEnv) Cleanup() { 97 env.provider.Close() 98 env.bookkeeperTestEnv.Cleanup() 99 os.RemoveAll(env.dbPath) 100 } 101 102 ///////////// CouchDB Environment ////////////// 103 104 // CouchDBCommonStorageTestEnv implements TestEnv interface for couchdb based storage 105 type CouchDBCommonStorageTestEnv struct { 106 couchAddress string 107 t testing.TB 108 provider DBProvider 109 bookkeeperTestEnv *bookkeeping.TestEnv 110 redoPath string 111 couchCleanup func() 112 } 113 114 // StartExternalResource starts external couchDB resources. 115 func (env *CouchDBCommonStorageTestEnv) StartExternalResource() { 116 if env.couchAddress == "" { 117 env.couchAddress, env.couchCleanup = couchdbtest.CouchDBSetup(nil) 118 } 119 } 120 121 // StopExternalResource stops external couchDB resources. 122 func (env *CouchDBCommonStorageTestEnv) StopExternalResource() { 123 if env.couchAddress != "" { 124 env.couchCleanup() 125 } 126 } 127 128 // Init implements corresponding function from interface TestEnv 129 func (env *CouchDBCommonStorageTestEnv) Init(t testing.TB) { 130 redoPath, err := ioutil.TempDir("", "pestate") 131 if err != nil { 132 t.Fatalf("Failed to create redo log directory: %s", err) 133 } 134 135 env.StartExternalResource() 136 137 stateDBConfig := &StateDBConfig{ 138 StateDBConfig: &ledger.StateDBConfig{ 139 StateDatabase: "CouchDB", 140 CouchDB: &couchdb.Config{ 141 Address: env.couchAddress, 142 Username: "", 143 Password: "", 144 MaxRetries: 3, 145 MaxRetriesOnStartup: 20, 146 RequestTimeout: 35 * time.Second, 147 InternalQueryLimit: 1000, 148 MaxBatchUpdateSize: 1000, 149 RedoLogPath: redoPath, 150 }, 151 }, 152 LevelDBPath: "", 153 } 154 155 env.bookkeeperTestEnv = bookkeeping.NewTestEnv(t) 156 dbProvider, err := NewCommonStorageDBProvider( 157 env.bookkeeperTestEnv.TestProvider, 158 &disabled.Provider{}, 159 &mock.HealthCheckRegistry{}, 160 stateDBConfig, 161 []string{"lscc", "_lifecycle"}, 162 ) 163 assert.NoError(t, err) 164 env.t = t 165 env.provider = dbProvider 166 env.redoPath = redoPath 167 } 168 169 // GetDBHandle implements corresponding function from interface TestEnv 170 func (env *CouchDBCommonStorageTestEnv) GetDBHandle(id string) DB { 171 db, err := env.provider.GetDBHandle(id) 172 assert.NoError(env.t, err) 173 return db 174 } 175 176 // GetName implements corresponding function from interface TestEnv 177 func (env *CouchDBCommonStorageTestEnv) GetName() string { 178 return "couchDBCommonStorageTestEnv" 179 } 180 181 // Cleanup implements corresponding function from interface TestEnv 182 func (env *CouchDBCommonStorageTestEnv) Cleanup() { 183 csdbProvider := env.provider.(*CommonStorageDBProvider) 184 if csdbProvider != nil { 185 statecouchdb.CleanupDB(env.t, csdbProvider.VersionedDBProvider) 186 } 187 os.RemoveAll(env.redoPath) 188 env.bookkeeperTestEnv.Cleanup() 189 env.provider.Close() 190 }