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  }