github.com/yacovm/fabric@v2.0.0-alpha.0.20191128145320-c5d4087dc723+incompatible/core/peer/peer_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 SPDX-License-Identifier: Apache-2.0 4 */ 5 6 package peer 7 8 import ( 9 "fmt" 10 "io/ioutil" 11 "math/rand" 12 "os" 13 "path/filepath" 14 "runtime" 15 "testing" 16 17 "github.com/hyperledger/fabric-protos-go/common" 18 "github.com/hyperledger/fabric/bccsp/sw" 19 configtxtest "github.com/hyperledger/fabric/common/configtx/test" 20 "github.com/hyperledger/fabric/common/metrics/disabled" 21 "github.com/hyperledger/fabric/core/comm" 22 "github.com/hyperledger/fabric/core/committer/txvalidator/plugin" 23 "github.com/hyperledger/fabric/core/deliverservice" 24 validation "github.com/hyperledger/fabric/core/handlers/validation/api" 25 "github.com/hyperledger/fabric/core/ledger" 26 "github.com/hyperledger/fabric/core/ledger/ledgermgmt" 27 "github.com/hyperledger/fabric/core/ledger/ledgermgmt/ledgermgmttest" 28 "github.com/hyperledger/fabric/core/ledger/mock" 29 ledgermocks "github.com/hyperledger/fabric/core/ledger/mock" 30 "github.com/hyperledger/fabric/core/transientstore" 31 "github.com/hyperledger/fabric/gossip/gossip" 32 gossipmetrics "github.com/hyperledger/fabric/gossip/metrics" 33 "github.com/hyperledger/fabric/gossip/service" 34 gossipservice "github.com/hyperledger/fabric/gossip/service" 35 peergossip "github.com/hyperledger/fabric/internal/peer/gossip" 36 "github.com/hyperledger/fabric/internal/peer/gossip/mocks" 37 "github.com/hyperledger/fabric/msp/mgmt" 38 msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools" 39 "github.com/stretchr/testify/assert" 40 "github.com/stretchr/testify/require" 41 "google.golang.org/grpc" 42 ) 43 44 func TestMain(m *testing.M) { 45 msptesttools.LoadMSPSetupForTesting() 46 rc := m.Run() 47 os.Exit(rc) 48 } 49 50 func NewTestPeer(t *testing.T) (*Peer, func()) { 51 tempdir, err := ioutil.TempDir("", "peer-test") 52 require.NoError(t, err, "failed to create temporary directory") 53 54 // Initialize gossip service 55 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 56 assert.NoError(t, err) 57 signer := mgmt.GetLocalSigningIdentityOrPanic(cryptoProvider) 58 59 messageCryptoService := peergossip.NewMCS(&mocks.ChannelPolicyManagerGetter{}, signer, mgmt.NewDeserializersManager(cryptoProvider), cryptoProvider) 60 secAdv := peergossip.NewSecurityAdvisor(mgmt.NewDeserializersManager(cryptoProvider)) 61 defaultSecureDialOpts := func() []grpc.DialOption { return []grpc.DialOption{grpc.WithInsecure()} } 62 defaultDeliverClientDialOpts := []grpc.DialOption{grpc.WithBlock()} 63 defaultDeliverClientDialOpts = append( 64 defaultDeliverClientDialOpts, 65 grpc.WithDefaultCallOptions( 66 grpc.MaxCallRecvMsgSize(comm.MaxRecvMsgSize), 67 grpc.MaxCallSendMsgSize(comm.MaxSendMsgSize))) 68 defaultDeliverClientDialOpts = append( 69 defaultDeliverClientDialOpts, 70 comm.ClientKeepaliveOptions(comm.DefaultKeepaliveOptions)..., 71 ) 72 gossipConfig, err := gossip.GlobalConfig("localhost:0", nil) 73 74 gossipService, err := gossipservice.New( 75 signer, 76 gossipmetrics.NewGossipMetrics(&disabled.Provider{}), 77 "localhost:0", 78 grpc.NewServer(), 79 messageCryptoService, 80 secAdv, 81 defaultSecureDialOpts, 82 nil, 83 nil, 84 gossipConfig, 85 &service.ServiceConfig{}, 86 &deliverservice.DeliverServiceConfig{ 87 ReConnectBackoffThreshold: deliverservice.DefaultReConnectBackoffThreshold, 88 ReconnectTotalTimeThreshold: deliverservice.DefaultReConnectTotalTimeThreshold, 89 }, 90 ) 91 require.NoError(t, err, "failed to create gossip service") 92 93 ledgerMgr, err := constructLedgerMgrWithTestDefaults(filepath.Join(tempdir, "ledgersData")) 94 require.NoError(t, err, "failed to create ledger manager") 95 96 assert.NoError(t, err) 97 transientStoreProvider, err := transientstore.NewStoreProvider( 98 filepath.Join(tempdir, "transientstore"), 99 ) 100 assert.NoError(t, err) 101 peerInstance := &Peer{ 102 GossipService: gossipService, 103 StoreProvider: transientStoreProvider, 104 LedgerMgr: ledgerMgr, 105 CryptoProvider: cryptoProvider, 106 } 107 108 cleanup := func() { 109 ledgerMgr.Close() 110 os.RemoveAll(tempdir) 111 } 112 return peerInstance, cleanup 113 } 114 115 func TestInitialize(t *testing.T) { 116 peerInstance, cleanup := NewTestPeer(t) 117 defer cleanup() 118 119 peerInstance.Initialize( 120 nil, 121 plugin.MapBasedMapper(map[string]validation.PluginFactory{}), 122 &ledgermocks.DeployedChaincodeInfoProvider{}, 123 nil, 124 nil, 125 runtime.NumCPU(), 126 ) 127 } 128 129 func TestCreateChannel(t *testing.T) { 130 peerInstance, cleanup := NewTestPeer(t) 131 defer cleanup() 132 133 var initArg string 134 peerInstance.Initialize( 135 func(cid string) { initArg = cid }, 136 plugin.MapBasedMapper(map[string]validation.PluginFactory{}), 137 &ledgermocks.DeployedChaincodeInfoProvider{}, 138 nil, 139 nil, 140 runtime.NumCPU(), 141 ) 142 143 testChainID := fmt.Sprintf("mytestchainid-%d", rand.Int()) 144 block, err := configtxtest.MakeGenesisBlock(testChainID) 145 if err != nil { 146 fmt.Printf("Failed to create a config block, err %s\n", err) 147 t.FailNow() 148 } 149 150 err = peerInstance.CreateChannel(testChainID, block, &mock.DeployedChaincodeInfoProvider{}, nil, nil) 151 if err != nil { 152 t.Fatalf("failed to create chain %s", err) 153 } 154 155 assert.Equal(t, testChainID, initArg) 156 157 // Correct ledger 158 ledger := peerInstance.GetLedger(testChainID) 159 if ledger == nil { 160 t.Fatalf("failed to get correct ledger") 161 } 162 163 // Get config block from ledger 164 block, err = ConfigBlockFromLedger(ledger) 165 assert.NoError(t, err, "Failed to get config block from ledger") 166 assert.NotNil(t, block, "Config block should not be nil") 167 assert.Equal(t, uint64(0), block.Header.Number, "config block should have been block 0") 168 169 // Bad ledger 170 ledger = peerInstance.GetLedger("BogusChain") 171 if ledger != nil { 172 t.Fatalf("got a bogus ledger") 173 } 174 175 // Correct PolicyManager 176 pmgr := peerInstance.GetPolicyManager(testChainID) 177 if pmgr == nil { 178 t.Fatal("failed to get PolicyManager") 179 } 180 181 // Bad PolicyManager 182 pmgr = peerInstance.GetPolicyManager("BogusChain") 183 if pmgr != nil { 184 t.Fatal("got a bogus PolicyManager") 185 } 186 187 channels := peerInstance.GetChannelsInfo() 188 if len(channels) != 1 { 189 t.Fatalf("incorrect number of channels") 190 } 191 } 192 193 func TestDeliverSupportManager(t *testing.T) { 194 peerInstance, cleanup := NewTestPeer(t) 195 defer cleanup() 196 197 manager := &DeliverChainManager{Peer: peerInstance} 198 199 chainSupport := manager.GetChain("fake") 200 assert.Nil(t, chainSupport, "chain support should be nil") 201 202 peerInstance.channels = map[string]*Channel{"testchain": {}} 203 chainSupport = manager.GetChain("testchain") 204 assert.NotNil(t, chainSupport, "chain support should not be nil") 205 } 206 207 func constructLedgerMgrWithTestDefaults(ledgersDataDir string) (*ledgermgmt.LedgerMgr, error) { 208 ledgerInitializer := ledgermgmttest.NewInitializer(ledgersDataDir) 209 210 ledgerInitializer.CustomTxProcessors = map[common.HeaderType]ledger.CustomTxProcessor{ 211 common.HeaderType_CONFIG: &ConfigTxProcessor{}, 212 } 213 ledgerInitializer.Config.HistoryDBConfig = &ledger.HistoryDBConfig{ 214 Enabled: true, 215 } 216 return ledgermgmt.NewLedgerMgr(ledgerInitializer), nil 217 }