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  }