github.com/tenywen/fabric@v1.0.0-beta.0.20170620030522-a5b1ed380643/core/ledger/kvledger/history/historydb/historyleveldb/pkg_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2016 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package historyleveldb
    18  
    19  import (
    20  	"io/ioutil"
    21  	"os"
    22  	"testing"
    23  
    24  	"github.com/hyperledger/fabric/common/ledger/blkstorage"
    25  	"github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage"
    26  	"github.com/hyperledger/fabric/common/ledger/testutil"
    27  	"github.com/hyperledger/fabric/core/ledger/kvledger/history/historydb"
    28  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb"
    29  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr"
    30  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr"
    31  	"github.com/hyperledger/fabric/core/ledger/ledgerconfig"
    32  	"github.com/spf13/viper"
    33  )
    34  
    35  /////// levelDBLockBasedHistoryEnv //////
    36  
    37  type levelDBLockBasedHistoryEnv struct {
    38  	t                     testing.TB
    39  	testBlockStorageEnv   *testBlockStoreEnv
    40  	testDBEnv             *stateleveldb.TestVDBEnv
    41  	txmgr                 txmgr.TxMgr
    42  	testHistoryDBProvider historydb.HistoryDBProvider
    43  	testHistoryDB         historydb.HistoryDB
    44  }
    45  
    46  func NewTestHistoryEnv(t *testing.T) *levelDBLockBasedHistoryEnv {
    47  
    48  	viper.Set("ledger.history.enableHistoryDatabase", "true")
    49  
    50  	blockStorageTestEnv := newBlockStorageTestEnv(t)
    51  
    52  	testDBEnv := stateleveldb.NewTestVDBEnv(t)
    53  	testDB, err := testDBEnv.DBProvider.GetDBHandle("TestDB")
    54  	testutil.AssertNoError(t, err, "")
    55  
    56  	txMgr := lockbasedtxmgr.NewLockBasedTxMgr(testDB)
    57  
    58  	testHistoryDBProvider := NewHistoryDBProvider()
    59  	testHistoryDB, err := testHistoryDBProvider.GetDBHandle("TestHistoryDB")
    60  	testutil.AssertNoError(t, err, "")
    61  
    62  	return &levelDBLockBasedHistoryEnv{t, blockStorageTestEnv, testDBEnv, txMgr, testHistoryDBProvider, testHistoryDB}
    63  }
    64  
    65  func (env *levelDBLockBasedHistoryEnv) cleanup() {
    66  	defer env.txmgr.Shutdown()
    67  	defer env.testDBEnv.Cleanup()
    68  	defer env.testBlockStorageEnv.cleanup()
    69  
    70  	// clean up history
    71  	env.testHistoryDBProvider.Close()
    72  	removeDBPath(env.t, "Cleanup")
    73  }
    74  
    75  func removeDBPath(t testing.TB, caller string) {
    76  	dbPath := ledgerconfig.GetHistoryLevelDBPath()
    77  	if err := os.RemoveAll(dbPath); err != nil {
    78  		t.Fatalf("Err: %s", err)
    79  		t.FailNow()
    80  	}
    81  	logger.Debugf("Removed folder [%s] for history test environment for %s", dbPath, caller)
    82  }
    83  
    84  /////// testBlockStoreEnv//////
    85  
    86  type testBlockStoreEnv struct {
    87  	t               testing.TB
    88  	provider        *fsblkstorage.FsBlockstoreProvider
    89  	blockStorageDir string
    90  }
    91  
    92  func newBlockStorageTestEnv(t testing.TB) *testBlockStoreEnv {
    93  
    94  	testPath, err := ioutil.TempDir("", "historyleveldb-")
    95  	if err != nil {
    96  		panic(err)
    97  	}
    98  	conf := fsblkstorage.NewConf(testPath, 0)
    99  
   100  	attrsToIndex := []blkstorage.IndexableAttr{
   101  		blkstorage.IndexableAttrBlockHash,
   102  		blkstorage.IndexableAttrBlockNum,
   103  		blkstorage.IndexableAttrTxID,
   104  		blkstorage.IndexableAttrBlockNumTranNum,
   105  	}
   106  	indexConfig := &blkstorage.IndexConfig{AttrsToIndex: attrsToIndex}
   107  
   108  	blockStorageProvider := fsblkstorage.NewProvider(conf, indexConfig).(*fsblkstorage.FsBlockstoreProvider)
   109  
   110  	return &testBlockStoreEnv{t, blockStorageProvider, testPath}
   111  }
   112  
   113  func (env *testBlockStoreEnv) cleanup() {
   114  	env.provider.Close()
   115  	env.removeFSPath()
   116  }
   117  
   118  func (env *testBlockStoreEnv) removeFSPath() {
   119  	fsPath := env.blockStorageDir
   120  	os.RemoveAll(fsPath)
   121  }