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