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  }