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