github.com/renegr87/renegr87@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  }