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