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  }