github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/peer/configtx_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package peer 8 9 import ( 10 "io/ioutil" 11 "os" 12 "testing" 13 14 "github.com/golang/protobuf/proto" 15 "github.com/hechain20/hechain/bccsp/sw" 16 "github.com/hechain20/hechain/common/capabilities" 17 "github.com/hechain20/hechain/common/channelconfig" 18 configtxtest "github.com/hechain20/hechain/common/configtx/test" 19 "github.com/hechain20/hechain/common/ledger/testutil" 20 "github.com/hechain20/hechain/core/config/configtest" 21 "github.com/hechain20/hechain/core/ledger" 22 "github.com/hechain20/hechain/internal/configtxgen/encoder" 23 "github.com/hechain20/hechain/internal/configtxgen/genesisconfig" 24 "github.com/hechain20/hechain/protoutil" 25 "github.com/hyperledger/fabric-protos-go/common" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestConfigTxCreateLedger(t *testing.T) { 30 helper := newTestHelper(t) 31 channelID := "testchain1" 32 tempdir, err := ioutil.TempDir("", "peer-test") 33 require.NoError(t, err, "failed to create temporary directory") 34 35 ledgerMgr, err := constructLedgerMgrWithTestDefaults(tempdir) 36 if err != nil { 37 t.Fatalf("Failed to create test environment: %s", err) 38 } 39 40 defer func() { 41 ledgerMgr.Close() 42 os.RemoveAll(tempdir) 43 }() 44 45 chanConf := helper.sampleChannelConfig(1, true) 46 genesisTx := helper.constructGenesisTx(t, channelID, chanConf) 47 genesisBlock := helper.constructBlock(genesisTx, 0, nil) 48 ledger, err := ledgerMgr.CreateLedger(channelID, genesisBlock) 49 require.NoError(t, err) 50 51 retrievedchanConf, err := RetrievePersistedChannelConfig(ledger) 52 require.NoError(t, err) 53 require.Equal(t, proto.CompactTextString(chanConf), proto.CompactTextString(retrievedchanConf)) 54 } 55 56 func TestConfigTxErrorScenarios(t *testing.T) { 57 configTxProcessor := &ConfigTxProcessor{} 58 // wrong tx type 59 configEnvWrongTxType := &common.ConfigEnvelope{} 60 txEnvelope, err := protoutil.CreateSignedEnvelope(common.HeaderType_DELIVER_SEEK_INFO, "channelID", nil, configEnvWrongTxType, 0, 0) 61 require.NoError(t, err) 62 err = configTxProcessor.GenerateSimulationResults(txEnvelope, nil, false) 63 require.EqualError(t, err, "tx type [DELIVER_SEEK_INFO] is not expected") 64 65 // empty channelConfig 66 txEnvelope, err = protoutil.CreateSignedEnvelope(common.HeaderType_CONFIG, "channelID", nil, &common.ConfigEnvelope{}, 0, 0) 67 require.NoError(t, err) 68 err = configTxProcessor.GenerateSimulationResults(txEnvelope, nil, false) 69 require.EqualError(t, err, "channel config found nil") 70 } 71 72 func TestConfigTxUpdateChanConfig(t *testing.T) { 73 helper := newTestHelper(t) 74 channelID := "testchain1" 75 tempdir, err := ioutil.TempDir("", "peer-test") 76 require.NoError(t, err, "failed to create temporary directory") 77 78 ledgerMgr, err := constructLedgerMgrWithTestDefaults(tempdir) 79 if err != nil { 80 t.Fatalf("Failed to create test environment: %s", err) 81 } 82 83 defer func() { 84 ledgerMgr.Close() 85 os.RemoveAll(tempdir) 86 }() 87 88 chanConf := helper.sampleChannelConfig(1, true) 89 genesisTx := helper.constructGenesisTx(t, channelID, chanConf) 90 genesisBlock := helper.constructBlock(genesisTx, 0, nil) 91 lgr, err := ledgerMgr.CreateLedger(channelID, genesisBlock) 92 require.NoError(t, err) 93 94 retrievedchanConf, err := RetrievePersistedChannelConfig(lgr) 95 require.NoError(t, err) 96 require.Equal(t, proto.CompactTextString(chanConf), proto.CompactTextString(retrievedchanConf)) 97 98 helper.mockCreateChain(t, channelID, lgr) 99 defer helper.clearMockChains() 100 101 bs := helper.peer.channels[channelID].bundleSource 102 inMemoryChanConf := bs.ConfigtxValidator().ConfigProto() 103 require.Equal(t, proto.CompactTextString(chanConf), proto.CompactTextString(inMemoryChanConf)) 104 105 retrievedchanConf, err = RetrievePersistedChannelConfig(lgr) 106 require.NoError(t, err) 107 require.Equal(t, proto.CompactTextString(bs.ConfigtxValidator().ConfigProto()), proto.CompactTextString(retrievedchanConf)) 108 109 lgr.Close() 110 helper.clearMockChains() 111 _, err = ledgerMgr.OpenLedger(channelID) 112 require.NoError(t, err) 113 } 114 115 func TestGenesisBlockCreateLedger(t *testing.T) { 116 b, err := configtxtest.MakeGenesisBlock("testchain") 117 require.NoError(t, err) 118 tempdir, err := ioutil.TempDir("", "peer-test") 119 require.NoError(t, err, "failed to create temporary directory") 120 121 ledgerMgr, err := constructLedgerMgrWithTestDefaults(tempdir) 122 if err != nil { 123 t.Fatalf("Failed to create test environment: %s", err) 124 } 125 126 defer func() { 127 ledgerMgr.Close() 128 os.RemoveAll(tempdir) 129 }() 130 131 lgr, err := ledgerMgr.CreateLedger("testchain", b) 132 require.NoError(t, err) 133 chanConf, err := RetrievePersistedChannelConfig(lgr) 134 require.NoError(t, err) 135 require.NotNil(t, chanConf) 136 t.Logf("chanConf = %s", chanConf) 137 } 138 139 type testHelper struct { 140 t *testing.T 141 peer *Peer 142 } 143 144 func newTestHelper(t *testing.T) *testHelper { 145 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 146 require.NoError(t, err) 147 return &testHelper{ 148 t: t, 149 peer: &Peer{CryptoProvider: cryptoProvider}, 150 } 151 } 152 153 func (h *testHelper) sampleChannelConfig(sequence uint64, enableV11Capability bool) *common.Config { 154 profile := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile, configtest.GetDevConfigDir()) 155 if enableV11Capability { 156 profile.Orderer.Capabilities = make(map[string]bool) 157 profile.Orderer.Capabilities[capabilities.ApplicationV1_1] = true 158 profile.Application.Capabilities = make(map[string]bool) 159 profile.Application.Capabilities[capabilities.ApplicationV1_2] = true 160 } 161 channelGroup, _ := encoder.NewChannelGroup(profile) 162 return &common.Config{ 163 Sequence: sequence, 164 ChannelGroup: channelGroup, 165 } 166 } 167 168 func (h *testHelper) constructGenesisTx(t *testing.T, channelID string, chanConf *common.Config) *common.Envelope { 169 configEnvelop := &common.ConfigEnvelope{ 170 Config: chanConf, 171 LastUpdate: h.constructLastUpdateField(channelID), 172 } 173 txEnvelope, err := protoutil.CreateSignedEnvelope(common.HeaderType_CONFIG, channelID, nil, configEnvelop, 0, 0) 174 require.NoError(t, err) 175 return txEnvelope 176 } 177 178 func (h *testHelper) constructBlock(txEnvelope *common.Envelope, blockNum uint64, previousHash []byte) *common.Block { 179 return testutil.NewBlock([]*common.Envelope{txEnvelope}, blockNum, previousHash) 180 } 181 182 func (h *testHelper) constructLastUpdateField(channelID string) *common.Envelope { 183 configUpdate := protoutil.MarshalOrPanic(&common.ConfigUpdate{ 184 ChannelId: channelID, 185 }) 186 envelopeForLastUpdateField, _ := protoutil.CreateSignedEnvelope( 187 common.HeaderType_CONFIG_UPDATE, 188 channelID, 189 nil, 190 &common.ConfigUpdateEnvelope{ConfigUpdate: configUpdate}, 191 0, 192 0, 193 ) 194 return envelopeForLastUpdateField 195 } 196 197 func (h *testHelper) mockCreateChain(t *testing.T, channelID string, ledger ledger.PeerLedger) { 198 chanBundle, err := h.constructChannelBundle(channelID, ledger) 199 require.NoError(t, err) 200 if h.peer.channels == nil { 201 h.peer.channels = map[string]*Channel{} 202 } 203 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 204 require.NoError(t, err) 205 h.peer.channels[channelID] = &Channel{ 206 bundleSource: channelconfig.NewBundleSource(chanBundle), 207 ledger: ledger, 208 cryptoProvider: cryptoProvider, 209 } 210 } 211 212 func (h *testHelper) clearMockChains() { 213 h.peer.channels = make(map[string]*Channel) 214 } 215 216 func (h *testHelper) constructChannelBundle(channelID string, ledger ledger.PeerLedger) (*channelconfig.Bundle, error) { 217 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 218 if err != nil { 219 return nil, err 220 } 221 222 chanConf, err := RetrievePersistedChannelConfig(ledger) 223 if err != nil { 224 return nil, err 225 } 226 227 return channelconfig.NewBundle(channelID, chanConf, cryptoProvider) 228 }