github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/ledger/ledgermgmt/ledger_mgmt_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 SPDX-License-Identifier: Apache-2.0 4 */ 5 6 package ledgermgmt 7 8 import ( 9 "fmt" 10 "io/ioutil" 11 "os" 12 "testing" 13 14 "github.com/hyperledger/fabric/bccsp/sw" 15 "github.com/hyperledger/fabric/common/configtx/test" 16 "github.com/hyperledger/fabric/common/metrics/disabled" 17 "github.com/hyperledger/fabric/core/ledger" 18 "github.com/hyperledger/fabric/core/ledger/cceventmgmt" 19 "github.com/hyperledger/fabric/core/ledger/mock" 20 "github.com/stretchr/testify/assert" 21 ) 22 23 func TestLedgerMgmt(t *testing.T) { 24 testDir, err := ioutil.TempDir("", "ledgermgmt") 25 if err != nil { 26 t.Fatalf("Failed to create ledger directory: %s", err) 27 } 28 initializer, err := constructDefaultInitializer(testDir) 29 if err != nil { 30 t.Fatalf("Failed to create default initializer: %s", err) 31 } 32 33 ledgerMgr := NewLedgerMgr(initializer) 34 defer func() { 35 os.RemoveAll(testDir) 36 }() 37 38 numLedgers := 10 39 ledgers := make([]ledger.PeerLedger, numLedgers) 40 for i := 0; i < numLedgers; i++ { 41 cid := constructTestLedgerID(i) 42 gb, _ := test.MakeGenesisBlock(cid) 43 l, err := ledgerMgr.CreateLedger(cid, gb) 44 assert.NoError(t, err) 45 ledgers[i] = l 46 } 47 48 ids, _ := ledgerMgr.GetLedgerIDs() 49 assert.Len(t, ids, numLedgers) 50 for i := 0; i < numLedgers; i++ { 51 assert.Equal(t, constructTestLedgerID(i), ids[i]) 52 } 53 54 ledgerID := constructTestLedgerID(2) 55 t.Logf("Ledger selected for test = %s", ledgerID) 56 _, err = ledgerMgr.OpenLedger(ledgerID) 57 assert.Equal(t, ErrLedgerAlreadyOpened, err) 58 59 l := ledgers[2] 60 l.Close() 61 // attempt to close the same ledger twice and ensure it doesn't panic 62 assert.NotPanics(t, l.Close) 63 64 _, err = ledgerMgr.OpenLedger(ledgerID) 65 assert.NoError(t, err) 66 67 _, err = ledgerMgr.OpenLedger(ledgerID) 68 assert.Equal(t, ErrLedgerAlreadyOpened, err) 69 // close all opened ledgers and ledger mgmt 70 ledgerMgr.Close() 71 72 // Recreate LedgerMgr with existing ledgers 73 ledgerMgr = NewLedgerMgr(initializer) 74 _, err = ledgerMgr.OpenLedger(ledgerID) 75 assert.NoError(t, err) 76 ledgerMgr.Close() 77 } 78 79 func TestChaincodeInfoProvider(t *testing.T) { 80 testDir, err := ioutil.TempDir("", "ledgermgmt") 81 if err != nil { 82 t.Fatalf("Failed to create ledger directory: %s", err) 83 } 84 initializer, err := constructDefaultInitializer(testDir) 85 if err != nil { 86 t.Fatalf("Failed to create default initializer: %s", err) 87 } 88 89 ledgerMgr := NewLedgerMgr(initializer) 90 defer func() { 91 ledgerMgr.Close() 92 os.RemoveAll(testDir) 93 }() 94 95 gb, _ := test.MakeGenesisBlock("ledger1") 96 ledgerMgr.CreateLedger("ledger1", gb) 97 98 mockDeployedCCInfoProvider := &mock.DeployedChaincodeInfoProvider{} 99 mockDeployedCCInfoProvider.ChaincodeInfoStub = func(channelName, ccName string, qe ledger.SimpleQueryExecutor) (*ledger.DeployedChaincodeInfo, error) { 100 return constructTestCCInfo(ccName, ccName, ccName), nil 101 } 102 103 ccInfoProvider := &chaincodeInfoProviderImpl{ 104 ledgerMgr, 105 mockDeployedCCInfoProvider, 106 } 107 _, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger2", constructTestCCDef("cc2", "1.0", "cc2Hash")) 108 t.Logf("Expected error received = %s", err) 109 assert.Error(t, err) 110 111 ccInfo, err := ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "non-matching-version", "cc1")) 112 assert.NoError(t, err) 113 assert.Nil(t, ccInfo) 114 115 ccInfo, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "cc1", "non-matching-hash")) 116 assert.NoError(t, err) 117 assert.Nil(t, ccInfo) 118 119 ccInfo, err = ccInfoProvider.GetDeployedChaincodeInfo("ledger1", constructTestCCDef("cc1", "cc1", "cc1")) 120 assert.NoError(t, err) 121 assert.Equal(t, constructTestCCInfo("cc1", "cc1", "cc1"), ccInfo) 122 } 123 124 func constructDefaultInitializer(testDir string) (*Initializer, error) { 125 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 126 if err != nil { 127 return nil, err 128 } 129 return &Initializer{ 130 Config: &ledger.Config{ 131 RootFSPath: testDir, 132 StateDBConfig: &ledger.StateDBConfig{}, 133 PrivateDataConfig: &ledger.PrivateDataConfig{ 134 MaxBatchSize: 5000, 135 BatchesInterval: 1000, 136 PurgeInterval: 100, 137 }, 138 HistoryDBConfig: &ledger.HistoryDBConfig{ 139 Enabled: true, 140 }, 141 }, 142 143 MetricsProvider: &disabled.Provider{}, 144 DeployedChaincodeInfoProvider: &mock.DeployedChaincodeInfoProvider{}, 145 Hasher: cryptoProvider, 146 }, nil 147 } 148 149 func constructTestLedgerID(i int) string { 150 return fmt.Sprintf("ledger_%06d", i) 151 } 152 153 func constructTestCCInfo(ccName, version, hash string) *ledger.DeployedChaincodeInfo { 154 return &ledger.DeployedChaincodeInfo{ 155 Name: ccName, 156 Hash: []byte(hash), 157 Version: version, 158 } 159 } 160 161 func constructTestCCDef(ccName, version, hash string) *cceventmgmt.ChaincodeDefinition { 162 return &cceventmgmt.ChaincodeDefinition{ 163 Name: ccName, 164 Hash: []byte(hash), 165 Version: version, 166 } 167 }